-package org.simantics.g3d.vtk.shape;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Matrix4d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.g3d.math.MathTools;\r
-import org.simantics.utils.threads.AWTThread;\r
-import org.simantics.utils.threads.ThreadUtils;\r
-\r
-import vtk.vtkActor;\r
-import vtk.vtkAssembly;\r
-import vtk.vtkConeSource;\r
-import vtk.vtkLineSource;\r
-import vtk.vtkLinearTransform;\r
-import vtk.vtkMatrix4x4;\r
-import vtk.vtkPolyDataMapper;\r
-import vtk.vtkProp3D;\r
-import vtk.vtkRenderer;\r
-import vtk.vtkTextActor;\r
-import vtk.vtkTubeFilter;\r
-\r
-public class DualHeadArrowActor extends vtkAssembly implements IvtkVisualObject{\r
-\r
- private vtkRenderer ren;\r
- private Vector3d axisDir = new Vector3d(1,0,0);\r
- private vtkTextActor tactor;\r
- private vtkActor tubeActor;\r
- private vtkActor coneActor;\r
- private vtkActor coneActor2;\r
- private boolean rendered = false;\r
-\r
- public DualHeadArrowActor(vtkRenderer _ren, String label) {\r
- super();\r
- ren = _ren;\r
- createAxis(label);\r
- }\r
- \r
- public DualHeadArrowActor(vtkRenderer _ren, String label, Vector3d dir) {\r
- super();\r
- ren = _ren;\r
- this.axisDir = dir;\r
- if (dir.lengthSquared() < MathTools.NEAR_ZERO)\r
- throw new IllegalArgumentException("Direction vector length must mer larger than zero");\r
- createAxis(label);\r
- }\r
-\r
- public void createAxis(String label) {\r
- double coneScale = 0.3 * axisDir.length();\r
- Vector3d coneOffset = new Vector3d(axisDir);\r
- coneOffset.normalize();\r
- coneOffset.scale(coneScale*0.5);\r
- \r
- vtkLineSource line = new vtkLineSource();\r
- //line.SetPoint1(0.0,0.0,0.0);\r
- line.SetPoint1(coneOffset.x,coneOffset.y,coneOffset.z);\r
- line.SetPoint2(axisDir.x-coneOffset.x,axisDir.y-coneOffset.y,axisDir.z-coneOffset.z);\r
- \r
- tactor = new vtkTextActor();\r
- \r
- tactor.SetInput(label);\r
- \r
- tactor.SetTextScaleModeToNone();\r
- tactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
- tactor.GetTextProperty().ShadowOff();\r
- tactor.GetTextProperty().ItalicOff();\r
- tactor.GetTextProperty().BoldOff();\r
- \r
- tactor.GetTextProperty().Delete();\r
- \r
- tactor.SetMaximumLineHeight(0.25);\r
- \r
- tactor.SetPickable(0);\r
- \r
- vtkTubeFilter tube = new vtkTubeFilter();\r
- tube.SetInput(line.GetOutput());\r
- tube.SetRadius(0.05 * axisDir.length());\r
- tube.SetNumberOfSides(8);\r
-\r
- vtkPolyDataMapper tubeMapper = new vtkPolyDataMapper();\r
- tubeMapper.SetInput(tube.GetOutput());\r
-\r
- tubeActor = new vtkActor();\r
- tubeActor.SetMapper(tubeMapper);\r
- tubeActor.PickableOff();\r
-\r
- int coneRes = 12;\r
- \r
-\r
- \r
- \r
- // --- x-Cone\r
- vtkConeSource cone = new vtkConeSource();\r
- cone.SetResolution(coneRes);\r
- vtkPolyDataMapper coneMapper = new vtkPolyDataMapper();\r
- coneMapper.SetInput(cone.GetOutput());\r
- coneActor = new vtkActor();\r
- coneActor.SetMapper(coneMapper);\r
- coneActor.GetProperty().SetColor(1, 0, 0);\r
- coneActor.SetScale(coneScale, coneScale, coneScale);\r
- coneActor.SetPosition(axisDir.x-coneOffset.x,axisDir.y-coneOffset.y,axisDir.z-coneOffset.z);\r
- coneActor.SetPickable(0);\r
- \r
- AxisAngle4d aa = MathTools.createRotation(new Vector3d(1,0,0), axisDir);\r
- if (aa != null)\r
- coneActor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
- \r
- \r
- coneActor2 = new vtkActor();\r
- coneActor2.SetMapper(coneMapper);\r
- coneActor2.GetProperty().SetColor(1, 0, 0);\r
- coneActor2.SetScale(coneScale, coneScale, coneScale);\r
- coneActor2.SetPosition(coneOffset.x,coneOffset.y,coneOffset.z);\r
- coneActor2.SetPickable(0);\r
- \r
- aa = MathTools.createRotation(new Vector3d(-1,0,0), axisDir);\r
- if (aa != null)\r
- coneActor2.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
- \r
- this.AddPart(tubeActor);\r
- this.AddPart(coneActor);\r
- this.AddPart(coneActor2);\r
- \r
- tube.GetOutput().Delete();\r
- cone.GetOutput().Delete();\r
- line.GetOutput().Delete();\r
- \r
- tubeMapper.Delete();\r
- tube.Delete();\r
- cone.Delete();\r
- line.Delete();\r
-\r
- coneMapper.Delete();\r
- \r
- coneActor.GetProperty().Delete();\r
- coneActor2.GetProperty().Delete();\r
- }\r
- \r
- public void addToRenderer() {\r
- if (rendered)\r
- return;\r
- rendered = true;\r
- \r
- ren.AddActor2D(tactor);\r
- \r
- ren.AddActor(this);\r
- }\r
- \r
- public void removeFromRenderer() {\r
- if (!rendered)\r
- return;\r
- rendered = false;\r
- ren.RemoveActor2D(tactor);\r
- ren.RemoveActor(this);\r
- }\r
- \r
- public boolean isRendered() {\r
- return rendered;\r
- }\r
-\r
- public void setAxesVisibility(boolean ison) {\r
- this.SetVisibility(ison ? 1 : 0);\r
- tactor.SetVisibility(ison ? 1 : 0);\r
- }\r
- \r
- public void setLabelVisibility(boolean ison) {\r
- tactor.SetVisibility(ison ? 1 : 0);\r
- }\r
- \r
- double mat[] = new double[16];\r
- Matrix4d m = new Matrix4d();\r
- private void updateTextLoc() {\r
- tactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
- \r
- \r
- GetMatrix(mat);\r
- MathTools.set(m,mat);\r
- Point3d p = new Point3d(axisDir.x*0.5, axisDir.y*0.5,axisDir.z*0.5);\r
- m.transform(p);\r
- tactor.GetPositionCoordinate().SetValue(p.x, p.y, p.z);\r
- \r
- tactor.GetPositionCoordinate().Delete();\r
- }\r
- \r
- @Override\r
- public void SetPickable(int id0) {\r
- super.SetPickable(id0);\r
- tubeActor.SetPickable(id0);\r
- coneActor.SetPickable(id0);\r
- coneActor2.SetPickable(id0);\r
- }\r
- \r
- @Override\r
- public void SetOrientation(double id0, double id1, double id2) {\r
- super.SetOrientation(id0, id1, id2);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void RotateWXYZ(double id0, double id1, double id2, double id3) {\r
- super.RotateWXYZ(id0, id1, id2, id3);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetPosition(double[] id0) {\r
- super.SetPosition(id0);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetPosition(double id0, double id1, double id2) {\r
- super.SetPosition(id0, id1, id2);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetOrientation(double[] id0) {\r
- super.SetOrientation(id0);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetScale(double id0) {\r
- super.SetScale(id0);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetScale(double id0, double id1, double id2) {\r
- super.SetScale(id0, id1, id2);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetScale(double[] id0) {\r
- super.SetScale(id0);\r
- updateTextLoc();\r
- }\r
- \r
- public void SetColor(double r, double g, double b) {\r
- coneActor.GetProperty().SetColor(r, g, b);\r
- coneActor2.GetProperty().SetColor(r, g, b);\r
- tubeActor.GetProperty().SetColor(r, g, b);\r
- coneActor.GetProperty().Delete();\r
- coneActor2.GetProperty().Delete();\r
- tubeActor.GetProperty().Delete();\r
- }\r
- \r
- public void SetTextColor(double r, double g, double b) {\r
- tactor.GetTextProperty().SetColor(r, g, b);\r
- tactor.GetTextProperty().Delete();\r
- }\r
- \r
- @Override\r
- public void SetUserMatrix(vtkMatrix4x4 id0) {\r
- super.SetUserMatrix(id0);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void SetUserTransform(vtkLinearTransform id0) {\r
- super.SetUserTransform(id0);\r
- updateTextLoc();\r
- }\r
- \r
- @Override\r
- public void Delete() {\r
- ren.RemoveActor(tactor);\r
- ren.RemoveActor(tubeActor);\r
- ren.RemoveActor(coneActor);\r
- ren.RemoveActor(coneActor2);\r
- tactor.Delete();\r
- tubeActor.Delete();\r
- coneActor.Delete();\r
- coneActor2.Delete();\r
- super.Delete();\r
- }\r
-\r
- public void dispose() {\r
- ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
- \r
- @Override\r
- public void run() {\r
- removeFromRenderer();\r
- Delete();\r
- }\r
- });\r
- }\r
- \r
- @Override\r
- public vtkProp3D getVtkProp() {\r
- return this;\r
- }\r
- \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
+ * Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.g3d.vtk.shape;
+
+import javax.vecmath.AxisAngle4d;
+import javax.vecmath.Matrix4d;
+import javax.vecmath.Point3d;
+import javax.vecmath.Vector3d;
+
+import org.simantics.g3d.math.MathTools;
+import org.simantics.utils.threads.AWTThread;
+import org.simantics.utils.threads.ThreadUtils;
+
+import vtk.vtkActor;
+import vtk.vtkAssembly;
+import vtk.vtkConeSource;
+import vtk.vtkLineSource;
+import vtk.vtkLinearTransform;
+import vtk.vtkMatrix4x4;
+import vtk.vtkPolyDataMapper;
+import vtk.vtkProp3D;
+import vtk.vtkRenderer;
+import vtk.vtkTextActor;
+import vtk.vtkTubeFilter;
+
+public class DualHeadArrowActor extends vtkAssembly implements IvtkVisualObject{
+
+ private vtkRenderer ren;
+ private Vector3d axisDir = new Vector3d(1,0,0);
+ private vtkTextActor tactor;
+ private vtkActor tubeActor;
+ private vtkActor coneActor;
+ private vtkActor coneActor2;
+ private boolean rendered = false;
+
+ public DualHeadArrowActor(vtkRenderer _ren, String label) {
+ super();
+ ren = _ren;
+ createAxis(label);
+ }
+
+ public DualHeadArrowActor(vtkRenderer _ren, String label, Vector3d dir) {
+ super();
+ ren = _ren;
+ this.axisDir = dir;
+ if (dir.lengthSquared() < MathTools.NEAR_ZERO)
+ throw new IllegalArgumentException("Direction vector length must mer larger than zero");
+ createAxis(label);
+ }
+
+ public void createAxis(String label) {
+ double coneScale = 0.3 * axisDir.length();
+ Vector3d coneOffset = new Vector3d(axisDir);
+ coneOffset.normalize();
+ coneOffset.scale(coneScale*0.5);
+
+ vtkLineSource line = new vtkLineSource();
+ //line.SetPoint1(0.0,0.0,0.0);
+ line.SetPoint1(coneOffset.x,coneOffset.y,coneOffset.z);
+ line.SetPoint2(axisDir.x-coneOffset.x,axisDir.y-coneOffset.y,axisDir.z-coneOffset.z);
+
+ tactor = new vtkTextActor();
+
+ tactor.SetInput(label);
+
+ tactor.SetTextScaleModeToNone();
+ tactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);
+ tactor.GetTextProperty().ShadowOff();
+ tactor.GetTextProperty().ItalicOff();
+ tactor.GetTextProperty().BoldOff();
+
+ tactor.GetTextProperty().Delete();
+
+ tactor.SetMaximumLineHeight(0.25);
+
+ tactor.SetPickable(0);
+
+ vtkTubeFilter tube = new vtkTubeFilter();
+ tube.SetInputData(line.GetOutput());
+ tube.SetRadius(0.05 * axisDir.length());
+ tube.SetNumberOfSides(8);
+
+ vtkPolyDataMapper tubeMapper = new vtkPolyDataMapper();
+ tubeMapper.SetInputData(tube.GetOutput());
+
+ tubeActor = new vtkActor();
+ tubeActor.SetMapper(tubeMapper);
+ tubeActor.PickableOff();
+
+ int coneRes = 12;
+
+
+
+
+ // --- x-Cone
+ vtkConeSource cone = new vtkConeSource();
+ cone.SetResolution(coneRes);
+ vtkPolyDataMapper coneMapper = new vtkPolyDataMapper();
+ coneMapper.SetInputData(cone.GetOutput());
+ coneActor = new vtkActor();
+ coneActor.SetMapper(coneMapper);
+ coneActor.GetProperty().SetColor(1, 0, 0);
+ coneActor.SetScale(coneScale, coneScale, coneScale);
+ coneActor.SetPosition(axisDir.x-coneOffset.x,axisDir.y-coneOffset.y,axisDir.z-coneOffset.z);
+ coneActor.SetPickable(0);
+
+ AxisAngle4d aa = MathTools.createRotation(new Vector3d(1,0,0), axisDir);
+ if (aa != null)
+ coneActor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);
+
+
+ coneActor2 = new vtkActor();
+ coneActor2.SetMapper(coneMapper);
+ coneActor2.GetProperty().SetColor(1, 0, 0);
+ coneActor2.SetScale(coneScale, coneScale, coneScale);
+ coneActor2.SetPosition(coneOffset.x,coneOffset.y,coneOffset.z);
+ coneActor2.SetPickable(0);
+
+ aa = MathTools.createRotation(new Vector3d(-1,0,0), axisDir);
+ if (aa != null)
+ coneActor2.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);
+
+ this.AddPart(tubeActor);
+ this.AddPart(coneActor);
+ this.AddPart(coneActor2);
+
+ tube.GetOutput().Delete();
+ cone.GetOutput().Delete();
+ line.GetOutput().Delete();
+
+ tubeMapper.Delete();
+ tube.Delete();
+ cone.Delete();
+ line.Delete();
+
+ coneMapper.Delete();
+
+ coneActor.GetProperty().Delete();
+ coneActor2.GetProperty().Delete();
+ }
+
+ public void addToRenderer() {
+ if (rendered)
+ return;
+ rendered = true;
+
+ ren.AddActor2D(tactor);
+
+ ren.AddActor(this);
+ }
+
+ public void removeFromRenderer() {
+ if (!rendered)
+ return;
+ rendered = false;
+ ren.RemoveActor2D(tactor);
+ ren.RemoveActor(this);
+ }
+
+ public boolean isRendered() {
+ return rendered;
+ }
+
+ public void setAxesVisibility(boolean ison) {
+ this.SetVisibility(ison ? 1 : 0);
+ tactor.SetVisibility(ison ? 1 : 0);
+ }
+
+ public void setLabelVisibility(boolean ison) {
+ tactor.SetVisibility(ison ? 1 : 0);
+ }
+
+ double mat[] = new double[16];
+ Matrix4d m = new Matrix4d();
+ private void updateTextLoc() {
+ tactor.GetPositionCoordinate().SetCoordinateSystemToWorld();
+
+
+ GetMatrix(mat);
+ MathTools.set(m,mat);
+ Point3d p = new Point3d(axisDir.x*0.5, axisDir.y*0.5,axisDir.z*0.5);
+ m.transform(p);
+ tactor.GetPositionCoordinate().SetValue(p.x, p.y, p.z);
+
+ tactor.GetPositionCoordinate().Delete();
+ }
+
+ @Override
+ public void SetPickable(int id0) {
+ super.SetPickable(id0);
+ tubeActor.SetPickable(id0);
+ coneActor.SetPickable(id0);
+ coneActor2.SetPickable(id0);
+ }
+
+ @Override
+ public void SetOrientation(double id0, double id1, double id2) {
+ super.SetOrientation(id0, id1, id2);
+ updateTextLoc();
+ }
+
+ @Override
+ public void RotateWXYZ(double id0, double id1, double id2, double id3) {
+ super.RotateWXYZ(id0, id1, id2, id3);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetPosition(double[] id0) {
+ super.SetPosition(id0);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetPosition(double id0, double id1, double id2) {
+ super.SetPosition(id0, id1, id2);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetOrientation(double[] id0) {
+ super.SetOrientation(id0);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetScale(double id0) {
+ super.SetScale(id0);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetScale(double id0, double id1, double id2) {
+ super.SetScale(id0, id1, id2);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetScale(double[] id0) {
+ super.SetScale(id0);
+ updateTextLoc();
+ }
+
+ public void SetColor(double r, double g, double b) {
+ coneActor.GetProperty().SetColor(r, g, b);
+ coneActor2.GetProperty().SetColor(r, g, b);
+ tubeActor.GetProperty().SetColor(r, g, b);
+ coneActor.GetProperty().Delete();
+ coneActor2.GetProperty().Delete();
+ tubeActor.GetProperty().Delete();
+ }
+
+ public void SetTextColor(double r, double g, double b) {
+ tactor.GetTextProperty().SetColor(r, g, b);
+ tactor.GetTextProperty().Delete();
+ }
+
+ @Override
+ public void SetUserMatrix(vtkMatrix4x4 id0) {
+ super.SetUserMatrix(id0);
+ updateTextLoc();
+ }
+
+ @Override
+ public void SetUserTransform(vtkLinearTransform id0) {
+ super.SetUserTransform(id0);
+ updateTextLoc();
+ }
+
+ @Override
+ public void Delete() {
+ ren.RemoveActor(tactor);
+ ren.RemoveActor(tubeActor);
+ ren.RemoveActor(coneActor);
+ ren.RemoveActor(coneActor2);
+ tactor.Delete();
+ tubeActor.Delete();
+ coneActor.Delete();
+ coneActor2.Delete();
+ super.Delete();
+ }
+
+ public void dispose() {
+ ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
+
+ @Override
+ public void run() {
+ removeFromRenderer();
+ Delete();
+ }
+ });
+ }
+
+ @Override
+ public vtkProp3D getVtkProp() {
+ return this;
+ }
+
+}