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