From be4d3459d4823f934a387447c8bc1382eb97344c Mon Sep 17 00:00:00 2001 From: Marko Luukkainen Date: Fri, 18 Oct 2019 15:51:59 +0300 Subject: [PATCH] Prevent too narrow angle branched during pipe routing gitlab #36 Change-Id: Iffeb64d62cae7f325054e1be21cc499ad144d3bc --- .../plant3d/actions/RoutePipeAction.java | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) 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 9773a9ea..64d2d8c6 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/actions/RoutePipeAction.java @@ -18,7 +18,6 @@ import org.simantics.g3d.math.Ray; import org.simantics.g3d.scenegraph.NodeMap; import org.simantics.g3d.scenegraph.base.INode; import org.simantics.g3d.tools.ConstraintDetector; -import org.simantics.g3d.tools.DummyConstraintDetector; import org.simantics.g3d.vtk.gizmo.TranslateAxisGizmo; import org.simantics.g3d.vtk.swt.InteractiveVtkComposite; import org.simantics.g3d.vtk.swt.vtkSwtAction; @@ -26,7 +25,6 @@ import org.simantics.g3d.vtk.utils.vtkUtil; import org.simantics.plant3d.Activator; import org.simantics.plant3d.gizmo.SplitPointSelectionGizmo; import org.simantics.plant3d.gizmo.TerminalSelectionGizmo; -import org.simantics.plant3d.ontology.Plant3D; import org.simantics.plant3d.scenegraph.EndComponent; import org.simantics.plant3d.scenegraph.InlineComponent; import org.simantics.plant3d.scenegraph.Nozzle; @@ -440,8 +438,7 @@ public class RoutePipeAction extends vtkSwtAction { startRemovable = false; detector.clearConstraintHighlights(); state = ToolState.NOT_ACTIVE; - setEnabled(false); - + setEnabled(false); } @@ -714,6 +711,8 @@ public class RoutePipeAction extends vtkSwtAction { } else if (hoverObject instanceof InlineComponent && ((InlineComponent)hoverObject).isVariableLength()) { endTo = (InlineComponent)hoverObject; endType = endingToStraight(endTo,mu,o,d); + if (endType == null) + endTo = null; } else if (hoverObject instanceof PipelineComponent && (endPort = endingToComponent(hoverObject,o,d)) != null) { endTo = (PipelineComponent)hoverObject; } else { @@ -907,6 +906,7 @@ public class RoutePipeAction extends vtkSwtAction { //detector.clearConstraintHighlights(); Point3d previousPipePoint = new Point3d(previousPosition); + Point3d currentPipePoint = new Point3d(currentPosition); //String st = ""; if (lock == LockType.NONE) { Point3d p = detector.getSnappedPoint(o, d, new Vector3d(previousPipePoint)); @@ -917,10 +917,9 @@ public class RoutePipeAction extends vtkSwtAction { if (t != null) return t; // if not, we'll have to remove highlight that was added when snapped point was detected - detector.clearConstraintHighlights(); - } + detector.clearConstraintHighlights(); + } - Vector3d sDir = new Vector3d(sEnd); sDir.sub(sStart); MathTools.intersectStraightStraight(sStart, sDir, o, d, currentPosition, new Point3d(), mu); @@ -936,46 +935,63 @@ public class RoutePipeAction extends vtkSwtAction { // branch point must lie between straight's ends. If connection point is exactly // on straight end user may want to connect pipes to each other // TODO : take account sizes of inline components) - // TODO : actually make connection if its detected + boolean connectPrev = false; boolean connectNext = false; - - if (mu[0] < 0.0) { - currentPosition.set(sStart); + boolean branch = false; + if (mu[0] < 0.1) { connectPrev = true; } - else if (mu[0] > 1.0) { - currentPosition.set(sEnd); + else if (mu[0] > 0.9) { connectNext = true; } - boolean connect = false; + + if (connectPrev) { PipeControlPoint pcp = s.getControlPoint(); - if (pcp.getPrevious() == null) - connect = true; + if (pcp.getPrevious() != null) + connectPrev = false; } else if (connectNext) { PipeControlPoint pcp = s.getControlPoint(); - if (pcp.getNext() == null) - connect = true; + if (pcp.getNext() != null) + connectNext = false; + } else { + Vector3d dir = s.getControlPoint().getPathLegDirection(Direction.NEXT); + Vector3d currDir = getLast().getControlPoint().getPathLegDirection(Direction.NEXT); + dir.normalize(); + currDir.normalize(); + double dot = dir.dot(currDir); + System.out.println(dot + " " + currDir + " " + dir); + if (dot > 0.95 || dot < -0.95) { + // pipes are almost in the same direction, creating a branch is not feasible. + branch = false; + } else { + branch = true; + } } - updateCurrentPoint(); - - if (connect) + + if (connectNext || connectPrev) info += "Connect pipes :"; - else - info += "Make Branch :"; + else if (branch) + info += "Create a Branch :"; setInfoText(info + currentPosition + " " + Math.max(0.0, Math.min(mu[0], 1.0))); - if (connect) { - if (connectNext) { - return PositionType.NEXT; - } else { - return PositionType.PREVIOUS; - } - + if (connectNext) { + currentPosition.set(sEnd); + updateCurrentPoint(); + return PositionType.NEXT; + } else if (connectPrev){ + currentPosition.set(sStart); + updateCurrentPoint(); + return PositionType.PREVIOUS; + } else if (branch) { + return PositionType.SPLIT; + } else { + currentPosition.set(currentPipePoint); + updateCurrentPoint(); + return null; } - return PositionType.SPLIT; } @@ -1024,7 +1040,7 @@ public class RoutePipeAction extends vtkSwtAction { updateCurrentPoint(); - setInfoText("Make branch (l) :" + currentPosition + " " + Math.max(0.0, Math.min(mu[0], 1.0)) + " " + routePoint.lengthSquared()); + setInfoText("Create a branch (l) :" + currentPosition + " " + Math.max(0.0, Math.min(mu[0], 1.0)) + " " + routePoint.lengthSquared()); return PositionType.SPLIT; } return null; -- 2.45.2