1 package org.simantics.plant3d.actions;
3 import java.awt.event.KeyEvent;
4 import java.awt.event.MouseEvent;
6 import javax.vecmath.Point3d;
7 import javax.vecmath.Vector3d;
9 import org.simantics.g3d.math.MathTools;
10 import org.simantics.g3d.math.Ray;
11 import org.simantics.g3d.scenegraph.IG3DNode;
12 import org.simantics.g3d.scenegraph.base.INode;
13 import org.simantics.g3d.toolbar.ToolComposite;
14 import org.simantics.g3d.vtk.common.VTKNodeMap;
15 import org.simantics.g3d.vtk.swt.InteractiveVtkComposite;
16 import org.simantics.g3d.vtk.swt.TranslateAction;
17 import org.simantics.g3d.vtk.utils.vtkUtil;
18 import org.simantics.plant3d.Activator;
19 import org.simantics.plant3d.scenegraph.InlineComponent;
20 import org.simantics.plant3d.scenegraph.PipelineComponent;
22 public class TranslateInlineAction extends TranslateAction {
24 private boolean inline;
30 public TranslateInlineAction(InteractiveVtkComposite panel, VTKNodeMap<?, ? extends INode> nodeMap,
31 ToolComposite toolComposite) {
32 super(panel, nodeMap, toolComposite);
33 setImageDescriptor(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_refresh.png"));
37 public void setNode(IG3DNode node) {
39 if (node instanceof InlineComponent) {
40 InlineComponent comp = (InlineComponent) node;
41 if (comp.isVariableLength()) {
43 } else if (comp.getNext() == null || comp.getPrevious() == null) {
46 dir = comp.getControlPoint().getInlineDir();
51 PipelineComponent prev = comp.getPrevious();
52 PipelineComponent next = comp.getNext();
53 if (prev == null || next == null) {
54 // TODO : we should support open ended translation (when translated component is
55 // the first or last of the run).
59 if (prev.getControlPoint().isInline() && !prev.getControlPoint().isFixedLength()
60 && prev.getPrevious() != null)
61 prev = prev.getPrevious();
62 if (next.getControlPoint().isInline() && !next.getControlPoint().isFixedLength()
63 && next.getNext() != null) {
64 next = next.getNext();
66 Point3d ns = new Point3d();
67 Point3d ne = new Point3d();
68 Point3d ps = new Point3d();
69 Point3d pe = new Point3d();
72 dir = comp.getControlPoint().getInlineDir();
73 // We may have offsets in the path leg, hence we have to project the
75 Vector3d wp = node.getWorldPosition();
76 if (prev.getControlPoint().isVariableLength())
77 s = MathTools.closestPointOnStraight(ps, wp, dir);
79 s = MathTools.closestPointOnStraight(pe, wp, dir);
80 if (next.getControlPoint().isVariableLength())
81 e = MathTools.closestPointOnStraight(ne, wp, dir);
83 e = MathTools.closestPointOnStraight(ns, wp, dir);
84 // Remove component's own space from end points to get actual movement range
85 double l = comp.getControlPoint().getInlineLength();
86 Vector3d ld = new Vector3d(dir);
97 protected void createAxisSelection(ToolComposite toolComposite) {
98 // No axis selection for inline components
102 public boolean keyPressed(KeyEvent e) {
103 if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
104 panel.useDefaultAction();
106 return super.keyPressed(e);
117 public void setWorldCoord(boolean b) {
122 public boolean mouseDragged(MouseEvent e) {
123 // if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) > 0 && valid) {
124 if (e.getButton() == MouseEvent.BUTTON1 && valid) {
126 Vector3d translate = getTranslate(e.getX(), e.getY(), prevTranslate);
127 // System.out.println("translate " + translate);
128 if (translate == null)
130 // boolean step = ((e.getModifiers() & MouseEvent.CTRL_MASK) > 0);
131 Vector3d pos = new Vector3d(node.getWorldPosition());
133 // System.out.println(pos + " " + translate);
134 // pos.add(translate);
136 // pos = constaints(pos, step);
140 super.mouseDragged(e);
143 getDefaultAction().mouseDragged(e);
149 protected Vector3d getTranslate(double x, double y, Vector3d offset) {
151 Ray ray = vtkUtil.createMouseRay(panel.getRenderer(), x, y);
153 Vector3d p = node.getWorldPosition();
156 Vector3d i1 = new Vector3d();
157 Vector3d i2 = new Vector3d();
159 double mu[] = new double[2];
160 MathTools.intersectStraightStraight(p, dir, ray.pos, ray.dir, i2, i1, mu);
162 Vector3d t = MathTools.closestPointOnEdge(i1, s, e);
165 return super.getTranslate(x, y, offset);