]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java
White space clean-up
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / PipelineComponent.java
index 8fe597cad4f760a58dcf82636a594a8c88eb44ae..6ddd7a09fc9ba3d68c83fd8bb6c6534d84485619 100644 (file)
@@ -14,7 +14,7 @@ import org.simantics.objmap.graph.annotations.RelatedGetObj;
 import org.simantics.objmap.graph.annotations.RelatedSetObj;
 import org.simantics.plant3d.ontology.Plant3D;
 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
-import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.Type;
+import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PointType;
 import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
 
 /**
@@ -31,6 +31,10 @@ public abstract class PipelineComponent extends GeometryNode {
        private PipelineComponent next;
        private PipelineComponent previous;
        
+       public PipeRun getPipeRun() {
+               return pipeRun;
+       }
+       
        /**
         * Sets the pipe run.
         * 
@@ -54,7 +58,7 @@ public abstract class PipelineComponent extends GeometryNode {
        }
        
        @RelatedGetObj(Plant3D.URIs.HasAlternativePipeRun)
-       public PipeRun getAlternaitvePipeRun() {
+       public PipeRun getAlternativePipeRun() {
                return alternativePipeRun;
        }
        
@@ -88,7 +92,10 @@ public abstract class PipelineComponent extends GeometryNode {
        public void setNext(PipelineComponent comp) {
                if (next == comp)
                        return;
+               if (this.next != null)
+                       this.next._removeRef(this);
                this.next = comp;
+               this.syncnext = false;
                syncNext();
                firePropertyChanged(Plant3D.URIs.HasNext);
                if (comp != null)
@@ -106,8 +113,11 @@ public abstract class PipelineComponent extends GeometryNode {
        public void setPrevious(PipelineComponent comp) {
                if (previous == comp)
                        return;
+               if (this.previous != null)
+                       this.previous._removeRef(this);
                this.previous = comp;
-               
+               this.syncprev = false;
+               syncPrevious();
                firePropertyChanged(Plant3D.URIs.HasPrevious);
                if (comp != null)
                        comp.sync();
@@ -124,7 +134,10 @@ public abstract class PipelineComponent extends GeometryNode {
        public void setBranch0(PipelineComponent comp) {
                if (branch0 == comp)
                        return;
+               if (this.branch0 != null)
+                       this.branch0._removeRef(this);
                this.branch0 = comp;
+               this.syncbr0 = false;
                syncBranch0();
                firePropertyChanged(Plant3D.URIs.HasBranch0);
                if (comp != null)
@@ -132,8 +145,29 @@ public abstract class PipelineComponent extends GeometryNode {
 //             System.out.println(this + " next " + comp);
        }
 
+       @GetPropertyValue(name="Previous",tabId="Debug",value=Plant3D.URIs.HasPrevious)
+       public String getPreviousDebug() {
+               if (previous == null)
+                       return null;
+               return previous.getName();
+       }
+       
+       @GetPropertyValue(name="Next",tabId="Debug",value=Plant3D.URIs.HasNext)
+       public String getNextDebug() {
+               if (next == null)
+                       return null;
+               return next.getName();
+       }
+       
+       @GetPropertyValue(name="Branch0",tabId="Debug",value=Plant3D.URIs.HasBranch0)
+       public String getBR0Debug() {
+               if (branch0 == null)
+                       return null;
+               return branch0.getName();
+       }
 
        
+       
        private PipeControlPoint getBranchPoint() {
                PipeControlPoint branchPoint;
                if (getControlPoint().getSubPoint().size() > 0) {
@@ -143,7 +177,7 @@ public abstract class PipelineComponent extends GeometryNode {
                                return null;
                        branchPoint = new PipeControlPoint(this,branch0.getPipeRun());
                        branchPoint.setFixed(false);
-                       branchPoint.setType(Type.END);
+                       branchPoint.setType(PointType.END);
                        branchPoint.parent = getControlPoint();
                        getControlPoint().children.add(branchPoint);
                        branchPoint.setWorldOrientation(getControlPoint().getWorldOrientation());
@@ -182,28 +216,56 @@ public abstract class PipelineComponent extends GeometryNode {
                return true;
        }
        
+       // When link to a component is removed, also link to the other direction must be removed at the same time, or
+       // Control point structure is left into illegal state.
+       private void _removeRef(PipelineComponent comp) {
+               if (next == comp) {
+                       next = null;
+                       syncnext = false;
+                       syncNext();
+               } else if (previous == comp) {
+                       previous = null;
+                       syncprev = false;
+                       syncPrevious();
+               } else if (branch0 == comp) {
+                       branch0 = null;
+                       syncbr0 = false;
+                       syncBranch0();
+               }
+       }
        
+       boolean syncnext = false;
+       private void syncNext() {
+               if (syncnext)
+                       return;
+               syncnext = _syncNext();
+       }
        
-       private boolean syncNext() {
-               
-               if (getControlPoint() != null) {
+       
+       private boolean _syncNext() {
+               PipeControlPoint pcp = getControlPoint();
+               if (pcp != null) {
+                       
                        if (next != null ) {
-                               if (next.getControlPoint() != null && next.getPipeRun() != null) {
+                               if (next.getControlPoint() != null) {
                                        
                                        // TODO, relying that the other direction is connected.
                                        boolean nxt = next.getPrevious() == this;
                                        boolean br0 = next.getBranch0() == this;
                                        if (nxt){
-                                               return _connectNext(getControlPoint(), next.getControlPoint()); 
+                                               return _connectNext(pcp, next.getControlPoint());       
                                        } else if (br0) {
-                                               return _connectNext(getControlPoint(), next.getBranchPoint());
+                                               return _connectNext(pcp, next.getBranchPoint());
+                                       } else {
+                                               return false;
                                        }
                                } else {
                                        return false;
                                }
                                
-                       } else if (getControlPoint().getPrevious() != null) {
-                               getControlPoint().setNext(null);
+                       } else if (pcp.getNext() != null) {
+                               pcp.setNext(null);
+                               return true;
                        }
                } else {
                        return false;
@@ -211,26 +273,36 @@ public abstract class PipelineComponent extends GeometryNode {
                return true;
        }
        
-       private boolean syncPrevious() {
-
-               if (getControlPoint() != null) {
+       boolean syncprev = false;
+       private void syncPrevious() {
+               if (syncprev)
+                       return;
+               syncprev = _syncPrevious();
+       }
+       
+       private boolean _syncPrevious() {
+               PipeControlPoint pcp = getControlPoint();
+               if (pcp != null) {
                        if (previous != null ) {
-                               if (previous.getControlPoint() != null && previous.getPipeRun() != null) {
+                               if (previous.getControlPoint() != null) {
                                        
                                        // TODO, relying that the other direction is connected.
                                        boolean prev = previous.getNext() == this;
                                        boolean br0 = previous.getBranch0() == this;
                                        if (prev){
-                                               return _connectPrev(getControlPoint(), previous.getControlPoint());     
+                                               return _connectPrev(pcp, previous.getControlPoint());   
                                        } else if (br0) {
-                                               return _connectPrev(getControlPoint(), previous.getBranchPoint());
+                                               return _connectPrev(pcp, previous.getBranchPoint());
+                                       } else {
+                                               return false;
                                        }
                                } else {
                                        return false;
                                }
                                
-                       } else if (getControlPoint().getPrevious() != null) {
-                               getControlPoint().setPrevious(null);
+                       } else if (pcp.getPrevious() != null) {
+                               pcp.setPrevious(null);
+                               return true;
                        }
                } else {
                        return false;
@@ -238,15 +310,24 @@ public abstract class PipelineComponent extends GeometryNode {
                return true;
        }
        
-       private boolean syncBranch0() {
+       boolean syncbr0 = false;
+       private void syncBranch0() {
+               if (syncbr0)
+                       return;
+               syncbr0 = _syncBranch0();
+       }
+       
+       private boolean _syncBranch0() {
                if (getControlPoint() != null) {
                        if (getControlPoint().isDualInline()) {
                                branch0 = null;
                                return false;
                        }
                        if (branch0 != null) {
-                               if (branch0.getControlPoint() != null  && branch0.getPipeRun() != null) {
+                               if (branch0.getControlPoint() != null) {
                                        PipeControlPoint branchPoint = getBranchPoint();
+                                       if (branchPoint == null)
+                                               return false;
                                        PipeControlPoint pcp = branch0.getControlPoint();
                                        // TODO, relying that the other direction is connected.
                                        boolean next = branch0.getPrevious() == this; // this --> branch0
@@ -255,7 +336,10 @@ public abstract class PipelineComponent extends GeometryNode {
                                                _connectNext(branchPoint, pcp);
                                        } else if (prev){
                                                _connectPrev(branchPoint, pcp); 
+                                       } else {
+                                               return false;
                                        }
+                                       
                                } else {
                                        return false;
                                }
@@ -263,6 +347,7 @@ public abstract class PipelineComponent extends GeometryNode {
                        } else if (getControlPoint().getSubPoint().size() > 0) { // TODO : this may cause problems? (Removes branch point, before branch has been set?)
                                getControlPoint().getSubPoint().get(0).remove();
                                getControlPoint().children.clear();
+                               return true;
                        }
                } else {
                        return false;
@@ -289,22 +374,19 @@ public abstract class PipelineComponent extends GeometryNode {
                return Collections.EMPTY_MAP;
        }
        
-       public PipeRun getPipeRun() {
-               return pipeRun;
-       }
-       
        public abstract String getType();
        public abstract PipeControlPoint getControlPoint();
        
        @Override
        public void remove() {
                PipeControlPoint pcp = getControlPoint();
-               if (pcp != null) {
+               // Second check is needed, when remove process is initiated from control point.
+               if (pcp != null && pcp.getPipelineComponent() != null) {
                        pcp.remove();
                }
                super.remove();
        }
-       
+
        @Override
        protected double[] getColor() {
                if (getControlPoint() == null || !getControlPoint().isFixed())
@@ -376,19 +458,13 @@ public abstract class PipelineComponent extends GeometryNode {
                                double a = pcp.getTurnAngle();
                                return a*r;
                        }
-                        default:
-                                return null;
+                       default:
+                               return null;
                }
        }
        
-       public void getControlPointEnds(Tuple3d p1, Tuple3d p2) {
+       public void getEnds(Tuple3d p1, Tuple3d p2) {
                getControlPoint().getControlPointEnds(p1, p2);
        }
        
-       public Vector3d getNormal() {
-               Vector3d v = new Vector3d();
-               MathTools.rotate(getWorldOrientation(), MathTools.Z_AXIS, v);
-               return v;
-       }
-       
 }