]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java
Simplified free ended variable length component update
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / actions / RoutePipeAction.java
index 0310311dacecbcc254a71237e82fb22bceb977ef..509ab38cce6e9120f94a1e732768b4af0f993e64 100644 (file)
@@ -18,9 +18,9 @@ import org.simantics.g3d.scenegraph.NodeMap;
 import org.simantics.g3d.scenegraph.base.INode;
 import org.simantics.g3d.tools.ConstraintDetector;
 import org.simantics.g3d.tools.DummyConstraintDetector;
-import org.simantics.g3d.vtk.action.vtkAction;
-import org.simantics.g3d.vtk.common.InteractiveVtkPanel;
 import org.simantics.g3d.vtk.gizmo.TranslateAxisGizmo;
+import org.simantics.g3d.vtk.swt.InteractiveVtkComposite;
+import org.simantics.g3d.vtk.swt.vtkSwtAction;
 import org.simantics.g3d.vtk.utils.vtkUtil;
 import org.simantics.plant3d.Activator;
 import org.simantics.plant3d.gizmo.SplitPointSelectionGizmo;
@@ -38,14 +38,13 @@ import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.Direction;
 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType;
 import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
 import org.simantics.plant3d.utils.ComponentUtils;
-import org.simantics.utils.threads.AWTThread;
 import org.simantics.utils.threads.ThreadUtils;
 import org.simantics.utils.ui.ExceptionUtils;
 
 import vtk.vtkProp;
 import vtk.vtkTextActor;
 
