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=e1a24f10369024c61a29a1b3d1e8e525039cac3f;hpb=3f17b6e42935927f12683fc26ecd5808bf66cde6;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 e1a24f10..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; @@ -459,11 +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(); @@ -582,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); @@ -612,7 +646,7 @@ public abstract class PipelineComponent extends GeometryNode { 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); @@ -652,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: @@ -664,7 +698,7 @@ 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 = ((TurnComponent)this).getTurnRadius(); @@ -695,12 +729,9 @@ public abstract class PipelineComponent extends GeometryNode { * @param error */ public void setError(String error) { - if (this.error == null) { - if (error == null) - return; - } else if (this.error.equals(error)) + if (Objects.equals(this.error, error)) return; - this.error = error; + this.error = error; firePropertyChanged("error"); } }