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