]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/shape/axisActor.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / shape / axisActor.java
diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/shape/axisActor.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/shape/axisActor.java
new file mode 100644 (file)
index 0000000..caf48d4
--- /dev/null
@@ -0,0 +1,268 @@
+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 axisActor 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 boolean rendered = false;\r
+\r
+       public axisActor(vtkRenderer _ren, String label) {\r
+               super();\r
+               ren = _ren;\r
+               createAxis(label);\r
+       }\r
+       \r
+       public axisActor(vtkRenderer _ren, String label, Vector3d dir) {\r
+               super();\r
+               ren = _ren;\r
+               this.axisDir = dir;\r
+               createAxis(label);\r
+       }\r
+\r
+       public void createAxis(String label) {\r
+               vtkLineSource line = new vtkLineSource();\r
+               line.SetPoint1(0.0,0.0,0.0);\r
+               line.SetPoint2(axisDir.x,axisDir.y,axisDir.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
+               double coneScale = 0.3 * axisDir.length();\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,axisDir.y,axisDir.z);\r
+               coneActor.SetPickable(0);\r
+               \r
+               AxisAngle4d aa = MathTools.createRotation(new Vector3d(1,0,0), new Vector3d(axisDir));\r
+               if (aa != null)\r
+                       coneActor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+               \r
+               this.AddPart(tubeActor);\r
+               this.AddPart(coneActor);\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
+       }\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
+       Point3d p = new Point3d();\r
+       private void updateTextLoc() {\r
+               tactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
+               \r
+               \r
+               GetMatrix(mat);\r
+               MathTools.set(m, mat);\r
+               p.set(axisDir.x, axisDir.y,axisDir.z);\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
+       }\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
+               tubeActor.GetProperty().SetColor(r, g, b);\r
+               coneActor.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
+               tactor.Delete();\r
+               tubeActor.Delete();\r
+               coneActor.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