]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/shape/axesActor.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / shape / axesActor.java
1 package org.simantics.g3d.vtk.shape;\r
2 \r
3 import javax.vecmath.Matrix4d;\r
4 import javax.vecmath.Point3d;\r
5 \r
6 import org.simantics.g3d.math.MathTools;\r
7 import org.simantics.utils.threads.AWTThread;\r
8 import org.simantics.utils.threads.ThreadUtils;\r
9 \r
10 import vtk.vtkActor;\r
11 import vtk.vtkAssembly;\r
12 import vtk.vtkAxes;\r
13 import vtk.vtkConeSource;\r
14 import vtk.vtkLinearTransform;\r
15 import vtk.vtkMatrix4x4;\r
16 import vtk.vtkPolyDataMapper;\r
17 import vtk.vtkProp3D;\r
18 import vtk.vtkRenderer;\r
19 import vtk.vtkTextActor;\r
20 import vtk.vtkTubeFilter;\r
21 \r
22 public class axesActor extends vtkAssembly implements IvtkVisualObject{\r
23 \r
24         private vtkRenderer ren;\r
25         private double axisLength = 0.8;\r
26         private vtkTextActor xactor, yactor, zactor;\r
27         private vtkActor tubeActor;\r
28         private vtkActor xconeActor;\r
29         private vtkActor yconeActor;\r
30         private vtkActor zconeActor;\r
31         private boolean rendered = false;\r
32 \r
33         public axesActor(vtkRenderer _ren) {\r
34                 super();\r
35                 ren = _ren;\r
36                 createAxes();\r
37         }\r
38         \r
39         public axesActor(vtkRenderer _ren, double axisLength) {\r
40                 super();\r
41                 ren = _ren;\r
42                 this.axisLength = axisLength;\r
43                 createAxes();\r
44         }\r
45 \r
46         public void createAxes() {\r
47                 vtkAxes axes = new vtkAxes();\r
48                 axes.SetOrigin(0, 0, 0);\r
49                 axes.SetScaleFactor(axisLength);\r
50 \r
51                 xactor = new vtkTextActor();\r
52                 yactor = new vtkTextActor();\r
53                 zactor = new vtkTextActor();\r
54 \r
55                 xactor.SetInput("X");\r
56                 yactor.SetInput("Y");\r
57                 zactor.SetInput("Z");\r
58 \r
59 //              xactor.SetTextScaleModeToViewport();\r
60 //              yactor.SetTextScaleModeToViewport();\r
61 //              zactor.SetTextScaleModeToViewport();\r
62                 xactor.SetTextScaleModeToNone();\r
63                 yactor.SetTextScaleModeToNone();\r
64                 zactor.SetTextScaleModeToNone();\r
65                 \r
66                 xactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
67                 xactor.GetTextProperty().ShadowOff();\r
68                 xactor.GetTextProperty().ItalicOff();\r
69                 xactor.GetTextProperty().BoldOff();\r
70 \r
71                 yactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
72                 yactor.GetTextProperty().ShadowOff();\r
73                 yactor.GetTextProperty().ItalicOff();\r
74                 yactor.GetTextProperty().BoldOff();\r
75 \r
76                 zactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
77                 zactor.GetTextProperty().ShadowOff();\r
78                 zactor.GetTextProperty().ItalicOff();\r
79                 zactor.GetTextProperty().BoldOff();\r
80                 \r
81                 xactor.GetTextProperty().Delete();\r
82                 yactor.GetTextProperty().Delete();\r
83                 zactor.GetTextProperty().Delete();\r
84 \r
85                 xactor.SetMaximumLineHeight(0.25);\r
86                 yactor.SetMaximumLineHeight(0.25);\r
87                 zactor.SetMaximumLineHeight(0.25);\r
88                 \r
89                 xactor.SetPickable(0);\r
90                 yactor.SetPickable(0);\r
91                 zactor.SetPickable(0);\r
92 \r
93                 vtkTubeFilter tube = new vtkTubeFilter();\r
94                 tube.SetInput(axes.GetOutput());\r
95                 tube.SetRadius(0.05 * axisLength);\r
96                 tube.SetNumberOfSides(8);\r
97 \r
98                 vtkPolyDataMapper tubeMapper = new vtkPolyDataMapper();\r
99                 tubeMapper.SetInput(tube.GetOutput());\r
100 \r
101                 tubeActor = new vtkActor();\r
102                 tubeActor.SetMapper(tubeMapper);\r
103                 tubeActor.PickableOff();\r
104 \r
105                 int coneRes = 12;\r
106                 double coneScale = 0.3 * axisLength;\r
107 \r
108                 // --- x-Cone\r
109                 vtkConeSource xcone = new vtkConeSource();\r
110                 xcone.SetResolution(coneRes);\r
111                 vtkPolyDataMapper xconeMapper = new vtkPolyDataMapper();\r
112                 xconeMapper.SetInput(xcone.GetOutput());\r
113                 xconeActor = new vtkActor();\r
114                 xconeActor.SetMapper(xconeMapper);\r
115                 xconeActor.GetProperty().SetColor(1, 0, 0);\r
116                 xconeActor.SetScale(coneScale, coneScale, coneScale);\r
117                 xconeActor.SetPosition(axisLength, 0.0, 0.0);\r
118                 xconeActor.SetPickable(0);\r
119 \r
120                 // --- y-Cone\r
121                 vtkConeSource ycone = new vtkConeSource();\r
122                 ycone.SetResolution(coneRes);\r
123                 vtkPolyDataMapper yconeMapper = new vtkPolyDataMapper();\r
124                 yconeMapper.SetInput(ycone.GetOutput());\r
125                 yconeActor = new vtkActor();\r
126                 yconeActor.SetMapper(yconeMapper);\r
127                 yconeActor.GetProperty().SetColor(1, 1, 0);\r
128                 yconeActor.RotateZ(90);\r
129                 yconeActor.SetScale(coneScale, coneScale, coneScale);\r
130                 yconeActor.SetPosition(0.0, axisLength, 0.0);\r
131                 yconeActor.SetPickable(0);\r
132 \r
133                 // --- z-Cone\r
134                 vtkConeSource zcone = new vtkConeSource();\r
135                 zcone.SetResolution(coneRes);\r
136                 vtkPolyDataMapper zconeMapper = new vtkPolyDataMapper();\r
137                 zconeMapper.SetInput(zcone.GetOutput());\r
138                 zconeActor = new vtkActor();\r
139                 zconeActor.SetMapper(zconeMapper);\r
140                 zconeActor.GetProperty().SetColor(0, 1, 0);\r
141                 zconeActor.RotateY(-90);\r
142                 zconeActor.SetScale(coneScale, coneScale, coneScale);\r
143                 zconeActor.SetPosition(0.0, 0.0, axisLength);\r
144                 zconeActor.SetPickable(0);\r
145 \r
146                 \r
147                 this.AddPart(tubeActor);\r
148                 this.AddPart(xconeActor);\r
149                 this.AddPart(yconeActor);\r
150                 this.AddPart(zconeActor);\r
151                 \r
152                 tube.GetOutput().Delete();\r
153                 xcone.GetOutput().Delete();\r
154                 ycone.GetOutput().Delete();\r
155                 zcone.GetOutput().Delete();\r
156                 axes.GetOutput().Delete();\r
157                 axes.Delete();\r
158                 tubeMapper.Delete();\r
159                 tube.Delete();\r
160                 xcone.Delete();\r
161                 ycone.Delete();\r
162                 zcone.Delete();\r
163                 xconeMapper.Delete();\r
164                 yconeMapper.Delete();\r
165                 zconeMapper.Delete();\r
166                 \r
167                 xconeActor.GetProperty().Delete();\r
168                 yconeActor.GetProperty().Delete();\r
169                 zconeActor.GetProperty().Delete();\r
170         }\r
171         \r
172         public void addToRenderer() {\r
173                 if (rendered)\r
174                         return;\r
175                 rendered = true;\r
176                 \r
177                 ren.AddActor2D(xactor);\r
178                 ren.AddActor2D(yactor);\r
179                 ren.AddActor2D(zactor);\r
180                 \r
181                 \r
182                 ren.AddActor(this);\r
183         }\r
184         \r
185         public void removeFromRenderer() {\r
186                 if (!rendered)\r
187                         return;\r
188                 rendered = false;\r
189                 ren.RemoveActor2D(xactor);\r
190                 ren.RemoveActor2D(yactor);\r
191                 ren.RemoveActor2D(zactor);\r
192                 ren.RemoveActor(this);\r
193         }\r
194         \r
195         public boolean isRendered() {\r
196                 return rendered;\r
197         }\r
198 \r
199         public void setAxesVisibility(boolean ison) {\r
200                 this.SetVisibility(ison ? 1 : 0);\r
201                 xactor.SetVisibility(ison ? 1 : 0);\r
202                 yactor.SetVisibility(ison ? 1 : 0);\r
203                 zactor.SetVisibility(ison ? 1 : 0);\r
204         }\r
205         \r
206         private boolean labelVisible = true;\r
207         \r
208         public void setLabelVisibility(boolean ison) {\r
209                 xactor.SetVisibility(ison ? 1 : 0);\r
210                 yactor.SetVisibility(ison ? 1 : 0);\r
211                 zactor.SetVisibility(ison ? 1 : 0);\r
212                 labelVisible = ison;\r
213                 if (labelVisible)\r
214                         updateTextLoc();\r
215         }\r
216         \r
217         Matrix4d m = new Matrix4d();\r
218         double mat[] = new double[16];\r
219         Point3d x = new Point3d();\r
220         Point3d y = new Point3d();\r
221         Point3d z = new Point3d();\r
222         \r
223         private void updateTextLoc() {\r
224                 if (!labelVisible)\r
225                         return;\r
226                 xactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
227                 yactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
228                 zactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
229                 \r
230                 GetMatrix(mat);\r
231                 MathTools.set(m, mat);\r
232                 x.set(axisLength, 0,0);\r
233                 y.set(0,axisLength, 0);\r
234                 z.set(0,0,axisLength);\r
235                 \r
236                 m.transform(x);\r
237                 m.transform(y);\r
238                 m.transform(z);\r
239                 xactor.GetPositionCoordinate().SetValue(x.x, x.y, x.z);\r
240                 yactor.GetPositionCoordinate().SetValue(y.x, y.y, y.z);\r
241                 zactor.GetPositionCoordinate().SetValue(z.x, z.y, z.z);\r
242                 \r
243                 xactor.GetPositionCoordinate().Delete();\r
244                 yactor.GetPositionCoordinate().Delete();\r
245                 zactor.GetPositionCoordinate().Delete();\r
246         }\r
247         \r
248         @Override\r
249         public void SetPickable(int id0) {\r
250                 super.SetPickable(id0);\r
251                 tubeActor.SetPickable(id0);\r
252                 xconeActor.SetPickable(id0);\r
253                 yconeActor.SetPickable(id0);\r
254                 zconeActor.SetPickable(id0);\r
255 \r
256         }\r
257         \r
258         @Override\r
259         public void SetOrientation(double id0, double id1, double id2) {\r
260                 super.SetOrientation(id0, id1, id2);\r
261                 updateTextLoc();\r
262         }\r
263         \r
264         @Override\r
265         public void RotateWXYZ(double id0, double id1, double id2, double id3) {\r
266                 super.RotateWXYZ(id0, id1, id2, id3);\r
267                 updateTextLoc();\r
268         }\r
269         \r
270         @Override\r
271         public void SetPosition(double[] id0) {\r
272                 super.SetPosition(id0);\r
273                 updateTextLoc();\r
274         }\r
275         \r
276         @Override\r
277         public void SetPosition(double id0, double id1, double id2) {\r
278                 super.SetPosition(id0, id1, id2);\r
279                 updateTextLoc();\r
280         }\r
281         \r
282         @Override\r
283         public void SetOrientation(double[] id0) {\r
284                 super.SetOrientation(id0);\r
285                 updateTextLoc();\r
286         }\r
287         \r
288         @Override\r
289         public void SetScale(double id0) {\r
290                 super.SetScale(id0);\r
291                 updateTextLoc();\r
292         }\r
293         \r
294         @Override\r
295         public void SetScale(double id0, double id1, double id2) {\r
296                 super.SetScale(id0, id1, id2);\r
297                 updateTextLoc();\r
298         }\r
299         \r
300         @Override\r
301         public void SetScale(double[] id0) {\r
302                 super.SetScale(id0);\r
303                 updateTextLoc();\r
304         }\r
305         \r
306         @Override\r
307         public void SetUserMatrix(vtkMatrix4x4 id0) {\r
308                 super.SetUserMatrix(id0);\r
309                 updateTextLoc();\r
310         }\r
311         \r
312         @Override\r
313         public void SetUserTransform(vtkLinearTransform id0) {\r
314                 super.SetUserTransform(id0);\r
315                 updateTextLoc();\r
316         }\r
317         \r
318         @Override\r
319         public void Delete() {\r
320                 ren.RemoveActor(xactor);\r
321                 ren.RemoveActor(yactor);\r
322                 ren.RemoveActor(zactor);\r
323                 ren.RemoveActor(tubeActor);\r
324                 ren.RemoveActor(xconeActor);\r
325                 ren.RemoveActor(yconeActor);\r
326                 ren.RemoveActor(xconeActor);\r
327                 xactor.Delete();\r
328                 yactor.Delete();\r
329                 zactor.Delete();\r
330                 tubeActor.Delete();\r
331                 xconeActor.Delete();\r
332                 yconeActor.Delete();\r
333                 zconeActor.Delete();\r
334                 super.Delete();\r
335         }\r
336 \r
337         public void dispose() {\r
338                 ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
339                         \r
340                         @Override\r
341                         public void run() {\r
342                                 removeFromRenderer();\r
343                                 Delete();\r
344                         }\r
345                 });\r
346         }\r
347         \r
348         @Override\r
349         public vtkProp3D getVtkProp() {\r
350                 return this;\r
351         }\r
352         \r
353 }\r