]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGnode.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.csg / src / org / simantics / g3d / csg / scenegraph2 / CSGnode.java
1 package org.simantics.g3d.csg.scenegraph2;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 \r
6 import javax.vecmath.AxisAngle4d;\r
7 import javax.vecmath.Quat4d;\r
8 import javax.vecmath.Vector3d;\r
9 \r
10 import org.jcae.opencascade.jni.TopoDS_Shape;\r
11 import org.simantics.g3d.property.annotations.GetPropertyValue;\r
12 import org.simantics.g3d.property.annotations.SetPropertyValue;\r
13 import org.simantics.g3d.scenegraph.G3DNode;\r
14 import org.simantics.layer0.Layer0;\r
15 import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
16 import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
17 import org.simantics.opencascade.OccTriangulator;\r
18 import org.simantics.opencascade.vtk.vtkSolidObject;\r
19 import org.simantics.utils.threads.AWTThread;\r
20 \r
21 import vtk.vtkPanel;\r
22 import vtk.vtkProp3D;\r
23 import vtk.vtkRenderer;\r
24 \r
25 public abstract class CSGnode extends G3DNode implements ICSGnode {\r
26 \r
27         public static final double MIN_VALUE = 0.001;\r
28         \r
29         private String name;\r
30         \r
31 \r
32         @RelatedGetValue(Layer0.URIs.HasName)\r
33         @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
34         public String getName() {\r
35                 return name;\r
36         }\r
37         \r
38         @RelatedSetValue(Layer0.URIs.HasName)\r
39         @SetPropertyValue(Layer0.URIs.HasName)\r
40         public void setName(String name) {\r
41                 if (name == null)\r
42                         return;\r
43                 this.name = name;\r
44                 firePropertyChanged(Layer0.URIs.HasName);\r
45         }\r
46         \r
47         @Override\r
48         public String toString() {\r
49                 return getName();\r
50         }\r
51         \r
52         \r
53         private vtkSolidObject solidObject;\r
54         \r
55         @Override\r
56         public TopoDS_Shape getGeometry() {\r
57                 TopoDS_Shape shape = getBaseGeometry();\r
58                 if (shape == null)\r
59                         return null;\r
60                 Quat4d q = getOrientation();\r
61                 AxisAngle4d r = new AxisAngle4d();\r
62                 r.set(q);\r
63                 TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle);\r
64                 shape.delete();\r
65                 shape = tshape;\r
66                 Vector3d p = getPosition();\r
67                 tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z);\r
68                 shape.delete();\r
69                 return tshape;  \r
70         }\r
71         \r
72         public void visualize(vtkPanel panel) {\r
73                 if (solidObject != null) {\r
74                         solidObject.delete();\r
75                         solidObject = null;\r
76                 }\r
77                 TopoDS_Shape shape = getGeometry();\r
78                 if (shape == null)\r
79                         return;\r
80                 solidObject = new vtkSolidObject(panel, shape);\r
81                 solidObject.visualizeSolid(true, false);\r
82         }\r
83         \r
84         @SuppressWarnings("unchecked")\r
85         public Collection<vtkProp3D> getActors() {\r
86                 if (solidObject == null)\r
87                         return Collections.EMPTY_LIST;\r
88                 return solidObject.getActors();\r
89         }\r
90         \r
91         public void stopVisualize() {\r
92                 if (solidObject != null) {\r
93                         if (Thread.currentThread() == AWTThread.getThreadAccess().getThread())\r
94                                 solidObject.delete();\r
95                         else\r
96                                 solidObject.dispose();\r
97                         solidObject = null;\r
98                 }\r
99         }\r
100         \r
101         @Override\r
102         public void cleanup() {\r
103                 stopVisualize();\r
104                 super.cleanup();\r
105         }\r
106         \r
107         \r
108 \r
109 }\r