+// try {
+// 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();
+// 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 (!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);
+//
+// }
+//
+//
+// } catch (Exception e) {
+// ExceptionUtils.logAndShowError("Cannot add component", e);
+// }