From 6f4226494d2b90e24563763ed2805fcca13de11d Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Tue, 10 Dec 2019 14:37:50 +0200 Subject: [PATCH] Allow insertion of reducers in the middle of pipe runs gitlab #66 Change-Id: Iccf79d8178718cb6dd64033e30ed52729f6c88eb --- .../dialog/ComponentSelectionDialog.java | 17 +- .../controlpoint/PipeControlPoint.java | 5 +- .../plant3d/utils/ComponentUtils.java | 180 +++++++++--------- 3 files changed, 94 insertions(+), 108 deletions(-) diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java b/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java index 00b52f3b..0c292bc8 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java @@ -472,25 +472,16 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange } if (selected.isSizeChange()) { - filterAllowed.add(PositionType.NEXT); - filterAllowed.add(PositionType.PREVIOUS); - if (inlineSplit) { - turnRadiusText.setEnabled(false); - diameterText.setEnabled(false); + turnRadiusText.setEnabled(true); + diameterText.setEnabled(true); + if (diameter == null || turnRadius == null) ok = false; - } else { - turnRadiusText.setEnabled(true); - diameterText.setEnabled(true); - if (diameter == null || turnRadius == null) - ok = false; - } - } else { turnRadiusText.setEnabled(false); diameterText.setEnabled(false); } - if (!selected.isSizeChange() && !selected.isVariable()) { + if (!selected.isVariable()) { switch (selected.getType()) { case END: filterAllowed.add(PositionType.NEXT); diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java index eec074a6..796b5de9 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java @@ -15,6 +15,7 @@ import javax.vecmath.Vector3d; import org.simantics.g3d.math.MathTools; import org.simantics.g3d.property.annotations.GetPropertyValue; import org.simantics.g3d.scenegraph.G3DNode; +import org.simantics.g3d.scenegraph.base.ParentNode; import org.simantics.plant3d.scenegraph.IP3DNode; import org.simantics.plant3d.scenegraph.Nozzle; import org.simantics.plant3d.scenegraph.P3DRootNode; @@ -620,8 +621,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { if (isDualSub()) throw new RuntimeException("Dual sub points cannot be inserted."); // size change control point cannot be inserted this way, because it ends PipeRun - if (isSizeChange()) - throw new RuntimeException("Size change points cannot be inserted."); +// if (isSizeChange()) +// throw new RuntimeException("Size change points cannot be inserted."); PipeRun piperun = previous.getPipeRun(); // and just to make sure that control point structure is not corrupted if (getPipeRun() != null) { diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java b/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java index 0ae36e33..5a84a524 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java @@ -436,77 +436,79 @@ public class ComponentUtils { } } - - if (!sizeChange) { - String name = component.getPipeRun().getUniqueName(typeName); - newComponent.setName(name); + String name = component.getPipeRun().getUniqueName(typeName); + newComponent.setName(name); - pipeRun.addChild(newComponent); + pipeRun.addChild(newComponent); + if (newPcp.isSizeChange()) + newComponent.setAlternativePipeRun(pipeRun); - if (newComponent instanceof InlineComponent) { - InlineComponent inlineComponent = (InlineComponent)newComponent; - if (inlineComponent.isVariableLength()|| inlineComponent.isModifialble()) { - newPcp.setLength(inst.length); - newComponent.setParameter("length", inst.length); - } - if (inst.rotationAngle != null) - ((InlineComponent) newComponent).setRotationAngle(inst.rotationAngle); - } else if (newComponent instanceof TurnComponent) { - TurnComponent turnComponent = (TurnComponent)newComponent; - if (turnComponent.isVariableAngle()) { - newPcp.setTurnAngle(inst.angle); - newComponent.setParameter("turnAngle", inst.angle); - } - if (inst.rotationAngle != null) - ((TurnComponent) newComponent).setRotationAngle(inst.rotationAngle); - } - - - newComponent.updateParameters(); - - Vector3d v = new Vector3d(dir); - if (insertAdjustable) { - if (insertPosition == PositionType.NEXT) - v.scale(newComponent.getControlPoint().getInlineLength()); - else if (insertPosition == PositionType.SPLIT) - v.set(0, 0, 0); - else if (insertPosition == PositionType.PREVIOUS) - v.scale(-newComponent.getControlPoint().getInlineLength()); - } else { + if (newComponent instanceof InlineComponent) { + InlineComponent inlineComponent = (InlineComponent)newComponent; + if (inlineComponent.isVariableLength()|| inlineComponent.isModifialble()) { + newPcp.setLength(inst.length); + newComponent.setParameter("length", inst.length); + } + if (inst.rotationAngle != null) + ((InlineComponent) newComponent).setRotationAngle(inst.rotationAngle); + } else if (newComponent instanceof TurnComponent) { + TurnComponent turnComponent = (TurnComponent)newComponent; + if (turnComponent.isVariableAngle()) { + newPcp.setTurnAngle(inst.angle); + newComponent.setParameter("turnAngle", inst.angle); + } + if (inst.rotationAngle != null) + ((TurnComponent) newComponent).setRotationAngle(inst.rotationAngle); + } + + + newComponent.updateParameters(); + + Vector3d v = new Vector3d(dir); + if (insertAdjustable) { + if (insertPosition == PositionType.NEXT) v.scale(newComponent.getControlPoint().getInlineLength()); - } - switch (position) { - case NEXT: - pos.add(v); - break; - case PREVIOUS: - pos.sub(v); - break; - case SPLIT: - break; - default: - break; - } - - switch (position) { - case NEXT: - if (toPcp.isDualInline()) - toPcp = toPcp.getDualSub(); - newPcp.insert(toPcp, Direction.NEXT); - newPcp.setWorldPosition(pos); - break; - case PREVIOUS: - if (toPcp.isDualSub()) - toPcp = toPcp.parent; - newPcp.insert(toPcp, Direction.PREVIOUS); - newPcp.setWorldPosition(pos); - break; - case SPLIT: - PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true); - default: - break; - } + else if (insertPosition == PositionType.SPLIT) + v.set(0, 0, 0); + else if (insertPosition == PositionType.PREVIOUS) + v.scale(-newComponent.getControlPoint().getInlineLength()); } else { + v.scale(newComponent.getControlPoint().getInlineLength()); + } + switch (position) { + case NEXT: + pos.add(v); + break; + case PREVIOUS: + pos.sub(v); + break; + case SPLIT: + break; + default: + break; + } + + switch (position) { + case NEXT: + if (toPcp.isDualInline()) + toPcp = toPcp.getDualSub(); + newPcp.insert(toPcp, Direction.NEXT); + newPcp.setWorldPosition(pos); + break; + case PREVIOUS: + if (toPcp.isDualSub()) + toPcp = toPcp.parent; + newPcp.insert(toPcp, Direction.PREVIOUS); + newPcp.setWorldPosition(pos); + break; + case SPLIT: + PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true); + default: + break; + } + + // Move the size change and the rest of the components in the pipe run to a new pipe run + if (sizeChange) { PipeRun other = new PipeRun(); String n = root.getUniqueName("PipeRun"); other.setName(n); @@ -514,39 +516,31 @@ public class ComponentUtils { other.setTurnRadius(inst.turnRadius); root.addChild(other); + other.addChild(newComponent.getControlPoint().getDualSub()); + newComponent.setAlternativePipeRun(other); - if (position == PositionType.NEXT) { - PipingRules.addSizeChange(false, pipeRun, other, (InlineComponent)newComponent, toPcp, null); - } else if (position == PositionType.PREVIOUS){ - PipingRules.addSizeChange(true, pipeRun, other, (InlineComponent)newComponent, toPcp, null); - } - newPcp.setWorldPosition(pos); - - // TODO : chicken-egg problem - newComponent.updateParameters(); - Vector3d v = new Vector3d(dir); - v.scale(newComponent.getControlPoint().getLength()*0.5); - switch (position) { - case NEXT: - pos.add(v); - break; - case PREVIOUS: - pos.sub(v); - break; - case SPLIT: - break; - default: - break; + boolean forward = position != PositionType.PREVIOUS; + PipelineComponent comp = forward ? newComponent.getNext() : newComponent.getPrevious(); + while (comp != null && comp.getPipeRun() == pipeRun) { + if (comp.getParent() == pipeRun) { + comp.deattach(); + other.addChild(comp); + } else { + comp.setPipeRun(other); + } + + // Reset parameters to match new pipe run + comp.updateParameters(); + + comp = forward ? comp.getNext() : comp.getPrevious(); } - newPcp.setWorldPosition(pos); - if (inst.rotationAngle != null) - ((InlineComponent) newComponent).setRotationAngle(inst.rotationAngle); + newComponent.updateParameters(); } - return newComponent; } + public static boolean connect(PipelineComponent current, PipelineComponent endTo) throws Exception { return connect(current, endTo, null, null); } -- 2.45.2