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=51addbb09ee9edf707af756c8d9d035807aa99d2;hb=ac816c402bf23a233e2614f537fbfec490294a20;hp=22c58ddb160be1a1f43303b34e63d1dd3614bc17;hpb=923dc84d6d22c7b80039dd4e07bec088ab78ea33;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 22c58ddb..51addbb0 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 @@ -7,6 +7,7 @@ import java.util.List; import javax.vecmath.AxisAngle4d; import javax.vecmath.Matrix3d; +import javax.vecmath.Point3d; import javax.vecmath.Quat4d; import javax.vecmath.Tuple3d; import javax.vecmath.Vector3d; @@ -22,19 +23,22 @@ import vtk.vtkRenderer; public class PipeControlPoint extends G3DNode implements IP3DNode { + + private static boolean DEBUG = false; - public enum Type{INLINE,TURN,END}; + public enum PointType{INLINE,TURN,END}; public enum Direction{NEXT,PREVIOUS}; public enum PositionType {SPLIT,NEXT,PREVIOUS,PORT} private PipelineComponent component; - private Type type; - private boolean fixed = true; - private boolean rotate = false; - private boolean reverse = false; - private boolean deletable = true; - private boolean sub = false; + private PointType type; + private boolean isFixed = true; + private boolean isRotate = false; + private boolean isReverse = false; + private boolean isDeletable = true; + private boolean isSizeChange = false; + private boolean isSub = false; public PipeControlPoint(PipelineComponent component) { this.component = component; @@ -66,89 +70,89 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { return component; } - public Type getType() { + public PointType getType() { return type; } - public void setType(Type type) { + public void setType(PointType type) { this.type = type; } @GetPropertyValue(name="Fixed",tabId="Debug",value="fixed") public boolean isFixed() { - return fixed; + return isFixed; } public void setFixed(boolean fixed) { - this.fixed = fixed; + this.isFixed = fixed; } @GetPropertyValue(name="Rotate",tabId="Debug",value="rotate") public boolean isRotate() { - return rotate; + return isRotate; } public void setRotate(boolean rotate) { - this.rotate = rotate; + this.isRotate = rotate; } @GetPropertyValue(name="Reverse",tabId="Debug",value="reverse") public boolean isReverse() { - return reverse; + return isReverse; } public void setReverse(boolean reverse) { - this.reverse = reverse; + this.isReverse = reverse; } public void setSub(boolean sub) { - this.sub = sub; + this.isSub = sub; } @GetPropertyValue(name="Deletable",tabId="Debug",value="deletable") public boolean isDeletable() { - return deletable; + return isDeletable; } public void setDeletable(boolean deletable) { - this.deletable = deletable; + this.isDeletable = deletable; } public boolean isPathLegEnd() { - return type != Type.INLINE; + return type != PointType.INLINE; } public boolean isEnd() { - return type == Type.END; + return type == PointType.END; } public boolean isTurn() { - return type == Type.TURN; + return type == PointType.TURN; } public boolean isInline() { - return type == Type.INLINE; + return type == PointType.INLINE; } public boolean isDirected() { - return fixed && isEnd(); + return isFixed && isEnd(); } public boolean isNonDirected() { - return !fixed && isEnd(); + return !isFixed && isEnd(); } public boolean isVariableLength() { - return !fixed && isInline(); + return !isFixed && isInline(); } public boolean isVariableAngle() { - return !fixed && isTurn(); + return !isFixed && isTurn(); } public boolean isBranchEnd() { - return deletable && isEnd(); + return isDeletable && isEnd(); } public boolean isOffset() { @@ -156,7 +160,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } public boolean isDualSub() { - return parent != null && sub; + return parent != null && isSub; } public boolean isDualInline() { @@ -164,12 +168,17 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } public boolean isSizeChange() { - if (children.size() == 0) - return false; - if (!isDualInline()) - return false; - return getPipeRun() != children.get(0).getPipeRun(); + return isSizeChange; +// if (children.size() == 0) +// return false; +// if (!isDualInline()) +// return false; +// return getPipeRun() != children.get(0).getPipeRun(); } + + public void setSizeChange(boolean isSizeChange) { + this.isSizeChange = isSizeChange; + } private PipeControlPoint next; @@ -186,11 +195,14 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { public void setNext(PipeControlPoint next) { if (isEnd() && previous != null && next != null) throw new RuntimeException("End control points are allowed to have only one connection"); -// if (next != null && getPipeRun() == null) -// throw new RuntimeException("Cannot connect control point befor piperun has been set"); + if (next == this) + throw new RuntimeException("Cannot connect to self"); + if (this.next == next) + return; + if (DEBUG) System.out.println(this + " next " + next); this.next = next; if (component != null) { - if (parent == null || sub) + if (parent == null || isSub) component.setNext(next != null ? next.component : null); else component.setBranch0(next != null ? next.component : null); @@ -202,11 +214,14 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { public void setPrevious(PipeControlPoint previous) { if (isEnd() && next != null && previous != null) throw new RuntimeException("End control points are allowed to have only one connection"); -// if (previous != null && getPipeRun() == null) -// throw new RuntimeException("Cannot connect control point befor piperun has been set"); + if (previous == this) + throw new RuntimeException("Cannot connect to self"); + if (this.previous == previous) + return; + if (DEBUG) System.out.println(this + " previous " + previous); this.previous = previous; if (component != null) { - if (parent == null || sub) + if (parent == null || isSub) component.setPrevious(previous != null ? previous.component : null); else component.setBranch0(previous != null ? previous.component : null); @@ -225,14 +240,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { public PipeControlPoint getParentPoint() { return parent; } - - - - - - private double length; private Double turnAngle; private Vector3d turnAxis; @@ -290,7 +299,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } public void setTurnAngle(Double turnAngle) { - if (Double.isInfinite(turnAngle) || Double.isNaN(turnAngle)) { + if (turnAngle == null || Double.isInfinite(turnAngle) || Double.isNaN(turnAngle)) { return; } if (this.turnAngle != null && Math.abs(this.turnAngle-turnAngle) < MathTools.NEAR_ZERO) @@ -300,7 +309,9 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } public void setTurnAxis(Vector3d turnAxis) { - this.turnAxis = turnAxis; + if (this.turnAxis != null && MathTools.equals(turnAxis, this.turnAxis)) + return; + this.turnAxis = turnAxis; firePropertyChanged("turnAxis"); } @@ -403,7 +414,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { dir.normalize(); Quat4d q = getControlPointOrientationQuat(dir, angle); if (reversed) { - Quat4d q2 = new Quat4d(); + Quat4d q2 = new Quat4d(); q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI)); q.mulInverse(q2); } @@ -483,6 +494,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { dir.sub(pcp.getWorldPosition(),previous.getWorldPosition()); if (dir.lengthSquared() > MathTools.NEAR_ZERO) dir.normalize(); + else + return null; Quat4d q = getControlPointOrientationQuat(dir, pcp.getRotationAngle() != null ? pcp.getRotationAngle() : 0.0); AxisAngle4d aa = new AxisAngle4d(MathTools.Y_AXIS,pcp.getTurnAngle() == null ? 0.0 : pcp.getTurnAngle()); Quat4d q2 = MathTools.getQuat(aa); @@ -499,6 +512,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { dir.sub(next.getWorldPosition(),pcp.getWorldPosition()); if (dir.lengthSquared() > MathTools.NEAR_ZERO) dir.normalize(); + else + return null; Quat4d q = getControlPointOrientationQuat(dir, pcp.getRotationAngle() != null ? pcp.getRotationAngle() : 0.0); AxisAngle4d aa = new AxisAngle4d(MathTools.Y_AXIS,pcp.getTurnAngle() == null ? 0.0 : pcp.getTurnAngle()); Quat4d q2 = MathTools.getQuat(aa); @@ -791,9 +806,9 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } public double getInlineLength() { - if (type == Type.TURN) + if (type == PointType.TURN) return length; - else if (type == Type.INLINE) + else if (type == PointType.INLINE) return length * 0.5; return 0; } @@ -1009,7 +1024,19 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { if (currentNext.isVariableLength() && currentPrev.isVariableLength()) { // we have to join them into single variable length component. additionalRemove = currentPrev; - //currentPrev.remove(); + // combine lengths and set the location of remaining control point to the center. + Point3d ps = new Point3d(); + Point3d pe = new Point3d(); + Point3d ns = new Point3d(); + Point3d ne = new Point3d(); + currentPrev.getInlineControlPointEnds(ps, pe); + currentNext.getInlineControlPointEnds(ns, ne); + double l = currentPrev.getLength() + currentNext.getLength(); + Vector3d cp = new Vector3d(); + cp.add(ps, ne); + cp.scale(0.5); + currentNext.setLength(l); + currentNext.setWorldPosition(cp); } } else { // FIXME : pipe run must be split into two parts, since the control point structure is no more continuous. @@ -1111,8 +1138,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { ocp.removeComponent(); sccp.removeComponent(); - p1.remChild(ocp); - p2.remChild(sccp); + if (p1 != null) + p1.remChild(ocp); + if (p2 != null) + p2.remChild(sccp); // TODO : now we assume that this is size change, and we do if (ocp.next != null) @@ -1128,8 +1157,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { sccp.setNext(null); sccp.setPrevious(null); - checkRemove(p1); - checkRemove(p2); + if (p1 != null) + checkRemove(p1); + if (p2 != null) + checkRemove(p2); } private void removeSubPoints() { @@ -1149,18 +1180,34 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { if (component == null) return; PipelineComponent next = component.getNext(); - PipelineComponent prev = component.getNext(); + PipelineComponent prev = component.getPrevious(); + PipelineComponent br0 = component.getBranch0(); + component.setNext(null); + component.setPrevious(null); + component.setBranch0(null); if (next != null) { if (next.getNext() == component) next.setNext(null); else if (next.getPrevious() == component) next.setPrevious(null); + else if (next.getBranch0() == component) + next.setBranch0(null); } if (prev != null) { if (prev.getNext() == component) prev.setNext(null); else if (prev.getPrevious() == component) prev.setPrevious(null); + else if (prev.getBranch0() == component) + prev.setBranch0(null); + } + if (br0 != null) { + if (br0.getNext() == component) + br0.setNext(null); + else if (br0.getPrevious() == component) + br0.setPrevious(null); + else if (br0.getBranch0() == component) + br0.setBranch0(null); } PipelineComponent comp = component; component = null;