X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2FPipelineComponent.java;h=f71dfed41a8e1e676842951bf4a5fc2c60084fcc;hb=bcf3a9c994d2bda45fa3d2738fda8a14bb34cdcd;hp=26a3239700657c78aa7085c14332dc1ecac7ac61;hpb=480f31b77f516043c679bea4357da438fc98d4cf;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java index 26a32397..f71dfed4 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java @@ -88,7 +88,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 +109,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 +130,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 +141,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) { @@ -182,28 +212,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 +269,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 +306,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 +332,10 @@ public abstract class PipelineComponent extends GeometryNode { _connectNext(branchPoint, pcp); } else if (prev){ _connectPrev(branchPoint, pcp); + } else { + return false; } + } else { return false; } @@ -263,6 +343,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;