X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2FSCLScenegraph.java;h=e0c198388e41f20a0f6848c22b2e70ae34b0ea2f;hb=694cdd2bbccb545e74d77befd83f1bdcb79bda5e;hp=b3a0ff251502a41cc772352710553cfcc64957eb;hpb=bf8a8b92f405dfd96198d5e1b377ce2f1059675b;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java index b3a0ff251..e0c198388 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java @@ -18,6 +18,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; import java.util.UUID; +import java.util.function.Function; import java.util.stream.Collectors; import javax.xml.transform.OutputKeys; @@ -33,9 +34,12 @@ import org.simantics.Simantics; import org.simantics.datatypes.literal.GUID; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.common.request.IndexRoot; +import org.simantics.db.common.request.ResourceRead; import org.simantics.db.common.request.UnaryRead; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.RuntimeDatabaseException; +import org.simantics.db.layer0.variable.Variables; import org.simantics.diagram.elements.DecorationSVGNode; import org.simantics.diagram.elements.DiagramNodeUtil; import org.simantics.diagram.elements.TextGridNode; @@ -70,6 +74,7 @@ import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode; import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode; import org.simantics.scenegraph.utils.NodeUtil; import org.simantics.scl.runtime.function.Function1; +import org.simantics.scl.runtime.tuple.Tuple2; import org.simantics.trend.impl.ItemNode; import org.simantics.utils.threads.ThreadUtils; import org.slf4j.Logger; @@ -89,16 +94,47 @@ public class SCLScenegraph { private static final String[] ALL_SECTIONS = { MAIN_SECTION, SELECTION_SECTION, SELECTION_MASK_SECTION }; - + @Deprecated public static ICanvasSceneGraphProvider getICanvasSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException { ICanvasSceneGraphProvider provider = DiagramNodeUtil.loadSceneGraphProvider(model, diagram, diagramRVI); return provider; } + @Deprecated public static void disposeSceneGraphProvider(ICanvasSceneGraphProvider provider) { provider.dispose(); } - + + public static T doWithICanvasSceneGraphProvider(Resource diagram, Function1 func) throws DatabaseException { + return doWithICanvasSceneGraphProvider(diagram, (Function) provider -> func.apply(provider)); + } + + public static T doWithICanvasSceneGraphProvider(Resource diagram, Function func) throws DatabaseException { + Tuple2 result = Simantics.getSession().syncRequest(new ResourceRead(diagram) { + + @Override + public Tuple2 perform(ReadGraph graph) throws DatabaseException { + Resource indexRoot = graph.syncRequest(new IndexRoot(resource)); + String diagramRVI = Variables.getRVI(graph, resource); + return new Tuple2(indexRoot, diagramRVI); + } + }); + ICanvasSceneGraphProvider provider = DiagramNodeUtil.loadSceneGraphProvider((Resource) result.c0, diagram, (String) result.c1); + try { + return func.apply(provider); + } finally { + provider.dispose(); + } + } + + public static T doWithCanvasContext(Resource diagram, Function1 func) throws DatabaseException { + return doWithCanvasContext(diagram, (Function) canvasContext -> func.apply(canvasContext)); + } + + public static T doWithCanvasContext(Resource diagram, Function func) throws DatabaseException { + return doWithICanvasSceneGraphProvider(diagram, (Function) provider -> func.apply(provider.getCanvasContext())); + } + public static String getNodeTransform(ICanvasContext ctx, String name) { Set texts = NodeUtil.collectNodes(ctx.getSceneGraph(), TextNode.class); @@ -723,10 +759,14 @@ public class SCLScenegraph { private String getKey(SingleElementNode node) { String key; - if (mappings.containsKey(node.getKey())) - key = mappings.get(node.getKey()).toString(); - else - key = node.getKey().toString(); + if(node.getKey() != null) { + if (mappings.containsKey(node.getKey())) + key = mappings.get(node.getKey()).toString(); + else + key = node.getKey().toString(); + } else { + key = Long.toString(node.getId()); + } return key; } @@ -777,7 +817,7 @@ public class SCLScenegraph { SelectionNode n = (SelectionNode)node; SingleElementNode parentSEN = (SingleElementNode)NodeUtil.getNearestParentOfType(node, SingleElementNode.class); - if(parentSEN != null && parentSEN.getKey() != null) { + if(parentSEN != null) { RenderSVGContext parentBuilder2 = getParentBuilder(parentSEN); @@ -808,15 +848,13 @@ public class SCLScenegraph { AffineTransform at = node.getTransform(); if(node instanceof SingleElementNode) { SingleElementNode sen = (SingleElementNode)node; - if(sen.getKey() != null) { - String key = getKey(sen); - String typeClass = sen.getTypeClass(); - String clazz = "definedElement"; - if(typeClass != null && !typeClass.isEmpty()) - clazz = clazz + " " + typeClass; - - parentBuilder.append(MAIN_SECTION, "\n"); - } + String key = getKey(sen); + String typeClass = sen.getTypeClass(); + String clazz = "definedElement"; + if(typeClass != null && !typeClass.isEmpty()) + clazz = clazz + " " + typeClass; + + parentBuilder.append(MAIN_SECTION, "\n"); senBuilders.put(sen, new RenderSVGContext()); } if(!at.isIdentity()) { @@ -862,16 +900,12 @@ public class SCLScenegraph { RenderSVGContext b = senBuilders.get(sen); String content = b.get(MAIN_SECTION); if(content.isEmpty()) { - if(sen.getKey() != null) { - - for(SelectionNode n : NodeUtil.collectNodes(node, SelectionNode.class)) { - n.setIgnore(true); - } - - Element doc = renderSVGNode((IG2DNode)node); - String svg = printSVGDocument(doc); - parentBuilder.append(MAIN_SECTION, svg); + for(SelectionNode n : NodeUtil.collectNodes(node, SelectionNode.class)) { + n.setIgnore(true); } + Element doc = renderSVGNode((IG2DNode)node); + String svg = printSVGDocument(doc); + parentBuilder.append(MAIN_SECTION, svg); } else { parentBuilder.append(b); } @@ -883,9 +917,9 @@ public class SCLScenegraph { } if(node instanceof SingleElementNode) { SingleElementNode sen = (SingleElementNode)node; - if(sen.getKey() != null) { + //if(sen.getKey() != null) { parentBuilder.append(MAIN_SECTION, ""); - } + //} } } indent --;