]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java
Add a wall thickness property to pipe runs.
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / actions / AddComponentAction.java
index 60f95215250409cfb382c42474e1926f857fd417..8dcee92610f00f8fea6afc1a1114d949cc787e1f 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,15 +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.ComponentUtils.InsertInstruction;
 import org.simantics.plant3d.utils.Item;
-import org.simantics.plant3d.utils.Item.Type;
 import org.simantics.utils.threads.ThreadUtils;
 import org.simantics.utils.ui.ExceptionUtils;
 
@@ -38,61 +36,91 @@ 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;
        
        private Set<PositionType> allowed = new HashSet<PositionType>();
        
        private Item toAdd = null;
+       private PositionType insertPosition;
+       @SuppressWarnings("unused")
+       private boolean insertAdjustable;
+       @SuppressWarnings("unused")
+       private boolean lengthAdjustable;
+       
+       private String libUri;
+       
+       private double lengthFactor = 1.0;
        
-       public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root) {
+       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 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) {
+                               allowed.add(PositionType.NEXT);
+                       }
+                       if (component.getPrevious() == null) {
+                               allowed.add(PositionType.PREVIOUS);
+                       }
+                       if (component instanceof InlineComponent && !component.getControlPoint().isFixedLength()){
+                               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);
+               
+               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);
+               
                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);
@@ -162,135 +190,23 @@ 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:
-                    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());
-                Vector3d v = new Vector3d(dir);
-                v.scale(toPcp.getInlineLength());
-                pos.add(v);
+                       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;
                        }
                        
-                       
-                       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);
-                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);
-                               
-                       }
-                       
-                       
+                       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;
+                       ComponentUtils.addComponent(root, component, inst);
                } catch (Exception e) {
                        ExceptionUtils.logAndShowError("Cannot add component", e);
                }
@@ -316,6 +232,6 @@ public class AddComponentAction extends vtkSwtAction {
        
        @Override
        public boolean mouseWheelMoved(MouseWheelEvent e) {
-           return getDefaultAction().mouseWheelMoved(e);
+               return getDefaultAction().mouseWheelMoved(e);
        }
 }