+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.stubs.FixedLengthInlineComponent;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.proconf.g3d.actions.ConstrainedTransformAction;\r
-import org.simantics.proconf.g3d.actions.TranslateActionConstraints;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.gizmo.AbstractGizmo;\r
-import org.simantics.proconf.g3d.gizmo.TransformGizmo;\r
-import org.simantics.proconf.g3d.gizmo.TransformInlineGizmo;\r
-\r
-
-\r
-\r
-/**\r
- * Action that allows translating VariableLengthInlineComontolPoints.\r
- * \r
- * TODO : Action won't show two gizmos when both ends can be moved\r
- * TODO : With loose ends, gizmo is in the middle of component, when it should be positioned on the end of the component\r
- * \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class TranslateStraightAction extends ConstrainedTransformAction {\r
- \r
- private static final int CONNECTED = 0;\r
- private static final int LOOSE = 1;\r
- \r
- private AbstractGizmo gizmo; \r
- private TransformGizmo transformGizmo;\r
- private TransformInlineGizmo transformInlineGizmo;\r
- \r
- \r
- //private Straight straight;\r
- //private PipeControlPoint pcp;\r
- \r
- private Resource pcpResource;\r
- \r
- private int type;\r
-\r
- Vector3d prevTranslate = new Vector3d();\r
- \r
- Point3d start;\r
- Point3d end;\r
- Vector3d dir;\r
- double istep = 10.0;\r
- int decimals = 2;\r
- public TranslateStraightAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- transformGizmo = new TransformGizmo(component.getDisplaySystem().getRenderer());\r
- transformInlineGizmo = new TransformInlineGizmo(component.getDisplaySystem().getRenderer());\r
- }\r
- \r
- public void init() {\r
- this.setText("Translate");\r
- this.setToolTipText("Translate one end of a straight");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/translate_d.png"));\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() != 1)\r
- return false;\r
- \r
- IEntity r = EntityFactory.create(graph,resources.get(0));\r
- if (!r.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- return false;\r
- }\r
- FixedLengthInlineComponent flic = new FixedLengthInlineComponent(r);\r
- PipeControlPoint scp = flic.getControlPoint();\r
- PipeControlPoint start = scp.getPrevious();\r
- PipeControlPoint end = scp.getNext(); \r
- \r
- if (start == null) {\r
- pcpResource = scp.getResource();\r
- type = LOOSE;\r
- return true;\r
- }\r
- if (end == null) {\r
- pcpResource = scp.getResource();\r
- type = LOOSE;\r
- return true;\r
- }\r
- if (start.isInstanceOf(ProcessResource.plant3Dresource.BranchEndControlPoint)) {\r
- pcpResource = graph.getObjects(start.getResource(), ProcessResource.plant3Dresource.SubPointOf).iterator().next();\r
- type = CONNECTED;\r
- return true;\r
- }\r
- if (end.isInstanceOf(ProcessResource.plant3Dresource.BranchEndControlPoint)) {\r
- pcpResource = graph.getObjects(end.getResource(), ProcessResource.plant3Dresource.SubPointOf).iterator().next();\r
- type = CONNECTED;\r
- return true;\r
- }\r
- \r
-\r
- return false;\r
- \r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- super.deactivate();\r
- parent.setGizmo(null);\r
-\r
- }\r
-\r
- @Override\r
- public void activate() {\r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(g,pcpResource);\r
- if (type == CONNECTED) {\r
- gizmo = transformInlineGizmo;\r
- \r
- start = new Point3d();\r
- end = new Point3d();\r
- dir = new Vector3d();\r
- //ControlPointTools.getInlineControlPointEnds(pcp, start, end, dir);\r
- ControlPointTools.getInlineMovement(pcp, start, end);\r
- \r
- //PipingTools2.getInlineComponentEnds(ic, start, end);\r
- dir.set(end);\r
- dir.sub(start);\r
- \r
- //System.out.println(start + " " + end + " " + dir);\r
- Vector3d front = new Vector3d(1.0,0.0,0.0);\r
- Vector3d current = new Vector3d(dir);\r
- float angle = (float)current.angle(front);\r
- AxisAngle4f aa;\r
- if (angle < 0.01 || (Math.PI - angle) < 0.01) {\r
- aa = new AxisAngle4f();\r
- } else {\r
- current.normalize();\r
- Vector3d right = new Vector3d();\r
- right.cross(front, current);\r
-\r
- right.normalize();\r
- if (right.lengthSquared() < 0.01) {\r
- aa = new AxisAngle4f();\r
- } else {\r
- aa = new AxisAngle4f((float) right.x, (float) right.y, (float) right.z, angle);\r
- }\r
- }\r
- transformInlineGizmo.setRotation(aa);\r
- \r
- } else {\r
- gizmo = transformGizmo;\r
- }\r
- parent.setGizmo(gizmo);\r
-\r
- component.getNoShadowRoot().attachChild(gizmo.getNode());\r
-\r
- updateGizmo(pcp);\r
- TranslateActionConstraints.addConstraints(new Resource[]{pcpResource}, detector);\r
- parent.setViewChanged(true);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- \r
- \r
- // FIXME : copy-paste from TranslateInlineAction.getTranslate()\r
- Vector3d getTranslate() {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- // Vector3d p = gizmo.getPosition();\r
- if (((TransformInlineGizmo) gizmo).isSelected()) {\r
- double s[] = new double[1];\r
-\r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight(start, dir, o, d, i2, i1, s);\r
- translate.set(dir);\r
- if (s[0] < 0.0)\r
- s[0] = 0.0;\r
- else if (s[0] > 1.0)\r
- s[0] = 1.0;\r
- translate.scale(s[0]);\r
- translate.add(start);\r
- \r
- if (useConstraints) {\r
- Vector3d t = new Vector3d(translate);\r
- // FIXME : snapped point may be outside of proper range\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- translate = new Vector3d(snap);\r
- }\r
- }\r
-\r
- return translate;\r
- }\r
- return null;\r
- }\r
- // FIXME : copy-paste from TranslateAction.getTranslate(Vector3d v)\r
- Vector3d getTranslate(PipeControlPoint pcp, Vector3d offset) {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = ((TransformGizmo)gizmo).getPosition();\r
- Vector3d dir = null;\r
- switch (((TransformGizmo)gizmo).getSelected()) {\r
- case TransformGizmo.XYZ :\r
- Vector3d normal = camera.getUnNormalizedHeading();\r
- normal.normalize();\r
- double s[] = new double[1];\r
- Vector3d r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.X :\r
- dir = new Vector3d(1.0,0.0,0.0);\r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.x = s[0];\r
- \r
- break;\r
- case TransformGizmo.Y :\r
- dir = new Vector3d(0.0,1.0,0.0);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.y = s[0];\r
- break;\r
- case TransformGizmo.Z :\r
- dir = new Vector3d(0.0,0.0,1.0);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.z = s[0];\r
- break;\r
- case TransformGizmo.XY :\r
- normal = new Vector3d(0.0,0.0,1.0);\r
- s = new double[1];\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- }\r
- break;\r
- case TransformGizmo.XZ :\r
- normal = new Vector3d(0.0,1.0,0.0);\r
- s = new double[1];\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.YZ :\r
- normal = new Vector3d(1.0,0.0,0.0);\r
- s = new double[1];\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- default :\r
- \r
- return null;\r
- }\r
- //System.out.println(translate + " " + offset);\r
- translate.sub(offset);\r
- \r
- if (useConstraints) {\r
- switch (((TransformGizmo)gizmo).getSelected()) {\r
- case TransformGizmo.X:\r
- case TransformGizmo.Y:\r
- case TransformGizmo.Z:\r
- Vector3d t = new Vector3d(translate);\r
- // TODO : to the test against all translated objects and snap to closest one\r
- Point3d pos = G3DTools.getPoint(pcp.getLocalPosition());\r
- t.add(pos);\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- // System.out.print("t: " + translate);\r
- translate = new Vector3d(snap);\r
- translate.sub(pos);\r
- // System.out.println(" " + translate);\r
- }\r
- break;\r
- \r
- }\r
- }\r
- //System.out.println(translate);\r
- return translate;\r
- }\r
- \r
- \r
- \r
- @Override\r
- public void doChanges(Graph graph) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(graph, pcpResource); \r
- if (input.mousePressed()) {\r
- if (type == LOOSE)\r
- prevTranslate = getTranslate(pcp,new Vector3d());\r
- \r
- }\r
- if (input.mouseClicked()) {\r
- //System.out.println("end");\r
- end();\r
- return;\r
- }\r
- if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- } \r
- detector.clearConstraintHighlights();\r
- parent.setViewChanged(true);\r
- \r
- \r
- Vector3d translate;\r
- if (type == CONNECTED)\r
- translate = getTranslate();\r
- else\r
- translate = getTranslate(pcp,prevTranslate);\r
- \r
- if (translate == null) {\r
- //cameraRotateAction.update();\r
- parent.getDefaultAction().update();\r
- updateGizmo(pcp);\r
- return;\r
- }\r
-\r
- String text = "";\r
- \r
- if (type == CONNECTED) {\r
- G3DTools.setTuple3(pcp.getWorldPosition(), translate);\r
- // mo.setLocalTranslation(translate);\r
- //text += GraphicsNodeTools.getWorldTranslation(mo.getGraphicsNode()) + " " + translate;// mo.getWorldPosition()\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
-\r
- } else {\r
- G3DTools.addTuple3(pcp.getWorldPosition(), translate);\r
- // mo.modifyWorldTranslation(translate);\r
- //text += GraphicsNodeTools.getWorldTranslation(mo.getGraphicsNode()) + " ";//mo.getWorldPosition() + " ";\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
- \r
- }\r
- \r
- setInfoText(text);\r
- updateGizmo(pcp);\r
-\r
- }\r
- \r
- protected void updateGizmo(PipeControlPoint pcp) {\r
- gizmo.update(G3DTools.getVector(pcp.getWorldPosition()), camera.getCameraPos(), component);\r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file