1 package org.simantics.diagram.connection.splitting;
\r
3 import gnu.trove.set.hash.THashSet;
\r
5 import java.awt.geom.Point2D;
\r
7 import org.simantics.diagram.connection.RouteGraph;
\r
8 import org.simantics.diagram.connection.RouteLine;
\r
9 import org.simantics.diagram.connection.RouteNode;
\r
10 import org.simantics.diagram.connection.RouteTerminal;
\r
12 public class SplittedRouteGraph {
\r
13 public final RouteLine splitLine;
\r
14 public final THashSet<RouteNode> interfaceNodes1;
\r
15 public final THashSet<RouteLine> lines1; // does not contain splitLine
\r
16 public final THashSet<RouteTerminal> terminals1;
\r
17 public final THashSet<RouteNode> interfaceNodes2;
\r
18 public final THashSet<RouteLine> lines2; // does not contain splitLine
\r
19 public final THashSet<RouteTerminal> terminals2;
\r
21 public SplittedRouteGraph(RouteLine splitLine,
\r
22 THashSet<RouteNode> interfaceNodes1, THashSet<RouteLine> lines1,
\r
23 THashSet<RouteTerminal> terminals1,
\r
24 THashSet<RouteNode> interfaceNodes2, THashSet<RouteLine> lines2,
\r
25 THashSet<RouteTerminal> terminals2) {
\r
27 this.splitLine = splitLine;
\r
28 this.interfaceNodes1 = interfaceNodes1;
\r
29 this.lines1 = lines1;
\r
30 this.terminals1 = terminals1;
\r
31 this.interfaceNodes2 = interfaceNodes2;
\r
32 this.lines2 = lines2;
\r
33 this.terminals2 = terminals2;
\r
37 public String toString() {
\r
38 StringBuilder b = new StringBuilder();
\r
40 b.append("splitLine = " + splitLine.getData() + "\n");
\r
42 b.append("interfaceNodes1 =");
\r
43 for(RouteNode node : interfaceNodes1)
\r
44 b.append(" " + node.getData() + "(" + node.getClass().getSimpleName() + ")");
\r
47 b.append("lines1 =");
\r
48 for(RouteLine node : lines1)
\r
49 b.append(" " + node.getData());
\r
52 b.append("terminals1 =");
\r
53 for(RouteTerminal node : terminals1)
\r
54 b.append(" " + node.getData());
\r
57 b.append("interfaceNodes2 =");
\r
58 for(RouteNode node : interfaceNodes2)
\r
59 b.append(" " + node.getData() + "(" + node.getClass().getSimpleName() + ")");
\r
62 b.append("lines2 =");
\r
63 for(RouteLine node : lines2)
\r
64 b.append(" " + node.getData());
\r
67 b.append("terminals2 =");
\r
68 for(RouteTerminal node : terminals2)
\r
69 b.append(" " + node.getData());
\r
72 return b.toString();
\r
75 public static RouteLine findNearestLine(RouteGraph rg, Point2D splitCanvasPos) {
\r
76 double hi = 1000, lo = 1;
\r
77 RouteLine nearestLine = null;
\r
78 final double LIMIT = 0.5;
\r
80 double tolerance = (hi + lo) * 0.5;
\r
81 RouteLine line = rg.pickLine(splitCanvasPos.getX(), splitCanvasPos.getY(), tolerance);
\r
82 double delta = (hi - lo) * 0.5;
\r
97 * @return the specified point instance snapped to the specified line
\r
99 public static Point2D snapToLine(Point2D point, RouteLine line) {
\r
100 // line.print(System.out);
\r
101 // for (RoutePoint rp : line.getPoints())
\r
102 // System.out.println("RP: " + rp.getX() + ", " + rp.getY());
\r
103 // Get exact intersection point on the line
\r
104 if (line.isHorizontal()) {
\r
105 point.setLocation( point.getX(), line.getPosition() );
\r
107 point.setLocation( line.getPosition(), point.getY() );
\r
115 * @return new {@link Point2D} instance with specified point snapped to specified line
\r
117 public static Point2D snappedToLine(Point2D point, RouteLine line) {
\r
118 Point2D result = (Point2D) point.clone();
\r
119 return snapToLine(result, line);
\r