]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
Disable in-line translate for variable length components
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipeControlPoint.java
index 02bce62246e8748612ac72f7e2b64afae4da06de..ecaeb7ae7c41d2b70017d4de433dfac968270ecc 100644 (file)
@@ -1,6 +1,7 @@
 package org.simantics.plant3d.scenegraph.controlpoint;
 
 import java.util.ArrayList;
 package org.simantics.plant3d.scenegraph.controlpoint;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
 import java.util.Collection;
 import java.util.List;
 
@@ -30,6 +31,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        
        private Type type;
        private boolean fixed = true;
        
        private Type type;
        private boolean fixed = true;
+       private boolean rotate = false;
+       private boolean reverse = false;
        private boolean deletable = true;
        private boolean sub = false;
        
        private boolean deletable = true;
        private boolean sub = false;
        
@@ -81,6 +84,24 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                this.fixed = fixed;
        }
        
                this.fixed = fixed;
        }
        
+       @GetPropertyValue(name="Rotate",tabId="Debug",value="rotate")
+       public boolean isRotate() {
+               return rotate;
+       }
+       
+       public void setRotate(boolean rotate) {
+               this.rotate = rotate;
+       }
+       
+       @GetPropertyValue(name="Reverse",tabId="Debug",value="reverse")
+       public boolean isReverse() {
+               return reverse;
+       }
+       
+       public void setReverse(boolean reverse) {
+               this.reverse = reverse;
+       }
+       
        public void setSub(boolean sub) {
                this.sub = sub;
        }
        public void setSub(boolean sub) {
                this.sub = sub;
        }
@@ -173,7 +194,9 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                component.setNext(next != null ? next.component : null);
                        else
                                component.setBranch0(next != null ? next.component : null);
                                component.setNext(next != null ? next.component : null);
                        else
                                component.setBranch0(next != null ? next.component : null);
+                       updateSubPoint();
                }
                }
+               
        }
        
        public void setPrevious(PipeControlPoint previous) {
        }
        
        public void setPrevious(PipeControlPoint previous) {
@@ -182,11 +205,14 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
 //             if (previous != null && getPipeRun() == null)
 //                     throw new RuntimeException("Cannot connect control point befor piperun has been set");
                this.previous = previous;
 //             if (previous != null && getPipeRun() == null)
 //                     throw new RuntimeException("Cannot connect control point befor piperun has been set");
                this.previous = previous;
-               if (component != null)
+               if (component != null) {
                        if (parent == null || sub)
                                component.setPrevious(previous != null ? previous.component : null);
                        else
                                component.setBranch0(previous != null ? previous.component : null);
                        if (parent == null || sub)
                                component.setPrevious(previous != null ? previous.component : null);
                        else
                                component.setBranch0(previous != null ? previous.component : null);
+                       updateSubPoint();
+               }
+               
        }
        
        public PipeControlPoint parent;
        }
        
        public PipeControlPoint parent;
@@ -213,6 +239,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
 
        private Double offset;
        private Double rotationAngle;
 
        private Double offset;
        private Double rotationAngle;
+       private Boolean reversed;
        
        @GetPropertyValue(name="Length",tabId="Debug",value="length")
        public double getLength() {
        
        @GetPropertyValue(name="Length",tabId="Debug",value="length")
        public double getLength() {
@@ -251,6 +278,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                return rotationAngle;
        }
        
                return rotationAngle;
        }
        
+       @GetPropertyValue(name="Reversed",tabId="Debug",value="reversed")
+       public Boolean getReversed() {
+               return reversed;
+       }
+       
        public void setTurnAngle(Double turnAngle) {
                if (Double.isInfinite(turnAngle) || Double.isNaN(turnAngle)) {
                        return;
        public void setTurnAngle(Double turnAngle) {
                if (Double.isInfinite(turnAngle) || Double.isNaN(turnAngle)) {
                        return;
@@ -286,11 +318,30 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                firePropertyChanged("rotationAngle");
        }
        
                firePropertyChanged("rotationAngle");
        }
        
+       public void setReversed(Boolean reversed) {
+               this.reversed = reversed;
+               firePropertyChanged("rotationAngle");
+       }
+       
        public Vector3d getSizeChangeOffsetVector(Vector3d dir) {
        public Vector3d getSizeChangeOffsetVector(Vector3d dir) {
+               Quat4d q;
+               if (rotationAngle == null)
+                       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);
+       return offset;
+       }
+       
+       public Vector3d getSizeChangeOffsetVector() {
+               Quat4d q;
                if (rotationAngle == null)
                if (rotationAngle == null)
-                       rotationAngle = 0.0;
-               Quat4d q = getControlPointOrientationQuat(dir, rotationAngle);
-               Vector3d v = new Vector3d(0.0,0.0,offset);
+                       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);
        return offset;
        Vector3d offset = new Vector3d();
        MathTools.rotate(q, v, offset);
        return offset;
@@ -310,7 +361,19 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                return previous.toString();
        }
        
                return previous.toString();
        }
        
-        public Quat4d getControlPointOrientationQuat(double angle) {
+       @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) {
                         Vector3d dir = getPathLegDirection(Direction.NEXT);
                 
                 if (turnAxis == null) {
                         Vector3d dir = getPathLegDirection(Direction.NEXT);
@@ -324,11 +387,33 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                 dir.normalize();
                         return getControlPointOrientationQuat(dir, turnAxis, angle);
                 }
                                 dir.normalize();
                         return getControlPointOrientationQuat(dir, turnAxis, angle);
                 }
