]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
Handle PipeRun removals with detaching Components.
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipeControlPoint.java
index eae8ec33220aacc91b27873cf86e9eef4d7110a9..8b1455ca2980a8f4927b291299efff2102d5606f 100644 (file)
@@ -43,6 +43,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        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)
@@ -1065,17 +1067,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()) {
@@ -1088,8 +1092,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) {
@@ -1255,12 +1261,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;
        }
 
        /**
@@ -1305,6 +1314,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);
@@ -1351,6 +1362,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();