]> 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 bf220dd8776dc03959acc6a1410e78771a4adac1..defee7024561616c386089806168175f591399cc 100644 (file)
@@ -2,6 +2,7 @@ package org.simantics.plant3d.actions;
 
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -10,12 +11,13 @@ import javax.vecmath.Vector3d;
 import org.eclipse.swt.widgets.Display;
 import org.simantics.g3d.scenegraph.NodeMap;
 import org.simantics.g3d.scenegraph.base.INode;
-import org.simantics.g3d.vtk.action.vtkAction;
-import org.simantics.g3d.vtk.common.InteractiveVtkPanel;
+import org.simantics.g3d.vtk.swt.InteractiveVtkComposite;
+import org.simantics.g3d.vtk.swt.vtkSwtAction;
 import org.simantics.plant3d.Activator;
 import org.simantics.plant3d.dialog.ComponentSelectionDialog;
 import org.simantics.plant3d.gizmo.TerminalSelectionGizmo;
 import org.simantics.plant3d.scenegraph.InlineComponent;
+import org.simantics.plant3d.scenegraph.Nozzle;
 import org.simantics.plant3d.scenegraph.P3DRootNode;
 import org.simantics.plant3d.scenegraph.PipeRun;
 import org.simantics.plant3d.scenegraph.PipelineComponent;
@@ -25,14 +27,14 @@ 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.AWTThread;
 import org.simantics.utils.threads.ThreadUtils;
 import org.simantics.utils.ui.ExceptionUtils;
 
 import vtk.vtkProp;
 
