]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
Refactoring of PipeControlPoint.getPathLegDirection() 88/3988/1
authorReino Ruusu <reino.ruusu@semantum.fi>
Thu, 12 Mar 2020 13:15:52 +0000 (15:15 +0200)
committerReino Ruusu <reino.ruusu@semantum.fi>
Thu, 12 Mar 2020 13:15:52 +0000 (15:15 +0200)
gitlab #107

Change-Id: Ic6f04155c1552597aa80ebdacbc58dcab6ad56c2

org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java

index 00a1560ef9378fe0151d6f61b98a074f3b051ed3..c5bf29ddd5798d06175f9e6c6d90e6f078e16cf7 100644 (file)
@@ -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);
                }
        }