X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2Fcontrolpoint%2FPipingRules.java;h=a0ff359e8479a8c0f2b23889aee55ef7dd28018e;hb=c107c8c7654c47da1cbc57336a524efe0f48d77a;hp=7b0d3bf7bd31682d2d25dcc1be431cc8c03f75aa;hpb=011a16274c3209e40ec885b82c3f295020729a3a;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java index 7b0d3bf7..a0ff359e 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java @@ -53,8 +53,8 @@ public class PipingRules { public static void requestUpdate(PipeControlPoint pcp) { if (DEBUG) System.out.println("PipingRules request " + pcp); synchronized (updateMutex) { - if (!requestUpdates.contains(pcp)) - requestUpdates.add(pcp); + if (!requestUpdates.contains(pcp)) + requestUpdates.add(pcp); } } @@ -64,19 +64,19 @@ public class PipingRules { List temp = new ArrayList(requestUpdates.size()); synchronized(updateMutex) { - temp.addAll(requestUpdates); - requestUpdates.clear(); + temp.addAll(requestUpdates); + requestUpdates.clear(); } synchronized (ruleMutex) { - currentUpdates.clear(); - currentUpdates.addAll(temp); - // TODO : we should remove already processed control points from currentUpdates after each _positionUpdate call. - for (PipeControlPoint pcp : currentUpdates) - _positionUpdate(pcp, true); - currentUpdates.clear(); - } + currentUpdates.clear(); + currentUpdates.addAll(temp); + // TODO : we should remove already processed control points from currentUpdates after each _positionUpdate call. + for (PipeControlPoint pcp : currentUpdates) + _positionUpdate(pcp, true); + currentUpdates.clear(); + } synchronized(updateMutex) { - requestUpdates.removeAll(temp); + requestUpdates.removeAll(temp); } return true; @@ -88,13 +88,13 @@ public class PipingRules { } public static boolean positionUpdate(PipeControlPoint pcp, boolean allowIR) throws Exception { - synchronized (ruleMutex) { - currentUpdates.add(pcp); - boolean b = _positionUpdate(pcp, allowIR); - currentUpdates.clear(); - return b; - } - + synchronized (ruleMutex) { + currentUpdates.add(pcp); + boolean b = _positionUpdate(pcp, allowIR); + currentUpdates.clear(); + return b; + } + } private static boolean _positionUpdate(PipeControlPoint pcp, boolean allowIR) throws Exception { @@ -297,26 +297,26 @@ public class PipingRules { private static void updatePathLegNext(PipeControlPoint start, PipeControlPoint updated, PathLegUpdateType lengthChange) throws Exception { - UpdateStruct2 us = createUS(start, Direction.NEXT, 0, new ArrayList(), updated); - if (lengthChange == PathLegUpdateType.NONE) { - if (start.equals(updated)) - lengthChange = PathLegUpdateType.NEXT; - else if (us.end.equals(updated)) - lengthChange = PathLegUpdateType.PREV; - } + UpdateStruct2 us = createUS(start, Direction.NEXT, 0, new ArrayList(), updated); + if (lengthChange == PathLegUpdateType.NONE) { + if (start.equals(updated)) + lengthChange = PathLegUpdateType.NEXT; + else if (us.end.equals(updated)) + lengthChange = PathLegUpdateType.PREV; + } updatePathLeg(us, lengthChange); } private static void updatePathLegPrev(PipeControlPoint start, PipeControlPoint updated, PathLegUpdateType lengthChange) throws Exception { // TODO: this method is not symmetric with updatePathLegNext, which may alter lengthChange parameter? - UpdateStruct2 us = createUS(start, Direction.PREVIOUS, 0, new ArrayList(), updated); + UpdateStruct2 us = createUS(start, Direction.PREVIOUS, 0, new ArrayList(), updated); // if (lengthChange == PathLegUpdateType.NONE) { // if (start.equals(updated)) // lengthChange = PathLegUpdateType.NEXT; // else if (us.end.equals(updated)) // lengthChange = PathLegUpdateType.PREV; // } - updatePathLeg(us, lengthChange); + updatePathLeg(us, lengthChange); } private static class UpdateStruct2 { @@ -417,48 +417,48 @@ public class PipingRules { } private static UpdateStruct2 createUS(PipeControlPoint start, Direction direction, int iter, ArrayList toRemove, PipeControlPoint updated) { - ArrayList list = new ArrayList(); - PipeControlPoint end = null; - if (direction == Direction.NEXT) { - end = start.findNextEnd(list); - } else { - ArrayList prevList = new ArrayList(); - PipeControlPoint tend = start.findPreviousEnd(prevList); - for (PipeControlPoint icp : prevList) { - if (icp.isDualSub()) { - list.add(0, icp.getParentPoint()); - } else { - list.add(0, icp); - } - } - end = start; - start = tend; - } - if (start == end) - return null; - boolean hasOffsets = false; - Vector3d offset = new Vector3d(); - Vector3d startPoint = start.getWorldPosition(); - Vector3d endPoint = end.getWorldPosition(); - Vector3d dir = new Vector3d(); - hasOffsets = calculateOffset(startPoint, endPoint, list, dir, offset); - return new UpdateStruct2(start, startPoint, list, end, endPoint, dir, offset, hasOffsets, iter, direction == Direction.PREVIOUS, toRemove, updated); + ArrayList list = new ArrayList(); + PipeControlPoint end = null; + if (direction == Direction.NEXT) { + end = start.findNextEnd(list); + } else { + ArrayList prevList = new ArrayList(); + PipeControlPoint tend = start.findPreviousEnd(prevList); + for (PipeControlPoint icp : prevList) { + if (icp.isDualSub()) { + list.add(0, icp.getParentPoint()); + } else { + list.add(0, icp); + } + } + end = start; + start = tend; + } + if (start == end) + return null; + boolean hasOffsets = false; + Vector3d offset = new Vector3d(); + Vector3d startPoint = start.getWorldPosition(); + Vector3d endPoint = end.getWorldPosition(); + Vector3d dir = new Vector3d(); + hasOffsets = calculateOffset(startPoint, endPoint, list, dir, offset); + return new UpdateStruct2(start, startPoint, list, end, endPoint, dir, offset, hasOffsets, iter, direction == Direction.PREVIOUS, toRemove, updated); } private static boolean asDirected(PipeControlPoint pcp, Direction direction) { - if (pcp.isDirected()) - return true; - if (pcp.isTurn() && pcp.isFixed()) { - if (!pcp._getReversed()) - return direction == Direction.NEXT; - else - return direction == Direction.PREVIOUS; - } - return false; + if (pcp.isDirected()) + return true; + if (pcp.isTurn() && pcp.isFixed()) { + if (!pcp._getReversed()) + return direction == Direction.NEXT; + else + return direction == Direction.PREVIOUS; + } + return false; } private static Vector3d direction(PipeControlPoint pcp, Direction direction) { - return pcp.getDirection(direction); + return pcp.getDirection(direction); } private static void updatePathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) throws Exception { @@ -593,8 +593,8 @@ public class PipingRules { PipeControlPoint icp = pathLegPoints.get(i); PipeControlPoint prev = i > 0 ? pathLegPoints.get(i - 1) : null; - PipeControlPoint next = i < pathLegPoints.size() - 1 ? pathLegPoints.get(i + 1) : null; - + PipeControlPoint next = i < pathLegPoints.size() - 1 ? pathLegPoints.get(i + 1) : null; + if (prev != null && prev.isDualInline()) prev = prev.getSubPoint().get(0); @@ -710,49 +710,49 @@ public class PipingRules { } private static void updateVariableLengthEnd(PipeControlPoint icp, PipeControlPoint prev) { - Vector3d currentPos = icp.getWorldPosition(); - Vector3d prevPos = prev.getWorldPosition(); - - Vector3d dir = new Vector3d(); - dir.sub(currentPos, prevPos); - - boolean simple = currentUpdates.contains(icp); - if (simple) { - // Update based on position -> adjust length - double currentLength = (dir.length() - prev.getInlineLength()) * 2.0; - icp.setLength(currentLength); - } else { - // Update based on neighbour movement -> adjust length and position, so that free end stays in place. - double currentLength = icp.getLength(); - if (currentLength < MathTools.NEAR_ZERO) { - currentLength = (dir.length() - prev.getInlineLength()) * 2.0; - } - - if (dir.lengthSquared() > MathTools.NEAR_ZERO) - dir.normalize(); - Point3d endPos = new Point3d(dir); - endPos.scale(currentLength * 0.5); - endPos.add(currentPos); // this is the free end of the component - - double offset = prev.getInlineLength(); - Point3d beginPos = new Point3d(dir); - beginPos.scale(offset); - beginPos.add(prevPos); // this is the connected end of the component - - double l = beginPos.distance(endPos); - - if (Double.isNaN(l)) - System.out.println("Length for " + icp + " is NaN"); - - dir.scale(l * 0.5); - beginPos.add(dir); // center position - - if (DEBUG) - System.out.println("PipingRules.updateInlineControlPoints() setting variable length to " + l); - icp.setLength(l); - - icp.setWorldPosition(new Vector3d(beginPos)); - } + Vector3d currentPos = icp.getWorldPosition(); + Vector3d prevPos = prev.getWorldPosition(); + + Vector3d dir = new Vector3d(); + dir.sub(currentPos, prevPos); + + boolean simple = currentUpdates.contains(icp); + if (simple) { + // Update based on position -> adjust length + double currentLength = (dir.length() - prev.getInlineLength()) * 2.0; + icp.setLength(currentLength); + } else { + // Update based on neighbour movement -> adjust length and position, so that free end stays in place. + double currentLength = icp.getLength(); + if (currentLength < MathTools.NEAR_ZERO) { + currentLength = (dir.length() - prev.getInlineLength()) * 2.0; + } + + if (dir.lengthSquared() > MathTools.NEAR_ZERO) + dir.normalize(); + Point3d endPos = new Point3d(dir); + endPos.scale(currentLength * 0.5); + endPos.add(currentPos); // this is the free end of the component + + double offset = prev.getInlineLength(); + Point3d beginPos = new Point3d(dir); + beginPos.scale(offset); + beginPos.add(prevPos); // this is the connected end of the component + + double l = beginPos.distance(endPos); + + if (Double.isNaN(l)) + System.out.println("Length for " + icp + " is NaN"); + + dir.scale(l * 0.5); + beginPos.add(dir); // center position + + if (DEBUG) + System.out.println("PipingRules.updateInlineControlPoints() setting variable length to " + l); + icp.setLength(l); + + icp.setWorldPosition(new Vector3d(beginPos)); + } } private static void ppNoOffset(UpdateStruct2 u) throws Exception { @@ -833,12 +833,12 @@ public class PipingRules { Vector3d directedDirection = direction(dcp, dcpStart ? Direction.NEXT : Direction.PREVIOUS); if (directedDirection == null) { - //updateTurnControlPointTurn(dcp, dcp.getPrevious(), dcp.getNext()); - updateTurnControlPointTurn(dcp, null, null); - directedDirection = direction(dcp, dcpStart ? Direction.NEXT : Direction.PREVIOUS); - if (directedDirection == null) { - return; - } + //updateTurnControlPointTurn(dcp, dcp.getPrevious(), dcp.getNext()); + updateTurnControlPointTurn(dcp, null, null); + directedDirection = direction(dcp, dcpStart ? Direction.NEXT : Direction.PREVIOUS); + if (directedDirection == null) { + return; + } } Point3d directedEndPoint = new Point3d(u.endPoint); if (u.hasOffsets) @@ -860,8 +860,8 @@ public class PipingRules { double distance = t.length(); boolean aligned = (distance < ALLOWED_OFFSET); if (aligned) { - if (u.start.isInline() || u.end.isInline() || u.start.isFixed() || u.end.isFixed()) - processPathLeg(u, true, false); + if (u.start.isInline() || u.end.isInline() || u.start.isFixed() || u.end.isFixed()) + processPathLeg(u, true, false); checkExpandPathLeg(u, lengthChange, inlineEnd); } else { @@ -882,14 +882,15 @@ public class PipingRules { if (other.isVariableAngle()) { // TODO calculate needed space from next run end. - if (mu[0] < 1.0) { + double space = spaceForTurn(other); + if (mu[0] < space) { if (dcpStart) { closest.set(u.startPoint); } else { closest.set(u.endPoint); } Vector3d v = new Vector3d(directedDirection); - v.scale(spaceForTurn(other)); + v.scale(space); closest.add(v); } @@ -1011,7 +1012,7 @@ public class PipingRules { p1 = dcp.getWorldPosition(); Vector3d v = new Vector3d(); if (!u.reversed) - v.set(dir1); + v.set(dir1); else v.set(dir2); @@ -1028,7 +1029,7 @@ public class PipingRules { // By default, the elbows are placed next to each other, by using 90 deg angles. // If the distance between elbows is not enough, we must move the other elbow (and create more shallow angle elbows) if (MathTools.distance(p1, p2) < off*2.05) { - p2.add(v); + p2.add(v); } PipeControlPoint tcp1 = insertElbow(dcp, next, p1); @@ -1146,7 +1147,7 @@ public class PipingRules { PipeControlPoint endNext = u.end.getNext(); if (endNext != null) { - // TODO: u.end, u.dir, null + // TODO: u.end, u.dir, null double a = updateTurnControlPointTurn(u.end, null, null); if (a < MIN_TURN_ANGLE && u.end.isDeletable()) endRemoved = true; @@ -1315,7 +1316,7 @@ public class PipingRules { if (updateEnds) { if (u.start.isTurn()) { //updateTurnControlPointTurn(u.start, u.start.getPrevious(), u.start.getNext()); - updateTurnControlPointTurn(u.start, null, null); + updateTurnControlPointTurn(u.start, null, null); // updatePathLegPrev(u.start, u.start, PathLegUpdateType.NONE); } else if (u.start.isEnd()) { updateEndComponentControlPoint(u.start, u.startPoint, u.endPoint); @@ -1324,7 +1325,7 @@ public class PipingRules { } if (u.end.isTurn()) { //updateTurnControlPointTurn(u.end, u.end.getPrevious(), u.end.getNext()); - updateTurnControlPointTurn(u.end, null, null); + updateTurnControlPointTurn(u.end, null, null); // updatePathLegNext(u.end, u.end, PathLegUpdateType.NONE); } else if (u.end.isEnd()) { updateEndComponentControlPoint(u.end, u.startPoint, u.endPoint); @@ -1538,85 +1539,85 @@ public class PipingRules { } private static double updateTurnControlPointTurn(PipeControlPoint tcp, Vector3d prev, Vector3d next) { - if (next == null) { - UpdateStruct2 us = createUS(tcp, Direction.NEXT, 0, new ArrayList(), tcp); - if (us != null) - next = us.dir; - } - if (prev == null) { - UpdateStruct2 us = createUS(tcp, Direction.PREVIOUS, 0, new ArrayList(), tcp); - if (us != null) { - prev = us.dir; - } - } - - if (!tcp.isFixed()) { - - - if (next == null || prev == null) { - if (tcp.getTurnAngle() != null) - return tcp.getTurnAngle(); - return Math.PI; // FIXME : argh - } - double turnAngle = prev.angle(next); - - double angle = Math.PI - turnAngle; - - Vector3d turnAxis = new Vector3d(); - turnAxis.cross(prev, next); - if (turnAxis.lengthSquared() > MathTools.NEAR_ZERO) { - double elbowRadius = tcp.getPipelineComponent().getPipeRun().getTurnRadius(); - double R = elbowRadius / Math.tan(angle * 0.5); - - turnAxis.normalize(); - tcp.setTurnAngle(turnAngle); - tcp.setLength(R);// setComponentOffsetValue(R); - tcp.setTurnAxis(turnAxis); - // tcp.setPosition(tcp.getPosition()); - } else { - turnAngle = 0.0; - tcp.setTurnAngle(0.0); - tcp.setLength(0.0); - tcp.setTurnAxis(new Vector3d(MathTools.Y_AXIS)); - } - - updateControlPointOrientation(tcp); - - if (DEBUG) - System.out.println("PipingTools.updateTurnControlPointTurn " + prev + " " + next + " " + turnAngle + " " + turnAxis); - return turnAngle; - } else { - - if (prev != null && next != null) { - // Nothing to do - } else if (prev == null) { - if (!tcp._getReversed()) - tcp.setReversed(true); - } else if (next == null) { - if (tcp._getReversed()) - tcp.setReversed(false); - } - - Vector3d dir = null; - if (!tcp._getReversed()) { - dir = prev; - } else { - dir = next; - dir.negate(); - } - if (dir == null) { - return Math.PI; // FIXME : argh - } - - Quat4d q = PipeControlPoint.getControlPointOrientationQuat(dir, tcp.getRotationAngle() != null ? tcp.getRotationAngle() : 0.0); - Vector3d v = new Vector3d(); - MathTools.rotate(q, MathTools.Y_AXIS,v); - tcp.setTurnAxis(v); - tcp.setWorldOrientation(q); - if (tcp.getTurnAngle() != null) - return tcp.getTurnAngle(); - return Math.PI; // FIXME : argh - } + if (next == null) { + UpdateStruct2 us = createUS(tcp, Direction.NEXT, 0, new ArrayList(), tcp); + if (us != null) + next = us.dir; + } + if (prev == null) { + UpdateStruct2 us = createUS(tcp, Direction.PREVIOUS, 0, new ArrayList(), tcp); + if (us != null) { + prev = us.dir; + } + } + + if (!tcp.isFixed()) { + + + if (next == null || prev == null) { + if (tcp.getTurnAngle() != null) + return tcp.getTurnAngle(); + return Math.PI; // FIXME : argh + } + double turnAngle = prev.angle(next); + + double angle = Math.PI - turnAngle; + + Vector3d turnAxis = new Vector3d(); + turnAxis.cross(prev, next); + if (turnAxis.lengthSquared() > MathTools.NEAR_ZERO) { + double elbowRadius = tcp.getPipelineComponent().getPipeRun().getTurnRadius(); + double R = elbowRadius / Math.tan(angle * 0.5); + + turnAxis.normalize(); + tcp.setTurnAngle(turnAngle); + tcp.setLength(R);// setComponentOffsetValue(R); + tcp.setTurnAxis(turnAxis); + // tcp.setPosition(tcp.getPosition()); + } else { + turnAngle = 0.0; + tcp.setTurnAngle(0.0); + tcp.setLength(0.0); + tcp.setTurnAxis(new Vector3d(MathTools.Y_AXIS)); + } + + updateControlPointOrientation(tcp); + + if (DEBUG) + System.out.println("PipingTools.updateTurnControlPointTurn " + prev + " " + next + " " + turnAngle + " " + turnAxis); + return turnAngle; + } else { + + if (prev != null && next != null) { + // Nothing to do + } else if (prev == null) { + if (!tcp._getReversed()) + tcp.setReversed(true); + } else if (next == null) { + if (tcp._getReversed()) + tcp.setReversed(false); + } + + Vector3d dir = null; + if (!tcp._getReversed()) { + dir = prev; + } else { + dir = next; + dir.negate(); + } + if (dir == null) { + return Math.PI; // FIXME : argh + } + + Quat4d q = PipeControlPoint.getControlPointOrientationQuat(dir, tcp.getRotationAngle() != null ? tcp.getRotationAngle() : 0.0); + Vector3d v = new Vector3d(); + MathTools.rotate(q, MathTools.Y_AXIS,v); + tcp.setTurnAxis(v); + tcp.setWorldOrientation(q); + if (tcp.getTurnAngle() != null) + return tcp.getTurnAngle(); + return Math.PI; // FIXME : argh + } } @@ -1648,118 +1649,118 @@ public class PipingRules { public static void reverse(PipeRun pipeRun) { while (true) { - List points = getControlPoints(pipeRun); - PipeControlPoint pcp = points.get(0); - if (pcp.isSizeChange() && pcp.getSubPoint().size() > 0) { - pipeRun = pcp.getPipeRun(); - } else { - break; - } + List points = getControlPoints(pipeRun); + PipeControlPoint pcp = points.get(0); + if (pcp.isSizeChange() && pcp.getSubPoint().size() > 0) { + pipeRun = pcp.getPipeRun(); + } else { + break; + } } List all = new ArrayList(); List> pcps = new ArrayList>(); while (true) { - all.add(pipeRun); - List points = getControlPoints(pipeRun); - pcps.add(points); - PipeControlPoint pcp = points.get(points.size()-1); - if (pcp.getSubPoint().size() > 0) { - pipeRun = pcp.getSubPoint().get(0).getPipeRun(); - } else { - break; - } + all.add(pipeRun); + List points = getControlPoints(pipeRun); + pcps.add(points); + PipeControlPoint pcp = points.get(points.size()-1); + if (pcp.getSubPoint().size() > 0) { + pipeRun = pcp.getSubPoint().get(0).getPipeRun(); + } else { + break; + } } for (int i = 0 ; i < all.size(); i++) { - List list = pcps.get(i); - _reverse(list); + List list = pcps.get(i); + _reverse(list); } for (int i = 0 ; i < all.size(); i++) { - boolean last = i == all.size() - 1; - List list = pcps.get(i); - - if (!last) { - List list2 = pcps.get(i+1); - PipeControlPoint prev = list.get(list.size()-1); - PipeControlPoint next = list2.get(0); - System.out.println(); - if (prev == next) { - // Reverse the component on the boundary. - InlineComponent ic = (InlineComponent)prev.getPipelineComponent(); - PipeRun r1 = ic.getPipeRun(); - PipeRun r2 = ic.getAlternativePipeRun(); - if (r1 == null || r2 == null) - throw new RuntimeException("Components on PipeRun changes should refer to bot PipeRuns"); - ic.deattach(); - r2.addChild(ic); - ic.setPipeRun(r2); - ic.setAlternativePipeRun(r1); - } else { - throw new RuntimeException("PipeRun changes should contain shared control points"); - } - - } - } - + boolean last = i == all.size() - 1; + List list = pcps.get(i); + + if (!last) { + List list2 = pcps.get(i+1); + PipeControlPoint prev = list.get(list.size()-1); + PipeControlPoint next = list2.get(0); + System.out.println(); + if (prev == next) { + // Reverse the component on the boundary. + InlineComponent ic = (InlineComponent)prev.getPipelineComponent(); + PipeRun r1 = ic.getPipeRun(); + PipeRun r2 = ic.getAlternativePipeRun(); + if (r1 == null || r2 == null) + throw new RuntimeException("Components on PipeRun changes should refer to bot PipeRuns"); + ic.deattach(); + r2.addChild(ic); + ic.setPipeRun(r2); + ic.setAlternativePipeRun(r1); + } else { + throw new RuntimeException("PipeRun changes should contain shared control points"); + } + + } + } + } private static void _reverse(List list) { - if (list.size() <= 1) - return; // nothing to do. - - for (int i = 0 ; i < list.size(); i++) { - boolean first = i == 0; - boolean last = i == list.size() - 1; - PipeControlPoint current = list.get(i); - PipeControlPoint currentSub = null; - if (current.isDualInline()) - currentSub = current.getSubPoint().get(0); - if (first) { - PipeControlPoint next = list.get(i+1); - if (next.isDualInline()) - next = next.getSubPoint().get(0); - if (current.getNext() == next) - current.setNext(null); - current.setPrevious(next); - if (currentSub != null) { - if (currentSub.getNext() == next) - currentSub.setNext(null); - currentSub.setPrevious(next); - } - } else if (last) { - PipeControlPoint prev = list.get(i-1); - - if (current.getPrevious() == prev) - current.setPrevious(null); - current.setNext(prev); - - if (currentSub != null) { - if (currentSub.getPrevious() == prev) - currentSub.setPrevious(null); - currentSub.setNext(prev); - } - } else { - PipeControlPoint prev = list.get(i-1); - PipeControlPoint next = list.get(i+1); - if (next.isDualInline()) - next = next.getSubPoint().get(0); - - - current.setPrevious(next); - current.setNext(prev); - - if (currentSub != null) { - currentSub.setPrevious(next); - currentSub.setNext(prev); - } - - } - if (current.isTurn() && current.isFixed()) { - current.setReversed(!current._getReversed()); - } - if (current.isInline() && current.isReverse()) { - current.setReversed(!current._getReversed()); - } - } + if (list.size() <= 1) + return; // nothing to do. + + for (int i = 0 ; i < list.size(); i++) { + boolean first = i == 0; + boolean last = i == list.size() - 1; + PipeControlPoint current = list.get(i); + PipeControlPoint currentSub = null; + if (current.isDualInline()) + currentSub = current.getSubPoint().get(0); + if (first) { + PipeControlPoint next = list.get(i+1); + if (next.isDualInline()) + next = next.getSubPoint().get(0); + if (current.getNext() == next) + current.setNext(null); + current.setPrevious(next); + if (currentSub != null) { + if (currentSub.getNext() == next) + currentSub.setNext(null); + currentSub.setPrevious(next); + } + } else if (last) { + PipeControlPoint prev = list.get(i-1); + + if (current.getPrevious() == prev) + current.setPrevious(null); + current.setNext(prev); + + if (currentSub != null) { + if (currentSub.getPrevious() == prev) + currentSub.setPrevious(null); + currentSub.setNext(prev); + } + } else { + PipeControlPoint prev = list.get(i-1); + PipeControlPoint next = list.get(i+1); + if (next.isDualInline()) + next = next.getSubPoint().get(0); + + + current.setPrevious(next); + current.setNext(prev); + + if (currentSub != null) { + currentSub.setPrevious(next); + currentSub.setNext(prev); + } + + } + if (current.isTurn() && current.isFixed()) { + current.setReversed(!current._getReversed()); + } + if (current.isInline() && current.isReverse()) { + current.setReversed(!current._getReversed()); + } + } } public static void merge(PipeRun run1, PipeRun r2) { @@ -1842,19 +1843,19 @@ public class PipingRules { /* there are many different cases to insert new component when it splits existing VariableLengthinlineComponent. - - 1. VariableLengthComponet is connected from both sides: - - insert new component between VariableLength component and component connected to it - - insert new VariableLengthComponent between inserted component and component selected in previous step + + 1. VariableLengthComponet is connected from both sides: + - insert new component between VariableLength component and component connected to it + - insert new VariableLengthComponent between inserted component and component selected in previous step 2. VariableLengthComponent is connected from one side - - Use previous case or: - - Insert new component to empty end - - Insert new VariableLength component to inserted components empty end - + - Use previous case or: + - Insert new component to empty end + - Insert new VariableLength component to inserted components empty end + 3. VariableLength is not connected to any component. - - Should not be possible, at least in current implementation. - - Could be done using second case + - Should not be possible, at least in current implementation. + - Could be done using second case */