import java.util.List;
import java.util.Map;
-import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import org.simantics.Simantics;
import org.simantics.db.exception.DatabaseException;
import org.simantics.g3d.math.MathTools;
import org.simantics.g3d.scenegraph.GeometryProvider;
+import org.simantics.g3d.scenegraph.ParametricGeometryProvider;
import org.simantics.layer0.Layer0;
+import org.simantics.plant3d.geometry.ParameterRead;
import org.simantics.plant3d.ontology.Plant3D;
import org.simantics.plant3d.scenegraph.EndComponent;
import org.simantics.plant3d.scenegraph.Equipment;
types.add(Plant3D.URIs.Builtin_ConcentricReducer);
types.add(Plant3D.URIs.Builtin_BranchSplitComponent);
types.add(Plant3D.URIs.Builtin_EccentricReducer);
+ types.add(Plant3D.URIs.Builtin_Elbow45);
+ types.add(Plant3D.URIs.Builtin_Elbow90);
for (String typeURI : types) {
load(graph, typeURI);
}
if (geom != null) {
GeometryProvider provider = graph.adapt(geom, GeometryProvider.class);
+ if (provider instanceof ParametricGeometryProvider) {
+ Map<String,Object> params = graph.syncRequest(new ParameterRead(type));
+ if (params.size() > 0)
+ ((ParametricGeometryProvider)provider).setProperties(params);
+ }
return provider;
}
return null;
if (provider != null || graph.hasStatement(type,p3d.NonVisibleComponent)) {
providers.put(typeURI, provider);
if (graph.isInheritedFrom(type, p3d.PipelineComponent))
- clazzes.put(typeURI,getClazz(graph, type));
+ clazzes.put(typeURI,getClazz(graph, type));
names.put(typeURI, NameUtils.getSafeName(graph, type));
return;
}
*/
public static Equipment createEquipment(P3DRootNode root, String typeURI) throws Exception {
- GeometryProvider provider = providers.get(typeURI);
- if (provider == null) {
- load(typeURI);
- provider = providers.get(typeURI);
- }
- Equipment equipment = root.createEquipment();
- equipment.setType(typeURI);
- equipment.setGeometry(provider);
- root.addChild(equipment);
- return equipment;
- }
+ GeometryProvider provider = providers.get(typeURI);
+ if (provider == null) {
+ load(typeURI);
+ provider = providers.get(typeURI);
+ }
+ Equipment equipment = root.createEquipment();
+ equipment.setType(typeURI);
+ equipment.setGeometry(provider);
+ root.addChild(equipment);
+ return equipment;
+ }
public static InlineComponent createStraight(P3DRootNode root) throws Exception{
InlineComponent component = root.createInline();
}
public static Equipment createEquipment(P3DRootNode root, Item equipmentType) throws Exception {
- Equipment equipment = createEquipment(root, equipmentType.getUri());
- String n = root.getUniqueName(equipmentType.getName());
- equipment.setName(n);
- root.addChild(equipment);
- return equipment;
+ Equipment equipment = createEquipment(root, equipmentType.getUri());
+ String n = root.getUniqueName(equipmentType.getName());
+ equipment.setName(n);
+ return equipment;
}
public static Nozzle createDefaultNozzle(P3DRootNode root, Equipment equipment) throws Exception {
- return createNozzle(root, equipment, new Item(Plant3D.URIs.Builtin_Nozzle, "Nozzle"));
+ return createNozzle(root, equipment, new Item(Plant3D.URIs.Builtin_Nozzle, "Nozzle"));
}
public static Nozzle createNozzle(P3DRootNode root, Equipment equipment, Item nozzleType) throws Exception {
- Nozzle nozzle = root.createNozzle();
- nozzle.setType(nozzleType.getUri());
- String n = root.getUniqueName(nozzleType.getName());
- nozzle.setName(n);
- PipeRun pipeRun = new PipeRun();
- n = root.getUniqueName("PipeRun");
- pipeRun.setName(n);
- nozzle.setPipeRun(pipeRun);
-
- equipment.addChild(nozzle);
- root.addChild(pipeRun);
- // root.getNodeMap().commit("Add nozzle " + n);
- return nozzle;
+ Nozzle nozzle = root.createNozzle();
+ nozzle.setType(nozzleType.getUri());
+ String n = root.getUniqueName(nozzleType.getName());
+ nozzle.setName(n);
+ PipeRun pipeRun = new PipeRun();
+ n = root.getUniqueName("PipeRun");
+ pipeRun.setName(n);
+ nozzle.setPipeRun(pipeRun);
+
+ equipment.addChild(nozzle);
+ root.addChild(pipeRun);
+ // root.getNodeMap().commit("Add nozzle " + n);
+ return nozzle;
}
public static class InsertInstruction {
- public String typeUri;
-
- public PositionType position = PositionType.NEXT;
- public PositionType insertPosition = PositionType.NEXT;
-
- // Reducer requires pipe specs
- public Double diameter;
- public Double turnRadius;
-
- // Variable length
- public Double length;
-
- // Variable angle
- public Double angle;
+ public String typeUri;
+
+ public PositionType position = PositionType.NEXT;
+ public PositionType insertPosition = PositionType.NEXT;
+
+ // Reducer requires pipe specs
+ public Double diameter;
+ public Double turnRadius;
+
+ // Variable length
+ public Double length;
+
+ // Variable angle
+ public Double angle;
- public String getTypeUri() {
- return typeUri;
- }
+ public String getTypeUri() {
+ return typeUri;
+ }
- public void setTypeUri(String typeUri) {
- this.typeUri = typeUri;
- }
+ public void setTypeUri(String typeUri) {
+ this.typeUri = typeUri;
+ }
- public PositionType getPosition() {
- return position;
- }
+ public PositionType getPosition() {
+ return position;
+ }
- public void setPosition(PositionType position) {
- this.position = position;
- }
+ public void setPosition(PositionType position) {
+ this.position = position;
+ }
- public PositionType getInsertPosition() {
- return insertPosition;
- }
+ public PositionType getInsertPosition() {
+ return insertPosition;
+ }
- public void setInsertPosition(PositionType insertPosition) {
- this.insertPosition = insertPosition;
- }
+ public void setInsertPosition(PositionType insertPosition) {
+ this.insertPosition = insertPosition;
+ }
- public Double getDiameter() {
- return diameter;
- }
+ public Double getDiameter() {
+ return diameter;
+ }
- public void setDiameter(Double diameter) {
- this.diameter = diameter;
- }
+ public void setDiameter(Double diameter) {
+ this.diameter = diameter;
+ }
- public Double getTurnRadius() {
- return turnRadius;
- }
+ public Double getTurnRadius() {
+ return turnRadius;
+ }
- public void setTurnRadius(Double turnRadius) {
- this.turnRadius = turnRadius;
- }
+ public void setTurnRadius(Double turnRadius) {
+ this.turnRadius = turnRadius;
+ }
- public Double getLength() {
- return length;
- }
+ public Double getLength() {
+ return length;
+ }
- public void setLength(Double length) {
- this.length = length;
- }
+ public void setLength(Double length) {
+ this.length = length;
+ }
- public Double getAngle() {
- return angle;
- }
+ public Double getAngle() {
+ return angle;
+ }
- public void setAngle(Double angle) {
- this.angle = angle;
- }
+ public void setAngle(Double angle) {
+ this.angle = angle;
+ }
}
public static PipelineComponent addComponent(P3DRootNode root, PipelineComponent component, InsertInstruction inst) throws Exception {
-
- PipelineComponent newComponent = ComponentUtils.createComponent(root, inst.typeUri);
- PipeControlPoint newPcp = newComponent.getControlPoint();
-
- PipeControlPoint toPcp = component.getControlPoint();
- PipeRun pipeRun = toPcp.getPipeRun();
-
- String typeName = names.get(inst.typeUri);
- if (typeName == null)
- typeName = "Component";
-
- Vector3d dir = null;
- Vector3d pos = null;
-
- PositionType position = inst.position;
- PositionType insertPosition = inst.insertPosition;
- boolean lengthAdjustable = false;
- if (newComponent instanceof InlineComponent) {
- lengthAdjustable = ((InlineComponent)newComponent).isVariableLength();
- }
- boolean insertAdjustable = false;
- if (component instanceof InlineComponent) {
- insertAdjustable = ((InlineComponent)component).isVariableLength();
- }
- boolean sizeChange = false;
- if (newComponent instanceof InlineComponent) {
- sizeChange = ((InlineComponent)newComponent).isSizeChange();
- }
-
- if (toPcp.isInline()) {
- switch (position) {
- case NEXT:
- if (toPcp.isDualInline())
- toPcp = toPcp.getSubPoint().get(0);
-
- break;
- case PREVIOUS:
- if (toPcp.isDualSub())
- toPcp = toPcp.parent;
- }
- Vector3d start = new Vector3d();
- Vector3d end = new Vector3d();
- dir = new Vector3d();
- toPcp.getInlineControlPointEnds(start, end, dir);
- dir.normalize();
- switch (position) {
- case NEXT:
- pos = new Vector3d(end);
- break;
- case PREVIOUS:
- pos = new Vector3d(start);
- break;
- case SPLIT:
- pos = new Vector3d(toPcp.getWorldPosition());
- break;
- }
-
- } else if (toPcp.isDirected()) {
- dir = new Vector3d(toPcp.getDirection(Direction.NEXT));
- pos = new Vector3d(toPcp.getWorldPosition());
- } else if (toPcp.isTurn() && toPcp.isFixed()) {
- dir = new Vector3d(toPcp.getDirection(position == PositionType.NEXT ? Direction.NEXT : Direction.PREVIOUS));
- pos = new Vector3d(toPcp.getWorldPosition());
- if (!lengthAdjustable) {
- Vector3d v = new Vector3d(dir);
- v.scale(toPcp.getInlineLength());
- pos.add(v);
- } else {
- if (insertPosition == PositionType.NEXT) {
- Vector3d v = new Vector3d(dir);
- v.scale(toPcp.getInlineLength());
- pos.add(v);
- } else if (insertPosition == PositionType.SPLIT) {
- // scale 0.5*length so that we don't remove the length twice from the new component
- Vector3d v = new Vector3d(dir);
- v.scale(toPcp.getInlineLength()*0.5);
- pos.add(v);
- }
- }
- }
-
-
- if (!sizeChange) {
- String name = component.getPipeRun().getUniqueName(typeName);
- newComponent.setName(name);
+
+ PipelineComponent newComponent = ComponentUtils.createComponent(root, inst.typeUri);
+ PipeControlPoint newPcp = newComponent.getControlPoint();
+
+ PipeControlPoint toPcp = component.getControlPoint();
+ PipeRun pipeRun = toPcp.getPipeRun();
+
+ String typeName = names.get(inst.typeUri);
+ if (typeName == null)
+ typeName = "Component";
+
+ Vector3d dir = null;
+ Vector3d pos = null;
+
+ PositionType position = inst.position;
+ PositionType insertPosition = inst.insertPosition;
+ boolean lengthAdjustable = false;
+ if (newComponent instanceof InlineComponent) {
+ lengthAdjustable = ((InlineComponent)newComponent).isVariableLength();
+ }
+ boolean insertAdjustable = false;
+ if (component instanceof InlineComponent) {
+ insertAdjustable = ((InlineComponent)component).isVariableLength();
+ }
+ boolean sizeChange = false;
+ if (newComponent instanceof InlineComponent) {
+ sizeChange = ((InlineComponent)newComponent).isSizeChange();
+ }
+
+ if (toPcp.isInline()) {
+ switch (position) {
+ case NEXT:
+ if (toPcp.isDualInline()) {
+ toPcp = toPcp.getSubPoint().get(0);
+ pipeRun = toPcp.getPipeRun();
+ }
+
+ break;
+ case PREVIOUS:
+ if (toPcp.isDualSub()) {
+ toPcp = toPcp.parent;
+ pipeRun = toPcp.getPipeRun();
+ }
+ break;
+ default:
+ break;
+ }
+ Vector3d start = new Vector3d();
+ Vector3d end = new Vector3d();
+ dir = new Vector3d();
+ toPcp.getInlineControlPointEnds(start, end, dir);
+ dir.normalize();
+ switch (position) {
+ case NEXT:
+ pos = new Vector3d(end);
+ break;
+ case PREVIOUS:
+ pos = new Vector3d(start);
+ break;
+ case SPLIT:
+ pos = new Vector3d(toPcp.getWorldPosition());
+ break;
+ default:
+ break;
+ }
- pipeRun.addChild(newComponent);
- // TODO: these options are not stored into DB. Should they?!
- if (newComponent instanceof InlineComponent && ((InlineComponent)newComponent).isVariableLength()) {
- newPcp.setLength(inst.length);
- } else if (newComponent instanceof TurnComponent && ((TurnComponent)newComponent).isVariableAngle()) {
- newPcp.setTurnAngle(inst.angle);
- }
-
- 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 {
- v.scale(newComponent.getControlPoint().getInlineLength());
- }
- switch (position) {
- case NEXT:
- pos.add(v);
- break;
- case PREVIOUS:
- pos.sub(v);
- break;
- case SPLIT:
- break;
- }
-
- switch (position) {
- case NEXT:
- if (toPcp.isDualInline())
- toPcp = toPcp.getSubPoint().get(0);
- 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);
- }
- } else {
- PipeRun other = new PipeRun();
- String n = root.getUniqueName("PipeRun");
- other.setName(n);
- other.setPipeDiameter(inst.diameter);
- other.setTurnRadius(inst.turnRadius);
- root.addChild(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;
- }
- newPcp.setWorldPosition(pos);
-
- }
-
-
- return newComponent;
+ } else if (toPcp.isDirected()) {
+ dir = new Vector3d(toPcp.getDirection(Direction.NEXT));
+ pos = new Vector3d(toPcp.getWorldPosition());
+ } else if (toPcp.isTurn() && toPcp.asFixedAngle()) {
+ dir = new Vector3d(toPcp.getDirection(position == PositionType.NEXT ? Direction.NEXT : Direction.PREVIOUS));
+ pos = new Vector3d(toPcp.getWorldPosition());
+ if (!lengthAdjustable) {
+ Vector3d v = new Vector3d(dir);
+ v.scale(toPcp.getInlineLength());
+ pos.add(v);
+ } else {
+ if (insertPosition == PositionType.NEXT) {
+ Vector3d v = new Vector3d(dir);
+ v.scale(toPcp.getInlineLength());
+ pos.add(v);
+ } else if (insertPosition == PositionType.SPLIT) {
+ // scale 0.5*length so that we don't remove the length twice from the new component
+ Vector3d v = new Vector3d(dir);
+ v.scale(toPcp.getInlineLength()*0.5);
+ pos.add(v);
+ }
+ }
+ }
+
+
+ if (!sizeChange) {
+ String name = component.getPipeRun().getUniqueName(typeName);
+ newComponent.setName(name);
+
+ pipeRun.addChild(newComponent);
+ // TODO: these options are not stored into DB. Should they?!
+ if (newComponent instanceof InlineComponent && ((InlineComponent)newComponent).isVariableLength()) {
+ newPcp.setLength(inst.length);
+ } else if (newComponent instanceof TurnComponent && ((TurnComponent)newComponent).isVariableAngle()) {
+ newPcp.setTurnAngle(inst.angle);
+ }
+
+ 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 {
+ 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.getSubPoint().get(0);
+ 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 {
+ PipeRun other = new PipeRun();
+ String n = root.getUniqueName("PipeRun");
+ other.setName(n);
+ other.setPipeDiameter(inst.diameter);
+ other.setTurnRadius(inst.turnRadius);
+ root.addChild(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;
+ }
+ newPcp.setWorldPosition(pos);
+
+ }
+
+
+ return newComponent;
}
public static boolean connect(PipelineComponent current, PipelineComponent endTo) throws Exception {
- return connect(current, endTo, null, null);
+ return connect(current, endTo, null, null);
}
/**
* @throws Exception
*/
public static boolean connect(PipelineComponent current, PipelineComponent endTo, PositionType endType, Vector3d position) throws Exception{
- PipeControlPoint endCP = endTo.getControlPoint();
- boolean reversed;
- if (current.getNext() == null)
- reversed = false;
- else if (current.getPrevious() == null)
- reversed = true;
- else
- return false;
-
- PipeRun pipeRun = current.getPipeRun();
- P3DRootNode root = (P3DRootNode)current.getRootNode();
- PipeControlPoint currentCP = current.getControlPoint();
-
- if (endType == null || endType == PositionType.NEXT || endType == PositionType.PREVIOUS) {
-
-
-
- boolean requiresReverse = false;
- if (!reversed && endCP.getPrevious() != null) {
- if (endCP.getNext() != null)
- return false;
- requiresReverse = true;
- } else if (reversed && endCP.getNext() != null) {
- if (endCP.getPrevious() != null)
- return false;
- requiresReverse = true;
- }
- PipeRun other = endCP.getPipeRun();
- boolean mergeRuns = pipeRun.equalSpecs(other);
-
- if (requiresReverse) {
- // Pipe line must be traversible with next/previous relations without direction change.
- // Now the component, where we are connecting the created pipeline is defined in different order.
- PipingRules.reverse(other);
-
- }
- if (mergeRuns) {
- // Runs have compatible specs and must be merged
- if (pipeRun != other) // FIXME: temporary workaround.
- PipingRules.merge(pipeRun, other);
- if (!reversed) {
- currentCP.setNext(endCP);
- endCP.setPrevious(currentCP);
- } else {
- currentCP.setPrevious(endCP);
- endCP.setNext(currentCP);
- }
- } else {
- // Runs do not have compatible specs, and a reducer must be attached in between.
- InlineComponent reducer = ComponentUtils.createReducer(root);
- PipeControlPoint pcp = reducer.getControlPoint();
- PipeControlPoint ocp = pcp.getSubPoint().get(0);
-
- Vector3d endPos = endCP.getWorldPosition();
- Vector3d currentPos = currentCP.getWorldPosition();
- Vector3d v = new Vector3d(endPos);
- v.sub(currentPos);
- v.scale(0.5);
- v.add(currentPos);
-
- PipingRules.addSizeChange(reversed, pipeRun, other, reducer, currentCP, endCP);
-
- pcp.setWorldPosition(v);
- reducer.updateParameters();
- }
- PipingRules.positionUpdate(endCP);
- return true;
-
- } else if (endType == PositionType.SPLIT) {
- InlineComponent branchSplit = createBranchSplit((InlineComponent)endTo, position);
- if (branchSplit == null)
- return false;
- PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
- PipeControlPoint pcp = new PipeControlPoint(branchSplit,pipeRun);
- branchSplitCP.children.add(pcp);
- pcp.parent = branchSplitCP;
- pcp.setWorldOrientation(branchSplitCP.getWorldOrientation());
- pcp.setWorldPosition(branchSplitCP.getWorldPosition());
-
-
- if(!reversed) {
- pcp.setPrevious(currentCP);
- currentCP.setNext(pcp);
- } else {
- pcp.setNext(currentCP);
- currentCP.setPrevious(pcp);
- }
- PipingRules.positionUpdate(endCP);
- return true;
- }
- return false;
+ PipeControlPoint endCP = endTo.getControlPoint();
+ boolean reversed;
+ if (current.getNext() == null)
+ reversed = false;
+ else if (current.getPrevious() == null)
+ reversed = true;
+ else
+ return false;
+
+ PipeRun pipeRun = current.getPipeRun();
+ P3DRootNode root = (P3DRootNode)current.getRootNode();
+ PipeControlPoint currentCP = current.getControlPoint();
+
+ if (endType == null || endType == PositionType.NEXT || endType == PositionType.PREVIOUS) {
+
+
+
+ boolean requiresReverse = false;
+ if (!reversed && endCP.getPrevious() != null) {
+ if (endCP.getNext() != null)
+ return false;
+ requiresReverse = true;
+ } else if (reversed && endCP.getNext() != null) {
+ if (endCP.getPrevious() != null)
+ return false;
+ requiresReverse = true;
+ }
+ PipeRun other = endCP.getPipeRun();
+ boolean mergeRuns = other == null ? true : pipeRun.equalSpecs(other);
+
+ if (requiresReverse) {
+ // Pipe line must be traversible with next/previous relations without direction change.
+ // Now the component, where we are connecting the created pipeline is defined in different order.
+ PipingRules.reverse(other);
+
+ }
+ if (mergeRuns) {
+ // Runs have compatible specs and must be merged
+ if (other != null && pipeRun != other)
+ PipingRules.merge(pipeRun, other);
+ else if (other == null) {
+ if (!(endTo instanceof Nozzle)) {
+ pipeRun.addChild(endTo);
+ } else {
+ endTo.setPipeRun(pipeRun);
+ }
+ }
+ if (!reversed) {
+ currentCP.setNext(endCP);
+ endCP.setPrevious(currentCP);
+ } else {
+ currentCP.setPrevious(endCP);
+ endCP.setNext(currentCP);
+ }
+ } else {
+ // Runs do not have compatible specs, and a reducer must be attached in between.
+ InlineComponent reducer = ComponentUtils.createReducer(root);
+ PipeControlPoint pcp = reducer.getControlPoint();
+
+ Vector3d endPos = endCP.getWorldPosition();
+ Vector3d currentPos = currentCP.getWorldPosition();
+ Vector3d v = new Vector3d(endPos);
+ v.sub(currentPos);
+ v.scale(0.5);
+ v.add(currentPos);
+
+ PipingRules.addSizeChange(reversed, pipeRun, other, reducer, currentCP, endCP);
+
+ pcp.setWorldPosition(v);
+ reducer.updateParameters();
+ }
+ PipingRules.positionUpdate(endCP);
+ return true;
+
+ } else if (endType == PositionType.SPLIT) {
+ InlineComponent branchSplit = createBranchSplit((InlineComponent)endTo, position);
+ if (branchSplit == null)
+ return false;
+ PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
+ PipeControlPoint pcp = new PipeControlPoint(branchSplit,pipeRun);
+ branchSplitCP.children.add(pcp);
+ pcp.parent = branchSplitCP;
+ pcp.setWorldOrientation(branchSplitCP.getWorldOrientation());
+ pcp.setWorldPosition(branchSplitCP.getWorldPosition());
+
+
+ if(!reversed) {
+ pcp.setPrevious(currentCP);
+ currentCP.setNext(pcp);
+ } else {
+ pcp.setNext(currentCP);
+ currentCP.setPrevious(pcp);
+ }
+ PipingRules.positionUpdate(endCP);
+ return true;
+ }
+ return false;
}
public static InlineComponent createBranchSplit(InlineComponent component, Vector3d pos) throws Exception{
- if (!component.isVariableLength())
- return null;
- PipeRun pipeRun = component.getPipeRun();
- Vector3d sStart = new Vector3d();
- Vector3d sEnd = new Vector3d();
- component.getControlPoint().getInlineControlPointEnds(sStart, sEnd);
-
- if (MathTools.distance(sStart, sEnd) < (pipeRun.getPipeDiameter()*0.5))
- return null;
-
-
- Vector3d p = MathTools.closestPointOnEdge(new Vector3d(pos), sStart, sEnd);
- if (p == sStart) {
- Vector3d v = new Vector3d(sEnd);
- v.sub(sStart);
- v.normalize();
- v.scale(component.getPipeRun().getPipeDiameter()*0.5);
- p.add(v);
- } else if (p == sEnd) {
- Vector3d v = new Vector3d(sStart);
- v.sub(sEnd);
- v.normalize();
- v.scale(component.getPipeRun().getPipeDiameter()*0.5);
- p.add(v);
- }
-
- P3DRootNode root = (P3DRootNode)component.getRootNode();
- InlineComponent branchSplit = ComponentUtils.createBranchSplit(root);
- String branchName = component.getPipeRun().getUniqueName("Branch");
- branchSplit.setName(branchName);
- component.getPipeRun().addChild(branchSplit);
- PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
- branchSplitCP.setWorldPosition(p);
- PipingRules.splitVariableLengthComponent(branchSplit, component, false);
- return branchSplit;
- }
+ if (!component.isVariableLength())
+ return null;
+ PipeRun pipeRun = component.getPipeRun();
+ Vector3d sStart = new Vector3d();
+ Vector3d sEnd = new Vector3d();
+ component.getControlPoint().getInlineControlPointEnds(sStart, sEnd);
+
+ if (MathTools.distance(sStart, sEnd) < (pipeRun.getPipeDiameter()*0.5))
+ return null;
+
+
+ Vector3d p = MathTools.closestPointOnEdge(new Vector3d(pos), sStart, sEnd);
+ if (p == sStart) {
+ Vector3d v = new Vector3d(sEnd);
+ v.sub(sStart);
+ v.normalize();
+ v.scale(component.getPipeRun().getPipeDiameter()*0.5);
+ p.add(v);
+ } else if (p == sEnd) {
+ Vector3d v = new Vector3d(sStart);
+ v.sub(sEnd);
+ v.normalize();
+ v.scale(component.getPipeRun().getPipeDiameter()*0.5);
+ p.add(v);
+ }
+
+ P3DRootNode root = (P3DRootNode)component.getRootNode();
+ InlineComponent branchSplit = ComponentUtils.createBranchSplit(root);
+ String branchName = component.getPipeRun().getUniqueName("Branch");
+ branchSplit.setName(branchName);
+ component.getPipeRun().addChild(branchSplit);
+ PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
+ branchSplitCP.setWorldPosition(p);
+ PipingRules.splitVariableLengthComponent(branchSplit, component, false);
+ return branchSplit;
+ }
}