private boolean isSizeChange = false; // changes size of the pipe. The next control point / component is on different PipeRun
private boolean isSub = false; // child point for offset / size change
+ private boolean disposed = false;
+
public PipeControlPoint(PipelineComponent component) {
this.component = component;
if (component.getPipeRun() != null)
public boolean isInline() {
return type == PointType.INLINE;
}
+
+ public boolean asPathLegEnd() {
+ // Ends and Turns are path leg ends by default, but also unconnected inline are path leg ends.
+ return isPathLegEnd() || getNext() == null || getPrevious() == null;
+ }
/**
* True for end components, if control point defines absolute position direction, which rules cannot modify.
// We need to calculate turnAngle and rotationAngle
Vector3d dirOut = getPathLegDirection(direction == Direction.NEXT ? Direction.NEXT : Direction.PREVIOUS);
Vector3d dir = getPathLegDirection(direction == Direction.NEXT ? Direction.PREVIOUS : Direction.NEXT);
+ if (dir == null || dirOut == null)
+ return;
dir.negate();
- dirOut.normalize();
- dir.normalize();
double angle = dir.angle(dirOut);
//super._setNext(null);
if (direction == Direction.NEXT)
if (MathTools.createRotation(dirOutN, dirOut, dir, aa)) {
setRotationAngle(aa.angle);
setTurnAngle(angle);
+ if (DEBUG) System.out.println("convertToFixed " + dir + " " + dirOut + " " +dirOutN + " " +angle + " "+ aa.angle);
}
}
return getControlPointOrientationQuat(dir, turnAxis, angle);
}
}
+
+ public Quat4d getControlPointOrientationQuat(Vector3d dir, double angle, boolean reversed) {
+ if (turnAxis == null) {
+ if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+ dir.normalize();
+ Quat4d q = getControlPointOrientationQuat(dir, angle);
+ if (reversed) {
+ Quat4d q2 = new Quat4d();
+ q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
+ q.mulInverse(q2);
+ }
+ return q;
+ } else {
+ if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+ dir.normalize();
+ return getControlPointOrientationQuat(dir, turnAxis, angle);
+ }
+ }
public Quat4d getControlPointOrientationQuat(double angle, boolean reversed) {
if (turnAxis == null) {
Vector3d dir = getPathLegDirection(Direction.NEXT);
- if (dir.lengthSquared() > MathTools.NEAR_ZERO)
- dir.normalize();
- Quat4d q = getControlPointOrientationQuat(dir, angle);
- if (reversed) {
- Quat4d q2 = new Quat4d();
- q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
- q.mulInverse(q2);
- }
- return q;
+ return getControlPointOrientationQuat(dir, angle, reversed);
} else {
Vector3d dir = getPathLegDirection(Direction.PREVIOUS);
dir.negate();
- if (dir.lengthSquared() > MathTools.NEAR_ZERO)
- dir.normalize();
- return getControlPointOrientationQuat(dir, turnAxis, angle);
+ return getControlPointOrientationQuat(dir, angle, reversed);
}
}
return dir;
}
+ /**
+ * Returns direction vector.
+ *
+ * For directed control points, always returns outwards pointing vector.
+ *
+ * @param direction
+ * @return normalized vector, or null
+ */
public Vector3d getDirection(Direction direction) {
if (isDirected())
return getDirectedControlPointDirection();
Vector3d offset = new Vector3d();
MathTools.rotate(q2, v, offset);
MathTools.rotate(q, offset, dir);
+ dir.normalize();
return dir;
}
} else {
Vector3d offset = new Vector3d();
MathTools.rotate(q2, v, offset);
MathTools.rotate(q, offset, dir);
+ dir.normalize();
return dir;
}
}
return null;
}
+ /**
+ * Returns path leg direction of the control point.
+ *
+ * This method differs from getDirection by also returning inward pointing vectors for directed control points.
+ *
+ * @param direction
+ * @return
+ */
public Vector3d getPathLegDirection(Direction direction) {
if (direction == Direction.NEXT) {
if (next != null) {
}
Vector3d v = new Vector3d();
v.sub(next.getWorldPosition(),pcp.getWorldPosition());
+ if (v.lengthSquared() > MathTools.NEAR_ZERO)
+ v.normalize();
+ else
+ return null;
return v;
} else {
if (previous == null) {
}
Vector3d v = new Vector3d();
v.sub(pcp.getWorldPosition(),previous.getWorldPosition());
+ if (v.lengthSquared() > MathTools.NEAR_ZERO)
+ v.normalize();
+ else
+ return null;
return v;
} else if (isDirected()) {
return getDirectedControlPointDirection();
} else if (isEnd()) {
Vector3d v = new Vector3d();
v.sub(getWorldPosition(),previous.getWorldPosition());
+ if (v.lengthSquared() > MathTools.NEAR_ZERO)
+ v.normalize();
+ else
+ return null;
return v;
} else if (isTurn() && asFixedAngle() && !_getReversed()) {
return getDirection(Direction.NEXT);
pcp = getParentPoint();
Vector3d v = new Vector3d();
v.sub(previous.getWorldPosition(),pcp.getWorldPosition());
+ if (v.lengthSquared() > MathTools.NEAR_ZERO)
+ v.normalize();
+ else
+ return null;
return v;
} else {
if (next == null) {
}
Vector3d v = new Vector3d();
v.sub(pcp.getWorldPosition(),next.getWorldPosition());
+ if (v.lengthSquared() > MathTools.NEAR_ZERO)
+ v.normalize();
+ else
+ return null;
return v;
} else if (isDirected()) {
Vector3d v = getDirectedControlPointDirection();
} else if (isEnd()) {
Vector3d v = new Vector3d();
v.sub(getWorldPosition(),next.getWorldPosition());
+ if (v.lengthSquared() > MathTools.NEAR_ZERO)
+ v.normalize();
+ else
+ return null;
return v;
} else if (isTurn() && asFixedAngle() && _getReversed()) {
return getDirection(Direction.PREVIOUS);
Vector3d pos = getWorldPosition(), pos2 = sub == this ? pos : sub.getWorldPosition();
Vector3d dir1 = getPathLegDirection(Direction.PREVIOUS);
- dir1.normalize();
Vector3d dir2 = sub.getPathLegDirection(Direction.NEXT);
- dir2.normalize();
if (isInline()) {
dir1.scale(length * 0.5);
dir2.scale(length * 0.5);
PipeControlPoint sub = isAxial() ? this : getDualSub();
Vector3d dir1 = getPathLegDirection(Direction.PREVIOUS);
- dir1.normalize();
Vector3d dir2 = sub.getPathLegDirection(Direction.NEXT);
- dir2.normalize();
v1.set(dir1);
v2.set(dir2);
}
public void _remove(boolean renconnect) {
- if (component == null && next == null && previous == null)
- return;
- if (DEBUG) System.out.println(this + " Remove " + renconnect);
+ if (disposed)
+ return;
+
+ if (DEBUG) System.out.println(this + " Remove " + renconnect);
if (getParentPoint() != null) {
getParentPoint()._remove(renconnect);
return;
}
PipeRun pipeRun = getPipeRun();
- if (pipeRun == null)
- return;
+// PipeRUn removal has been changed, so pipeRun may be null.
+// if (pipeRun == null)
+// return;
PipeControlPoint additionalRemove = null;
if (!PipingRules.isEnabled()) {
PipeControlPoint currentNext = next;
if (currentNext == null && currentPrev == null) {
removeComponent();
- pipeRun.remChild(this);
- checkRemove(pipeRun);
+ if (pipeRun != null) {
+ pipeRun.remChild(this);
+ checkRemove(pipeRun);
+ }
return;
}
if (currentNext != null && currentPrev != null) {
} else if (currentNext != null) {
if (currentNext.isDualInline()) {
PipeControlPoint sccp = currentNext;
- PipeControlPoint ocp = getDualSub();
+ PipeControlPoint ocp = currentNext.getDualSub();
if (ocp == null) {
throw new RuntimeException("Removing PipeControlPoint " + this+ " structure damaged, no offset control point");
}
}
removeComponent();
- pipeRun.remChild(this);
- checkRemove(pipeRun);
- if (PipingRules.isEnabled() && pipeRun.getParent() != null && pipeRun.getControlPoints().size() > 0)
- PipingRules.validate(pipeRun);
+ if (pipeRun != null) {
+ pipeRun.remChild(this);
+ checkRemove(pipeRun);
+ if (PipingRules.isEnabled() && pipeRun.getParent() != null && pipeRun.getControlPoints().size() > 0)
+ PipingRules.validate(pipeRun);
+ }
if (additionalRemove != null)
additionalRemove.remove();
+ disposed = true;
}
/**
PipelineComponent n = next.getPipelineComponent();
while (n != null) {
+ if (n.getPipeRun() != previousRun)
+ break;
if (! (n instanceof Nozzle)) {
n.deattach();
nextPipeRun.addChild(n);
}
private boolean checkRemove(PipeRun pipeRun) {
+ if (pipeRun == null)
+ return false;
Collection<PipeControlPoint> points = pipeRun.getControlPoints();
if (points.size() == 0) {
pipeRun.remove();
public void setOrientation(Quat4d orientation) {
if (MathTools.equals(orientation, getOrientation()))
return;
+ if (getPipelineComponent() != null && (getPipelineComponent() instanceof Nozzle))
+ System.out.println();
super.setOrientation(orientation);
if (getParentPoint() == null && component != null)
component._setWorldOrientation(getWorldOrientation());