*/
@PropertyContributor
public abstract class PipelineComponent extends GeometryNode {
+
+ private static boolean DEBUG = false;
private PipeRun pipeRun;
this.next._removeRef(this);
this.next = comp;
this.syncnext = false;
+ if (DEBUG) System.out.println(this + " next " + comp);
syncNext();
firePropertyChanged(Plant3D.URIs.HasNext);
if (comp != null)
comp.sync();
-// System.out.println(this + " next " + comp);
+
}
this.previous._removeRef(this);
this.previous = comp;
this.syncprev = false;
+ if (DEBUG) System.out.println(this + " prev " + comp);
syncPrevious();
firePropertyChanged(Plant3D.URIs.HasPrevious);
if (comp != null)
comp.sync();
-// System.out.println(this + " prev " + comp);
+
}
private PipelineComponent branch0;
this.branch0._removeRef(this);
this.branch0 = comp;
this.syncbr0 = false;
+ if (DEBUG) System.out.println(this + " br0 " + comp);
syncBranch0();
firePropertyChanged(Plant3D.URIs.HasBranch0);
if (comp != null)
comp.sync();
-// System.out.println(this + " next " + comp);
}
@GetPropertyValue(name="Previous",tabId="Debug",value=Plant3D.URIs.HasPrevious)
}
} else if (getControlPoint().getSubPoint().size() > 0) { // TODO : this may cause problems? (Removes branch point, before branch has been set?)
- getControlPoint().getSubPoint().get(0).remove();
- getControlPoint().children.clear();
+ //getControlPoint().getSubPoint().get(0).remove();
+ //getControlPoint().children.clear();
return true;
}
} else {
@Override
public void remove() {
+ if (DEBUG) System.out.println(this + " remove");
PipeControlPoint pcp = getControlPoint();
// Second check is needed, when remove process is initiated from control point.
if (pcp != null && pcp.getPipelineComponent() != null) {
} else {
if (previous == null) {
if (!isDirected())
- throw new RuntimeException("Cannot calculate path leg direction for unconnected control point");
+ throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + this);
return getDirectedControlPointDirection();
} else {
if (isVariableAngle())
- throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point");
+ throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + this);
if (isInline()) {
PipeControlPoint pcp = this;
if (pcp.isDualSub()) {
} else if (isTurn() && isFixed() && !_getReversed()) {
return getDirection(Direction.NEXT);
}
- throw new RuntimeException("Missing implementation");
+ throw new RuntimeException("Missing implementation " + this);
}
}
} else {
} else {
if (next == null) {
if (!isDirected())
- throw new RuntimeException("Cannot calculate path leg direction for unconnected control point");
+ throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + this);
Vector3d v = getDirectedControlPointDirection();
v.negate();
return v;
} else {
if (isVariableAngle())
- throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point");
+ throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + this);
if (isInline()) {
PipeControlPoint pcp = this;
if (pcp.isDualInline()) {
} else if (isTurn() && isFixed() && _getReversed()) {
return getDirection(Direction.PREVIOUS);
}
- throw new RuntimeException("Missing implementation");
+ throw new RuntimeException("Missing implementation " + this);
}
}
}
public void _remove(boolean renconnect) {
if (component == null && next == null && previous == null)
return;
+ if (DEBUG) System.out.println(this + " Remove " + renconnect);
if (isDualInline() || isDualSub()) {
removeDualPoint();
return;
}
+ if (getParentPoint() != null) {
+ getParentPoint()._remove(renconnect);
+ }
PipeRun pipeRun = getPipeRun();
if (pipeRun == null)
return;
additionalRemove.remove();
}
+ /**
+ * Removes control point and attempts to reconnect next/prev
+ *
+ * If this point is size change (PipeRuns are different on both sides), then reconnection cannot be made.
+ */
public void remove() {
PipeControlPoint currentPrev = previous;
PipeControlPoint currentNext = next;
_remove();
try {
if (currentNext != null)
- PipingRules.requestUpdate(currentNext);
+ if (!currentNext.checkRemove())
+ PipingRules.requestUpdate(currentNext);
if (currentPrev != null)
- PipingRules.requestUpdate(currentPrev);
+ if (!currentPrev.checkRemove())
+ PipingRules.requestUpdate(currentPrev);
} catch (Exception e) {
e.printStackTrace();
}
}
+
+ /**
+ * Removes control point without attempting to reconnect next/prev.
+ * This usually leads to creation of another PipeRun for the control points after this point.
+ */
public void removeAndSplit() {
PipeControlPoint currentPrev = previous;
PipeControlPoint currentNext = next;
_remove(false);
try {
if (currentNext != null)
- PipingRules.requestUpdate(currentNext);
+ if (!currentNext.checkRemove())
+ PipingRules.requestUpdate(currentNext);
if (currentPrev != null)
- PipingRules.requestUpdate(currentPrev);
+ if (!currentPrev.checkRemove())
+ PipingRules.requestUpdate(currentPrev);
} catch (Exception e) {
e.printStackTrace();
}
}
+
+ /**
+ * This is called when adjacent control point is removed.
+ *
+ * This call should remove the give point, if the point cannot exist alone.
+ * At the moment there is one such case: branch.
+ *
+ * @return
+ */
+ protected boolean checkRemove() {
+ if (getParentPoint() != null) {
+ return getParentPoint().checkRemove();
+ } else {
+ if (getPipelineComponent() == null)
+ return true; // already removed
+ if (getPipelineComponent().getType().equals("Plant3D.URIs.Builtin_BranchSplitComponent")) {
+ if (getSubPoint().get(0).getNext() == null && getSubPoint().get(0).getPrevious() == null) {
+ remove();
+ return true;
+ }
+ }
+ return false;
+ }
+ }
private void checkRemove(PipeRun pipeRun) {
Collection<PipeControlPoint> points = pipeRun.getControlPoints();