]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java
Fix division by zero in ComponentUtls.addComponent()
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / utils / ComponentUtils.java
index c20cf92102a2262a7429c8b41fc7fffda3484af2..ea9f492f6b96e8144215cff483399e6ee7d9af32 100644 (file)
@@ -11,6 +11,7 @@ import javax.vecmath.Vector3d;
 
 import org.simantics.Simantics;
 import org.simantics.db.ReadGraph;
+import org.simantics.db.RequestProcessor;
 import org.simantics.db.Resource;
 import org.simantics.db.common.request.ReadRequest;
 import org.simantics.db.common.utils.NameUtils;
@@ -32,34 +33,41 @@ import org.simantics.plant3d.scenegraph.TurnComponent;
 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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
 
 public class ComponentUtils {
 
+       private final static Logger LOGGER = LoggerFactory.getLogger(ComponentUtils.class);
        
        private static Map<String,Class<? extends PipelineComponent>> clazzes = new HashMap<String, Class<? extends PipelineComponent>>();
        private static Map<String,GeometryProvider> providers = new HashMap<String,GeometryProvider>();
        private static Map<String,String> names = new HashMap<String,String>();
        
-       public static void preloadCache() {
-               Simantics.getSession().asyncRequest(new ReadRequest() {
-                       
-                       @Override
-                       public void run(ReadGraph graph) throws DatabaseException {
-                               List<String> types = new ArrayList<String>();
-                               types.add(Plant3D.URIs.Builtin_Straight);
-                               types.add(Plant3D.URIs.Builtin_Elbow);
-                               types.add(Plant3D.URIs.Builtin_ConcentricReducer);
-                               types.add(Plant3D.URIs.Builtin_BranchSplitComponent);
-                               types.add(Plant3D.URIs.Builtin_EccentricReducer);
-                               types.add(Plant3D.URIs.Builtin_Elbow45);
-                               types.add(Plant3D.URIs.Builtin_Elbow90);
+       public static void preloadCache(RequestProcessor session) {
+               try {
+                       session.syncRequest(new ReadRequest() {
                                
-                               for (String typeURI : types) {
-                                       load(graph, typeURI);
+                               @Override
+                               public void run(ReadGraph graph) throws DatabaseException {
+                                       List<String> types = new ArrayList<String>();
+                                       types.add(Plant3D.URIs.Builtin_Straight);
+                                       types.add(Plant3D.URIs.Builtin_Elbow);
+                                       types.add(Plant3D.URIs.Builtin_ConcentricReducer);
+                                       types.add(Plant3D.URIs.Builtin_BranchSplitComponent);
+                                       types.add(Plant3D.URIs.Builtin_EccentricReducer);
+                                       types.add(Plant3D.URIs.Builtin_Elbow45);
+                                       types.add(Plant3D.URIs.Builtin_Elbow90);
+                                       
+                                       for (String typeURI : types) {
+                                               load(graph, typeURI);
+                                       }
                                }
-                       }
-               });
+                       });
+               } catch (DatabaseException e) {
+                       LOGGER.error("ComponentUtils.preloadCache() failed unexpectedly", e);
+               }
        }
        
        private static GeometryProvider getProvider(ReadGraph graph, Resource type) throws DatabaseException {
@@ -273,6 +281,7 @@ public class ComponentUtils {
                
                // Reducer requires pipe specs
                public Double diameter;
+               public Double thickness;
                public Double turnRadius;
                
                // Variable length 
@@ -323,6 +332,14 @@ public class ComponentUtils {
                public void setDiameter(Double diameter) {
                        this.diameter = diameter;
                }
+               
+               public double getThickness() {
+                       return thickness;
+               }
+               
+               public void setThickness(double thickness) {
+                       this.thickness = thickness;
+               }
 
                public Double getTurnRadius() {
                        return turnRadius;
@@ -361,9 +378,6 @@ public class ComponentUtils {
        public static PipelineComponent addComponent(P3DRootNode root, PipelineComponent component,  InsertInstruction inst) throws Exception {
                
                PipelineComponent newComponent = ComponentUtils.createComponent(root, inst.typeUri);
-               if (inst.name != null)
-                       newComponent.setName(inst.name);
-               
                PipeControlPoint newPcp = newComponent.getControlPoint();
                
                PipeControlPoint toPcp = component.getControlPoint();
@@ -391,6 +405,8 @@ public class ComponentUtils {
                        sizeChange = ((InlineComponent)newComponent).isSizeChange();
                }
                
+               // Calculate component position and direction vectors
+               // 'dir' is a unit vector that represents the direction from 'component' to 'newComponent'
                if (toPcp.isInline()) {
                        switch (position) {
                        case NEXT: 
@@ -411,15 +427,15 @@ public class ComponentUtils {
                        }
                        Vector3d start = new Vector3d();
                        Vector3d end = new Vector3d();
-                       dir = new Vector3d();
-                       toPcp.getInlineControlPointEnds(start, end, dir);
-                       dir.normalize();
+                       dir = toPcp.getInlineDir();
+                       toPcp.getControlPointEnds(start, end);
                        switch (position) {
                        case NEXT:
                                pos = new Vector3d(end);
                                break;
                        case PREVIOUS:
                                pos = new Vector3d(start);
+                               dir.negate();
                                break;
                        case SPLIT:
                                pos = new Vector3d(toPcp.getWorldPosition());
@@ -427,9 +443,9 @@ public class ComponentUtils {
                        default:
                                break;
                        }
-
                } else if (toPcp.isDirected()) {
-                       dir = new Vector3d(toPcp.getDirection(Direction.NEXT));
+                       // 'dir' always points out of a nozzle regardless of insertion direction
+                       dir = new Vector3d(toPcp.getDirectedControlPointDirection());
                        pos = new Vector3d(toPcp.getWorldPosition());
                } else if (toPcp.isTurn() && toPcp.asFixedAngle()) {
                        dir = new Vector3d(toPcp.getDirection(position == PositionType.NEXT ? Direction.NEXT : Direction.PREVIOUS));
@@ -452,8 +468,12 @@ public class ComponentUtils {
                        }
                }
                
-               String name = component.getPipeRun().getUniqueName(typeName);
-               newComponent.setName(name);
+               if (inst.name != null) {
+                       newComponent.setName(inst.name);
+               } else {
+                       String name = component.getPipeRun().getUniqueName(typeName);
+                       newComponent.setName(name);
+               }
 
                pipeRun.addChild(newComponent);
                if (newPcp.isSizeChange())
@@ -470,18 +490,22 @@ public class ComponentUtils {
                } else if (newComponent instanceof TurnComponent) {
                    TurnComponent turnComponent = (TurnComponent)newComponent;
                    if  (turnComponent.isVariableAngle()) {
-                               newPcp.setTurnAngle(inst.angle);
+                               newPcp.setTurnAngle(Math.toRadians(inst.angle));
                                newComponent.setParameter("turnAngle", inst.angle);
                    }
                    if (inst.rotationAngle != null)
                 ((TurnComponent) newComponent).setRotationAngle(inst.rotationAngle);
                }
                
-               
                newComponent.updateParameters();
                
                Vector3d v = new Vector3d(dir);
                if (insertAdjustable) {
+                       // Prevent moving of adjacent components - always insert at end of a connected variable length component
+                       if (position == PositionType.NEXT && component.getNext() != null ||
+                               position == PositionType.PREVIOUS && component.getPrevious() != null)
+                               insertPosition = PositionType.PREVIOUS;
+                       
                        if (insertPosition == PositionType.NEXT)
                                v.scale(newComponent.getControlPoint().getInlineLength());
                        else if (insertPosition == PositionType.SPLIT)
@@ -491,12 +515,11 @@ public class ComponentUtils {
                } else {
                        v.scale(newComponent.getControlPoint().getInlineLength());
                }
+               
                switch (position) {
                case NEXT:
-                       pos.add(v);
-                       break;
                case PREVIOUS:
-                       pos.sub(v);
+                       pos.add(v);
                        break;
                case SPLIT:
                        break;
@@ -508,14 +531,20 @@ public class ComponentUtils {
                case NEXT: 
                        if (toPcp.isDualInline())
                                toPcp = toPcp.getDualSub();
-                       newPcp.insert(toPcp, Direction.NEXT);
                        newPcp.setWorldPosition(pos);
+                       if (toPcp.getNext() != null)
+                               PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, false);
+                       else
+                               newPcp.insert(toPcp, Direction.NEXT);
                        break;
                case PREVIOUS:
                        if (toPcp.isDualSub())
                                toPcp = toPcp.parent;
-                       newPcp.insert(toPcp, Direction.PREVIOUS);
                        newPcp.setWorldPosition(pos);
+                       if (toPcp.getPrevious() != null)
+                               PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, false);
+                       else
+                               newPcp.insert(toPcp, Direction.PREVIOUS);
                        break;
                case SPLIT:
                        PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true);
@@ -529,6 +558,7 @@ public class ComponentUtils {
                        String n = root.getUniqueName("PipeRun");
                        other.setName(n);
                        other.setPipeDiameter(inst.diameter);
+                       other.setPipeThickness(inst.thickness);
                        other.setTurnRadius(inst.turnRadius);
                        root.addChild(other);