]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java
Support for reversible in-line components
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipingRules.java
index 5ec468e27993ab8531290f18537d245225773178..3fc0488105fe8a24a8bd7197a188fb448ec3bfe7 100644 (file)
@@ -475,13 +475,19 @@ public class PipingRules {
                if (DEBUG)
                        System.out.println("PipingRules.updateInlineControlPoints() " + u);
 
-               if (!u.hasOffsets) {
-                       
-                       Vector3d start = new Vector3d(u.startPoint);
-                       Vector3d end = new Vector3d(u.endPoint);
-                       // create offsets.
+               Vector3d start = new Vector3d(u.startPoint);
+               Vector3d end = new Vector3d(u.endPoint);
+               
+               if (checkSizes) {
+                       // create offsets for leg ends.
                        MathTools.mad(start, u.dir, u.start.getInlineLength());
                        MathTools.mad(end, u.dir, -u.end.getInlineLength());
+               }
+               
+               boolean recalcline = false;
+               if (!u.hasOffsets) {
+                       
+                       
                        for (PipeControlPoint icp : u.list) {
                                updateInlineControlPoint(icp, start, end, u.dir);
                                
@@ -514,7 +520,7 @@ public class PipingRules {
                                if (icp.isVariableLength()) {
                                        if (i != pathLegPoints.size() - 1) {
                                                PipeControlPoint next = pathLegPoints.get(i + 1);
-                                               updateVariableLength(icp,  prev, next);
+                                               recalcline = recalcline | updateVariableLength(icp,  prev, next);
 
                                        } else {
                                                // this is variable length component at the end of the
@@ -532,35 +538,12 @@ public class PipingRules {
                                        // space between them.
                                        // I there is, we'll have to create new variable length
                                        // component between them.
-                                       Vector3d currentPos = icp.getWorldPosition();
-                                       Vector3d prevPos = prev.getWorldPosition();
-                                       Vector3d dir = new Vector3d(currentPos);
-                                       dir.sub(prevPos);
-                                       double l = dir.lengthSquared();
-                                       double l2prev = prev.getInlineLength();
-                                       double l2next = icp.getInlineLength();
-                                       double l2 = l2prev + l2next;
-                                       double l2s = l2 * l2;
-                                       if (l > l2s) {
-                                               if (allowInsertRemove) {
-                                                       dir.normalize();
-                                                       double length = Math.sqrt(l) - l2; // true length of the
-                                                                                                                               // variable length
-                                                                                                                               // component
-                                                       dir.scale(length * 0.5 + l2prev); // calculate center
-                                                                                                                               // position of the
-                                                                                                                               // component
-                                                       dir.add(prevPos);
-                                                       PipeControlPoint scp = insertStraight(prev, icp, dir, length);
-                                               } else {
-                                                       triedIR = true;
-                                               }
-                                       }
+                                       recalcline = recalcline | possibleVaribleLengthInsert(icp, prev);
                                }
                        }
                } else { // with offset
-                       Vector3d sp = new Vector3d(u.startPoint);
-                       Vector3d ep = new Vector3d(u.endPoint);
+                       Vector3d sp = new Vector3d(start);
+                       Vector3d ep = new Vector3d(end);
                        ep.sub(u.offset);
                        
                        ArrayList<PipeControlPoint> pathLegPoints = new ArrayList<PipeControlPoint>();
@@ -581,6 +564,9 @@ public class PipingRules {
                        }
                        pathLegPoints.add(u.end);
                        
+                       if (!checkSizes)
+                               return; 
+                       
                        sp = new Vector3d(u.startPoint);
                        ep = new Vector3d(u.endPoint);
                        ep.sub(u.offset);
@@ -597,7 +583,7 @@ public class PipingRules {
                                        if (i != pathLegPoints.size() - 1) {
                                                PipeControlPoint next;
                                                next = pathLegPoints.get(i + 1);
-                                               updateVariableLength(icp,  prev, next);
+                                               recalcline = recalcline | updateVariableLength(icp,  prev, next);
 
                                        } else {
                                                // this is variable length component at the end of the
@@ -607,7 +593,15 @@ public class PipingRules {
                                                // place, but center of the component must be moved.
                                                updateVariableLengthEnd(icp, prev);
                                        }
-                               } else if (icp.isOffset()) {
+                               } else if (!prev.isVariableLength()) {
+                                       // If this and previous control point are not variable
+                                       // length pcps, we'll have to check if there is no empty
+                                       // space between them.
+                                       // I there is, we'll have to create new variable length
+                                       // component between them.
+                                       recalcline = recalcline | possibleVaribleLengthInsert(icp, prev);
+                               }
+                               if (icp.isOffset()) {
                                        // TODO : offset vector is already calculated and should be
                                        // cached
                                        Vector3d  offset = icp.getSizeChangeOffsetVector(u.dir);
@@ -616,9 +610,13 @@ public class PipingRules {
                                }
                        }
                }
+               if (recalcline) {
+                       u.list.clear();
+                       u.start.findNextEnd(u.list);
+               }
        }
        
-       private static void updateVariableLength(PipeControlPoint icp, PipeControlPoint prev,  PipeControlPoint next) {
+       private static boolean updateVariableLength(PipeControlPoint icp, PipeControlPoint prev,  PipeControlPoint next) {
                Vector3d prevPos = prev.getWorldPosition();
                Vector3d nextPos = next.getWorldPosition();
                
@@ -649,6 +647,7 @@ public class PipingRules {
                        dir.add(prevPos);
                        icp.setWorldPosition(dir);
                        icp.setLength(length);
+                       return false;
                } else {
                        // components leave no space to the component and it
                        // must be removed
@@ -657,8 +656,39 @@ public class PipingRules {
                                if (DEBUG)
                                        System.out.println("PipingRules.updateVariableLength removing " + icp);
                                icp._remove();
+                               return true;
+                       }
+                       return false;
+               }
+       }
+       
+       private static boolean possibleVaribleLengthInsert(PipeControlPoint icp, PipeControlPoint prev) throws Exception{
+               Vector3d currentPos = icp.getWorldPosition();
+               Vector3d prevPos = prev.getWorldPosition();
+               Vector3d dir = new Vector3d(currentPos);
+               dir.sub(prevPos);
+               double l = dir.lengthSquared();
+               double l2prev = prev.getInlineLength();
+               double l2next = icp.getInlineLength();
+               double l2 = l2prev + l2next;
+               double l2s = l2 * l2;
+               if (l > l2s) {
+                       if (allowInsertRemove) {
+                               dir.normalize();
+                               double length = Math.sqrt(l) - l2; // true length of the
+                                                                                                       // variable length
+                                                                                                       // component
+                               dir.scale(length * 0.5 + l2prev); // calculate center
+                                                                                                       // position of the
+                                                                                                       // component
+                               dir.add(prevPos);
+                               PipeControlPoint scp = insertStraight(prev, icp, dir, length);
+                               return true;
+                       } else {
+                               triedIR = true;
                        }
                }
+               return false;
        }
        
        private static void updateVariableLengthEnd(PipeControlPoint icp,  PipeControlPoint prev) {
@@ -1446,8 +1476,11 @@ public class PipingRules {
                double angle = 0.0;
                if (angleO != null)
                        angle = angleO;
-
-               Quat4d q = pcp.getControlPointOrientationQuat(angle);
+               Boolean reversedO = pcp.getReversed();
+               boolean reversed = false;
+               if (reversedO != null)
+                       reversed = reversedO;
+               Quat4d q = pcp.getControlPointOrientationQuat(angle, reversed);
                pcp.setWorldOrientation(q);
        }
 
@@ -1652,9 +1685,8 @@ public class PipingRules {
                        System.out.println("Run is not connected");
                }
                for (PipeControlPoint pcp : pcps) {
-                       if (!pcp.isDirected())
-                               if (pcp.getNext() == null && pcp.getPrevious() == null)
-                                       System.out.println("Orphan " + pcp);
+                       if (!pcp.isDirected() && pcp.getNext() == null && pcp.getPrevious() == null)
+                               System.out.println("Orphan undirected " + pcp);
                }
                for (PipeControlPoint pcp : pcps) {
                        if (pcp.getParentPoint() == null) {