]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
Merge "Fix error in inserting dual inline components"
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Mon, 6 Apr 2020 12:43:28 +0000 (12:43 +0000)
committerGerrit Code Review <gerrit2@simantics>
Mon, 6 Apr 2020 12:43:28 +0000 (12:43 +0000)
1  2 
org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java

index 124e54bb15761dc7451c63c5a9a4fd3af70335e5,0c7e3b26ed4935f297f94c12ab7386a01faaf488..cd4f407b22b6f65e3e80a91c2bc4cc5fae2df9a6
@@@ -462,7 -462,7 +462,7 @@@ public class PipeControlPoint extends G
                }
                if (this.rotationAngle != null && Math.abs(this.rotationAngle-rotationAngle) < MathTools.NEAR_ZERO)
                        return;
 -              if (Objects.equals(rotationAngle, rotationAngle))
 +              if (Objects.equals(this.rotationAngle, rotationAngle))
                        return;
                this.rotationAngle = rotationAngle;
                firePropertyChanged("rotationAngle");
                        if (pcp.isDualSub()) {
                                pcp.getParentPoint().setNext(this);
                        }
-                       if (isDualInline()) {
-                           getDualSub().setPrevious(this);
-                       }
                } else {
                        // if direction is previous, user must have given sizechange
                        if (pcp.isDualSub())
        }
        
        /**
 -       * Returns direction vector. 
 +       * Returns direction vector pointing towards an adjacent component for
 +       * directed control points or turn control points with one open end. 
         * 
 -       * For directed control points, always returns outwards pointing vector.
 +       * Always returns an outwards pointing vector.
 +       * 
 +       * For any other type of component, the return value is null.
 +       * 
 +       * For turn components this only return a non-null value for the unconnected
 +       * end of the component. 
         * 
         * @param direction
         * @return normalized vector, or null
                      Vector3d offset = new Vector3d();
                      MathTools.rotate(q2, v, offset);
                      MathTools.rotate(q, offset, dir);
 +                    dir.negate();
                      dir.normalize();
                      return dir;
                  }
         */
        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);
                }
        }
  
                updateSubPoint();
        }
  
 +      public void orientToDirection(Vector3d dir) {
 +              Double angleO = getRotationAngle();
 +              double angle = 0.0;
 +              if (angleO != null)
 +                      angle = angleO;
 +              boolean reversed = _getReversed();
 +              Quat4d q = null;
 +              if (dir != null) {
 +                  q = getControlPointOrientationQuat(dir, angle, reversed);
 +              } else {
 +                  q = getControlPointOrientationQuat(angle, reversed);
 +              }
 +              setWorldOrientation(q);
 +      }
 +
        @Override
        public String toString() {
                return getClass().getName() + "@" + Integer.toHexString(hashCode());