+package org.simantics.g3d.csg.scenegraph2;\r
+\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+\r
+import javax.vecmath.AxisAngle4d;\r
+import javax.vecmath.Quat4d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.jcae.opencascade.jni.TopoDS_Shape;\r
+import org.simantics.g3d.property.annotations.GetPropertyValue;\r
+import org.simantics.g3d.property.annotations.SetPropertyValue;\r
+import org.simantics.g3d.scenegraph.G3DNode;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
+import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
+import org.simantics.opencascade.OccTriangulator;\r
+import org.simantics.opencascade.vtk.vtkSolidObject;\r
+import org.simantics.utils.threads.AWTThread;\r
+\r
+import vtk.vtkPanel;\r
+import vtk.vtkProp3D;\r
+import vtk.vtkRenderer;\r
+\r
+public abstract class CSGnode extends G3DNode implements ICSGnode {\r
+\r
+ public static final double MIN_VALUE = 0.001;\r
+ \r
+ private String name;\r
+ \r
+\r
+ @RelatedGetValue(Layer0.URIs.HasName)\r
+ @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ @RelatedSetValue(Layer0.URIs.HasName)\r
+ @SetPropertyValue(Layer0.URIs.HasName)\r
+ public void setName(String name) {\r
+ if (name == null)\r
+ return;\r
+ this.name = name;\r
+ firePropertyChanged(Layer0.URIs.HasName);\r
+ }\r
+ \r
+ @Override\r
+ public String toString() {\r
+ return getName();\r
+ }\r
+ \r
+ \r
+ private vtkSolidObject solidObject;\r
+ \r
+ @Override\r
+ public TopoDS_Shape getGeometry() {\r
+ TopoDS_Shape shape = getBaseGeometry();\r
+ if (shape == null)\r
+ return null;\r
+ Quat4d q = getOrientation();\r
+ AxisAngle4d r = new AxisAngle4d();\r
+ r.set(q);\r
+ TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle);\r
+ shape.delete();\r
+ shape = tshape;\r
+ Vector3d p = getPosition();\r
+ tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z);\r
+ shape.delete();\r
+ return tshape; \r
+ }\r
+ \r
+ public void visualize(vtkPanel panel) {\r
+ if (solidObject != null) {\r
+ solidObject.delete();\r
+ solidObject = null;\r
+ }\r
+ TopoDS_Shape shape = getGeometry();\r
+ if (shape == null)\r
+ return;\r
+ solidObject = new vtkSolidObject(panel, shape);\r
+ solidObject.visualizeSolid(true, false);\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ public Collection<vtkProp3D> getActors() {\r
+ if (solidObject == null)\r
+ return Collections.EMPTY_LIST;\r
+ return solidObject.getActors();\r
+ }\r
+ \r
+ public void stopVisualize() {\r
+ if (solidObject != null) {\r
+ if (Thread.currentThread() == AWTThread.getThreadAccess().getThread())\r
+ solidObject.delete();\r
+ else\r
+ solidObject.dispose();\r
+ solidObject = null;\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public void cleanup() {\r
+ stopVisualize();\r
+ super.cleanup();\r
+ }\r
+ \r
+ \r
+\r
+}\r