-public class RoutePipeAction extends vtkAction {
+public class RoutePipeAction extends vtkSwtAction {
        enum LockType {
                X, Y, Z, XY, YZ, XZ, NONE, CUSTOM
        };
@@ -87,7 +86,7 @@ public class RoutePipeAction extends vtkAction {
     private Set<PositionType> allowed = new HashSet<PositionType>();
     
        
-       public RoutePipeAction(InteractiveVtkPanel panel, P3DRootNode root) {
+       public RoutePipeAction(InteractiveVtkComposite panel, P3DRootNode root) {
                super(panel);
                this.root = root;
                setText("Route Pipe");
@@ -112,10 +111,10 @@ public class RoutePipeAction extends vtkAction {
        public void deattach() {
                deactivate();
                startComponent = null;
-               nodeMap.commit();
+               nodeMap.commit("Route pipe");
                deattachUI();
                super.deattach();
-               panel.repaint();
+               panel.refresh();
        }
        
        public void attach() {
@@ -123,7 +122,7 @@ public class RoutePipeAction extends vtkAction {
                        return;
                
                super.attach();
-               ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
+               ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() {
                        public void run() {
 //                             attachUI();
                                try {
@@ -145,6 +144,7 @@ public class RoutePipeAction extends vtkAction {
        
        private void deattachUI() {
                //panel.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+               panel.lock();
                if (translateAxisGizmo.isAttached())
                        translateAxisGizmo.deattach();
                if (splitPointSelectionGizmo.isAttached())
@@ -152,16 +152,17 @@ public class RoutePipeAction extends vtkAction {
                if (terminalSelectionGizmo.isAttached())
                        terminalSelectionGizmo.deattach();
                if (infoActor != null) {
-                       panel.GetRenderer().RemoveActor(infoActor);
+                       panel.getRenderer().RemoveActor(infoActor);
                        infoActor.Delete();
                        infoActor = null;
                }
+               panel.unlock();
        }
        
        private List<PipelineComponent> added = new ArrayList<PipelineComponent>();
        
        @Override
-       public void keyPressed(KeyEvent e) {
+       public boolean keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
                        panel.useDefaultAction();
                if (lock != LockType.CUSTOM) {
@@ -223,12 +224,12 @@ public class RoutePipeAction extends vtkAction {
                
                
                update();
-               
+               return true;
        }
        
        
        private void update() {
-               panel.repaint();
+               panel.refresh();
        }
        private void update(double x, double y) {
                switch (state) {
@@ -276,9 +277,9 @@ public class RoutePipeAction extends vtkAction {
                        return;
                } else {
                        terminalSelectionGizmo.setComponent(startComponent, allowed);
-                       terminalSelectionGizmo.attach(panel.GetRenderer());
+                       terminalSelectionGizmo.attach(panel);
                        state = ToolState.SELECTING_POSITION;
-                       panel.repaint();
+                       update();
                }
                
        }
@@ -356,7 +357,7 @@ public class RoutePipeAction extends vtkAction {
                                straightCP.setNext(start);
                        }
                }
-               translateAxisGizmo.attach(panel.GetRenderer());
+               translateAxisGizmo.attach(panel);
                setPreviousPosition(previousPosition);
                updateCurrentPoint();
        }
@@ -402,7 +403,7 @@ public class RoutePipeAction extends vtkAction {
                        
                }
                
-               translateAxisGizmo.attach(panel.GetRenderer());
+               translateAxisGizmo.attach(panel);
                setPreviousPosition(previousPosition);
                updateCurrentPoint();
        }
@@ -412,7 +413,7 @@ public class RoutePipeAction extends vtkAction {
                Point3d p2 = new Point3d();
                start.getInlineControlPointEnds(p1, p2);
                splitPointSelectionGizmo.setSplit(p1, p2);
-               splitPointSelectionGizmo.attach(panel.GetRenderer());
+               splitPointSelectionGizmo.attach(panel);
                state = ToolState.SELECTING_SPLIT;
        }
        public void deactivate() {
@@ -475,24 +476,26 @@ public class RoutePipeAction extends vtkAction {
        }
        
        @Override
-       public void mousePressed(MouseEvent e) {
+       public boolean mousePressed(MouseEvent e) {
                if (useDefault) {
-                       panel.getDefaultAction().mousePressed(e);
+                       getDefaultAction().mousePressed(e);
                }
+               return true;
        }
 
        @Override
-       public void mouseReleased(MouseEvent e) {
+       public boolean mouseReleased(MouseEvent e) {
                if (useDefault) {
-                       panel.getDefaultAction().mouseReleased(e);
+                       getDefaultAction().mouseReleased(e);
                }
+               return true;
        }
        
        @Override
-       public void mouseClicked(MouseEvent e) {
+       public boolean mouseClicked(MouseEvent e) {
                if (useDefault) {
-                       panel.getDefaultAction().mouseClicked(e);
-                       return;
+                       getDefaultAction().mouseClicked(e);
+                       return true;
                }
                if (state == ToolState.ROUTING) {
                        try {
@@ -528,7 +531,8 @@ public class RoutePipeAction extends vtkAction {
                } else if (state == ToolState.SELECTING_POSITION) {
                        if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {
                                int type = panel.getPickType();
-                               panel.setPickType(0);
+                               //panel.setPickType(0);
+                               panel.setPickType(5);
                                vtkProp[] picked = panel.pick(e.getX(), e.getY());
                                panel.setPickType(type);
                                PositionType position = terminalSelectionGizmo.getPickedPosition(picked);
@@ -555,7 +559,7 @@ public class RoutePipeAction extends vtkAction {
                                splitPointSelectionGizmo.deattach();
                                if (t == null) {
                                        panel.useDefaultAction();
-                                       return;
+                                       return true;
                                }
                                try {
                                        Vector3d pos = new Vector3d(t);
@@ -579,7 +583,7 @@ public class RoutePipeAction extends vtkAction {
                                }
                        }
                }
-               
+               return true;
        }
        
        private InlineComponent createBranchSplit(InlineComponent component, Vector3d pos) throws Exception{
@@ -594,19 +598,21 @@ public class RoutePipeAction extends vtkAction {
        }
        
        @Override
-       public void mouseMoved(MouseEvent e) {
+       public boolean mouseMoved(MouseEvent e) {
                if (useDefault) {
-                       panel.getDefaultAction().mouseMoved(e);
-                       return;
+                       getDefaultAction().mouseMoved(e);
+                       return true;
                }
                step = ((e.getModifiers() & MouseEvent.CTRL_DOWN_MASK) > 0);
                update(e.getX(), e.getY());
+               return true;
        }
        
        @Override
-       public void mouseDragged(MouseEvent e) {
+       public boolean mouseDragged(MouseEvent e) {
                if (useDefault)
-                       panel.getDefaultAction().mouseDragged(e);
+                       getDefaultAction().mouseDragged(e);
+               return true;
        }
        
 
@@ -644,7 +650,7 @@ public class RoutePipeAction extends vtkAction {
                endType = null;
                endPort = null;
 
-               Ray ray = vtkUtil.createMouseRay(panel.GetRenderer(),x, y);
+               Ray ray = vtkUtil.createMouseRay(panel.getRenderer(),x, y);
                Vector3d o = new Vector3d(ray.pos);
                Vector3d d = ray.dir;
                
@@ -709,11 +715,7 @@ public class RoutePipeAction extends vtkAction {
                    updateRoute(o,d);
                }
                  
-               panel.repaint();
-               
-
-        
-               
+               panel.refresh();
            }
            
            private boolean updateCurrentPoint(Vector3d o, Vector3d d) {
@@ -757,7 +759,7 @@ public class RoutePipeAction extends vtkAction {
                    MathTools.intersectStraightPlane(o, d, point, new Vector3d(1.0,0.0,0.0), currentPosition);
                    break;
                case NONE:
-                       Vector3d normal = new Vector3d(panel.GetRenderer().GetActiveCamera().GetDirectionOfProjection());
+                       Vector3d normal = new Vector3d(panel.getRenderer().GetActiveCamera().GetDirectionOfProjection());
                    normal.normalize();
                    
                    MathTools.intersectStraightPlane(o, d, point, normal, currentPosition);
@@ -830,7 +832,7 @@ public class RoutePipeAction extends vtkAction {
 
                                
                        infoActor.SetPosition(10,10);
-                               panel.GetRenderer().AddActor(infoActor);
+                               panel.getRenderer().AddActor(infoActor);
                }
                infoActor.SetInput(text);
            }
@@ -1059,16 +1061,19 @@ public class RoutePipeAction extends vtkAction {
             * Updates tool graphics for current point 
             */
            private void updateCurrentPoint() {
-//             PipeComponentProvider.createStraightEdges(pipeShapes.get(pipeShapes.size() - 1), controlPoints.get(controlPoints.size() - 1), currentPoint, pipeDiameter*0.5);
                InlineComponent straight = (InlineComponent)added.get(added.size()-1);
-               // FIXME : does not take account space the the previous elbow reserves. 
+               // TODO: the inline length is from previous update step. 
+               double l = straight.getPrevious().getControlPoint().getInlineLength();
                Vector3d v = new Vector3d();
                v.sub(currentPosition, previousPosition);
                double length = v.length();
-               v.scale(0.5);
-               v.add(previousPosition);
-               straight.getControlPoint().setWorldPosition(v);
-               straight.getControlPoint().setLength(length);
+               if (length > MathTools.NEAR_ZERO) {
+               v.scale(1.0/length);
+               v.scale(0.5*(length+l));
+               v.add(previousPosition);
+               straight.getControlPoint().setWorldPosition(v);
+               straight.getControlPoint().setLength(length);
+               }
                try {
                                PipingRules.positionUpdate(straight.getControlPoint(),false);
                        } catch (Exception e) {