]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network/src/org/simantics/district/network/profile/DiagramSettingsRequest.java
First prototype of HSV color space based dynamic DN element coloring
[simantics/district.git] / org.simantics.district.network / src / org / simantics / district / network / profile / DiagramSettingsRequest.java
index 6fdb9721f059b20d32498e75f0f423659ebfa5be..a17464d8aefe655ea4e83b9eea54832a513cc9f6 100644 (file)
@@ -20,11 +20,15 @@ public class DiagramSettingsRequest extends ResourceRead<DiagramSettings> {
                super(runtimeDiagram);
        }
 
-       @Override
+       @SuppressWarnings("unchecked")
+    @Override
        public DiagramSettings perform(ReadGraph graph) throws DatabaseException {
                DiagramResource DIA = DiagramResource.getInstance(graph);
                DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
 
+               Function1<Resource, Double> elementColoringFunction = null;
+               float elementColoringGradientHue = 0;
+               float elementColoringGradientSaturation = 1;
                Function1<Resource, Double> edgeThicknessProperty = null;
                Function1<Resource, Double> nodeScaleProperty = null;
                double edgeThicknessGain = 1;
@@ -34,6 +38,20 @@ public class DiagramSettingsRequest extends ResourceRead<DiagramSettings> {
 
                Resource diagram = graph.getPossibleObject(resource, DIA.RuntimeDiagram_HasConfiguration);
                if (diagram != null) {
+                       Variable dv = Variables.getPossibleVariable(graph, diagram);
+                       if (dv != null) {
+                               Object obj = dv.getPossiblePropertyValue(graph, DN.Diagram_elementColoringFunction);
+                               if (obj instanceof Function1<?,?>) {
+                                       elementColoringFunction = (Function1<Resource, Double>) obj;
+                               }
+                       }
+                       elementColoringGradientHue =
+                                       limit(0, 360, safeFloatProperty(graph, diagram, DN.Diagram_elementColoringGradientHue, 0.0f))
+                                       / 360.0f;
+                       elementColoringGradientSaturation =
+                                       limit(0, 100, safeFloatProperty(graph, diagram, DN.Diagram_elementColoringGradientSaturation, 0.0f))
+                                       / 100.0f;
+
                        Resource etp = graph.getPossibleObject(diagram, DN.Diagram_edgeThicknessProperty);
                        //System.out.println("etp: " + NameUtils.getURIOrSafeNameInternal(graph, etp));
                        if (etp != null) {
@@ -69,14 +87,31 @@ public class DiagramSettingsRequest extends ResourceRead<DiagramSettings> {
 
                DiagramSettings ds = new DiagramSettings(
                                nodeScaleProperty, nodeScaleGain, nodeScaleBias,
-                               edgeThicknessProperty, edgeThicknessGain, edgeThicknessBias);
+                               edgeThicknessProperty, edgeThicknessGain, edgeThicknessBias,
+                               elementColoringFunction,
+                               elementColoringGradientHue,
+                               elementColoringGradientSaturation);
                //System.out.println("new diagram settings: " + ds);
                return ds;
        }
 
+       private static float safeFloatProperty(ReadGraph graph, Resource r, Resource property, float defaultValue) throws DatabaseException {
+               Float d = graph.getPossibleRelatedValue(r, property, Bindings.FLOAT);
+               return d != null ? d : defaultValue;
+       }
+
        private static double safeDoubleProperty(ReadGraph graph, Resource r, Resource property, double defaultValue) throws DatabaseException {
                Double d = graph.getPossibleRelatedValue(r, property, Bindings.DOUBLE);
                return d != null ? d : defaultValue;
        }
 
+       private static float limit(float min, float max, float value) {
+               return Math.max(min, Math.min(value,  max));
+       }
+
+       @SuppressWarnings("unused")
+       private static double limit(double min, double max, double value) {
+               return Math.max(min, Math.min(value,  max));
+       }
+
 }