X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2FPipelineComponent.java;h=e200af6b2c852419ffbae9f3334ce2744cbf256b;hb=0602e0f78f22aaf27211ef1de801ddc631e103c0;hp=8fe597cad4f760a58dcf82636a594a8c88eb44ae;hpb=a460e609147d064dd3da464bcf1626845e0f93b4;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 8fe597ca..e200af6b 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java @@ -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) { @@ -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()) @@ -381,14 +463,8 @@ public abstract class PipelineComponent extends GeometryNode { } } - 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; - } - }