]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java
Add units to ComponentSelectionDialog
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / actions / AddComponentAction.java
index defee7024561616c386089806168175f591399cc..f87e63f70aa216639bc947d8e3dc9f5bf3f53f09 100644 (file)
@@ -6,9 +6,11 @@ import java.awt.event.MouseWheelEvent;
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.vecmath.Vector3d;
-
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ResourceLocator;
 import org.eclipse.swt.widgets.Display;
+import org.simantics.db.Resource;
+import org.simantics.g3d.math.MathTools;
 import org.simantics.g3d.scenegraph.NodeMap;
 import org.simantics.g3d.scenegraph.base.INode;
 import org.simantics.g3d.vtk.swt.InteractiveVtkComposite;
@@ -19,16 +21,11 @@ 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;
-import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
-import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.Direction;
 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType;
-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.plant3d.utils.Item;
 import org.simantics.utils.threads.ThreadUtils;
 import org.simantics.utils.ui.ExceptionUtils;
 
@@ -39,7 +36,7 @@ public class AddComponentAction extends vtkSwtAction {
 
        private P3DRootNode root;
        private PipelineComponent component;
-       private NodeMap<vtkProp,INode> nodeMap;
+       private NodeMap<Resource,vtkProp,INode> nodeMap;
        
        private TerminalSelectionGizmo gizmo;
        
@@ -47,60 +44,89 @@ public class AddComponentAction extends vtkSwtAction {
        
        private Item toAdd = null;
        private PositionType insertPosition;
+       @SuppressWarnings("unused")
        private boolean insertAdjustable;
+       @SuppressWarnings("unused")
        private boolean lengthAdjustable;
        
-       public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root) {
+       private String libUri;
+       
+       private double lengthFactor = 1.0;
+       private String lengthUnit = "m";
+       
+       public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root, String libUri) {
                super(panel);
                this.root = root;
                setText("Add Component");
-               setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png"));
+               setImageDescriptor(ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/Component.png").get());
                nodeMap = root.getNodeMap();
                gizmo = new TerminalSelectionGizmo(panel);
+               this.libUri = libUri;
        }
        
+       public void setLengthFactor(double lengthFactor) {
+               this.lengthFactor = lengthFactor;
+       }
+
+       public void setLengthUnit(String lengthUnit) {
+               this.lengthUnit = lengthUnit;
+       }
+
        public void setComponent(PipelineComponent component) {
                this.component = component;
                
                allowed.clear();
                if (component instanceof Nozzle) {
-                   if (component.getNext() == null && component.getPrevious() == null) {
-                   allowed.add(PositionType.NEXT);
-               }  
+                       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);
-               }
+                       if (component.getNext() == null || component.getControlPoint().isVariableLength()) {
+                               allowed.add(PositionType.NEXT);
+                       }
+                       if (component.getPrevious() == null || component.getControlPoint().isVariableLength()) {
+                               allowed.add(PositionType.PREVIOUS);
+                       }
+                       if (component instanceof InlineComponent && component.getControlPoint().isVariableLength()){
+                               allowed.add(PositionType.SPLIT);
+                       }
                }
                setEnabled(allowed.size() > 0);
        }
        
+       private String name;
+       
        private Double length;
        private Double angle;
+       private Double rotationAngle;
        private Double diameter;
+       private Double thickness;
        private Double turnRadius;
        
        @Override
        public void run() {
-           
-               ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed, component);
+               
+               ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed, component, libUri);
+               
+               // Set list of already reserved component names
+               dialog.addUsedNames(ComponentUtils.getPipelineComponentNames(root));
+               dialog.setLengthFactor(lengthFactor);
+               dialog.setLengthUnit(lengthUnit);
+               
                if (dialog.open() == ComponentSelectionDialog.CANCEL)
                        return;
                toAdd = dialog.getSelected();
                if (toAdd == null)
                        return;
+               this.name = dialog.getName();
                this.insertPosition = dialog.getInsertPosition();
                this.insertAdjustable = dialog.isInsertAdjustable();
                this.lengthAdjustable = dialog.isLenghtAdjustable();
                this.length = dialog.getLength();
                this.angle = dialog.getAngle();
+               this.rotationAngle = dialog.getRotationAngle();
                this.diameter = dialog.getDiameter();
+               this.thickness = dialog.getThickness();
                this.turnRadius = dialog.getTurnRadius();
                allowed = dialog.filterAllowed();
                gizmo.setComponent(component, allowed);
@@ -169,177 +195,40 @@ public class AddComponentAction extends vtkSwtAction {
        }
        
        public void doInsert(PositionType position) {
-           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);
-//             }
+               try  {
+                       if (position == PositionType.SPLIT && length != null && length > component.getControlPoint().getLength()) {
+                               MessageDialog.openError(panel.getComponent().getShell(), "Error", "There is no room for a component of length " + length * lengthFactor + " units");
+                               return;
+                       }
+                       
+                       InsertInstruction inst = new InsertInstruction();
+                       inst.typeUri = toAdd.getUri();
+                       inst.name = name;
+                       inst.angle = angle != null ? MathTools.degToRad(angle) : null;
+                       inst.diameter = diameter;
+                       inst.thickness = thickness;
+                       inst.length = length;
+                       inst.turnRadius = turnRadius;
+                       inst.insertPosition = insertPosition;
+                       inst.rotationAngle = rotationAngle;
+                       inst.position = position;
+                       PipelineComponent newComponent = ComponentUtils.addComponent(root, component, inst);
+                       componentAdded(newComponent);
+               } catch (Exception e) {
+                       ExceptionUtils.logAndShowError("Cannot add component", e);
+               }
        }
        
+       /**
+        * This method does nothing, but can be overridden by a subclass to do additional
+        * post-processing for a newly added component.
+        * 
+        * @param newComponent  A newly added pipeline component
+        */
+       protected void componentAdded(PipelineComponent newComponent) {
+               // Nothing to do here
+       }
+
        public boolean mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {
                        int type = panel.getPickType();
@@ -360,6 +249,6 @@ public class AddComponentAction extends vtkSwtAction {
        
        @Override
        public boolean mouseWheelMoved(MouseWheelEvent e) {
-           return getDefaultAction().mouseWheelMoved(e);
+               return getDefaultAction().mouseWheelMoved(e);
        }
 }