- PipelineComponent newComponent = ComponentUtils.createComponent(root,toAdd.getUri());
- PipeControlPoint newPcp = newComponent.getControlPoint();
-
- PipeControlPoint toPcp = component.getControlPoint();
- PipeRun pipeRun = toPcp.getPipeRun();
-
- Vector3d dir = null;
- Vector3d pos = null;
-
-
- 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();
- if (!insertAdjustable || insertPosition == PositionType.NEXT) {
- switch (position) {
- case NEXT:
- pos = new Vector3d(end);
- break;
- case PREVIOUS:
- pos = new Vector3d(start);
- break;
- case SPLIT:
- break;
- }
- } else if (insertPosition == PositionType.SPLIT) {
- pos = new Vector3d(toPcp.getWorldPosition());
- } else {
- switch (position) {
- case NEXT:
- pos = new Vector3d(start);
- break;
- case PREVIOUS:
- pos = new Vector3d(end);
- break;
- case SPLIT:
- 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 (!toAdd.isSizeChange()) {
- String name = component.getPipeRun().getUniqueName(toAdd.getName());
- newComponent.setName(name);
-
- pipeRun.addChild(newComponent);
- if (toAdd.isVariable()) {
- // TODO: these options are not stored into DB. Should they?!
- if (toAdd.getType() == Type.INLINE) {
- newPcp.setLength(length);
-// newPcp.setFixed(true);
- } else if (toAdd.getType() == Type.TURN) {
- newPcp.setTurnAngle(angle);
-// newPcp.setFixed(true);
- }
- }
- 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(diameter);
- other.setTurnRadius(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);
-
- }
-
-