X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2Fcontrolpoint%2FPipeControlPoint.java;h=555a662089a41240b3ac17861b6130a657d68997;hb=refs%2Fchanges%2F26%2F3026%2F1;hp=02bce62246e8748612ac72f7e2b64afae4da06de;hpb=22bb24d2a7e26c70b0dd4c57080f2c25ac3d40a8;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java index 02bce622..555a6620 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java @@ -30,6 +30,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 +82,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; } @@ -173,7 +184,9 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { component.setNext(next != null ? next.component : null); else component.setBranch0(next != null ? next.component : null); + updateSubPoint(); } + } public void setPrevious(PipeControlPoint previous) { @@ -182,11 +195,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 (component != null) + if (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; @@ -287,10 +303,24 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } 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) - 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; @@ -547,8 +577,12 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } else { if (isInline()) { + PipeControlPoint pcp = this; + if (pcp.isDualSub()) { + pcp = pcp.getParentPoint(); + } Vector3d v = new Vector3d(); - v.sub(getWorldPosition(),previous.getWorldPosition()); + v.sub(pcp.getWorldPosition(),previous.getWorldPosition()); return v; } else if (isDirected()) { return getDirectedControlPointDirection(); @@ -579,8 +613,12 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { return v; } else { if (isInline()) { + PipeControlPoint pcp = this; + if (pcp.isDualInline()) { + pcp = pcp.getSubPoint().get(0); + } Vector3d v = new Vector3d(); - v.sub(getWorldPosition(),next.getWorldPosition()); + v.sub(pcp.getWorldPosition(),next.getWorldPosition()); return v; } else if (isDirected()) { Vector3d v = getDirectedControlPointDirection(); @@ -980,6 +1018,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); @@ -1031,22 +1078,41 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { 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; + 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()); - 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 +1120,13 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { 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); - for (PipeControlPoint sub : getSubPoint()) { - sub.setWorldPosition(getWorldPosition()); - sub.setWorldOrientation(getWorldOrientation()); - } + updateSubPoint(); } @Override