X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2FPipelineComponent.java;h=6afa937d60f18c8cdbd38234ecfae6d3fbce360c;hb=refs%2Fchanges%2F77%2F3977%2F1;hp=28e4ad71f12951eb9237ef2b2514ae3c12047413;hpb=549d4ea5320afd818da290fa96ee07fe27a575a7;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 28e4ad71..6afa937d 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import javax.vecmath.Quat4d; import javax.vecmath.Tuple3d; @@ -78,9 +79,16 @@ public abstract class PipelineComponent extends GeometryNode { return; this.alternativePipeRun = pipeRun; if (getControlPoint().isDualInline()) { - PipeControlPoint sub = getControlPoint().getSubPoint().get(0); - if (sub.getParent() != this.alternativePipeRun) - this.alternativePipeRun.addChild(sub); + PipeControlPoint sub = getControlPoint().getDualSub(); + if (sub.getParent() != this.alternativePipeRun) { + if (this.alternativePipeRun != null) { + this.alternativePipeRun.addChild(sub); + } else if (sub.getPipeRun() != null) { + // FIXME : how to handle child point without proper run? + sub.getPipeRun().remChild(sub); + } + } + } firePropertyChanged(Plant3D.URIs.HasAlternativePipeRun); } @@ -93,7 +101,6 @@ public abstract class PipelineComponent extends GeometryNode { @Override @CompoundRelatedGetValue(objRelation=Plant3D.URIs.hasParameter,objType=Plant3D.URIs.Parameter,valRelation=Plant3D.URIs.hasParameterValue) - @CompoundGetPropertyValue(name="Parameters",tabId="Parameters",value="parameters") public Map getParameterMap() { return super.getParameterMap(); } @@ -109,6 +116,8 @@ public abstract class PipelineComponent extends GeometryNode { // TODO : how to filter parameters that are calculated by geometry provider? Map map = new HashMap(getParameterMap()); map.remove("radius"); + map.remove("radius2"); + map.remove("offset"); return map; } @@ -121,6 +130,12 @@ public abstract class PipelineComponent extends GeometryNode { } setParameterMap(parameters); } + + public void setParameter(String name, Object value) { + Map parameters = new HashMap<>(getParameterMap()); + parameters.put(name, value); + setParameterMap(parameters); + } public abstract void setType(String typeURI) throws Exception; @@ -131,18 +146,23 @@ public abstract class PipelineComponent extends GeometryNode { @RelatedSetObj(Plant3D.URIs.HasNext) public void setNext(PipelineComponent comp) { - if (next == comp) - return; + if (next == comp) { + syncNext(); + return; + } if (this.next != null) - this.next._removeRef(this); - this.next = comp; - this.syncnext = false; - if (DEBUG) System.out.println(this + " next " + comp); - syncNext(); - firePropertyChanged(Plant3D.URIs.HasNext); - if (comp != null) - comp.sync(); - + this.next._removeRef(this); + _setNext(comp); + this.syncnext = false; + if (DEBUG) System.out.println(this + " next " + comp); + syncNext(); + firePropertyChanged(Plant3D.URIs.HasNext); + if (comp != null) + comp.sync(); + } + + protected void _setNext(PipelineComponent comp) { + this.next = comp; } @@ -153,19 +173,25 @@ public abstract class PipelineComponent extends GeometryNode { @RelatedSetObj(Plant3D.URIs.HasPrevious) public void setPrevious(PipelineComponent comp) { - if (previous == comp) + if (previous == comp) { + syncPrevious(); return; + } if (this.previous != null) this.previous._removeRef(this); - this.previous = comp; + _setPrevious(comp); this.syncprev = false; if (DEBUG) System.out.println(this + " prev " + comp); syncPrevious(); firePropertyChanged(Plant3D.URIs.HasPrevious); if (comp != null) comp.sync(); - } + + protected void _setPrevious(PipelineComponent comp) { + this.previous = comp; + } + private PipelineComponent branch0; @RelatedGetObj(Plant3D.URIs.HasBranch0) @@ -175,8 +201,10 @@ public abstract class PipelineComponent extends GeometryNode { @RelatedSetObj(Plant3D.URIs.HasBranch0) public void setBranch0(PipelineComponent comp) { - if (branch0 == comp) + if (branch0 == comp) { + syncBranch0(); return; + } if (this.branch0 != null) this.branch0._removeRef(this); this.branch0 = comp; @@ -213,8 +241,8 @@ public abstract class PipelineComponent extends GeometryNode { private PipeControlPoint getBranchPoint() { PipeControlPoint branchPoint; - if (getControlPoint().getSubPoint().size() > 0) { - branchPoint = getControlPoint().getSubPoint().get(0); + if (getControlPoint().getChildPoints().size() > 0) { + branchPoint = getControlPoint().getChildPoints().get(0); } else { if (branch0.getPipeRun() == null) return null; @@ -235,27 +263,27 @@ public abstract class PipelineComponent extends GeometryNode { if (pcp.getNext() != nextPCP) { pcp.setNext(nextPCP); } - if (pcp.isDualInline()) { - PipeControlPoint sub = pcp.getSubPoint().get(0); - if (sub.getNext() != nextPCP) - sub.setNext(nextPCP); - } +// if (pcp.isDualInline()) { +// PipeControlPoint sub = pcp.getChildPoints().get(0); +// if (sub.getNext() != nextPCP) +// sub.setNext(nextPCP); +// } return true; } private boolean _connectPrev(PipeControlPoint pcp, PipeControlPoint prevPCP) { if (prevPCP == null) return false; - if (prevPCP.isDualInline()) - prevPCP = prevPCP.getSubPoint().get(0); +// if (prevPCP.isDualInline()) +// prevPCP = prevPCP.getChildPoints().get(0); if (pcp.getPrevious() != prevPCP) { pcp.setPrevious(prevPCP); } - if (pcp.isDualInline()) { - PipeControlPoint sub = pcp.getSubPoint().get(0); - if (sub.getPrevious() != prevPCP) - sub.setPrevious(prevPCP); - } +// if (pcp.isDualInline()) { +// PipeControlPoint sub = pcp.getChildPoints().get(0); +// if (sub.getPrevious() != prevPCP) +// sub.setPrevious(prevPCP); +// } return true; } @@ -263,22 +291,28 @@ public abstract class PipelineComponent extends GeometryNode { // Control point structure is left into illegal state. private void _removeRef(PipelineComponent comp) { if (next == comp) { - next = null; + _setNext(null); syncnext = false; + if (DEBUG) System.out.println(this + " remove next " + comp); + firePropertyChanged(Plant3D.URIs.HasNext); syncNext(); } else if (previous == comp) { - previous = null; + _setPrevious(null); syncprev = false; + if (DEBUG) System.out.println(this + " remove prev " + comp); + firePropertyChanged(Plant3D.URIs.HasPrevious); syncPrevious(); } else if (branch0 == comp) { branch0 = null; syncbr0 = false; + if (DEBUG) System.out.println(this + " remove br0 " + comp); + firePropertyChanged(Plant3D.URIs.HasBranch0); syncBranch0(); } } boolean syncnext = false; - private void syncNext() { + protected void syncNext() { if (syncnext) return; syncnext = _syncNext(); @@ -317,7 +351,7 @@ public abstract class PipelineComponent extends GeometryNode { } boolean syncprev = false; - private void syncPrevious() { + protected void syncPrevious() { if (syncprev) return; syncprev = _syncPrevious(); @@ -354,7 +388,7 @@ public abstract class PipelineComponent extends GeometryNode { } boolean syncbr0 = false; - private void syncBranch0() { + protected void syncBranch0() { if (syncbr0) return; syncbr0 = _syncBranch0(); @@ -387,7 +421,7 @@ public abstract class PipelineComponent extends GeometryNode { return false; } - } else if (getControlPoint().getSubPoint().size() > 0) { // TODO : this may cause problems? (Removes branch point, before branch has been set?) + } else if (getControlPoint().getChildPoints().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; @@ -414,7 +448,7 @@ public abstract class PipelineComponent extends GeometryNode { } public Map updateParameterMap() { - return Collections.EMPTY_MAP; + return Collections.emptyMap(); } public abstract String getType(); @@ -426,10 +460,44 @@ public abstract class PipelineComponent extends GeometryNode { PipeControlPoint pcp = getControlPoint(); // Second check is needed, when remove process is initiated from control point. if (pcp != null && pcp.getPipelineComponent() != null) { + if (pcp.isSizeChange()) { + mergeWithAlternative(); + } + pcp.remove(); } + + setPipeRun(null); super.remove(); } + + private void mergeWithAlternative() { + PipeRun run = getPipeRun(); + PipeRun alternative = getAlternativePipeRun(); + if (alternative != null) { + // Move components from alternative pipe run to main run + PipelineComponent p = getNext(); + while (p != null && p.getPipeRun() == alternative) { + if (p.getParent() == alternative) { + p.deattach(); // For components + run.addChild(p); + } + else { + p.setPipeRun(run); // For nozzles + } + + p.updateParameters(); + PipingRules.requestUpdate(p.getControlPoint()); + + p = p.getNext(); + } + + setAlternativePipeRun(run); + + if (alternative.getChild().isEmpty()) + alternative.remove(); + } + } public void removeAndSplit() { PipeControlPoint pcp = getControlPoint(); @@ -437,6 +505,7 @@ public abstract class PipelineComponent extends GeometryNode { if (pcp != null && pcp.getPipelineComponent() != null) { pcp.removeAndSplit(); } + setPipeRun(null); super.remove(); } @@ -460,12 +529,7 @@ public abstract class PipelineComponent extends GeometryNode { super.setOrientation(orientation); if (getControlPoint() != null) { getControlPoint()._setWorldOrientation(getWorldOrientation()); - try { - PipingRules.requestUpdate(getControlPoint()); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + PipingRules.requestUpdate(getControlPoint()); } } @@ -476,12 +540,7 @@ public abstract class PipelineComponent extends GeometryNode { super.setPosition(position); if (getControlPoint() != null) { getControlPoint()._setWorldPosition(getWorldPosition()); - try { - PipingRules.requestUpdate(getControlPoint()); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + PipingRules.requestUpdate(getControlPoint()); } } @@ -507,7 +566,7 @@ public abstract class PipelineComponent extends GeometryNode { case END: return null; case TURN: { - double r = getPipeRun().getTurnRadius(); + double r = ((TurnComponent)this).getTurnRadius(); double a = pcp.getTurnAngle(); return a*r; } @@ -516,6 +575,24 @@ public abstract class PipelineComponent extends GeometryNode { } } + /** + * Returns diameter of the pipe + * @return + */ + public Double getDiameter() { + return getPipeRun().getPipeDiameter(); + } + + /** + * Returns secondary diameter of the pipe for size change components + * @return + */ + public Double getDiameter2() { + if (getAlternativePipeRun() == null) + return null; + return getAlternativePipeRun().getPipeDiameter(); + } + public void getEnds(Tuple3d p1, Tuple3d p2) { getControlPoint().getControlPointEnds(p1, p2); } @@ -539,8 +616,8 @@ public abstract class PipelineComponent extends GeometryNode { } // Calculate center of mass for the frustum - double r1 = getPipeRun().getPipeDiameter(); - double r2 = getAlternativePipeRun().getPipeDiameter(); + double r1 = getPipeRun().getInsideDiameter(); + double r2 = getAlternativePipeRun().getInsideDiameter(); Vector3d p1 = new Vector3d(), p2 = new Vector3d(); pcp.getInlineControlPointEnds(p1, p2); @@ -567,9 +644,9 @@ public abstract class PipelineComponent extends GeometryNode { case TURN: { Vector3d loc = pcp.getRealPosition(PositionType.PREVIOUS); - double r = getPipeRun().getTurnRadius(); + double r = ((TurnComponent)this).getTurnRadius(); double a = pcp.getTurnAngle(); - double pipeRadius = pcp.getPipeRun().getPipeDiameter() / 2; + double pipeRadius = pcp.getPipeRun().getInsideDiameter() / 2; // Unit vector in inlet flow direction Vector3d inletDir = pcp.getPathLegDirection(Direction.PREVIOUS); @@ -609,7 +686,7 @@ public abstract class PipelineComponent extends GeometryNode { if (pcp == null) throw new IllegalStateException("No centroid defined"); - double pipeRadius = getPipeRun().getPipeDiameter() / 2; + double pipeRadius = getPipeRun().getInsideDiameter() / 2; switch (pcp.getType()) { case INLINE: @@ -621,10 +698,10 @@ public abstract class PipelineComponent extends GeometryNode { // Calculate center of mass for the frustum double r1 = pipeRadius; - double r2 = getAlternativePipeRun().getPipeDiameter() / 2; + double r2 = getAlternativePipeRun().getInsideDiameter() / 2; return pcp.getLength() * Math.PI * (r1*r1 + r1*r2 + r2*r2) / 4; case TURN: { - double r = getPipeRun().getTurnRadius(); + double r = ((TurnComponent)this).getTurnRadius(); double a = pcp.getTurnAngle(); return r * a * Math.PI * pipeRadius * pipeRadius; } @@ -632,4 +709,29 @@ public abstract class PipelineComponent extends GeometryNode { throw new IllegalStateException("No centroid defined"); } } + + + private String error; + + /** + * Returns possible pipe modelling error, or null; + * @return + */ + @GetPropertyValue(name="Error", value="error", tabId = "Default") + public String getError() { + return error; + } + + /** + * Sets pipe modelling error. + * + * Error is usually set by PipingRules. + * @param error + */ + public void setError(String error) { + if (Objects.equals(this.error, error)) + return; + this.error = error; + firePropertyChanged("error"); + } }