- 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();
+ }
- UpdateStruct2 us = createUS(start, Direction.NEXT, 0, new ArrayList<ExpandIterInfo>(), 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<ExpandIterInfo>(), updated);
+ if (lengthChange == PathLegUpdateType.NONE) {
+ if (start.equals(updated))
+ lengthChange = PathLegUpdateType.NEXT;
+ else if (us.end.equals(updated))
+ lengthChange = PathLegUpdateType.PREV;
+ }
- ArrayList<PipeControlPoint> list = new ArrayList<PipeControlPoint>();
- PipeControlPoint end = null;
- if (direction == Direction.NEXT) {
- end = start.findNextEnd(list);
- } else {
- ArrayList<PipeControlPoint> prevList = new ArrayList<PipeControlPoint>();
- 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<PipeControlPoint> list = new ArrayList<PipeControlPoint>();
+ PipeControlPoint end = null;
+ if (direction == Direction.NEXT) {
+ end = start.findNextEnd(list);
+ } else {
+ ArrayList<PipeControlPoint> prevList = new ArrayList<PipeControlPoint>();
+ 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);
- 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));
+ }
- if (next == null) {
- UpdateStruct2 us = createUS(tcp, Direction.NEXT, 0, new ArrayList<PipingRules.ExpandIterInfo>(), tcp);
- if (us != null)
- next = us.dir;
- }
- if (prev == null) {
- UpdateStruct2 us = createUS(tcp, Direction.PREVIOUS, 0, new ArrayList<PipingRules.ExpandIterInfo>(), 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<PipingRules.ExpandIterInfo>(), tcp);
+ if (us != null)
+ next = us.dir;
+ }
+ if (prev == null) {
+ UpdateStruct2 us = createUS(tcp, Direction.PREVIOUS, 0, new ArrayList<PipingRules.ExpandIterInfo>(), 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
+ }
- boolean last = i == all.size() - 1;
- List<PipeControlPoint> list = pcps.get(i);
-
- if (!last) {
- List<PipeControlPoint> 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<PipeControlPoint> list = pcps.get(i);
+
+ if (!last) {
+ List<PipeControlPoint> 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");
+ }
+
+ }
+ }
+
- 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());
+ }
+ }