-        }
+       }
+        
+    public Quat4d getControlPointOrientationQuat(double angle, boolean reversed) {
+                
+                if (turnAxis == null) {
+                        Vector3d dir = getPathLegDirection(Direction.NEXT);
+                        if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+                                dir.normalize();
+                        Quat4d q =  getControlPointOrientationQuat(dir, angle);
+                        if (reversed) {
+                                Quat4d q2 = new Quat4d();
+                               q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
+                               q.mulInverse(q2);
+                        }
+                        return q;
+                } else {
+                        Vector3d dir = getPathLegDirection(Direction.PREVIOUS);
+                        dir.negate();
+                        if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+                                dir.normalize();
+                        return getControlPointOrientationQuat(dir, turnAxis, angle);
+                }
+       }
         
        
        
         
        
        
-        public static Quat4d getControlPointOrientationQuat(Vector3d dir, double angle) {
+       public static Quat4d getControlPointOrientationQuat(Vector3d dir, double angle) {
                        if (dir.lengthSquared() < MathTools.NEAR_ZERO)
                                return MathTools.getIdentityQuat();
                
                        if (dir.lengthSquared() < MathTools.NEAR_ZERO)
                                return MathTools.getIdentityQuat();
                
@@ -547,8 +632,12 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                        
                                } else {
                                        if (isInline()) {
                                        
                                } else {
                                        if (isInline()) {
+                                               PipeControlPoint pcp = this;
+                                               if (pcp.isDualSub()) {
+                                                       pcp = pcp.getParentPoint();
+                                               }
                                                Vector3d v = new Vector3d();
                                                Vector3d v = new Vector3d();
-                                               v.sub(getWorldPosition(),previous.getWorldPosition());
+                                               v.sub(pcp.getWorldPosition(),previous.getWorldPosition());
                                                return v;
                                        } else if (isDirected()) {
                                                return getDirectedControlPointDirection();
                                                return v;
                                        } else if (isDirected()) {
                                                return getDirectedControlPointDirection();
@@ -579,8 +668,12 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                        return v;
                                } else {
                                        if (isInline()) {
                                        return v;
                                } else {
                                        if (isInline()) {
+                                               PipeControlPoint pcp = this;
+                                               if (pcp.isDualInline()) {
+                                                       pcp = pcp.getSubPoint().get(0);
+                                               }
                                                Vector3d v = new Vector3d();
                                                Vector3d v = new Vector3d();
-                                               v.sub(getWorldPosition(),next.getWorldPosition());
+                                               v.sub(pcp.getWorldPosition(),next.getWorldPosition());
                                                return v;
                                        } else if (isDirected()) {
                                                Vector3d v = getDirectedControlPointDirection();
                                                return v;
                                        } else if (isDirected()) {
                                                Vector3d v = getDirectedControlPointDirection();
@@ -980,6 +1073,15 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                p1.remChild(ocp);
                p2.remChild(sccp);
                
                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);
                ocp.setNext(null);
                ocp.setPrevious(null);
                sccp.setNext(null);
@@ -1021,6 +1123,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                }
                PipelineComponent comp = component;
                component = null;
                }
                PipelineComponent comp = component;
                component = null;
+               
                comp.remove();
        }
        
                comp.remove();
        }
        
@@ -1031,22 +1134,41 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                super.setOrientation(orientation);
                if (getParentPoint() == null && component != null)
                        component._setWorldOrientation(getWorldOrientation());
                super.setOrientation(orientation);
                if (getParentPoint() == null && component != null)
                        component._setWorldOrientation(getWorldOrientation());
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
-               }
+               updateSubPoint();
        }
        
        @Override
        public void setPosition(Vector3d position) {
                if (MathTools.equals(position, getPosition()))
                        return;
        }
        
        @Override
        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());
                super.setPosition(position);
                if (getParentPoint() == null && component != null)
                        component._setWorldPosition(getWorldPosition());
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
+               updateSubPoint();
+       }
+       
+       private void updateSubPoint() {
+               if (isOffset()) {
+                       if (next == null && previous == null) {
+                               for (PipeControlPoint sub : getSubPoint()) {
+                                       sub.setWorldPosition(getWorldPosition());
+                                       sub.setWorldOrientation(getWorldOrientation());
+                               }
+                               return;
+                       }
+                       for (PipeControlPoint sub : getSubPoint()) {
+                               Vector3d wp = getWorldPosition();
+                               wp.add(getSizeChangeOffsetVector());
+                               sub.setWorldPosition(wp);
+                               sub.setWorldOrientation(getWorldOrientation());
+                       }
+               } else {
+                       for (PipeControlPoint sub : getSubPoint()) {
+                               sub.setWorldPosition(getWorldPosition());
+                               sub.setWorldOrientation(getWorldOrientation());
+                       }
                }
        }
 
                }
        }
 
@@ -1054,19 +1176,13 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        public void _setWorldPosition(Vector3d position) {
                Vector3d localPos = getLocalPosition(position);
                super.setPosition(localPos);
        public void _setWorldPosition(Vector3d position) {
                Vector3d localPos = getLocalPosition(position);
                super.setPosition(localPos);
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
-               }
+               updateSubPoint();
        }
        
        public void _setWorldOrientation(Quat4d orientation) {
                Quat4d localOr = getLocalOrientation(orientation);
                super.setOrientation(localOr);
        }
        
        public void _setWorldOrientation(Quat4d orientation) {
                Quat4d localOr = getLocalOrientation(orientation);
                super.setOrientation(localOr);
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
-               }
+               updateSubPoint();
        }
        
        @Override
        }
        
        @Override