if (!PipingRules.enabled)
return false;
- if (requestUpdates.size() == 0)
- return false;
-
- List<PipeControlPoint> temp = new ArrayList<PipeControlPoint>(requestUpdates.size());
- synchronized(updateMutex) {
+ List<PipeControlPoint> temp;
+ synchronized(updateMutex) {
+ if (requestUpdates.size() == 0)
+ return false;
+
+ temp = new ArrayList<PipeControlPoint>(requestUpdates.size());
temp.addAll(requestUpdates);
requestUpdates.clear();
}
scp.setWorldPosition(pos);
Vector3d dir = new Vector3d();
dir.sub(pcp2.getWorldPosition(), pcp1.getWorldPosition());
- updateControlPointOrientation(scp, dir);
+ scp.orientToDirection(dir);
scp.setLength(length);
validate(scp.getPipeRun());
return scp;
double curr = gapObj.d;
int d = 1;
while (d < gaps.size() && curr < -MIN_INLINE_LENGTH) {
- GapObj next = i+d >= 0 ? gaps.get(i+d) : null;
+ GapObj next = i+d < gaps.size() ? gaps.get(i+d) : null;
GapObj prev = i-d >= 0 ? gaps.get(i-d) : null;
if (next != null && next.gap == Gap.SPACE) {
double move = Math.min(-curr, next.d);
else if (d < -0.9999)
return tr*2.0; // point following turn is directly behind the nozzle, in theory, we should return Double.Inf...
- double curr = tr*0.1;
+ double curr = 0.0;
int iter = 10;
Vector3d tp0 = tcp.getPosition();
try {
while (iter > 0) {
Vector3d tp = new Vector3d(dir);
tp.scaleAdd(curr, dp);
- tcp.setPosition(tp);
+ tcp._setPosition(tp); // no firing of listeners here
if (other == ne) {
dir2 = pathLegDirection(tcp);
} else {
}
double a = dir.angle(dir2);
- double t = Math.tan(a * 0.5);
- double R = 0.0;
- if (t > MathTools.NEAR_ZERO)
- R = tr * t;
+
+ // other is directly between dcp and tcp, a zero angle turn should do
+ if (Math.PI - a <= MathTools.NEAR_ZERO)
+ return 0.0;
+
+ double R = tr * Math.tan(a * 0.5);
if (R <= curr)
break;
curr = R*1.001;
}
}
finally {
- tcp.setPosition(tp0);
+ tcp._setPosition(tp0); // return the original value
}
return curr;
}
} else if (u.start.isEnd()) {
updateEndComponentControlPoint(u.start, u.dir);
} else if (u.start.isInline()) {
- updateControlPointOrientation(u.start, u.dir);
+ u.start.orientToDirection(u.dir);
}
if (u.end.isTurn()) {
//updateTurnControlPointTurn(u.end, u.end.getPrevious(), u.end.getNext());
} else if (u.end.isEnd()) {
updateEndComponentControlPoint(u.end, u.dir);
} else if (u.end.isInline()) {
- updateControlPointOrientation(u.end, u.dir);
+ u.end.orientToDirection(u.dir);
}
} else {
System.out.println(" " + newInlinePoint);
icp.setWorldPosition(newInlinePoint);
- updateControlPointOrientation(icp, dir);
+ icp.orientToDirection(dir);
}
/**
System.out.println("PipingRules.updateEndComponentControlPoint() " + ecp);
if (!ecp.isFixed()) // prevent overriding nozzle orientations..
- updateControlPointOrientation(ecp, dir);
+ ecp.orientToDirection(dir);
for (PipeControlPoint pcp : ecp.getChildPoints()) {
// TODO update position
}
}
- private static void updateControlPointOrientation(PipeControlPoint pcp, Vector3d dir) {
- Double angleO = pcp.getRotationAngle();
- double angle = 0.0;
- if (angleO != null)
- angle = angleO;
- boolean reversed = pcp._getReversed();
- Quat4d q = null;
- if (dir != null) {
- q = pcp.getControlPointOrientationQuat(dir, angle, reversed);
- } else {
- q = pcp.getControlPointOrientationQuat(angle, reversed);
- }
- pcp.setWorldOrientation(q);
- }
-
/**
* Updates all branches when branch's position has been changed
*
return tcp.getTurnAngle();
return Math.PI; // FIXME : argh
}
- double turnAngle = prev.angle(next);
+
+ final boolean isDegenerate = prev.lengthSquared() < MathTools.NEAR_ZERO || next.lengthSquared() < MathTools.NEAR_ZERO;
+ double turnAngle = isDegenerate ? 0.0 : prev.angle(next);
Vector3d turnAxis = new Vector3d();
turnAxis.cross(prev, next);
tcp.setTurnAxis(new Vector3d(MathTools.Y_AXIS));
}
- updateControlPointOrientation(tcp,prev);
+ tcp.orientToDirection(prev);
if (DEBUG)
System.out.println("PipingTools.updateTurnControlPointTurn " + prev + " " + next + " " + turnAngle + " " + turnAxis);
public static void validate(PipeRun pipeRun) {
if (pipeRun == null)
return;
- Collection<PipeControlPoint> pcps = pipeRun.getControlPoints();
- int count = 0;
- //System.out.println("Validate " + pipeRun.getName());
- for (PipeControlPoint pcp : pcps) {
- if (pcp.getParentPoint() == null || pcp.getParentPoint().getPipeRun() != pipeRun)
- count++;
- }
- List<PipeControlPoint> runPcps = getControlPoints(pipeRun);
- if (runPcps.size() != count) {
- System.out.println("Run " + pipeRun.getName() + " contains unconnected control points, found " + runPcps.size() + " connected, " + pcps.size() + " total.");
+ synchronized (ruleMutex) {
+ Collection<PipeControlPoint> pcps = pipeRun.getControlPoints();
+ int count = 0;
+ //System.out.println("Validate " + pipeRun.getName());
for (PipeControlPoint pcp : pcps) {
- if (!runPcps.contains(pcp)) {
- System.out.println("Unconnected " + pcp + " " + pcp.getPipelineComponent());
- }
+ if (pcp.getParentPoint() == null || pcp.getParentPoint().getPipeRun() != pipeRun)
+ count++;
}
- }
- for (PipeControlPoint pcp : pcps) {
- if (pcp.getPipeRun() == null) {
- System.out.println("PipeRun ref missing " + pcp + " " + pcp.getPipelineComponent());
- }
- if (!pcp.isDirected() && pcp.getNext() == null && pcp.getPrevious() == null)
- System.out.println("Orphan undirected " + pcp + " " + pcp.getPipelineComponent());
- }
- for (PipeControlPoint pcp : pcps) {
- if (pcp.getParentPoint() == null) {
- PipeControlPoint sub = null;
- if (pcp.isDualInline())
- sub = pcp.getDualSub();
- PipeControlPoint next = pcp.getNext();
- PipeControlPoint prev = pcp.getPrevious();
- if (next != null) {
- if (!(next.getPrevious() == pcp || next.getPrevious() == sub)) {
- System.out.println("Inconsistency between " + pcp + " -> " +next );
- }
+ List<PipeControlPoint> runPcps = getControlPoints(pipeRun);
+ if (runPcps.size() != count) {
+ System.out.println("Run " + pipeRun.getName() + " contains unconnected control points, found " + runPcps.size() + " connected, " + pcps.size() + " total.");
+ for (PipeControlPoint pcp : pcps) {
+ if (!runPcps.contains(pcp)) {
+ System.out.println("Unconnected " + pcp + " " + pcp.getPipelineComponent());
+ }
}
- if (prev != null) {
- PipeControlPoint prevParent = null;
- if (prev.isDualSub()) {
- prevParent = prev.getParentPoint();
- } else if (prev.isDualInline()) {
- System.out.println("Inconsistency between " + pcp + " <-- " +prev );
+ }
+ for (PipeControlPoint pcp : pcps) {
+ if (pcp.getPipeRun() == null) {
+ System.out.println("PipeRun ref missing " + pcp + " " + pcp.getPipelineComponent());
+ }
+ if (!pcp.isDirected() && pcp.getNext() == null && pcp.getPrevious() == null)
+ System.out.println("Orphan undirected " + pcp + " " + pcp.getPipelineComponent());
+ }
+ for (PipeControlPoint pcp : pcps) {
+ if (pcp.getParentPoint() == null) {
+ PipeControlPoint sub = null;
+ if (pcp.isDualInline())
+ sub = pcp.getDualSub();
+ PipeControlPoint next = pcp.getNext();
+ PipeControlPoint prev = pcp.getPrevious();
+ if (next != null) {
+ if (!(next.getPrevious() == pcp || next.getPrevious() == sub)) {
+ System.out.println("Inconsistency between " + pcp + " -> " +next );
+ }
}
- if (!(prev.getNext() == pcp && (prevParent == null || prevParent.getNext() == pcp))) {
- System.out.println("Inconsistency between " + pcp + " <-- " +prev );
+ if (prev != null) {
+ PipeControlPoint prevParent = null;
+ if (prev.isDualSub()) {
+ prevParent = prev.getParentPoint();
+ } else if (prev.isDualInline()) {
+ System.out.println("Inconsistency between " + pcp + " <-- " +prev );
+ }
+ if (!(prev.getNext() == pcp && (prevParent == null || prevParent.getNext() == pcp))) {
+ System.out.println("Inconsistency between " + pcp + " <-- " +prev );
+ }
}
}
}