]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java
Fix directed path leg update failing to update inline lengths
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipingRules.java
index 58873b0f1003d5f64156b3c16a42def1cb8cccd4..e8e39c081d7c1461e297777bd08336335a9641e9 100644 (file)
@@ -864,7 +864,8 @@ public class PipingRules {
                double l2next = icp.getInlineLength();
                double l2 = l2prev + l2next;
                double l2s = l2 * l2;
-               if (l > l2s) {
+               double diff = l - l2s;
+               if (diff >= MIN_INLINE_LENGTH) {
                        if (allowInsertRemove) {
                                dir.normalize();
                                double length = Math.sqrt(l) - l2; // true length of the variable length component
@@ -925,12 +926,17 @@ public class PipingRules {
                }
        }
 
-       private static void ppNoOffset(UpdateStruct2 u) throws Exception {
+       /**
+        * Recalculates offset vector based on current direction, and calls checkExpandPathLeg
+        * @param u
+        * @param updateEnds
+        * @throws Exception
+        */
+       private static void ppNoOffset(UpdateStruct2 u, boolean updateEnds) throws Exception {
                if (DEBUG)
                        System.out.println("PipingRules.ppNoOffset() " + u);
                Vector3d offset = new Vector3d();
                if (u.hasOffsets) {
-                       u.dir.normalize();
                        for (PipeControlPoint icp : u.list) {
                                if (icp.isOffset()) {
                                        offset.add(icp.getSizeChangeOffsetVector(u.dir));
@@ -939,7 +945,7 @@ public class PipingRules {
                        }
                }
                u.offset = offset;
-               checkExpandPathLeg(u, PathLegUpdateType.NONE);
+               checkExpandPathLeg(u, PathLegUpdateType.NONE, updateEnds);
        }
 
        private static void ppNoDir(PipeControlPoint start, Vector3d startPoint, ArrayList<PipeControlPoint> list, PipeControlPoint end, Vector3d endPoint, boolean hasOffsets, int iter, boolean reversed, ArrayList<ExpandIterInfo> toRemove, PipeControlPoint updated) throws Exception {
@@ -949,7 +955,7 @@ public class PipingRules {
                Vector3d dir = new Vector3d();
                Vector3d offset = new Vector3d();
                hasOffsets = calculateOffset(startPoint, endPoint, start, list, end, dir, offset);
-               ppNoOffset(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, null, hasOffsets, iter, reversed, toRemove, updated));
+               ppNoOffset(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, null, hasOffsets, iter, reversed, toRemove, updated),true);
        }
 
        private static void checkExpandPathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) throws Exception {
@@ -988,16 +994,19 @@ public class PipingRules {
                        other = u.end;
                        position = u.startPoint;
                        dcpStart = true;
+                       if (!u.reversed)
+                canMoveOther = true;
                        inlineEnd = u.end.isInline();
                                
                } else {
                        dcp = u.end;
                        other = u.start;
                        position = u.endPoint;
+                       if (u.reversed)
+                canMoveOther = true;
                        inlineEnd = u.start.isInline();
                }
-               canMoveOther = !(other == u.updated);
-
+               
                Vector3d directedDirection = direction(dcp, dcpStart ? Direction.NEXT : Direction.PREVIOUS);
                if (directedDirection == null) {
                        //updateTurnControlPointTurn(dcp, dcp.getPrevious(), dcp.getNext());
@@ -1037,9 +1046,9 @@ public class PipingRules {
                    canMoveOther = true;
                }
                if (aligned) {
-                       if (u.start.isInline() || u.end.isInline() || u.start.asFixedAngle() || u.end.asFixedAngle())
-                               processPathLeg(u, true, false);
-                       checkExpandPathLeg(u, lengthChange, inlineEnd);
+                       //if (u.start.isInline() || u.end.isInline() || u.start.asFixedAngle() || u.end.asFixedAngle())
+                   //    processPathLeg(u, true, false);
+                       checkExpandPathLeg(u, lengthChange, inlineEnd || u.start.isInline() || u.end.isInline() || u.start.asFixedAngle() || u.end.asFixedAngle());
                        
                } else {
                        if (u.iter > 0) {
@@ -1075,11 +1084,11 @@ public class PipingRules {
                                                        System.out.println("PipingRules.updateDirectedPipeRun() moved end " + other + " to " + closest);
                                                other.setWorldPosition(closest);
                                                if (dcpStart) {
-                                                       ppNoOffset(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Vector3d(closest), directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated));
+                                                       ppNoOffset(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Vector3d(closest), directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated),true);
                                                        if (u.end.getNext() != null)
                                                                updatePathLegNext(u.end, u.updated, PathLegUpdateType.NEXT);
                                                } else {
-                                                       ppNoOffset(new UpdateStruct2(u.start, new Vector3d(closest), u.list, u.end, u.endPoint, directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated));
+                                                       ppNoOffset(new UpdateStruct2(u.start, new Vector3d(closest), u.list, u.end, u.endPoint, directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated),true);
                                                        if (u.start.getPrevious() != null)
                                                                updatePathLegPrev(u.start, u.updated, PathLegUpdateType.PREV);
                                                }
@@ -1286,7 +1295,7 @@ public class PipingRules {
                    R = tr / t;
                if (R <= curr)
                    break;
-               curr = R*1.01;
+               curr = R*1.001;
                iter--;
            }
            return curr;