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=ecaeb7ae7c41d2b70017d4de433dfac968270ecc;hb=refs%2Fchanges%2F59%2F3059%2F1;hp=b8198bda253fc0f57c6864e627f112df1f95780b;hpb=5c3e9116d5e5aefa51ec3caa3b0e42a4e983281f;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 b8198bda..ecaeb7ae 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 @@ -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; @@ -31,6 +32,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { private Type type; private boolean fixed = true; private boolean rotate = false; + private boolean reverse = false; private boolean deletable = true; private boolean sub = false; @@ -87,11 +89,19 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { 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; } @@ -229,6 +239,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { private Double offset; private Double rotationAngle; + private Boolean reversed; @GetPropertyValue(name="Length",tabId="Debug",value="length") public double getLength() { @@ -267,6 +278,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { 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; @@ -302,6 +318,11 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { firePropertyChanged("rotationAngle"); } + public void setReversed(Boolean reversed) { + this.reversed = reversed; + firePropertyChanged("rotationAngle"); + } + public Vector3d getSizeChangeOffsetVector(Vector3d dir) { Quat4d q; if (rotationAngle == null) @@ -340,7 +361,19 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { 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); @@ -354,11 +387,33 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { 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(); @@ -1018,6 +1073,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); @@ -1059,6 +1123,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } PipelineComponent comp = component; component = null; + comp.remove(); } @@ -1076,11 +1141,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(); }