X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Factions%2FRoutePipeAction.java;h=be82d85e3cd808eadd93be549d79724ac32cb94b;hb=refs%2Fchanges%2F31%2F3131%2F1;hp=17455a328b0797cef34dc296d560aff852090ea7;hpb=b8221b6f5e0b6ced872c0b760d796a4c205476af;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java b/org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java index 17455a32..be82d85e 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java @@ -2,6 +2,7 @@ package org.simantics.plant3d.actions; 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; @@ -303,7 +304,7 @@ public class RoutePipeAction extends vtkSwtAction { 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; @@ -491,6 +492,14 @@ public class RoutePipeAction extends vtkSwtAction { return true; } + @Override + public boolean mouseWheelMoved(MouseWheelEvent e) { + if (useDefault) { + getDefaultAction().mouseWheelMoved(e); + } + return true; + } + @Override public boolean mouseClicked(MouseEvent e) { if (useDefault) { @@ -563,7 +572,7 @@ public class RoutePipeAction extends vtkSwtAction { } 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(); @@ -586,24 +595,13 @@ public class RoutePipeAction extends vtkSwtAction { 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; } @@ -699,7 +697,7 @@ public class RoutePipeAction extends vtkSwtAction { } } 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)) { @@ -809,6 +807,23 @@ public class RoutePipeAction extends vtkSwtAction { 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(); @@ -864,7 +879,7 @@ public class RoutePipeAction extends vtkSwtAction { 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); @@ -963,8 +978,8 @@ public class RoutePipeAction extends vtkSwtAction { 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); @@ -979,7 +994,7 @@ public class RoutePipeAction extends vtkSwtAction { 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); @@ -1061,16 +1076,19 @@ public class RoutePipeAction extends vtkSwtAction { * 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 = straight.getPrevious().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) { @@ -1110,80 +1128,7 @@ public class RoutePipeAction extends vtkSwtAction { 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(); }