import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
public void deattach() {
deactivate();
startComponent = null;
- nodeMap.commit();
+ nodeMap.commit("Route pipe");
deattachUI();
super.deattach();
panel.refresh();
if (startComponent instanceof InlineComponent) {
direction = startComponent.getControlPoint().getPathLegDirection(reversed ? Direction.PREVIOUS : Direction.NEXT);
lock = LockType.CUSTOM;
- if (startComponent.getType().equals(Plant3D.URIs.Builtin_Straight)) {
+ if (((InlineComponent) startComponent).isVariableLength()) {
startWithTurn = true;
direction = null;
lock = LockType.NONE;
return true;
}
+ @Override
+ public boolean mouseWheelMoved(MouseWheelEvent e) {
+ if (useDefault) {
+ getDefaultAction().mouseWheelMoved(e);
+ }
+ return true;
+ }
+
@Override
public boolean mouseClicked(MouseEvent e) {
if (useDefault) {
}
try {
Vector3d pos = new Vector3d(t);
- InlineComponent branchSplit = createBranchSplit((InlineComponent)startComponent, pos);
+ InlineComponent branchSplit = ComponentUtils.createBranchSplit((InlineComponent)startComponent, pos);
PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
reversed = false;
PipeRun newRun = new PipeRun();
return true;
}
- private InlineComponent createBranchSplit(InlineComponent component, Vector3d pos) throws Exception{
- InlineComponent branchSplit = ComponentUtils.createBranchSplit(root);
- String branchName = component.getPipeRun().getUniqueName("Branch");
- branchSplit.setName(branchName);
- component.getPipeRun().addChild(branchSplit);
- PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
- branchSplitCP.setWorldPosition(pos);
- PipingRules.splitVariableLengthComponent(branchSplit, component, false);
- return branchSplit;
- }
-
@Override
public boolean mouseMoved(MouseEvent e) {
if (useDefault) {
getDefaultAction().mouseMoved(e);
return true;
}
- step = ((e.getModifiers() & MouseEvent.CTRL_DOWN_MASK) > 0);
+ step = ((e.getModifiers() & MouseEvent.CTRL_MASK) > 0);
update(e.getX(), e.getY());
return true;
}
}
} else {
if (hoverObject instanceof InlineComponent && ((InlineComponent)hoverObject).isVariableLength() && (endType = endingLockToStraight(hoverObject,mu)) != null) {
- endTo = (InlineComponent)hoverObject;;
+ endTo = (InlineComponent)hoverObject;
} else if (hoverObject instanceof Nozzle && endingLockToNozzle(hoverObject)) {
endTo = (Nozzle)hoverObject;
} else if ((hoverObject instanceof PipelineComponent) && ((endPort = endingLockToComponent(hoverObject)) != null)) {
s += detector.getSnapString();
}
+ //System.out.println(previousPosition + " -> " + currentPosition);
+// double dist = MathTools.distance(previousPosition, currentPosition);
+// if (dist < pipeRun.getTurnRadius()) {
+// s += "Too close";
+// Vector3d v = new Vector3d(currentPosition);
+// v.sub(previousPosition);
+// double vl = v.length();
+// if (vl > MathTools.NEAR_ZERO) {
+// v.scale(1.0/vl);
+// } else {
+//
+// return;
+// }
+// v.scale(pipeRun.getTurnRadius());
+// v.add(previousPosition);
+// currentPosition.set(v);
+// }
updateCurrentPoint();
s += currentPosition.toString();
String info = "";
Point3d sStart = new Point3d();
Point3d sEnd = new Point3d();
- s.getControlPointEnds(sStart, sEnd);
+ s.getEnds(sStart, sEnd);
//detector.clearConstraintHighlights();
Point3d previousPipePoint = new Point3d(previousPosition);
private PositionType endingLockToStraight(INode straightNode, double mu[]) {
InlineComponent s = (InlineComponent)straightNode;
- Point3d sStart = new Point3d();//G3DTools.getPoint(s.getHasControlPoint().getPreviousPoint().getLocalPosition());
- Point3d sEnd = new Point3d(); //G3DTools.getPoint(s.getHasControlPoint().getNextPoint().getLocalPosition());
+ Point3d sStart = new Point3d();
+ Point3d sEnd = new Point3d();
s.getControlPoint().getInlineControlPointEnds(sStart, sEnd);
Vector3d sDir = new Vector3d(sEnd);
sDir.sub(sStart);
routePoint.sub(branchPoint);
// startPoint of branch must be between pipe ends
// TODO : take account sizes of elbows (or other components)
- // branch point must be between pipe ends and intersection points must be quite close to each othert
+ // branch point must be between pipe ends and intersection points must be quite close to each other
if (mu[0] > 0.0 && mu[0] < 1.0 && routePoint.lengthSquared() < BRANCH_SNAP_DISTANCE) {
currentPosition.set(branchPoint);
* Updates tool graphics for current point
*/
private void updateCurrentPoint() {
-// PipeComponentProvider.createStraightEdges(pipeShapes.get(pipeShapes.size() - 1), controlPoints.get(controlPoints.size() - 1), currentPoint, pipeDiameter*0.5);
InlineComponent straight = (InlineComponent)added.get(added.size()-1);
- // FIXME : does not take account space the the previous elbow reserves.
+ // TODO: the inline length is from previous update step.
+ double l;
+ if (!reversed)
+ l = straight.getPrevious().getControlPoint().getInlineLength();
+ else
+ l = straight.getNext().getControlPoint().getInlineLength();
Vector3d v = new Vector3d();
v.sub(currentPosition, previousPosition);
double length = v.length();
- v.scale(0.5);
- v.add(previousPosition);
- straight.getControlPoint().setWorldPosition(v);
- straight.getControlPoint().setLength(length);
+ if (length > MathTools.NEAR_ZERO) {
+ v.scale(1.0/length);
+ v.scale(0.5*(length+l));
+ v.add(previousPosition);
+ straight.getControlPoint().setWorldPosition(v);
+ straight.getControlPoint().setLength(length);
+ }
try {
PipingRules.positionUpdate(straight.getControlPoint(),false);
} catch (Exception e) {
state = ToolState.NOT_ACTIVE;
if (endTo != null) {
- PipeControlPoint endCP = endTo.getControlPoint();
- if (endType == null || endType == PositionType.NEXT || endType == PositionType.PREVIOUS) {
-
- PipelineComponent current = getLast();
- PipeControlPoint currentCP = current.getControlPoint();
-
- boolean requiresReverse = false;
- if (!reversed && endCP.getPrevious() != null) {
- requiresReverse = true;
- } else if (reversed && endCP.getNext() != null) {
- requiresReverse = true;
- }
- PipeRun other = endCP.getPipeRun();
- boolean mergeRuns = pipeRun.equalSpecs(other);
-
- if (requiresReverse) {
- // Pipe line must be traversible with next/previous relations without direction change.
- // Now the component, where we are connecting the created pipeline is defined in different order.
- PipingRules.reverse(other);
-
- }
- if (mergeRuns) {
- // Runs have compatible specs and must be merged
- if (pipeRun != other) // FIXME: temporary workaround.
- PipingRules.merge(pipeRun, other);
- if (!reversed) {
- currentCP.setNext(endCP);
- endCP.setPrevious(currentCP);
- } else {
- currentCP.setPrevious(endCP);
- endCP.setNext(currentCP);
- }
- } else {
- // Runs do not have compatible specs, and a reducer must be attached in between.
- InlineComponent reducer = ComponentUtils.createReducer(root);
- PipeControlPoint pcp = reducer.getControlPoint();
- PipeControlPoint ocp = pcp.getSubPoint().get(0);
-
- Vector3d endPos = endCP.getWorldPosition();
- Vector3d currentPos = currentCP.getWorldPosition();
- Vector3d v = new Vector3d(endPos);
- v.sub(currentPos);
- v.scale(0.5);
- v.add(currentPos);
-
- PipingRules.addSizeChange(reversed, pipeRun, other, reducer, currentCP, endCP);
-
- pcp.setWorldPosition(v);
- reducer.updateParameters();
- }
-
- } else if (endType == PositionType.SPLIT) {
- InlineComponent branchSplit = createBranchSplit((InlineComponent)endTo, currentPosition);
- PipeControlPoint branchSplitCP = branchSplit.getControlPoint();
- PipeControlPoint pcp = new PipeControlPoint(branchSplit,pipeRun);
- branchSplitCP.children.add(pcp);
- pcp.parent = branchSplitCP;
- pcp.setWorldOrientation(branchSplitCP.getWorldOrientation());
- pcp.setWorldPosition(branchSplitCP.getWorldPosition());
-
- PipelineComponent current = getLast();
- PipeControlPoint currentCP = current.getControlPoint();
-
-
- if(!reversed) {
- pcp.setPrevious(currentCP);
- currentCP.setNext(pcp);
- } else {
- pcp.setNext(currentCP);
- currentCP.setPrevious(pcp);
- }
-
- }
- PipingRules.positionUpdate(endCP);
+ ComponentUtils.connect(getLast(), endTo, endType, currentPosition);
}
panel.useDefaultAction();
}