X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2Fcontrolpoint%2FPipeControlPoint.java;h=c5bf29ddd5798d06175f9e6c6d90e6f078e16cf7;hb=aa75048b8c434e4fa9b076443e8812932d09a59a;hp=00a1560ef9378fe0151d6f61b98a074f3b051ed3;hpb=a47ce2dfb6481ad1f57915ebddb540d7e5c8baba;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java index 00a1560e..c5bf29dd 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java @@ -855,107 +855,70 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { */ public Vector3d getPathLegDirection(Direction direction) { if (direction == Direction.NEXT) { - if (next != null) { - PipeControlPoint pcp = this; - if (pcp.isDualInline()) { - pcp = pcp.getDualSub(); - } - 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) { - if (!isDirected()) - throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + this); - return getDirectedControlPointDirection(); + return getPathLegDirectionNext(); + } else { + return getPathLegDirectionPrevious(); + } + } - } else { - if (isVariableAngle() && !asFixedAngle()) - throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + this); - if (isInline()) { - PipeControlPoint pcp = this; - if (pcp.isDualSub()) { - pcp = pcp.getParentPoint(); - } - 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); - } - throw new RuntimeException("Missing implementation " + this); - } - } + public Vector3d getPathLegDirectionPrevious() { + if (previous != null) { + PipeControlPoint pcp = this; + if (isDualSub()) + 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 (isDirected()) { + Vector3d v = getDirectedControlPointDirection(); + v.negate(); + return v; + } else if (next == null) { + throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + this); + } else if (isVariableAngle() && !asFixedAngle()) { + throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + this); + } else if (isInline() || isEnd()) { + Vector3d v = getPathLegDirectionNext(); + if (v != null) v.negate(); + return v; + } else if (isTurn() && asFixedAngle() && _getReversed()) { + return getDirection(Direction.PREVIOUS); } else { - if (previous != null) { - PipeControlPoint pcp = this; - if (isDualSub()) - 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) { - if (!isDirected()) - throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + this); - Vector3d v = getDirectedControlPointDirection(); - v.negate(); - return v; - } else { - if (isVariableAngle() && !asFixedAngle()) - throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + this); - if (isInline()) { - PipeControlPoint pcp = this; - if (pcp.isDualInline()) { - pcp = pcp.getDualSub(); - } - 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(); - v.negate(); - return v; - } 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); - } - throw new RuntimeException("Missing implementation " + this); - } + throw new RuntimeException("Missing implementation " + this); + } + } + + public Vector3d getPathLegDirectionNext() { + if (next != null) { + PipeControlPoint pcp = this; + if (pcp.isDualInline()) { + pcp = pcp.getDualSub(); } + 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 (isDirected()) { + return getDirectedControlPointDirection(); + } else if (previous == null) { + throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + this); + } else if (isVariableAngle() && !asFixedAngle()) { + throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + this); + } else if (isInline() || isEnd()) { + Vector3d v = getPathLegDirectionPrevious(); + if (v != null) v.negate(); + return v; + } else if (isTurn() && asFixedAngle() && !_getReversed()) { + return getDirection(Direction.NEXT); + } else { + throw new RuntimeException("Missing implementation " + this); } }