package org.simantics.district.network.profile; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.exception.DatabaseException; import org.simantics.scenegraph.INode; import org.simantics.scenegraph.g2d.G2DSceneGraph; import org.simantics.scenegraph.g2d.nodes.SingleElementNode; import org.simantics.scenegraph.profile.EvaluationContext; import org.simantics.scenegraph.profile.common.ProfileVariables; public class VertexSizeStyle extends ThrottledStyleBase { private static final Double PENDING = Double.NaN; private static final Double ONE = 1.0; @Override public Double calculateThrottledStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource groupItem) throws DatabaseException { DiagramSettings ds = graph.syncRequest(new DiagramSettingsRequest(runtimeDiagram), TransientCacheAsyncListener.instance()); Double scaling = ONE; // Prevent PendingVariableExceptions from coming through boolean wasSynchronous = graph.setSynchronous(true); try { if (ds.vertexScaleProperty.isPresent()) { scaling = Simantics.applySCLRead(graph, ds.vertexScaleProperty.get(), groupItem); if (scaling == null) { scaling = ONE; } else { // System.out.println("read vertex scaling: " + scaling + " : " + ds.vertexScaleProperty); scaling = scaling * ds.vertexScaleGain + ds.vertexScaleBias; // System.out.println("RESULT: " + scaling); } } return scaling; } finally { graph.setSynchronous(wasSynchronous); } } @Override public void applyThrottledStyleForNode(EvaluationContext observer, INode node, Double value) { //System.out.println("apply: " + node + " : " + value); SingleElementNode n = (SingleElementNode) node; if (value == PENDING) { ((G2DSceneGraph)node.getRootNode()).setPending(node); } else { ((G2DSceneGraph)node.getRootNode()).clearPending(node); } if (value == null) value = ONE; for (INode nn : n.getNodes()) ProfileVariables.claimNodeProperty(nn, "size", value, observer); } @Override protected void cleanupStyleForNode(EvaluationContext evaluationContext, INode node) { ((G2DSceneGraph)node.getRootNode()).clearPending(node); SingleElementNode n = (SingleElementNode) node; for (INode nn : n.getNodes()) ProfileVariables.claimNodeProperty(nn, "size", ONE, evaluationContext); } }