]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java
SCL function for connecting pipeline components
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / actions / RoutePipeAction.java
index 17455a328b0797cef34dc296d560aff852090ea7..be82d85e3cd808eadd93be549d79724ac32cb94b 100644 (file)
@@ -2,6 +2,7 @@ package org.simantics.plant3d.actions;
 
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -303,7 +304,7 @@ public class RoutePipeAction extends vtkSwtAction {
                        if (startComponent instanceof InlineComponent) {
                                direction = startComponent.getControlPoint().getPathLegDirection(reversed ? Direction.PREVIOUS : Direction.NEXT);
                                lock = LockType.CUSTOM;
-                               if (startComponent.getType().equals(Plant3D.URIs.Builtin_Straight)) {
+                               if (((InlineComponent) startComponent).isVariableLength()) {
                                        startWithTurn = true;
                                        direction = null;
                                        lock = LockType.NONE;
@@ -491,6 +492,14 @@ public class RoutePipeAction extends vtkSwtAction {
                return true;
        }
        
+       @Override
+       public boolean mouseWheelMoved(MouseWheelEvent e) {
+           if (useDefault) {
+            getDefaultAction().mouseWheelMoved(e);
+        }
+        return true;
+       }
+       
        @Override
        public boolean mouseClicked(MouseEvent e) {
                if (useDefault) {
@@ -563,7 +572,7 @@ public class RoutePipeAction extends vtkSwtAction {
                                }
                                try {
                                        Vector3d pos = new Vector3d(t);
-                                       InlineComponent branchSplit = createBranchSplit((InlineComponent)startComponent, pos);
+                                       InlineComponent branchSplit = ComponentUtils.createBranchSplit((InlineComponent)startComponent, pos);
                                        PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
                                        reversed = false;
                                        PipeRun newRun = new PipeRun();
@@ -586,24 +595,13 @@ public class RoutePipeAction extends vtkSwtAction {
                return true;
        }
        
-       private InlineComponent createBranchSplit(InlineComponent component, Vector3d pos) throws Exception{
-               InlineComponent branchSplit = ComponentUtils.createBranchSplit(root);
-               String branchName = component.getPipeRun().getUniqueName("Branch");
-               branchSplit.setName(branchName);
-               component.getPipeRun().addChild(branchSplit);
-               PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
-               branchSplitCP.setWorldPosition(pos);
-               PipingRules.splitVariableLengthComponent(branchSplit, component, false);
-               return branchSplit;
-       }
-       
        @Override
        public boolean mouseMoved(MouseEvent e) {
                if (useDefault) {
                        getDefaultAction().mouseMoved(e);
                        return true;
                }
-               step = ((e.getModifiers() & MouseEvent.CTRL_DOWN_MASK) > 0);
+               step = ((e.getModifiers() & MouseEvent.CTRL_MASK) > 0);
                update(e.getX(), e.getY());
                return true;
        }
@@ -699,7 +697,7 @@ public class RoutePipeAction extends vtkSwtAction {
                                  }
                          } else {  
                                  if (hoverObject instanceof InlineComponent && ((InlineComponent)hoverObject).isVariableLength() && (endType = endingLockToStraight(hoverObject,mu)) != null) {
-                                         endTo = (InlineComponent)hoverObject;;
+                                         endTo = (InlineComponent)hoverObject;
                                  } else if (hoverObject instanceof Nozzle && endingLockToNozzle(hoverObject)) {
                                          endTo = (Nozzle)hoverObject;
                                  } else if ((hoverObject instanceof PipelineComponent) &&  ((endPort = endingLockToComponent(hoverObject)) != null)) {
@@ -809,6 +807,23 @@ public class RoutePipeAction extends vtkSwtAction {
                    s += detector.getSnapString();
 
                }
+               //System.out.println(previousPosition + " -> " + currentPosition);
+//             double dist = MathTools.distance(previousPosition, currentPosition);
+//             if (dist < pipeRun.getTurnRadius()) {
+//                 s += "Too close";
+//                 Vector3d v = new Vector3d(currentPosition);
+//                 v.sub(previousPosition);
+//                 double vl = v.length();
+//                 if (vl > MathTools.NEAR_ZERO) {
+//                     v.scale(1.0/vl);
+//                 } else {
+//                     
+//                     return;
+//                 }
+//                 v.scale(pipeRun.getTurnRadius());
+//                 v.add(previousPosition);
+//                 currentPosition.set(v);
+//             }
                
                updateCurrentPoint();
                s += currentPosition.toString();
@@ -864,7 +879,7 @@ public class RoutePipeAction extends vtkSwtAction {
                String info = "";
                Point3d sStart = new Point3d();
                Point3d sEnd = new Point3d();
-               s.getControlPointEnds(sStart, sEnd);
+               s.getEnds(sStart, sEnd);
                //detector.clearConstraintHighlights();
                
                Point3d previousPipePoint = new Point3d(previousPosition);
@@ -963,8 +978,8 @@ public class RoutePipeAction extends vtkSwtAction {
            
            private PositionType endingLockToStraight(INode straightNode, double mu[]) {
                InlineComponent s = (InlineComponent)straightNode;
-               Point3d sStart = new Point3d();//G3DTools.getPoint(s.getHasControlPoint().getPreviousPoint().getLocalPosition());
-               Point3d sEnd = new Point3d(); //G3DTools.getPoint(s.getHasControlPoint().getNextPoint().getLocalPosition());
+               Point3d sStart = new Point3d();
+               Point3d sEnd = new Point3d(); 
                s.getControlPoint().getInlineControlPointEnds(sStart, sEnd);  
                Vector3d sDir = new Vector3d(sEnd);
                sDir.sub(sStart);
@@ -979,7 +994,7 @@ public class RoutePipeAction extends vtkSwtAction {
                routePoint.sub(branchPoint);
                // startPoint of branch must be between pipe ends
                // TODO : take account sizes of elbows (or other components)
-               // branch point must be between pipe ends and intersection points must be quite close to each othert
+               // branch point must be between pipe ends and intersection points must be quite close to each other
                if (mu[0] > 0.0 && mu[0] < 1.0 && routePoint.lengthSquared() < BRANCH_SNAP_DISTANCE) {
                    currentPosition.set(branchPoint);
                    
@@ -1061,16 +1076,19 @@ public class RoutePipeAction extends vtkSwtAction {
             * 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) {
@@ -1110,80 +1128,7 @@ public class RoutePipeAction extends vtkSwtAction {
                state = ToolState.NOT_ACTIVE;
                 
                if (endTo != null) {
-                       PipeControlPoint endCP = endTo.getControlPoint();
-                       if (endType == null || endType == PositionType.NEXT || endType == PositionType.PREVIOUS) {
-                               
-                               PipelineComponent current = getLast();
-                               PipeControlPoint currentCP = current.getControlPoint();
-                               
-                               boolean requiresReverse = false;
-                               if (!reversed && endCP.getPrevious() != null) {
-                                       requiresReverse = true;
-                               } else if (reversed && endCP.getNext() != null) {
-                                       requiresReverse = true;
-                               }
-                               PipeRun other = endCP.getPipeRun();
-                               boolean mergeRuns = pipeRun.equalSpecs(other);
-                               
-                               if (requiresReverse) {
-                                       // Pipe line must be traversible with next/previous relations without direction change.
-                                       // Now the component, where we are connecting the created pipeline is defined in different order.
-                                       PipingRules.reverse(other);
-                                       
-                               }
-                               if (mergeRuns) {
-                                       // Runs have compatible specs and must be merged
-                                       if (pipeRun != other) // FIXME: temporary workaround.
-                                               PipingRules.merge(pipeRun, other);
-                                       if (!reversed) {
-                                               currentCP.setNext(endCP);
-                                               endCP.setPrevious(currentCP);
-                                       } else {
-                                               currentCP.setPrevious(endCP);
-                                               endCP.setNext(currentCP);
-                                       }
-                               } else {
-                                       // Runs do not have compatible specs, and a reducer must be attached in between.
-                                       InlineComponent reducer = ComponentUtils.createReducer(root);
-                                       PipeControlPoint pcp = reducer.getControlPoint();
-                                       PipeControlPoint ocp = pcp.getSubPoint().get(0);
-                                       
-                                       Vector3d endPos = endCP.getWorldPosition();
-                                       Vector3d currentPos = currentCP.getWorldPosition();
-                                       Vector3d v = new Vector3d(endPos);
-                                       v.sub(currentPos);
-                                       v.scale(0.5);
-                                       v.add(currentPos);
-                                       
-                                       PipingRules.addSizeChange(reversed, pipeRun, other, reducer, currentCP, endCP);
-                                       
-                                       pcp.setWorldPosition(v);
-                                       reducer.updateParameters();
-                               }
-                               
-                       } else if (endType == PositionType.SPLIT) {
-                               InlineComponent branchSplit = createBranchSplit((InlineComponent)endTo, currentPosition);
-                                       PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
-                                       PipeControlPoint pcp = new PipeControlPoint(branchSplit,pipeRun);
-                                       branchSplitCP.children.add(pcp);
-                                       pcp.parent = branchSplitCP;
-                                       pcp.setWorldOrientation(branchSplitCP.getWorldOrientation());
-                                       pcp.setWorldPosition(branchSplitCP.getWorldPosition());
-                                       
-                                       PipelineComponent current = getLast();
-                               PipeControlPoint currentCP = current.getControlPoint();
-                               
-                               
-                               if(!reversed) {
-                                       pcp.setPrevious(currentCP);
-                                       currentCP.setNext(pcp);
-                               } else {
-                                       pcp.setNext(currentCP);
-                                       currentCP.setPrevious(pcp);
-                               }
-                                       
-                       }
-                       PipingRules.positionUpdate(endCP);
+                   ComponentUtils.connect(getLast(), endTo, endType, currentPosition);
                }
                panel.useDefaultAction();
            }