]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java
Very crude API for creating pipeline components
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / actions / AddComponentAction.java
index 119820178c8e9ff2b02275788608fe5937a12fba..defee7024561616c386089806168175f591399cc 100644 (file)
@@ -27,6 +27,7 @@ import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionTy
 import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
 import org.simantics.plant3d.utils.ComponentUtils;
 import org.simantics.plant3d.utils.Item;
+import org.simantics.plant3d.utils.ComponentUtils.InsertInstruction;
 import org.simantics.plant3d.utils.Item.Type;
 import org.simantics.utils.threads.ThreadUtils;
 import org.simantics.utils.ui.ExceptionUtils;
@@ -168,162 +169,175 @@ public class AddComponentAction extends vtkSwtAction {
        }
        
        public void doInsert(PositionType position) {
-               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);
-               }
+           try  {
+               InsertInstruction inst = new InsertInstruction();
+               inst.typeUri = toAdd.getUri();
+               inst.angle = angle;
+               inst.diameter = diameter;
+               inst.length = length;
+               inst.turnRadius = turnRadius;
+               inst.insertPosition = insertPosition;
+               inst.position = position;
+               ComponentUtils.addComponent(root, component, inst);
+           } catch (Exception e) {
+           ExceptionUtils.logAndShowError("Cannot add component", e);
+        }
+//             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);
+//             }
        }
        
        public boolean mouseClicked(MouseEvent e) {