]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
Handle variable length components on offset path leg
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipeControlPoint.java
index 21f2564d781e87b44fc1713264cf0640e002a618..b14b298bcf26d0060ea91ec09521f740fc596b45 100644 (file)
@@ -1,6 +1,7 @@
 package org.simantics.plant3d.scenegraph.controlpoint;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
@@ -30,6 +31,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        
        private Type type;
        private boolean fixed = true;
+       private boolean rotate = false;
        private boolean deletable = true;
        private boolean sub = false;
        
@@ -81,6 +83,16 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                this.fixed = fixed;
        }
        
+       @GetPropertyValue(name="Rotate",tabId="Debug",value="rotate")
+       public boolean isRotate() {
+               return rotate;
+       }
+       
+       
+       public void setRotate(boolean rotate) {
+               this.rotate = rotate;
+       }
+       
        public void setSub(boolean sub) {
                this.sub = sub;
        }
@@ -292,9 +304,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        }
        
        public Vector3d getSizeChangeOffsetVector(Vector3d dir) {
+               Quat4d q;
                if (rotationAngle == null)
-                       rotationAngle = 0.0;
-               Quat4d q = getControlPointOrientationQuat(dir, rotationAngle);
+                       q = getControlPointOrientationQuat(dir, 0.0);
+               else
+                       q = getControlPointOrientationQuat(dir, rotationAngle);
                Vector3d v = new Vector3d(0.0,offset,0.0);
        Vector3d offset = new Vector3d();
        MathTools.rotate(q, v, offset);
@@ -302,9 +316,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        }
        
        public Vector3d getSizeChangeOffsetVector() {
+               Quat4d q;
                if (rotationAngle == null)
-                       rotationAngle = 0.0;
-               Quat4d q = getControlPointOrientationQuat(rotationAngle);
+                       q = getControlPointOrientationQuat(0.0);
+               else
+                       q = getControlPointOrientationQuat(rotationAngle);
                Vector3d v = new Vector3d(0.0,offset,0.0);
        Vector3d offset = new Vector3d();
        MathTools.rotate(q, v, offset);
@@ -325,6 +341,18 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                return previous.toString();
        }
        
+       @GetPropertyValue(name="Sub",tabId="Debug",value="sub")
+       private String getSubString() {
+               if (children.size() == 0)
+                       return "";
+               return Arrays.toString(children.toArray());
+       }
+       
+       @GetPropertyValue(name="Type",tabId="Debug",value="type")
+       public String getTypeString() {
+               return type.name();
+       }
+       
         public Quat4d getControlPointOrientationQuat(double angle) {
                 
                 if (turnAxis == null) {
@@ -1003,6 +1031,15 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                p1.remChild(ocp);
                p2.remChild(sccp);
                
+               // TODO : now we assume that this is size change, and we do
+               if (ocp.next != null)
+                       ocp.next.setPrevious(null);
+               if (ocp.previous != null)
+                       ocp.previous.setNext(null);
+               if (sccp.next != null)
+                       sccp.next.setPrevious(null);
+               if (sccp.previous != null)
+                       sccp.previous.setNext(null);
                ocp.setNext(null);
                ocp.setPrevious(null);
                sccp.setNext(null);
@@ -1044,6 +1081,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                }
                PipelineComponent comp = component;
                component = null;
+               
                comp.remove();
        }
        
@@ -1061,11 +1099,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        public void setPosition(Vector3d position) {
                if (MathTools.equals(position, getPosition()))
                        return;
+               if (Double.isNaN(position.x) || Double.isNaN(position.y) || Double.isNaN(position.z))
+                       throw new IllegalArgumentException("NaN is not supported");
                super.setPosition(position);
                if (getParentPoint() == null && component != null)
                        component._setWorldPosition(getWorldPosition());
-               if (isDualSub())
-                       System.out.println();
                updateSubPoint();
        }