]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/splitting/SplittedRouteGraph.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram.connection / src / org / simantics / diagram / connection / splitting / SplittedRouteGraph.java
1 package org.simantics.diagram.connection.splitting;\r
2 \r
3 import gnu.trove.set.hash.THashSet;\r
4 \r
5 import java.awt.geom.Point2D;\r
6 \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
11 \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
20     \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
26         super();\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
34     }\r
35     \r
36     @Override\r
37     public String toString() {\r
38         StringBuilder b = new StringBuilder();\r
39         \r
40         b.append("splitLine = " + splitLine.getData() + "\n");\r
41         \r
42         b.append("interfaceNodes1 =");\r
43         for(RouteNode node : interfaceNodes1)\r
44             b.append(" " + node.getData() + "(" + node.getClass().getSimpleName() + ")");\r
45         b.append("\n");\r
46         \r
47         b.append("lines1 =");\r
48         for(RouteLine node : lines1)\r
49             b.append(" " + node.getData());\r
50         b.append("\n");\r
51         \r
52         b.append("terminals1 =");\r
53         for(RouteTerminal node : terminals1)\r
54             b.append(" " + node.getData());\r
55         b.append("\n");\r
56         \r
57         b.append("interfaceNodes2 =");\r
58         for(RouteNode node : interfaceNodes2)\r
59             b.append(" " + node.getData() + "(" + node.getClass().getSimpleName() + ")");\r
60         b.append("\n");\r
61         \r
62         b.append("lines2 =");\r
63         for(RouteLine node : lines2)\r
64             b.append(" " + node.getData());\r
65         b.append("\n");\r
66         \r
67         b.append("terminals2 =");\r
68         for(RouteTerminal node : terminals2)\r
69             b.append(" " + node.getData());\r
70         b.append("\n");\r
71         \r
72         return b.toString();\r
73     }\r
74 \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
79         while (true) {\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
83             if (delta < LIMIT)\r
84                 return nearestLine;\r
85             if (line == null) {\r
86                 lo = tolerance;\r
87             } else {\r
88                 nearestLine = line;\r
89                 hi = tolerance;\r
90             }\r
91         }\r
92     }\r
93 \r
94     /**\r
95      * @param point\r
96      * @param line\r
97      * @return the specified point instance snapped to the specified line\r
98      */\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
106         } else {\r
107             point.setLocation( line.getPosition(), point.getY() );\r
108         }\r
109         return point;\r
110     }\r
111 \r
112     /**\r
113      * @param point\r
114      * @param line\r
115      * @return new {@link Point2D} instance with specified point snapped to specified line\r
116      */\r
117     public static Point2D snappedToLine(Point2D point, RouteLine line) {\r
118         Point2D result = (Point2D) point.clone();\r
119         return snapToLine(result, line);\r
120     }\r
121 \r
122 }\r