]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/RouteGraphUtils.java
Store initial links between route notes for JS connection rendering
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / RouteGraphUtils.java
index 3127b431c7ce7178c5e656d1a745b79e13539a86..192b4947fdf90e3ba7dd328fb67d34ab1b056361 100644 (file)
@@ -18,6 +18,7 @@ import java.awt.Shape;
 import java.awt.Stroke;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -34,6 +35,7 @@ import org.simantics.db.common.request.UnaryRead;
 import org.simantics.db.common.utils.NameUtils;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.diagram.connection.ConnectionVisuals;
+import org.simantics.diagram.connection.Link;
 import org.simantics.diagram.connection.RouteGraph;
 import org.simantics.diagram.connection.RouteGraphConnectionClass;
 import org.simantics.diagram.connection.RouteLine;
@@ -42,6 +44,7 @@ import org.simantics.diagram.connection.RouteTerminal;
 import org.simantics.diagram.connection.RouteTerminalPosition;
 import org.simantics.diagram.connection.rendering.BasicConnectionStyle;
 import org.simantics.diagram.connection.rendering.ConnectionStyle;
+import org.simantics.diagram.connection.rendering.ExampleConnectionStyle;
 import org.simantics.diagram.connection.rendering.StyledRouteGraphRenderer;
 import org.simantics.diagram.connection.rendering.arrows.ArrowLineEndStyle;
 import org.simantics.diagram.connection.rendering.arrows.ILineEndStyle;
@@ -109,12 +112,21 @@ public class RouteGraphUtils {
         RouteGraph rg = new RouteGraph();
 
         // Default capacity should be enough for common cases.
-        Set<EdgeResource> links = new THashSet<EdgeResource>();
-        Map<Object, RouteNode> nodeByData = new THashMap<Object, RouteNode>();
+        Set<EdgeResource> links = new THashSet<>();
+        Map<Object, RouteNode> nodeByData = new THashMap<>();
 
         // Load all route graph interior RouteNodes: route lines and points
         for (Resource interiorNode : graph.getObjects(connection, DIA.HasInteriorRouteNode)) {
             if (graph.isInstanceOf(interiorNode, DIA.RouteLine)) {
+                Collection<Resource> areConnected = graph.getObjects(interiorNode, DIA.AreConnected);
+                if (areConnected.size() < 2) {
+                    // Degenerated route line encountered, most likely due to a bug somewhere else.
+                    // Ignoring them because adding them to the RouteGraph structure would cause
+                    // problems during rendering.
+                    LOGGER.warn("Stray RouteLine found: " + NameUtils.getSafeName(graph, interiorNode));
+                    continue;
+                }
+
                 Boolean isHorizontal = graph.getRelatedValue(interiorNode, DIA.IsHorizontal, Bindings.BOOLEAN);
                 Double position = graph.getRelatedValue(interiorNode, DIA.HasPosition, Bindings.DOUBLE);
                 RouteLine line = rg.addLine(isHorizontal, position);
@@ -122,7 +134,7 @@ public class RouteGraphUtils {
 
                 nodeByData.put( interiorNode, line );
 
-                for (Resource connectedTo : graph.getObjects(interiorNode, DIA.AreConnected)) {
+                for (Resource connectedTo : areConnected) {
                     links.add( new EdgeResource(interiorNode, connectedTo) );
                 }
             } else if (graph.isInstanceOf(interiorNode, DIA.RoutePoint)) {
@@ -292,7 +304,7 @@ public class RouteGraphUtils {
 
             final ResourceTerminal rt = new ResourceTerminal(terminal);
             final TerminalLayout tl = te.getElementClass().getSingleItem(TerminalLayout.class);
-            AffineTransform terminalPos = tl.getTerminalPosition(element, rt);
+            AffineTransform terminalPos = tl.getTerminalPosition(te, rt);
 
             if (terminalPos != null) {
                 terminalTr.concatenate(terminalPos);
@@ -343,6 +355,8 @@ public class RouteGraphUtils {
             }
         }
 
+        Collection<Link> initialLinks = new ArrayList<>();
+        
         // Finish route graph loading by Linking route nodes together
         for (EdgeResource link : links) {
             RouteNode n1 = nodeByData.get(link.first());
@@ -352,7 +366,9 @@ public class RouteGraphUtils {
                 continue;
             }
             rg.link(n1, n2);
+            initialLinks.add(new Link(n1, n2));
         }
+        rg.setInitialLinks(initialLinks);
 
         return rg;
 
@@ -523,6 +539,8 @@ public class RouteGraphUtils {
         }
     }
 
+    private static final ConnectionStyle DEFAULT_CONNECTION_STYLE = new BasicConnectionStyle(Color.BLACK, Color.BLACK, 3, ExampleConnectionStyle.SOLID, ExampleConnectionStyle.SOLID, 8);
+
     /**
      * @param graph
      * @param canvas
@@ -537,7 +555,7 @@ public class RouteGraphUtils {
             connectionType = modelingRules.getConnectionType(graph, connection);
         if (connectionType == null)
             connectionType = graph.getPossibleObject(connection, STR.HasConnectionType);
-        return readConnectionStyleFromConnectionType(graph, connectionType);
+        return connectionType != null ? readConnectionStyleFromConnectionType(graph, connectionType) : DEFAULT_CONNECTION_STYLE;
     }
 
     protected static ConnectionStyle readConnectionStyleFromConnectionType(ReadGraph graph, Resource connectionType) throws DatabaseException {
@@ -566,7 +584,7 @@ public class RouteGraphUtils {
 
         // Fixed style settings
         Color branchPointColor = Color.BLACK;
-        double branchPointRadius = 0.5;
+        double branchPointRadius = cv != null && cv.branchPointRadius != null ? cv.branchPointRadius : 0.5;
         double degenerateLineLength = 0.8;
         
         Color lineColor = cv != null ? cv.toColor() : null;