- /**
- * Recalculates turn control point's internal data (turn angle and offset)
- *
- * @param tcp
- * @param prev
- * @param next
- */
- private static double updateTurnControlPointTurn(PipeControlPoint tcp, PipeControlPoint prev, PipeControlPoint next) {
- if (DEBUG)
- System.out.println("PipingTools.updateTurnControlPointTurn()" + tcp);
- if (next == null || prev == null)
- return Math.PI; // FIXME : argh
- Vector3d middlePoint = tcp.getWorldPosition();
- Vector3d nextPoint = next.getWorldPosition();
- Vector3d prevPoint = prev.getWorldPosition();
- return updateTurnControlPointTurn(tcp, middlePoint, prevPoint, nextPoint);
- }
-
- /**
- * Recalculates turn control point's internal data (turn angle and offset)
- *
- * @param tcp
- * @param middlePoint
- * @param nextPoint
- * @param prevPoint
- */
- private static double updateTurnControlPointTurn(PipeControlPoint tcp, Vector3d middlePoint, Vector3d prevPoint, Vector3d nextPoint) {
-
- Vector3d dir1 = new Vector3d(middlePoint);
- dir1.sub(prevPoint);
- Vector3d dir2 = new Vector3d(nextPoint);
- dir2.sub(middlePoint);
- if (DEBUG)
- System.out.println("PipingTools.updateTurnControlPointTurn " + tcp + " " + prevPoint + " " + middlePoint + " " + nextPoint);
- return updateTurnControlPointTurn(tcp, dir1, dir2);
- }
-
- private static double updateTurnControlPointTurn(PipeControlPoint tcp, Vector3d dir1, Vector3d dir2) {
- double turnAngle = dir1.angle(dir2);
-
- double angle = Math.PI - turnAngle;
-
- Vector3d turnAxis = new Vector3d();
- turnAxis.cross(dir1, dir2);
- if (turnAxis.lengthSquared() > MathTools.NEAR_ZERO) {
- double elbowRadius = tcp.getPipelineComponent().getPipeRun().getTurnRadius();
- double R = elbowRadius / Math.tan(angle * 0.5);
+ private static double updateTurnControlPointTurn(PipeControlPoint tcp, Vector3d prev, Vector3d next) {
+ 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.asFixedAngle()) {
+
+
+ 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 = ((TurnComponent)tcp.getPipelineComponent()).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);