]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/shape/axisActor.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / shape / axisActor.java
1 package org.simantics.g3d.vtk.shape;\r
2 \r
3 import javax.vecmath.AxisAngle4d;\r
4 import javax.vecmath.Matrix4d;\r
5 import javax.vecmath.Point3d;\r
6 import javax.vecmath.Vector3d;\r
7 \r
8 import org.simantics.g3d.math.MathTools;\r
9 import org.simantics.utils.threads.AWTThread;\r
10 import org.simantics.utils.threads.ThreadUtils;\r
11 \r
12 import vtk.vtkActor;\r
13 import vtk.vtkAssembly;\r
14 import vtk.vtkConeSource;\r
15 import vtk.vtkLineSource;\r
16 import vtk.vtkLinearTransform;\r
17 import vtk.vtkMatrix4x4;\r
18 import vtk.vtkPolyDataMapper;\r
19 import vtk.vtkProp3D;\r
20 import vtk.vtkRenderer;\r
21 import vtk.vtkTextActor;\r
22 import vtk.vtkTubeFilter;\r
23 \r
24 public class axisActor extends vtkAssembly implements IvtkVisualObject{\r
25 \r
26         private vtkRenderer ren;\r
27         private Vector3d axisDir = new Vector3d(1,0,0);\r
28         private vtkTextActor tactor;\r
29         private vtkActor tubeActor;\r
30         private vtkActor coneActor;\r
31         private boolean rendered = false;\r
32 \r
33         public axisActor(vtkRenderer _ren, String label) {\r
34                 super();\r
35                 ren = _ren;\r
36                 createAxis(label);\r
37         }\r
38         \r
39         public axisActor(vtkRenderer _ren, String label, Vector3d dir) {\r
40                 super();\r
41                 ren = _ren;\r
42                 this.axisDir = dir;\r
43                 createAxis(label);\r
44         }\r
45 \r
46         public void createAxis(String label) {\r
47                 vtkLineSource line = new vtkLineSource();\r
48                 line.SetPoint1(0.0,0.0,0.0);\r
49                 line.SetPoint2(axisDir.x,axisDir.y,axisDir.z);\r
50                 \r
51                 tactor = new vtkTextActor();\r
52                 \r
53                 tactor.SetInput(label);\r
54                 \r
55                 tactor.SetTextScaleModeToNone();\r
56                 tactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
57                 tactor.GetTextProperty().ShadowOff();\r
58                 tactor.GetTextProperty().ItalicOff();\r
59                 tactor.GetTextProperty().BoldOff();\r
60                 \r
61                 tactor.GetTextProperty().Delete();\r
62                 \r
63                 tactor.SetMaximumLineHeight(0.25);\r
64                 \r
65                 tactor.SetPickable(0);\r
66                 \r
67                 vtkTubeFilter tube = new vtkTubeFilter();\r
68                 tube.SetInput(line.GetOutput());\r
69                 tube.SetRadius(0.05 * axisDir.length());\r
70                 tube.SetNumberOfSides(8);\r
71 \r
72                 vtkPolyDataMapper tubeMapper = new vtkPolyDataMapper();\r
73                 tubeMapper.SetInput(tube.GetOutput());\r
74 \r
75                 tubeActor = new vtkActor();\r
76                 tubeActor.SetMapper(tubeMapper);\r
77                 tubeActor.PickableOff();\r
78 \r
79                 int coneRes = 12;\r
80                 double coneScale = 0.3 * axisDir.length();\r
81 \r
82                 // --- x-Cone\r
83                 vtkConeSource cone = new vtkConeSource();\r
84                 cone.SetResolution(coneRes);\r
85                 vtkPolyDataMapper coneMapper = new vtkPolyDataMapper();\r
86                 coneMapper.SetInput(cone.GetOutput());\r
87                 coneActor = new vtkActor();\r
88                 coneActor.SetMapper(coneMapper);\r
89                 coneActor.GetProperty().SetColor(1, 0, 0);\r
90                 coneActor.SetScale(coneScale, coneScale, coneScale);\r
91                 coneActor.SetPosition(axisDir.x,axisDir.y,axisDir.z);\r
92                 coneActor.SetPickable(0);\r
93                 \r
94                 AxisAngle4d aa = MathTools.createRotation(new Vector3d(1,0,0), new Vector3d(axisDir));\r
95                 if (aa != null)\r
96                         coneActor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
97                 \r
98                 this.AddPart(tubeActor);\r
99                 this.AddPart(coneActor);\r
100                 \r
101                 tube.GetOutput().Delete();\r
102                 cone.GetOutput().Delete();\r
103                 line.GetOutput().Delete();\r
104                 \r
105                 tubeMapper.Delete();\r
106                 tube.Delete();\r
107                 cone.Delete();\r
108                 line.Delete();\r
109 \r
110                 coneMapper.Delete();\r
111                 \r
112                 coneActor.GetProperty().Delete();\r
113         }\r
114         \r
115         public void addToRenderer() {\r
116                 if (rendered)\r
117                         return;\r
118                 rendered = true;\r
119                 \r
120                 ren.AddActor2D(tactor);\r
121                 \r
122                 ren.AddActor(this);\r
123         }\r
124         \r
125         public void removeFromRenderer() {\r
126                 if (!rendered)\r
127                         return;\r
128                 rendered = false;\r
129                 ren.RemoveActor2D(tactor);\r
130                 ren.RemoveActor(this);\r
131         }\r
132         \r
133         public boolean isRendered() {\r
134                 return rendered;\r
135         }\r
136 \r
137         public void setAxesVisibility(boolean ison) {\r
138                 this.SetVisibility(ison ? 1 : 0);\r
139                 tactor.SetVisibility(ison ? 1 : 0);\r
140         }\r
141         \r
142         public void setLabelVisibility(boolean ison) {\r
143                 tactor.SetVisibility(ison ? 1 : 0);\r
144         }\r
145         \r
146         double mat[] = new double[16];\r
147         Matrix4d m = new Matrix4d();\r
148         Point3d p = new Point3d();\r
149         private void updateTextLoc() {\r
150                 tactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
151                 \r
152                 \r
153                 GetMatrix(mat);\r
154                 MathTools.set(m, mat);\r
155                 p.set(axisDir.x, axisDir.y,axisDir.z);\r
156                 m.transform(p);\r
157                 tactor.GetPositionCoordinate().SetValue(p.x, p.y, p.z);\r
158                 \r
159                 tactor.GetPositionCoordinate().Delete();\r
160         }\r
161         \r
162         @Override\r
163         public void SetPickable(int id0) {\r
164                 super.SetPickable(id0);\r
165                 tubeActor.SetPickable(id0);\r
166                 coneActor.SetPickable(id0);\r
167         }\r
168         \r
169         @Override\r
170         public void SetOrientation(double id0, double id1, double id2) {\r
171                 super.SetOrientation(id0, id1, id2);\r
172                 updateTextLoc();\r
173         }\r
174         \r
175         @Override\r
176         public void RotateWXYZ(double id0, double id1, double id2, double id3) {\r
177                 super.RotateWXYZ(id0, id1, id2, id3);\r
178                 updateTextLoc();\r
179         }\r
180         \r
181         @Override\r
182         public void SetPosition(double[] id0) {\r
183                 super.SetPosition(id0);\r
184                 updateTextLoc();\r
185         }\r
186         \r
187         @Override\r
188         public void SetPosition(double id0, double id1, double id2) {\r
189                 super.SetPosition(id0, id1, id2);\r
190                 updateTextLoc();\r
191         }\r
192         \r
193         @Override\r
194         public void SetOrientation(double[] id0) {\r
195                 super.SetOrientation(id0);\r
196                 updateTextLoc();\r
197         }\r
198         \r
199         @Override\r
200         public void SetScale(double id0) {\r
201                 super.SetScale(id0);\r
202                 updateTextLoc();\r
203         }\r
204         \r
205         @Override\r
206         public void SetScale(double id0, double id1, double id2) {\r
207                 super.SetScale(id0, id1, id2);\r
208                 updateTextLoc();\r
209         }\r
210         \r
211         @Override\r
212         public void SetScale(double[] id0) {\r
213                 super.SetScale(id0);\r
214                 updateTextLoc();\r
215         }\r
216         \r
217         public void SetColor(double r, double g, double b) {\r
218                 coneActor.GetProperty().SetColor(r, g, b);\r
219                 tubeActor.GetProperty().SetColor(r, g, b);\r
220                 coneActor.GetProperty().Delete();\r
221                 tubeActor.GetProperty().Delete();\r
222         }\r
223         \r
224         public void SetTextColor(double r, double g, double b) {\r
225                 tactor.GetTextProperty().SetColor(r, g, b);\r
226                 tactor.GetTextProperty().Delete();\r
227         }\r
228         \r
229         @Override\r
230         public void SetUserMatrix(vtkMatrix4x4 id0) {\r
231                 super.SetUserMatrix(id0);\r
232                 updateTextLoc();\r
233         }\r
234         \r
235         @Override\r
236         public void SetUserTransform(vtkLinearTransform id0) {\r
237                 super.SetUserTransform(id0);\r
238                 updateTextLoc();\r
239         }\r
240         \r
241         @Override\r
242         public void Delete() {\r
243                 ren.RemoveActor(tactor);\r
244                 ren.RemoveActor(tubeActor);\r
245                 ren.RemoveActor(coneActor);\r
246                 tactor.Delete();\r
247                 tubeActor.Delete();\r
248                 coneActor.Delete();\r
249                 super.Delete();\r
250         }\r
251 \r
252         public void dispose() {\r
253                 ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
254                         \r
255                         @Override\r
256                         public void run() {\r
257                                 removeFromRenderer();\r
258                                 Delete();\r
259                         }\r
260                 });\r
261         }\r
262         \r
263         @Override\r
264         public vtkProp3D getVtkProp() {\r
265                 return this;\r
266         }\r
267         \r
268 }\r