--- /dev/null
+package org.simantics.g3d.vtk.shape;\r
+\r
+import javax.vecmath.Matrix4d;\r
+import javax.vecmath.Point3d;\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.vtkAxes;\r
+import vtk.vtkConeSource;\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 axesActor extends vtkAssembly implements IvtkVisualObject{\r
+\r
+ private vtkRenderer ren;\r
+ private double axisLength = 0.8;\r
+ private vtkTextActor xactor, yactor, zactor;\r
+ private vtkActor tubeActor;\r
+ private vtkActor xconeActor;\r
+ private vtkActor yconeActor;\r
+ private vtkActor zconeActor;\r
+ private boolean rendered = false;\r
+\r
+ public axesActor(vtkRenderer _ren) {\r
+ super();\r
+ ren = _ren;\r
+ createAxes();\r
+ }\r
+ \r
+ public axesActor(vtkRenderer _ren, double axisLength) {\r
+ super();\r
+ ren = _ren;\r
+ this.axisLength = axisLength;\r
+ createAxes();\r
+ }\r
+\r
+ public void createAxes() {\r
+ vtkAxes axes = new vtkAxes();\r
+ axes.SetOrigin(0, 0, 0);\r
+ axes.SetScaleFactor(axisLength);\r
+\r
+ xactor = new vtkTextActor();\r
+ yactor = new vtkTextActor();\r
+ zactor = new vtkTextActor();\r
+\r
+ xactor.SetInput("X");\r
+ yactor.SetInput("Y");\r
+ zactor.SetInput("Z");\r
+\r
+// xactor.SetTextScaleModeToViewport();\r
+// yactor.SetTextScaleModeToViewport();\r
+// zactor.SetTextScaleModeToViewport();\r
+ xactor.SetTextScaleModeToNone();\r
+ yactor.SetTextScaleModeToNone();\r
+ zactor.SetTextScaleModeToNone();\r
+ \r
+ xactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
+ xactor.GetTextProperty().ShadowOff();\r
+ xactor.GetTextProperty().ItalicOff();\r
+ xactor.GetTextProperty().BoldOff();\r
+\r
+ yactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
+ yactor.GetTextProperty().ShadowOff();\r
+ yactor.GetTextProperty().ItalicOff();\r
+ yactor.GetTextProperty().BoldOff();\r
+\r
+ zactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
+ zactor.GetTextProperty().ShadowOff();\r
+ zactor.GetTextProperty().ItalicOff();\r
+ zactor.GetTextProperty().BoldOff();\r
+ \r
+ xactor.GetTextProperty().Delete();\r
+ yactor.GetTextProperty().Delete();\r
+ zactor.GetTextProperty().Delete();\r
+\r
+ xactor.SetMaximumLineHeight(0.25);\r
+ yactor.SetMaximumLineHeight(0.25);\r
+ zactor.SetMaximumLineHeight(0.25);\r
+ \r
+ xactor.SetPickable(0);\r
+ yactor.SetPickable(0);\r
+ zactor.SetPickable(0);\r
+\r
+ vtkTubeFilter tube = new vtkTubeFilter();\r
+ tube.SetInput(axes.GetOutput());\r
+ tube.SetRadius(0.05 * axisLength);\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 * axisLength;\r
+\r
+ // --- x-Cone\r
+ vtkConeSource xcone = new vtkConeSource();\r
+ xcone.SetResolution(coneRes);\r
+ vtkPolyDataMapper xconeMapper = new vtkPolyDataMapper();\r
+ xconeMapper.SetInput(xcone.GetOutput());\r
+ xconeActor = new vtkActor();\r
+ xconeActor.SetMapper(xconeMapper);\r
+ xconeActor.GetProperty().SetColor(1, 0, 0);\r
+ xconeActor.SetScale(coneScale, coneScale, coneScale);\r
+ xconeActor.SetPosition(axisLength, 0.0, 0.0);\r
+ xconeActor.SetPickable(0);\r
+\r
+ // --- y-Cone\r
+ vtkConeSource ycone = new vtkConeSource();\r
+ ycone.SetResolution(coneRes);\r
+ vtkPolyDataMapper yconeMapper = new vtkPolyDataMapper();\r
+ yconeMapper.SetInput(ycone.GetOutput());\r
+ yconeActor = new vtkActor();\r
+ yconeActor.SetMapper(yconeMapper);\r
+ yconeActor.GetProperty().SetColor(1, 1, 0);\r
+ yconeActor.RotateZ(90);\r
+ yconeActor.SetScale(coneScale, coneScale, coneScale);\r
+ yconeActor.SetPosition(0.0, axisLength, 0.0);\r
+ yconeActor.SetPickable(0);\r
+\r
+ // --- z-Cone\r
+ vtkConeSource zcone = new vtkConeSource();\r
+ zcone.SetResolution(coneRes);\r
+ vtkPolyDataMapper zconeMapper = new vtkPolyDataMapper();\r
+ zconeMapper.SetInput(zcone.GetOutput());\r
+ zconeActor = new vtkActor();\r
+ zconeActor.SetMapper(zconeMapper);\r
+ zconeActor.GetProperty().SetColor(0, 1, 0);\r
+ zconeActor.RotateY(-90);\r
+ zconeActor.SetScale(coneScale, coneScale, coneScale);\r
+ zconeActor.SetPosition(0.0, 0.0, axisLength);\r
+ zconeActor.SetPickable(0);\r
+\r
+ \r
+ this.AddPart(tubeActor);\r
+ this.AddPart(xconeActor);\r
+ this.AddPart(yconeActor);\r
+ this.AddPart(zconeActor);\r
+ \r
+ tube.GetOutput().Delete();\r
+ xcone.GetOutput().Delete();\r
+ ycone.GetOutput().Delete();\r
+ zcone.GetOutput().Delete();\r
+ axes.GetOutput().Delete();\r
+ axes.Delete();\r
+ tubeMapper.Delete();\r
+ tube.Delete();\r
+ xcone.Delete();\r
+ ycone.Delete();\r
+ zcone.Delete();\r
+ xconeMapper.Delete();\r
+ yconeMapper.Delete();\r
+ zconeMapper.Delete();\r
+ \r
+ xconeActor.GetProperty().Delete();\r
+ yconeActor.GetProperty().Delete();\r
+ zconeActor.GetProperty().Delete();\r
+ }\r
+ \r
+ public void addToRenderer() {\r
+ if (rendered)\r
+ return;\r
+ rendered = true;\r
+ \r
+ ren.AddActor2D(xactor);\r
+ ren.AddActor2D(yactor);\r
+ ren.AddActor2D(zactor);\r
+ \r
+ \r
+ ren.AddActor(this);\r
+ }\r
+ \r
+ public void removeFromRenderer() {\r
+ if (!rendered)\r
+ return;\r
+ rendered = false;\r
+ ren.RemoveActor2D(xactor);\r
+ ren.RemoveActor2D(yactor);\r
+ ren.RemoveActor2D(zactor);\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
+ xactor.SetVisibility(ison ? 1 : 0);\r
+ yactor.SetVisibility(ison ? 1 : 0);\r
+ zactor.SetVisibility(ison ? 1 : 0);\r
+ }\r
+ \r
+ private boolean labelVisible = true;\r
+ \r
+ public void setLabelVisibility(boolean ison) {\r
+ xactor.SetVisibility(ison ? 1 : 0);\r
+ yactor.SetVisibility(ison ? 1 : 0);\r
+ zactor.SetVisibility(ison ? 1 : 0);\r
+ labelVisible = ison;\r
+ if (labelVisible)\r
+ updateTextLoc();\r
+ }\r
+ \r
+ Matrix4d m = new Matrix4d();\r
+ double mat[] = new double[16];\r
+ Point3d x = new Point3d();\r
+ Point3d y = new Point3d();\r
+ Point3d z = new Point3d();\r
+ \r
+ private void updateTextLoc() {\r
+ if (!labelVisible)\r
+ return;\r
+ xactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
+ yactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
+ zactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
+ \r
+ GetMatrix(mat);\r
+ MathTools.set(m, mat);\r
+ x.set(axisLength, 0,0);\r
+ y.set(0,axisLength, 0);\r
+ z.set(0,0,axisLength);\r
+ \r
+ m.transform(x);\r
+ m.transform(y);\r
+ m.transform(z);\r
+ xactor.GetPositionCoordinate().SetValue(x.x, x.y, x.z);\r
+ yactor.GetPositionCoordinate().SetValue(y.x, y.y, y.z);\r
+ zactor.GetPositionCoordinate().SetValue(z.x, z.y, z.z);\r
+ \r
+ xactor.GetPositionCoordinate().Delete();\r
+ yactor.GetPositionCoordinate().Delete();\r
+ zactor.GetPositionCoordinate().Delete();\r
+ }\r
+ \r
+ @Override\r
+ public void SetPickable(int id0) {\r
+ super.SetPickable(id0);\r
+ tubeActor.SetPickable(id0);\r
+ xconeActor.SetPickable(id0);\r
+ yconeActor.SetPickable(id0);\r
+ zconeActor.SetPickable(id0);\r
+\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
+ @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(xactor);\r
+ ren.RemoveActor(yactor);\r
+ ren.RemoveActor(zactor);\r
+ ren.RemoveActor(tubeActor);\r
+ ren.RemoveActor(xconeActor);\r
+ ren.RemoveActor(yconeActor);\r
+ ren.RemoveActor(xconeActor);\r
+ xactor.Delete();\r
+ yactor.Delete();\r
+ zactor.Delete();\r
+ tubeActor.Delete();\r
+ xconeActor.Delete();\r
+ yconeActor.Delete();\r
+ zconeActor.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