]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/actions/TranslateInlineAction.java
Remove dependencies on log4j
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / actions / TranslateInlineAction.java
1 package org.simantics.plant3d.actions;
2
3 import java.awt.event.KeyEvent;
4 import java.awt.event.MouseEvent;
5
6 import javax.vecmath.Point3d;
7 import javax.vecmath.Vector3d;
8
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;
21
22 public class TranslateInlineAction extends TranslateAction {
23
24         private boolean inline;
25
26         private Vector3d s;
27         private Vector3d e;
28         private Vector3d dir;
29
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"));
34         }
35
36         @Override
37         public void setNode(IG3DNode node) {
38                 super.setNode(node);
39                 if (node instanceof InlineComponent) {
40                         InlineComponent comp = (InlineComponent) node;
41                         if (comp.isVariableLength()) {
42                                 setEnabled(false);
43                         } else if (comp.getNext() == null || comp.getPrevious() == null) {
44                                 setEnabled(true);
45                                 inline = false;
46                                 dir = comp.getControlPoint().getInlineDir();
47                                 dir.normalize();
48                         } else {
49                                 setEnabled(true);
50                                 inline = true;
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).
56                                         setEnabled(false);
57                                         return;
58                                 }
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();
65                                 }
66                                 Point3d ns = new Point3d();
67                                 Point3d ne = new Point3d();
68                                 Point3d ps = new Point3d();
69                                 Point3d pe = new Point3d();
70                                 next.getEnds(ns, ne);
71                                 prev.getEnds(ps, pe);
72                                 dir = comp.getControlPoint().getInlineDir();
73                                 // We may have offsets in the path leg, hence we have to project the
74                                 // coordinates.
75                                 Vector3d wp = node.getWorldPosition();
76                                 if (prev.getControlPoint().isVariableLength())
77                                         s = MathTools.closestPointOnStraight(ps, wp, dir);
78                                 else
79                                         s = MathTools.closestPointOnStraight(pe, wp, dir);
80                                 if (next.getControlPoint().isVariableLength())
81                                         e = MathTools.closestPointOnStraight(ne, wp, dir);
82                                 else
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);
87                                 ld.scale(l);
88                                 s.add(ld);
89                                 e.sub(ld);
90                         }
91                 } else {
92                         setEnabled(false);
93                 }
94         }
95
96         @Override
97         protected void createAxisSelection(ToolComposite toolComposite) {
98                 // No axis selection for inline components
99         }
100
101         @Override
102         public boolean keyPressed(KeyEvent e) {
103                 if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
104                         panel.useDefaultAction();
105                 if (!inline) {
106                         return super.keyPressed(e);
107                 } else {
108                         if (valid)
109                                 return true;
110
111                         update();
112                         return true;
113                 }
114         }
115
116         @Override
117         public void setWorldCoord(boolean b) {
118
119         }
120
121         @Override
122         public boolean mouseDragged(MouseEvent e) {
123                 // if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) > 0 && valid) {
124                 if (e.getButton() == MouseEvent.BUTTON1 && valid) {
125                         if (inline) {
126                                 Vector3d translate = getTranslate(e.getX(), e.getY(), prevTranslate);
127                                 // System.out.println("translate " + translate);
128                                 if (translate == null)
129                                         return true;
130                                 // boolean step = ((e.getModifiers() & MouseEvent.CTRL_MASK) > 0);
131                                 Vector3d pos = new Vector3d(node.getWorldPosition());
132
133 //                      System.out.println(pos + " " + translate);
134                                 // pos.add(translate);
135                                 pos.set(translate);
136                                 // pos = constaints(pos, step);
137                                 setWorldPos(pos);
138                                 update();
139                         } else {
140                                 super.mouseDragged(e);
141                         }
142                 } else {
143                         getDefaultAction().mouseDragged(e);
144                         update();
145                 }
146                 return true;
147         }
148
149         protected Vector3d getTranslate(double x, double y, Vector3d offset) {
150
151                 Ray ray = vtkUtil.createMouseRay(panel.getRenderer(), x, y);
152
153                 Vector3d p = node.getWorldPosition();
154
155                 if (inline) {
156                         Vector3d i1 = new Vector3d();
157                         Vector3d i2 = new Vector3d();
158
159                         double mu[] = new double[2];
160                         MathTools.intersectStraightStraight(p, dir, ray.pos, ray.dir, i2, i1, mu);
161
162                         Vector3d t = MathTools.closestPointOnEdge(i1, s, e);
163                         return t;
164                 } else {
165                         return super.getTranslate(x, y, offset);
166                 }
167
168         }
169
170 }