package org.simantics.diagram.connection.splitting; import gnu.trove.set.hash.THashSet; import java.awt.geom.Point2D; import org.simantics.diagram.connection.RouteGraph; import org.simantics.diagram.connection.RouteLine; import org.simantics.diagram.connection.RouteNode; import org.simantics.diagram.connection.RouteTerminal; public class SplittedRouteGraph { public final RouteLine splitLine; public final THashSet interfaceNodes1; public final THashSet lines1; // does not contain splitLine public final THashSet terminals1; public final THashSet interfaceNodes2; public final THashSet lines2; // does not contain splitLine public final THashSet terminals2; public SplittedRouteGraph(RouteLine splitLine, THashSet interfaceNodes1, THashSet lines1, THashSet terminals1, THashSet interfaceNodes2, THashSet lines2, THashSet terminals2) { super(); this.splitLine = splitLine; this.interfaceNodes1 = interfaceNodes1; this.lines1 = lines1; this.terminals1 = terminals1; this.interfaceNodes2 = interfaceNodes2; this.lines2 = lines2; this.terminals2 = terminals2; } @Override public String toString() { StringBuilder b = new StringBuilder(); b.append("splitLine = " + splitLine.getData() + "\n"); b.append("interfaceNodes1 ="); for(RouteNode node : interfaceNodes1) b.append(" " + node.getData() + "(" + node.getClass().getSimpleName() + ")"); b.append("\n"); b.append("lines1 ="); for(RouteLine node : lines1) b.append(" " + node.getData()); b.append("\n"); b.append("terminals1 ="); for(RouteTerminal node : terminals1) b.append(" " + node.getData()); b.append("\n"); b.append("interfaceNodes2 ="); for(RouteNode node : interfaceNodes2) b.append(" " + node.getData() + "(" + node.getClass().getSimpleName() + ")"); b.append("\n"); b.append("lines2 ="); for(RouteLine node : lines2) b.append(" " + node.getData()); b.append("\n"); b.append("terminals2 ="); for(RouteTerminal node : terminals2) b.append(" " + node.getData()); b.append("\n"); return b.toString(); } public static RouteLine findNearestLine(RouteGraph rg, Point2D splitCanvasPos) { double hi = 1000, lo = 1; RouteLine nearestLine = null; final double LIMIT = 0.5; while (true) { double tolerance = (hi + lo) * 0.5; RouteLine line = rg.pickLine(splitCanvasPos.getX(), splitCanvasPos.getY(), tolerance); double delta = (hi - lo) * 0.5; if (delta < LIMIT) return nearestLine; if (line == null) { lo = tolerance; } else { nearestLine = line; hi = tolerance; } } } /** * @param point * @param line * @return the specified point instance snapped to the specified line */ public static Point2D snapToLine(Point2D point, RouteLine line) { // line.print(System.out); // for (RoutePoint rp : line.getPoints()) // System.out.println("RP: " + rp.getX() + ", " + rp.getY()); // Get exact intersection point on the line if (line.isHorizontal()) { point.setLocation( point.getX(), line.getPosition() ); } else { point.setLocation( line.getPosition(), point.getY() ); } return point; } /** * @param point * @param line * @return new {@link Point2D} instance with specified point snapped to specified line */ public static Point2D snappedToLine(Point2D point, RouteLine line) { Point2D result = (Point2D) point.clone(); return snapToLine(result, line); } }