-public class AddComponentAction extends vtkAction {
+public class AddComponentAction extends vtkSwtAction {
        
 
        private P3DRootNode root;
@@ -44,8 +46,11 @@ public class AddComponentAction extends vtkAction {
        private Set<PositionType> allowed = new HashSet<PositionType>();
        
        private Item toAdd = null;
+       private PositionType insertPosition;
+       private boolean insertAdjustable;
+       private boolean lengthAdjustable;
        
-       public AddComponentAction(InteractiveVtkPanel panel, P3DRootNode root) {
+       public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root) {
                super(panel);
                this.root = root;
                setText("Add Component");
@@ -58,14 +63,20 @@ public class AddComponentAction extends vtkAction {
                this.component = component;
                
                allowed.clear();
-               if (component.getNext() == null) {
-                       allowed.add(PositionType.NEXT);
-               }
-               if (component.getPrevious() == null) {
-                       allowed.add(PositionType.PREVIOUS);
-               }
-               if (component instanceof InlineComponent && !component.getControlPoint().isFixed()){
-                       allowed.add(PositionType.SPLIT);
+               if (component instanceof Nozzle) {
+                   if (component.getNext() == null && component.getPrevious() == null) {
+                   allowed.add(PositionType.NEXT);
+               }  
+               } else {
+               if (component.getNext() == null) {
+                       allowed.add(PositionType.NEXT);
+               }
+               if (component.getPrevious() == null) {
+                       allowed.add(PositionType.PREVIOUS);
+               }
+               if (component instanceof InlineComponent && !component.getControlPoint().isFixed()){
+                       allowed.add(PositionType.SPLIT);
+               }
                }
                setEnabled(allowed.size() > 0);
        }
@@ -77,12 +88,16 @@ public class AddComponentAction extends vtkAction {
        
        @Override
        public void run() {
-               ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed);
+           
+               ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed, component);
                if (dialog.open() == ComponentSelectionDialog.CANCEL)
                        return;
                toAdd = dialog.getSelected();
                if (toAdd == null)
                        return;
+               this.insertPosition = dialog.getInsertPosition();
+               this.insertAdjustable = dialog.isInsertAdjustable();
+               this.lengthAdjustable = dialog.isLenghtAdjustable();
                this.length = dialog.getLength();
                this.angle = dialog.getAngle();
                this.diameter = dialog.getDiameter();
@@ -90,14 +105,14 @@ public class AddComponentAction extends vtkAction {
                allowed = dialog.filterAllowed();
                gizmo.setComponent(component, allowed);
                super.run();
-               panel.repaint();
+               panel.refresh();
        }
        
        @Override
-       public void keyPressed(KeyEvent e) {
+       public boolean keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
                        panel.useDefaultAction();
-               
+               return true;
                
        }
        
@@ -106,7 +121,7 @@ public class AddComponentAction extends vtkAction {
                        return;
                
                super.attach();
-               ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
+               ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() {
                        public void run() {
                                attachUI();
                        }
@@ -117,15 +132,15 @@ public class AddComponentAction extends vtkAction {
        public void deattach() {
 //             deactivate();
                component = null;
-               nodeMap.commit();
+               nodeMap.commit("Add component");
                deattachUI();
                super.deattach();
-               panel.repaint();
+               panel.refresh();
        }
        
        private void attachUI() {
                //panel.setCursor(activeCursor);
-               gizmo.attach(panel.GetRenderer());
+               gizmo.attach(panel);
        }
        
        private void deattachUI() {
@@ -134,135 +149,217 @@ public class AddComponentAction extends vtkAction {
        }
        
        @Override
-       public void mouseMoved(MouseEvent e) {
-               panel.getDefaultAction().mouseMoved(e);
+       public boolean mouseMoved(MouseEvent e) {
+               return getDefaultAction().mouseMoved(e);
        }
        
        @Override
-       public void mousePressed(MouseEvent e) {
-               panel.getDefaultAction().mousePressed(e);
+       public boolean mousePressed(MouseEvent e) {
+               return getDefaultAction().mousePressed(e);
        }
 
        @Override
-       public void mouseReleased(MouseEvent e) {
-               panel.getDefaultAction().mouseReleased(e);
+       public boolean mouseReleased(MouseEvent e) {
+               return getDefaultAction().mouseReleased(e);
        }
        
        @Override
-       public void mouseDragged(MouseEvent e) {
-               panel.getDefaultAction().mouseDragged(e);
+       public boolean mouseDragged(MouseEvent e) {
+               return getDefaultAction().mouseDragged(e);
        }
        
        public void doInsert(PositionType position) {
-               try  {
-                       PipelineComponent newComponent = ComponentUtils.createComponent(root,toAdd.getUri());
-                       PipeControlPoint newPcp = newComponent.getControlPoint();
-                       
-                       PipeControlPoint toPcp = component.getControlPoint();
-                       Vector3d start = new Vector3d();
-                       Vector3d end = new Vector3d();
-                       Vector3d dir = new Vector3d();
-                       toPcp.getInlineControlPointEnds(start, end, dir);
-                       dir.normalize();
-                       
-                       switch (position) {
-                       case NEXT: 
-                               if (toPcp.isDualInline())
-                                       toPcp = toPcp.getSubPoint().get(0);
-                               
-                               break;
-                       case PREVIOUS:
-                               if (toPcp.isDualSub())
-                                       toPcp = toPcp.parent;
-                       }
-                       PipeRun pipeRun = toPcp.getPipeRun();
-                       
-                       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();
-
-                               dir.scale(newComponent.getControlPoint().getLength()*0.5);
-                               start.sub(dir);
-                               end.add(dir);
-                               switch (position) {
-                               case NEXT: 
-                                       if (toPcp.isDualInline())
-                                               toPcp = toPcp.getSubPoint().get(0);
-                                       newPcp.insert(toPcp, Direction.NEXT);
-                                       newPcp.setWorldPosition(end);
-                                       break;
-                               case PREVIOUS:
-                                       if (toPcp.isDualSub())
-                                               toPcp = toPcp.parent;
-                                       newPcp.insert(toPcp, Direction.PREVIOUS);
-                                       newPcp.setWorldPosition(start);
-                                       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);
-                                       newPcp.setWorldPosition(end);
-                       } else if (position == PositionType.PREVIOUS){
-                               PipingRules.addSizeChange(true, pipeRun, other, (InlineComponent)newComponent, toPcp, null);
-                               newPcp.setWorldPosition(start);
-                       }
-                               // TODO : chicken-egg problem
-                               newComponent.updateParameters();
-                               dir.scale(newComponent.getControlPoint().getLength()*0.5);
-                               start.sub(dir);
-                               end.add(dir);
-                               if (position == PositionType.NEXT) {
-                                       newPcp.setWorldPosition(end);
-                               } else if (position == PositionType.PREVIOUS){
-                                       newPcp.setWorldPosition(start);
-                               }
-                       }
-                       
-                       
-               } 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 void mouseClicked(MouseEvent e) {
+       public boolean mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {
                        int type = panel.getPickType();
-                       panel.setPickType(0);
+                       //panel.setPickType(0);
+                       panel.setPickType(5);
                        vtkProp[] picked = panel.pick(e.getX(), e.getY());
                        panel.setPickType(type);
                        PositionType position = gizmo.getPickedPosition(picked);
+
                        if (position != null) {
                                doInsert(position);
                                panel.useDefaultAction();
-                               return;
+                               return true;
                        }
                } 
-               panel.getDefaultAction().mouseClicked(e);
+               return getDefaultAction().mouseClicked(e);
+       }
+       
+       @Override
+       public boolean mouseWheelMoved(MouseWheelEvent e) {
+           return getDefaultAction().mouseWheelMoved(e);
        }
 }