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;
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;
startRemovable = false;
detector.clearConstraintHighlights();
state = ToolState.NOT_ACTIVE;
- setEnabled(false);
-
+ setEnabled(false);
}
} 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 {
//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));
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);
// 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;
}
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;