X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2FPipeRun.java;h=2c334c1f2810f085f0deaad34028ea9d2a28994c;hb=refs%2Fchanges%2F00%2F3500%2F1;hp=958228e8eefad236d03d6485f5f3a8d0b08030d1;hpb=ebfe6b0245b5cf9231cecedf0aaacd891eb5d344;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipeRun.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipeRun.java index 958228e8..2c334c1f 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipeRun.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipeRun.java @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.simantics.g3d.math.MathTools; import org.simantics.g3d.property.annotations.GetPropertyValue; @@ -158,6 +160,86 @@ public class PipeRun extends P3DParentNode { return true; } + public boolean canMerge(PipeRun other) { + return MathTools.equals(pipeDiameter,other.pipeDiameter); + } + + /** + * Merges contents of PipeRun r2 to this PipeRun. Note: does not connect boundary components! + * @param r2 + */ + public void merge(PipeRun r2) { + Map turnIndexMap = null; + if (!this.equalSpecs(r2)) { + if (!this.canMerge(r2)) + throw new IllegalArgumentException("PipeRuns cannot be merged"); + // Merge turn radii. + turnIndexMap = new HashMap<>(); + List mergedTurnRadius = new ArrayList<>(); + for (double t : this.getTurnRadiusArray()) { + mergedTurnRadius.add(t); + } + for (int i2 = 0; i2 < r2.getTurnRadiusArray().length; i2++) { + double t2 = r2.getTurnRadiusArray()[i2]; + boolean found = false; + for (int i = 0; i < mergedTurnRadius.size(); i++) { + if (MathTools.equals(mergedTurnRadius.get(i), t2)) { + turnIndexMap.put(i2, i); + found = true; + break; + } + } + if (!found) { + turnIndexMap.put(i2, mergedTurnRadius.size()); + mergedTurnRadius.add(t2); + } + } + for (PipeControlPoint pcp : r2.getControlPoints()) { + PipelineComponent comp = pcp.getPipelineComponent(); + if (comp instanceof TurnComponent) { + + } + } + if (mergedTurnRadius.size() > this.getTurnRadiusArray().length) { + double arr[] = new double[mergedTurnRadius.size()]; + for (int i = 0; i < mergedTurnRadius.size(); i++) { + arr[i] = mergedTurnRadius.get(i); + } + this.setTurnRadiusArray(arr); + } + } + // Move components and control points + Collection pcps = r2.getControlPoints(); + for (PipeControlPoint pcp : pcps) { + r2.deattachChild(pcp); + this.addChild(pcp); + PipelineComponent component = pcp.getPipelineComponent(); + if (component != null) { + if (!(component instanceof Nozzle)) { + component.deattach(); + this.addChild(component); + } else { + Nozzle n = (Nozzle)component; + n.setPipeRun(this); + } + } + } + // Use new turn radii indexes + if (turnIndexMap != null) { + for (PipeControlPoint pcp : pcps) { + PipelineComponent component = pcp.getPipelineComponent(); + if (component instanceof TurnComponent) { + TurnComponent tc = (TurnComponent)component; + if (tc.getTurnRadiusIndex() == null || tc.getTurnRadiusIndex() < 0) + continue; + tc.setTurnRadiusIndex(turnIndexMap.get(tc.getTurnRadiusIndex())); + } + } + } + r2.remove(); + + } + private class ComponentComparator implements Comparator { @Override public int compare(PipelineComponent o1, PipelineComponent o2) {