]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
Revised update logic for inline components
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipeControlPoint.java
index 20386b5408c11ca4477e4fb6a67a4bb4e4209ff5..abd899ac23ae0af43f07b3020894fa29b9b0bfc9 100644 (file)
@@ -36,12 +36,15 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
 
        private PointType type;
        private boolean isFixed = true;        // In-line: fixed-length Turn: fixed-angle
+       private boolean isMod = false;         // Can user modify fixed value manually 
        private boolean isRotate = false;      // rotates around path leg axis.
        private boolean isReverse = false;     // definition direction can be swapped
        private boolean isDeletable = true;    // can be removed by rules
        private boolean isSizeChange = false;  // changes size of the pipe. The next control point / component is on different PipeRun
        private boolean isSub = false;         // child point for offset / size change
 
+       private boolean disposed = false;
+       
        public PipeControlPoint(PipelineComponent component) {
                this.component = component;
                if (component.getPipeRun() != null)
@@ -88,6 +91,15 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        public void setFixed(boolean fixed) {
                this.isFixed = fixed;
        }
+       
+       @GetPropertyValue(name="Mod",tabId="Debug",value="mod")
+       public boolean isMod() {
+        return isMod;
+    }
+    
+    public void setMod(boolean isMod) {
+        this.isMod = isMod;
+    }
 
        @GetPropertyValue(name="Rotate",tabId="Debug",value="rotate")
        public boolean isRotate() {
@@ -135,6 +147,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        public boolean isInline() {
                return type == PointType.INLINE;
        }
+       
+       public boolean asPathLegEnd() {
+           // Ends and Turns are path leg ends by default, but also unconnected inline are path leg ends.
+           return isPathLegEnd() || getNext() == null || getPrevious() == null;
+       }
 
        /**
         * True for end components, if control point defines absolute position direction, which rules cannot modify. 
@@ -331,6 +348,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
         if (MathTools.createRotation(dirOutN, dirOut, dir, aa)) {
             setRotationAngle(aa.angle);
             setTurnAngle(angle);
+            if (DEBUG) System.out.println("convertToFixed " + dir + " " + dirOut + " " +dirOutN + " " +angle + " "+ aa.angle);
         }
        }
 
@@ -388,7 +406,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
 
        @GetPropertyValue(name="Rotation Angle",tabId="Debug",value="rotationAngle")
        public Double getRotationAngle() {
-           if (asFixedAngle())
+           if (isRotate || asFixedAngle())
                return rotationAngle;
            return null;
        }
@@ -511,26 +529,34 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                        return getControlPointOrientationQuat(dir, turnAxis, angle);
                }
        }
+       
+       public Quat4d getControlPointOrientationQuat(Vector3d dir, double angle, boolean reversed) {
+           if (turnAxis == null) {
+            if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+                dir.normalize();
+            Quat4d q =  getControlPointOrientationQuat(dir, angle);
+            if (reversed) {
+                Quat4d q2 = new Quat4d();
+                q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
+                q.mulInverse(q2);
+            }
+            return q;
+        } else {
+            if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+                dir.normalize();
+            return getControlPointOrientationQuat(dir, turnAxis, angle);
+        }
+       }
 
        public Quat4d getControlPointOrientationQuat(double angle, boolean reversed) {
 
                if (turnAxis == null) {
                        Vector3d dir = getPathLegDirection(Direction.NEXT);
-                       if (dir.lengthSquared() > MathTools.NEAR_ZERO)
-                               dir.normalize();
-                       Quat4d q =  getControlPointOrientationQuat(dir, angle);
-                       if (reversed) {
-                               Quat4d q2 = new Quat4d();
-                               q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
-                               q.mulInverse(q2);
-                       }
-                       return q;
+                       return getControlPointOrientationQuat(dir, angle, reversed);
                } else {
                        Vector3d dir = getPathLegDirection(Direction.PREVIOUS);
                        dir.negate();
-                       if (dir.lengthSquared() > MathTools.NEAR_ZERO)
-                               dir.normalize();
-                       return getControlPointOrientationQuat(dir, turnAxis, angle);
+                       return getControlPointOrientationQuat(dir, angle, reversed);
                }
        }
 
@@ -1055,17 +1081,19 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        
 
        public void _remove(boolean renconnect) {
-               if (component == null && next == null && previous == null)
-                       return;
-               if (DEBUG) System.out.println(this + " Remove " + renconnect);
+           if (disposed)
+               return;
+               
+           if (DEBUG) System.out.println(this + " Remove " + renconnect);
 
                if (getParentPoint() != null) {
                    getParentPoint()._remove(renconnect);
                    return;
                }
                PipeRun pipeRun = getPipeRun();
-               if (pipeRun == null)
-                       return;
+//             PipeRUn removal has been changed, so pipeRun may be null.
+//             if (pipeRun == null)
+//                     return;
 
                PipeControlPoint additionalRemove = null;
                if (!PipingRules.isEnabled()) {
@@ -1078,8 +1106,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                        PipeControlPoint currentNext = next;
                        if (currentNext == null && currentPrev == null) {
                                removeComponent();
-                               pipeRun.remChild(this);
-                               checkRemove(pipeRun);
+                               if (pipeRun != null) {
+                                   pipeRun.remChild(this);
+                                   checkRemove(pipeRun);
+                               }
                                return;
                        }
                        if (currentNext != null && currentPrev != null) {
@@ -1245,12 +1275,15 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                }
 
                removeComponent();
-               pipeRun.remChild(this);
-               checkRemove(pipeRun);
-               if (PipingRules.isEnabled() && pipeRun.getParent() != null && pipeRun.getControlPoints().size() > 0)
-                       PipingRules.validate(pipeRun);
+               if (pipeRun != null) {
+               pipeRun.remChild(this);
+               checkRemove(pipeRun);
+               if (PipingRules.isEnabled() && pipeRun.getParent() != null && pipeRun.getControlPoints().size() > 0)
+                       PipingRules.validate(pipeRun);
+               }
                if (additionalRemove != null)
                        additionalRemove.remove();
+               disposed = true;
        }
 
        /**
@@ -1295,6 +1328,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
             
             PipelineComponent n = next.getPipelineComponent();
             while (n != null) {
+                if (n.getPipeRun() != previousRun)
+                    break;
                 if (! (n instanceof Nozzle)) {
                     n.deattach();
                     nextPipeRun.addChild(n);
@@ -1341,6 +1376,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
     }
 
        private boolean checkRemove(PipeRun pipeRun) {
+           if (pipeRun == null)
+               return false;
                Collection<PipeControlPoint> points = pipeRun.getControlPoints();
                if (points.size() == 0) {
                        pipeRun.remove();