X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram.svg%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fsvg%2Fexport%2FDiagramToSVG.java;h=9964592f95c6136eed0b38a426fc840db49e4ca3;hb=c92959f34dd3cf5f365d8798839a919840b5487a;hp=3c110976294a86bf1aa2414ea50eda567881365b;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram.svg/src/org/simantics/diagram/svg/export/DiagramToSVG.java b/bundles/org.simantics.diagram.svg/src/org/simantics/diagram/svg/export/DiagramToSVG.java index 3c1109762..9964592f9 100644 --- a/bundles/org.simantics.diagram.svg/src/org/simantics/diagram/svg/export/DiagramToSVG.java +++ b/bundles/org.simantics.diagram.svg/src/org/simantics/diagram/svg/export/DiagramToSVG.java @@ -20,6 +20,7 @@ import org.simantics.db.request.Read; import org.simantics.diagram.elements.DiagramNodeUtil; import org.simantics.diagram.export.ImagePrinter; import org.simantics.diagram.stubs.DiagramResource; +import org.simantics.g2d.canvas.Hints; import org.simantics.g2d.canvas.impl.CanvasContext; import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider; import org.simantics.layer0.Layer0; @@ -29,6 +30,7 @@ import org.simantics.structural2.StructuralVariables; import org.simantics.utils.DataContainer; import org.simantics.utils.datastructures.Pair; import org.simantics.utils.page.MarginUtils.Margins; +import org.simantics.utils.threads.IThreadWorkQueue; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.threads.WorkerThread; @@ -127,13 +129,11 @@ public class DiagramToSVG { if (diagram == null) throw new DatabaseException("Input " + input + " cannot be resolved as diagram"); - - - final WorkerThread thread = new WorkerThread("Diagram Image Painter"); thread.start(); final CanvasContext ctx = new CanvasContext(thread); + ctx.getDefaultHintContext().setHint(Hints.KEY_DISABLE_GRAPH_MODIFICATIONS, Boolean.TRUE); final AtomicReference sgProvider = new AtomicReference(); final ISessionContext sessionContext = Simantics.getSessionContext(); final DataContainer result = new DataContainer(null); @@ -203,8 +203,6 @@ public class DiagramToSVG { return model; } - - private static String resolveRVI(ReadGraph graph, Resource diagram) throws DatabaseException { ModelingResources mod = ModelingResources.getInstance(graph); Resource composite = graph.getSingleObject(diagram, mod.DiagramToComposite); @@ -213,4 +211,74 @@ public class DiagramToSVG { return StructuralVariables.getRVI(graph, variablePath); } + public static String renderWithLoader(final Resource input, final ImagePrinter.ImageExportPlan exportPlan, + Margins margins, SVGGraphics2D svgExporter, + IThreadWorkQueue loaderThread, + IThreadWorkQueue painterThread) throws Exception { + + if(!painterThread.currentThreadAccess()) throw new IllegalStateException("The callable should be called from the contextThread"); + + final CanvasContext ctx = new CanvasContext(loaderThread); + ctx.getDefaultHintContext().setHint(Hints.KEY_DISABLE_GRAPH_MODIFICATIONS, Boolean.TRUE); + final AtomicReference sgProvider = new AtomicReference(); + final DataContainer result = new DataContainer(null); + final DataContainer exception = new DataContainer(null); + + try { + + final ISessionContext sessionContext = Simantics.getSessionContext(); + + Pair modelAndRVI = sessionContext.getSession().syncRequest(new UniqueRead>() { + @Override + public Pair perform(ReadGraph graph) throws DatabaseException { + return new Pair( resolveModel(graph, exportPlan.diagram ), resolveRVI(graph, exportPlan.diagram) ); + } + }); + + ICanvasSceneGraphProvider provider = DiagramNodeUtil.loadSceneGraphProvider(ctx, modelAndRVI.first, exportPlan.diagram, modelAndRVI.second); + sgProvider.set( provider ); + + final Semaphore done = new Semaphore(0); + + ThreadUtils.asyncExec(loaderThread, new Runnable() { + @Override + public void run() { + try { + SVGBuilder chassis = margins != null ? + new SVGBuilder(exportPlan.dpi,exportPlan.size,margins) : + new SVGBuilder(exportPlan.dpi,exportPlan.size,exportPlan.margin); + result.set(chassis.paint(ctx, svgExporter)); + } catch (DatabaseException e) { + exception.set(e); + done.release(); + } catch (Throwable e) { + exception.set(new DatabaseException(e)); + done.release(); + } finally { + done.release(); + } + } + }); + + done.acquire(); + + } catch (DatabaseException e) { + exception.set(e); + } catch (Throwable e) { + exception.set(new DatabaseException(e)); + } finally { + + if (sgProvider.get() != null) + sgProvider.get().dispose(); + ctx.dispose(); + + } + + if(exception.get() != null) + throw exception.get(); + + return result.get(); + + } + }