}
- @SuppressWarnings("unused")
- private static boolean calculateOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, Vector3d dir, Vector3d offset) {
- boolean hasOffsets = false;
- List<PipeControlPoint> offsets = new ArrayList<PipeControlPoint>(list.size());
- // Only start offset affects the calculation
- if (start.isOffset())
- offsets.add(start);
- for (PipeControlPoint icp : list) {
- if (icp.isOffset()) {
- offsets.add(icp);
- } else if (icp.isDualSub())
- ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp, new Exception("ASSERT!"));
- }
+ public static boolean calculateDirectedOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, Vector3d dir, Vector3d offset) {
+ return calculateOffset(startPoint, endPoint, start, list, end, dir, offset, true);
+ }
+
+ public static boolean calculateOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, Vector3d dir, Vector3d offset) {
+ return calculateOffset(startPoint, endPoint, start, list, end, dir, offset, false);
+ }
+
+ private static boolean calculateOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, Vector3d dir, Vector3d offset, boolean directed) {
+ List<PipeControlPoint> offsets = getOffsetPoints(start, list);
if (offsets.size() == 0) {
- dir.set(endPoint);
- dir.sub(startPoint);
- double l = dir.lengthSquared();
- if (l > MathTools.NEAR_ZERO)
- dir.scale(1.0/Math.sqrt(l));
- offset.set(0.0, 0.0, 0.0);
+ setZeroOffset(startPoint, endPoint, dir, offset);
return false;
} else {
Vector3d sp = new Vector3d(startPoint);
double l = dir.lengthSquared();
if (l > MathTools.NEAR_ZERO)
dir.scale(1.0/Math.sqrt(l));
+
int iter = 100;
while (iter >= 0) {
iter--;
Vector3d v = icp.getSizeChangeOffsetVector(dir);
offset.add(v);
}
+
+ if (directed)
+ break;
+
Point3d nep = new Point3d(endPoint);
nep.sub(offset);
if (nep.distance(ep) < 0.0000000001) {
break;
- }
+ }
+
ep = nep;
dir.set(ep);
dir.sub(sp);
if (l > MathTools.NEAR_ZERO)
dir.scale(1.0/Math.sqrt(l));
}
- hasOffsets = true;
+
+ if (DEBUG)
+ System.out.println("calcOffset s:"+ startPoint + " e:" + endPoint + " d:" + dir + " o:"+offset) ;
+
+ return true;
}
-
- if (DEBUG && hasOffsets)
- System.out.println("calcOffset s:"+ startPoint + " e:" + endPoint + " d:" + dir + " o:"+offset) ;
- return hasOffsets;
}
+ public static void setZeroOffset(Vector3d startPoint, Vector3d endPoint, Vector3d dir, Vector3d offset) {
+ dir.set(endPoint);
+ dir.sub(startPoint);
+ double l = dir.lengthSquared();
+ if (l > MathTools.NEAR_ZERO)
+ dir.scale(1.0/Math.sqrt(l));
+ offset.set(0.0, 0.0, 0.0);
+ }
+
+ public static List<PipeControlPoint> getOffsetPoints(PipeControlPoint start, ArrayList<PipeControlPoint> list) {
+ List<PipeControlPoint> offsets = new ArrayList<PipeControlPoint>(list.size());
+ // Only start offset affects the calculation
+ if (start.isOffset())
+ offsets.add(start);
+ for (PipeControlPoint icp : list) {
+ if (icp.isOffset()) {
+ offsets.add(icp);
+ } else if (icp.isDualSub())
+ ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp, new Exception("ASSERT!"));
+ }
+ return offsets;
+ }
+
private static UpdateStruct2 createUS(PipeControlPoint start, Direction direction, int iter, ArrayList<ExpandIterInfo> toRemove, PipeControlPoint updated) {
ArrayList<PipeControlPoint> list = new ArrayList<PipeControlPoint>();
PipeControlPoint end = null;
Vector3d endPoint = end.getWorldPosition();
Vector3d dir = new Vector3d();
hasOffsets = calculateOffset(startPoint, endPoint, start, list, end, dir, offset);
- System.out.println();
return new UpdateStruct2(start, startPoint, list, end, endPoint, dir, offset, hasOffsets, iter, direction == Direction.PREVIOUS, toRemove, updated);
}
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
}
}
- 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));
}
}
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 {
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 {
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());
}
Point3d directedEndPoint = new Point3d(u.endPoint);
if (u.hasOffsets)
- directedEndPoint.add(u.offset);
+ directedEndPoint.sub(u.offset);
double mu[] = new double[2];
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) {
backIter(u);
if (canMoveOther) {
if (DEBUG)
System.out.println("PipingRules.updateDirectedPipeRun() moved end " + other + " to " + closest);
+
+ // Not aligned - we need to recalculate the offset to reflect new end points.
+ Vector3d offset;
+ if (u.hasOffsets) {
+ offset = new Vector3d();
+ Vector3d newDir = new Vector3d();
+ calculateDirectedOffset(position, closest, u.start, u.list, u.end, newDir, offset);
+ closest.add(offset);
+ } else {
+ offset = new Vector3d();
+ }
+
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));
+ checkExpandPathLeg(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Vector3d(closest), directedDirection, offset, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated), PathLegUpdateType.NONE, 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));
+ checkExpandPathLeg(new UpdateStruct2(u.start, new Vector3d(closest), u.list, u.end, u.endPoint, directedDirection, offset, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated), PathLegUpdateType.NONE, true);
if (u.start.getPrevious() != null)
updatePathLegPrev(u.start, u.updated, PathLegUpdateType.PREV);
}
return tr; // space for 90 deg
Vector3d dir = dcp.getDirectedControlPointDirection();
Vector3d dp = dcp.getWorldPosition();
- //Vector3d tp = tcp.getWorldPosition();
Vector3d op = other.getWorldPosition();
double u[] = new double[1];
Vector3d closest = MathTools.closestPointOnStraight(op, dp, dir,u);
R = tr / t;
if (R <= curr)
break;
- curr = R*1.01;
+ curr = R*1.001;
iter--;
}
return curr;
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();