]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGnode.java
a28e5a3a13abcab06c07f259c1dcc47640ccbf1d
[simantics/3d.git] / org.simantics.g3d.csg / src / org / simantics / g3d / csg / scenegraph2 / CSGnode.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g3d.csg.scenegraph2;\r
13 \r
14 import java.util.Collection;\r
15 import java.util.Collections;\r
16 \r
17 import javax.vecmath.AxisAngle4d;\r
18 import javax.vecmath.Quat4d;\r
19 import javax.vecmath.Vector3d;\r
20 \r
21 import org.jcae.opencascade.jni.TopoDS_Shape;\r
22 import org.simantics.g3d.property.annotations.GetPropertyValue;\r
23 import org.simantics.g3d.property.annotations.SetPropertyValue;\r
24 import org.simantics.g3d.scenegraph.G3DNode;\r
25 import org.simantics.layer0.Layer0;\r
26 import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
27 import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
28 import org.simantics.opencascade.OccTriangulator;\r
29 import org.simantics.opencascade.vtk.vtkSolidObject;\r
30 import org.simantics.utils.threads.AWTThread;\r
31 \r
32 import vtk.vtkPanel;\r
33 import vtk.vtkProp3D;\r
34 import vtk.vtkRenderer;\r
35 \r
36 public abstract class CSGnode extends G3DNode implements ICSGnode {\r
37 \r
38         public static final double MIN_VALUE = 0.001;\r
39         \r
40         private String name;\r
41         \r
42 \r
43         @RelatedGetValue(Layer0.URIs.HasName)\r
44         @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
45         public String getName() {\r
46                 return name;\r
47         }\r
48         \r
49         @RelatedSetValue(Layer0.URIs.HasName)\r
50         @SetPropertyValue(Layer0.URIs.HasName)\r
51         public void setName(String name) {\r
52                 if (name == null)\r
53                         return;\r
54                 this.name = name;\r
55                 firePropertyChanged(Layer0.URIs.HasName);\r
56         }\r
57         \r
58         @Override\r
59         public String toString() {\r
60                 return getName();\r
61         }\r
62         \r
63         \r
64         private vtkSolidObject solidObject;\r
65         \r
66         @Override\r
67         public TopoDS_Shape getGeometry() {\r
68                 TopoDS_Shape shape = getBaseGeometry();\r
69                 if (shape == null)\r
70                         return null;\r
71                 Quat4d q = getOrientation();\r
72                 AxisAngle4d r = new AxisAngle4d();\r
73                 r.set(q);\r
74                 TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle);\r
75                 shape.delete();\r
76                 shape = tshape;\r
77                 Vector3d p = getPosition();\r
78                 tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z);\r
79                 shape.delete();\r
80                 return tshape;  \r
81         }\r
82         \r
83         public void visualize(vtkPanel panel) {\r
84                 if (solidObject != null) {\r
85                         solidObject.delete();\r
86                         solidObject = null;\r
87                 }\r
88                 TopoDS_Shape shape = getGeometry();\r
89                 if (shape == null)\r
90                         return;\r
91                 solidObject = new vtkSolidObject(panel, shape);\r
92                 solidObject.visualizeSolid(true, false);\r
93         }\r
94         \r
95         @SuppressWarnings("unchecked")\r
96         public Collection<vtkProp3D> getActors() {\r
97                 if (solidObject == null)\r
98                         return Collections.EMPTY_LIST;\r
99                 return solidObject.getActors();\r
100         }\r
101         \r
102         public void stopVisualize() {\r
103                 if (solidObject != null) {\r
104                         if (Thread.currentThread() == AWTThread.getThreadAccess().getThread())\r
105                                 solidObject.delete();\r
106                         else\r
107                                 solidObject.dispose();\r
108                         solidObject = null;\r
109                 }\r
110         }\r
111         \r
112         @Override\r
113         public void cleanup() {\r
114                 stopVisualize();\r
115                 super.cleanup();\r
116         }\r
117         \r
118         \r
119 \r
120 }\r