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