1 package org.simantics.district.network;
3 import java.awt.geom.Rectangle2D;
4 import java.util.ArrayList;
5 import java.util.Collection;
6 import java.util.Collections;
7 import java.util.HashMap;
8 import java.util.Iterator;
11 import java.util.stream.Collectors;
12 import java.util.stream.Stream;
14 import org.simantics.databoard.Bindings;
15 import org.simantics.datatypes.literal.RGB;
16 import org.simantics.datatypes.literal.RGB.Integer;
17 import org.simantics.db.ReadGraph;
18 import org.simantics.db.Resource;
19 import org.simantics.db.WriteGraph;
20 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
21 import org.simantics.db.common.request.IndexRoot;
22 import org.simantics.db.common.request.ResourceRead;
23 import org.simantics.db.common.utils.OrderedSetUtils;
24 import org.simantics.db.exception.BindingException;
25 import org.simantics.db.exception.DatabaseException;
26 import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;
27 import org.simantics.db.exception.ServiceException;
28 import org.simantics.db.indexing.IndexUtils;
29 import org.simantics.db.layer0.request.PossibleVariable;
30 import org.simantics.db.layer0.variable.Variable;
31 import org.simantics.diagram.stubs.DiagramResource;
32 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
33 import org.simantics.diagram.synchronization.graph.layer.GraphLayer;
34 import org.simantics.diagram.synchronization.graph.layer.IGraphLayerUtil;
35 import org.simantics.district.network.ontology.DistrictNetworkResource;
36 import org.simantics.district.network.visualisations.DynamicVisualisationsContributions;
37 import org.simantics.district.network.visualisations.model.ColorBarOptions;
38 import org.simantics.district.network.visualisations.model.ColorBarOptions.ColorBarsLocation;
39 import org.simantics.district.network.visualisations.model.ColorBarOptions.ColorBarsSize;
40 import org.simantics.district.network.visualisations.model.DynamicColorContribution;
41 import org.simantics.district.network.visualisations.model.DynamicColorMap;
42 import org.simantics.district.network.visualisations.model.DynamicSizeContribution;
43 import org.simantics.district.network.visualisations.model.DynamicSizeMap;
44 import org.simantics.district.network.visualisations.model.SizeBarOptions;
45 import org.simantics.district.network.visualisations.model.SizeBarOptions.SizeBarsLocation;
46 import org.simantics.district.network.visualisations.model.SizeBarOptions.SizeBarsSize;
47 import org.simantics.layer0.Layer0;
48 import org.simantics.maps.elevation.server.SingletonTiffTileInterface;
49 import org.simantics.maps.elevation.server.prefs.MapsElevationServerPreferences;
50 import org.simantics.modeling.ModelingResources;
51 import org.simantics.modeling.adapters.NewCompositeActionFactory;
52 import org.simantics.operation.Layer0X;
53 import org.simantics.utils.datastructures.Pair;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
57 public class DistrictNetworkUtil {
59 private static final Logger LOGGER = LoggerFactory.getLogger(DistrictNetworkUtil.class);
61 public static Resource createEdge(WriteGraph graph, Resource composite, double[] detailedGeometryCoords) throws DatabaseException {
62 return createEdge(graph, composite, graph.getPossibleObject(composite, DistrictNetworkResource.getInstance(graph).EdgeDefaultMapping), detailedGeometryCoords);
65 public static Resource createEdge(WriteGraph graph, Resource composite, Resource mapping, double[] detailedGeometryCoords) throws DatabaseException {
66 Layer0 L0 = Layer0.getInstance(graph);
67 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
68 if (mapping == null) {
69 mapping = graph.getSingleObject(composite, DN.EdgeDefaultMapping);
72 Resource edge = graph.newResource();
73 graph.claim(edge, L0.InstanceOf, DN.Edge);
75 graph.claim(edge, DN.HasMapping, null, mapping);
77 OrderedSetUtils.addFirst(graph, composite, edge);
78 graph.claim(composite, L0.ConsistsOf, L0.PartOf, edge);
80 claimFreshElementName(graph, composite, edge);
82 // We need to put GraphLayer to newLayers so...
83 for (Resource layer : graph.getObjects(composite, DiagramResource.getInstance(graph).HasLayer)) {
84 IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class);
86 GraphLayer gl = layerUtil.loadLayer(graph, layer);
87 gl.forEachTag(tag -> {
88 DiagramGraphUtil.tag(graph, edge, tag, true);
92 // add detailed geometry (if any)
93 graph.claimLiteral(edge, DN.Edge_HasGeometry, detailedGeometryCoords, Bindings.DOUBLE_ARRAY);
101 * @param elevation Double.MAX_VALUE to fetch elevation from elevation server (if enabled and has data)
103 * @throws DatabaseException
105 public static Resource createVertex(WriteGraph graph, Resource composite, double[] coords, double elevation) throws DatabaseException {
106 Resource defaultVertexMapping = graph.getPossibleObject(composite, DistrictNetworkResource.getInstance(graph).VertexDefaultMapping);
107 return createVertex(graph, composite, coords, elevation, defaultVertexMapping);
114 * @param elevation Double.MAX_VALUE to fetch elevation from elevation server (if enabled and has data)
117 * @throws DatabaseException
119 public static Resource createVertex(WriteGraph graph, Resource composite, double[] coords, double elevation, Resource mapping) throws DatabaseException {
120 // Double.MAX_VALUE is our secret to lookup elevation from elevation server
121 if (elevation == Double.MAX_VALUE) {
122 // ok, resolve from server or default to 0
123 if (MapsElevationServerPreferences.useElevationServer()) {
124 // ok! we use new elevation API to resolve possible elevations for the starting points
126 elevation = SingletonTiffTileInterface.lookup(coords[1], coords[0]).doubleValue();
127 } catch (Exception ee) {
128 LOGGER.error("Could not get elevation from tiff interface", ee);
135 Layer0 L0 = Layer0.getInstance(graph);
136 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
137 DiagramResource DIA = DiagramResource.getInstance(graph);
138 Resource vertex = graph.newResource();
139 graph.claim(vertex, L0.InstanceOf, DN.Vertex);
140 graph.claimLiteral(vertex, DIA.HasLocation, coords);
141 graph.claimLiteral(vertex, DN.Vertex_HasElevation, elevation, Bindings.DOUBLE);
143 graph.claim(vertex, DN.HasMapping, null, mapping);
145 OrderedSetUtils.add(graph, composite, vertex);
146 graph.claim(composite, L0.ConsistsOf, L0.PartOf, vertex);
148 claimFreshElementName(graph, composite, vertex);
150 // We need to put GraphLayer to newLayers so...
151 for (Resource layer : graph.getObjects(composite, DiagramResource.getInstance(graph).HasLayer)) {
152 IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class);
154 GraphLayer gl = layerUtil.loadLayer(graph, layer);
155 gl.forEachTag(tag -> {
156 DiagramGraphUtil.tag(graph, vertex, tag, true);
163 public static Resource joinVertices(WriteGraph graph, Collection<Resource> vertices) throws DatabaseException {
164 if (vertices.isEmpty())
165 throw new IllegalArgumentException("vertices-collection should not be empty for joining vertices!");
166 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
167 Iterator<Resource> verticeIterator = vertices.iterator();
168 Resource master = verticeIterator.next();
169 while (verticeIterator.hasNext()) {
170 Resource slave = verticeIterator.next();
171 Resource composite = graph.getSingleObject(slave, Layer0.getInstance(graph).PartOf);
172 Collection<Resource> startVertexEdges = graph.getObjects(slave, DN.HasStartVertex_Inverse);
173 for (Resource startVertexEdge : startVertexEdges) {
174 graph.deny(startVertexEdge, DN.HasStartVertex);
175 graph.claim(startVertexEdge, DN.HasStartVertex, master);
177 Collection<Resource> endVertexEdges = graph.getObjects(slave, DN.HasEndVertex_Inverse);
178 for (Resource endVertexEdge : endVertexEdges) {
179 graph.deny(endVertexEdge, DN.HasEndVertex);
180 graph.claim(endVertexEdge, DN.HasEndVertex, master);
182 OrderedSetUtils.remove(graph, composite, slave);
183 // Remove ConsistsOf statement
184 graph.deny(composite, Layer0.getInstance(graph).ConsistsOf, slave);
189 public static double calculateDistance(ReadGraph graph, Resource startVertex, Resource endVertex) throws DatabaseException {
190 Layer0 L0 = Layer0.getInstance(graph);
191 Resource startComposite = graph.getSingleObject(startVertex, L0.PartOf);
192 Resource endComposite = graph.getSingleObject(endVertex, L0.PartOf);
193 if (!startComposite.equalsResource(endComposite)) {
194 throw new DatabaseException("Can not calculate distance between vertices on different composites! " + startVertex + " -> " + endVertex);
196 Resource crs = graph.getSingleObject(startComposite, DistrictNetworkResource.getInstance(graph).HasSpatialRefSystem);
198 CRS crsClass = graph.adapt(crs, CRS.class);
200 double[] startCoords = graph.getRelatedValue2(startVertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY);
201 double[] endCoords = graph.getRelatedValue2(endVertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY);
203 return crsClass.calculateDistance(startCoords, endCoords);
206 public static final String claimFreshElementName(WriteGraph graph, Resource diagram, Resource element) throws DatabaseException {
207 Layer0 L0 = Layer0.getInstance(graph);
208 DiagramResource DIA = DiagramResource.getInstance(graph);
209 // Get name prefix from diagram
210 String namePrefix = graph.getPossibleRelatedValue2(diagram, Layer0X.getInstance(graph).HasGeneratedNamePrefix);
211 if (namePrefix == null)
213 // Give running name to element and increment the counter attached to the diagram.
214 Long l = graph.getPossibleRelatedValue(diagram, DIA.HasModCount, Bindings.LONG);
216 l = Long.valueOf(0L);
217 String name = namePrefix + l.toString();
218 graph.claimLiteral(element, L0.HasName, name, Bindings.STRING);
219 graph.claimLiteral(diagram, DIA.HasModCount, ++l, Bindings.LONG);
223 public static Resource getDiagramElement(ReadGraph graph, Resource component) throws DatabaseException {
224 if (component == null)
226 DiagramResource DIA = DiagramResource.getInstance(graph);
227 if (graph.isInstanceOf(component, DIA.Element))
229 ModelingResources MOD = ModelingResources.getInstance(graph);
230 Resource element = graph.getPossibleObject(component, MOD.ComponentToElement);
231 return element != null && graph.isInstanceOf(element, DIA.Element) ? element : null;
234 public static Resource getMappedElement(ReadGraph graph, Resource element) throws DatabaseException {
237 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
238 return graph.getPossibleObject(element, DN.MappedComponent);
241 public static Resource getMappedComponent(ReadGraph graph, Resource element) throws DatabaseException {
244 Resource mappedElement = getMappedElement(graph, element);
245 if (mappedElement == null)
247 ModelingResources MOD = ModelingResources.getInstance(graph);
248 return graph.getPossibleObject(mappedElement, MOD.ElementToComponent);
251 public static Resource getMappedComponentCached(ReadGraph graph, Resource vertex) throws DatabaseException {
252 return graph.syncRequest(new MappedComponentRequest(vertex), TransientCacheListener.instance());
255 public static Resource getMappedDNElement(ReadGraph graph, Resource element) throws DatabaseException {
258 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
259 return graph.getPossibleObject(element, DN.MappedFromElement);
262 public static Variable toMappedConfigurationModule(ReadGraph graph, Resource input) throws DatabaseException {
266 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
267 if (graph.isInstanceOf(input, DN.Element)) {
268 Resource mappedElement = getMappedElement(graph, input);
269 if (mappedElement == null)
272 ModelingResources MOD = ModelingResources.getInstance(graph);
273 Resource mappedComponent = graph.getPossibleObject(mappedElement, MOD.ElementToComponent);
274 if (mappedComponent == null)
277 return graph.syncRequest(new PossibleVariable(mappedComponent));
282 public static void toggleDrawMap(WriteGraph graph, Resource diagram) throws ManyObjectsForFunctionalRelationException, BindingException, ServiceException {
283 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
284 Boolean current = graph.getPossibleRelatedValue(diagram, DN.Diagram_drawMapEnabled, Bindings.BOOLEAN);
287 graph.claimLiteral(diagram, DN.Diagram_drawMapEnabled, !current, Bindings.BOOLEAN);
290 public static Boolean drawMapEnabled(ReadGraph graph, Resource diagram) throws ManyObjectsForFunctionalRelationException, BindingException, ServiceException {
291 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
292 Boolean current = graph.getPossibleRelatedValue(diagram, DN.Diagram_drawMapEnabled, Bindings.BOOLEAN);
293 return current != null ? current : true;
296 public static void changeMapBackgroundColor(WriteGraph graph, Resource diagram, Integer integer) throws DatabaseException {
297 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
298 graph.claimLiteral(diagram, DN.Diagram_backgroundColor, integer, Bindings.getBindingUnchecked(RGB.Integer.class));
301 public static Boolean trackChangesEnabled(ReadGraph graph, Resource diagram) throws DatabaseException {
302 if (diagram != null && graph.hasStatement(diagram)) {
303 return Boolean.TRUE.equals(graph.getPossibleRelatedValue(diagram,
304 DistrictNetworkResource.getInstance(graph).Diagram_trackChangesEnabled));
310 public static RGB.Integer backgroundColor(ReadGraph graph, Resource diagram) throws DatabaseException {
311 return graph.getPossibleRelatedValue(diagram,
312 DistrictNetworkResource.getInstance(graph).Diagram_backgroundColor,
313 Bindings.getBindingUnchecked(RGB.Integer.class));
316 public static Resource createNetworkDiagram(WriteGraph graph, Resource target, Resource compositeType, String defaultName, Resource defaultEdgeMapping, Resource defaultVertexMapping, Resource rightClickVertexMapping, Resource leftClickVertexMapping, Resource crs) throws DatabaseException {
317 Resource composite = NewCompositeActionFactory.createComposite(graph, target, defaultName, compositeType);
319 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
320 Resource diagram = graph.getSingleObject(composite, ModelingResources.getInstance(graph).CompositeToDiagram);
321 graph.claim(diagram, DN.EdgeDefaultMapping, defaultEdgeMapping);
322 graph.claim(diagram, DN.VertexDefaultMapping, defaultVertexMapping);
323 graph.claim(diagram, DN.RightClickDefaultMapping, rightClickVertexMapping);
324 graph.claim(diagram, DN.LeftClickDefaultMapping, leftClickVertexMapping);
325 graph.claim(diagram, DN.HasSpatialRefSystem, crs);
327 // Generated name prefix from composite name
328 String compositeName = graph.getRelatedValue2(composite, Layer0.getInstance(graph).HasName, Bindings.STRING);
329 graph.claimLiteral(diagram, Layer0X.getInstance(graph).HasGeneratedNamePrefix, "N" + compositeName.substring(compositeName.length() - 1, compositeName.length()));
334 public static final class MappedComponentRequest extends ResourceRead<Resource> {
335 public MappedComponentRequest(Resource element) {
340 public Resource perform(ReadGraph graph) throws DatabaseException {
341 return getMappedComponent(graph, resource);
345 public static class ResourceVertex {
347 public final boolean isConsumer;
348 public final Resource vertex;
349 public final double[] coords;
351 public ResourceVertex(Resource vertex, double[] coords, boolean isConsumer) {
352 this.vertex = vertex;
353 this.coords = coords;
354 this.isConsumer = isConsumer;
358 public static void changeMappingType(WriteGraph graph, Resource newMapping, List<Resource> elements) throws DatabaseException {
359 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
360 for (Resource element : elements) {
361 graph.deny(element, DN.HasMapping);
362 graph.claim(element, DN.HasMapping, newMapping);
366 public static Stream<Resource> findDNElementsById(ReadGraph graph, Resource context, String idToFind) throws DatabaseException {
367 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
368 return IndexUtils.findByType(graph,
369 graph.syncRequest(new IndexRoot(context)),
371 ).stream().filter(element -> {
373 String id = graph.getPossibleRelatedValue(element, DN.HasId, Bindings.STRING);
374 return id != null && id.contains(idToFind);
375 } catch (DatabaseException e) {
376 LOGGER.error("Could not read id for element {]", element, e);
382 public static Resource findDNElementById(ReadGraph graph, Resource context, String idToFind) throws DatabaseException {
383 List<Resource> elements = findDNElementsById(graph, context, idToFind).collect(Collectors.toList());
384 if (elements.size() == 1) {
385 return elements.iterator().next();
390 public static List<Resource> findDNElementByXYCoordinates(ReadGraph graph, Resource context, double lat, double lon, double padding) throws DatabaseException {
391 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
392 DiagramResource DIA = DiagramResource.getInstance(graph);
393 List<Resource> results = new ArrayList<>();
394 Collection<Resource> vertices = IndexUtils.findByType(graph, graph.syncRequest(new IndexRoot(context)), DN.Vertex);
395 Rectangle2D rect = new Rectangle2D.Double(lat, lon, padding, padding);
396 for (Resource vertex : vertices) {
397 double[] location = graph.getRelatedValue(vertex, DIA.HasLocation, Bindings.DOUBLE_ARRAY);
398 if (rect.contains(location[0], location[1])) {
405 public static ColorBarOptions colorBarOptions(ReadGraph graph, Resource visualisation) throws DatabaseException {
406 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
407 if (visualisation != null) {
408 String colorBarLocation = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ColorBarLocation, Bindings.STRING);
409 String colorBarSize = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ColorBarSize, Bindings.STRING);
410 Boolean show = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowColorBars, Bindings.BOOLEAN);
411 Boolean showTicks = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowColorBarTicks, Bindings.BOOLEAN);
412 if (colorBarLocation != null) {
413 return new ColorBarOptions()
414 .showColorBars(show != null ? show : false)
415 .showColorBarsTicks(showTicks != null ? showTicks : false)
416 .withLocation(ColorBarsLocation.valueOf(colorBarLocation))
417 .withSize(ColorBarsSize.valueOf(colorBarSize));
420 return ColorBarOptions.useDefault();
423 public static void setColorBarOptions(WriteGraph graph, Resource visualisation, ColorBarOptions options) throws DatabaseException {
424 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
425 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ColorBarLocation, options.getLocation().toString(), Bindings.STRING);
426 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ColorBarSize, options.getSize().toString(), Bindings.STRING);
427 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowColorBars, options.isShowColorBars(), Bindings.BOOLEAN);
428 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowColorBarTicks, options.isShowColorBarsTicks(), Bindings.BOOLEAN);
431 public static Resource createVisualisation(WriteGraph graph, Resource diagram, String visualisationName) throws DatabaseException {
432 Layer0 L0 = Layer0.getInstance(graph);
433 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
434 Resource visualisation = graph.newResource();
435 graph.claim(visualisation, L0.InstanceOf, DN.Diagram_Visualisations);
436 graph.claimLiteral(visualisation, L0.HasName, visualisationName);
437 graph.claim(diagram, DN.Diagram_hasVisualisation, visualisation);
438 return visualisation;
441 public static SizeBarOptions sizeBarOptions(ReadGraph graph, Resource visualisation) throws DatabaseException {
442 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
443 if (visualisation != null) {
444 String sizeBarLocation = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_SizeBarLocation, Bindings.STRING);
445 String sizeBarSize = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_SizeBarSize, Bindings.STRING);
446 Boolean show = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowSizeBars, Bindings.BOOLEAN);
447 Boolean showTicks = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowSizeBarTicks, Bindings.BOOLEAN);
448 if (sizeBarLocation != null) {
449 return new SizeBarOptions()
450 .showSizeBars(show != null ? show : false)
451 .showSizeBarsTicks(showTicks != null ? showTicks : false)
452 .withLocation(SizeBarsLocation.valueOf(sizeBarLocation))
453 .withSize(SizeBarsSize.valueOf(sizeBarSize));
456 return SizeBarOptions.useDefault();
459 public static void setSizeBarOptions(WriteGraph graph, Resource visualisation, SizeBarOptions options) throws DatabaseException {
460 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
461 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_SizeBarLocation, options.getLocation().toString(), Bindings.STRING);
462 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_SizeBarSize, options.getSize().toString(), Bindings.STRING);
463 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowSizeBars, options.isShowSizeBars(), Bindings.BOOLEAN);
464 graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowSizeBarTicks, options.isShowSizeBarsTicks(), Bindings.BOOLEAN);
467 public static Map<String, DynamicColorContribution> colorContributions(ReadGraph graph, Resource visualisation) throws DatabaseException {
468 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
469 if (visualisation == null) {
470 return Collections.emptyMap();
472 Map<String, DynamicColorContribution> contributions = new HashMap<>();
474 Map<String, DynamicColorMap> colorMaps = DynamicVisualisationsContributions.dynamicColorMaps(graph);
476 Collection<Resource> colorContributions = graph.getObjects(visualisation, DN.Diagram_Visualisations_colorContributions);
477 for (Resource colorContribution : colorContributions) {
478 String ucName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionContributorName, Bindings.STRING);
479 String label = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionLabel, Bindings.STRING);
480 String moduleName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionModuleName, Bindings.STRING);
481 String attributeName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionModuleAttribute, Bindings.STRING);
482 String unit = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionUnit, Bindings.STRING);
483 Double variableGain = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionVariableGain, Bindings.DOUBLE);
484 Double variableBias = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionVariableBias, Bindings.DOUBLE);
485 String dynamicColorMap = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultColorMap, Bindings.STRING);
486 Double defaultMin = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMin, Bindings.DOUBLE);
487 Double defaultMax = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMax, Bindings.DOUBLE);
488 Boolean used = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionUsed, Bindings.BOOLEAN);
489 Boolean useDefault = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionUseDefault, Bindings.BOOLEAN);
490 DynamicColorContribution dynamicColorContribution = new DynamicColorContribution(label, moduleName, attributeName, unit, variableGain, variableBias, colorMaps.get(dynamicColorMap), defaultMin, defaultMax);
491 dynamicColorContribution.setUsed(used != null ? used : false);
492 dynamicColorContribution.setUseDefault(useDefault != null ? useDefault : false);
493 contributions.put(ucName, dynamicColorContribution);
495 return contributions;
498 public static void setColorContributions(WriteGraph graph, Resource visualisation, List<Pair<String, DynamicColorContribution>> collect) throws DatabaseException {
499 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
500 Layer0 L0 = Layer0.getInstance(graph);
502 graph.deny(visualisation, DN.Diagram_Visualisations_colorContributions);
503 for (Pair<String, DynamicColorContribution> coll : collect) {
504 Resource colorContribution = graph.newResource();
505 graph.claim(colorContribution, L0.InstanceOf, DN.Diagram_Visualisations_ColorContribution);
506 graph.claimLiteral(colorContribution, L0.HasName, coll.first);
508 DynamicColorContribution contr = coll.second;
509 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionContributorName, coll.first);
510 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionLabel, contr.getLabel());
511 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionModuleName, contr.getModuleName());
512 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionModuleAttribute, contr.getAttributeName());
513 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionUnit, contr.getUnit());
514 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionVariableGain, contr.getVariableGain());
515 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionVariableBias, contr.getVariableBias());
516 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultColorMap, contr.getDefaultColorMap().getLabel());
517 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMin, contr.getDefaultMin());
518 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMax, contr.getDefaultMax());
519 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionUsed, contr.isUsed());
520 graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionUseDefault, contr.isUseDefault());
522 graph.claim(visualisation, DN.Diagram_Visualisations_colorContributions, colorContribution);
526 public static Map<String, DynamicSizeContribution> sizeContributions(ReadGraph graph, Resource visualisation) throws DatabaseException {
527 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
528 if (visualisation == null) {
529 return Collections.emptyMap();
531 Map<String, DynamicSizeContribution> contributions = new HashMap<>();
533 Map<String, DynamicSizeMap> sizeMaps = DynamicVisualisationsContributions.dynamicSizeMaps(graph);
535 Collection<Resource> colorContributions = graph.getObjects(visualisation, DN.Diagram_Visualisations_sizeContributions);
536 for (Resource colorContribution : colorContributions) {
537 String ucName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionContributorName, Bindings.STRING);
538 String label = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionLabel, Bindings.STRING);
539 String moduleName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionModuleName, Bindings.STRING);
540 String attributeName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionModuleAttribute, Bindings.STRING);
541 String unit = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionUnit, Bindings.STRING);
542 Double variableGain = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionVariableGain, Bindings.DOUBLE);
543 Double variableBias = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionVariableBias, Bindings.DOUBLE);
544 String dynamicSizeMap = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionDefaultSizeMap, Bindings.STRING);
545 Double defaultMin = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionDefaultMin, Bindings.DOUBLE);
546 Double defaultMax = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionDefaultMax, Bindings.DOUBLE);
547 Boolean used = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionUsed, Bindings.BOOLEAN);
548 Boolean useDefault = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_sizeContributionUseDefault, Bindings.BOOLEAN);
549 DynamicSizeContribution dsc = new DynamicSizeContribution(label, moduleName, attributeName, unit, variableGain, variableBias, sizeMaps.get(dynamicSizeMap), defaultMin, defaultMax);
550 dsc.setUsed(used != null ? used : false);
551 dsc.setUseDefault(useDefault != null ? useDefault : false);
552 contributions.put(ucName, dsc);
554 return contributions;
557 public static void setSizeContributions(WriteGraph graph, Resource visualisation, List<Pair<String, DynamicSizeContribution>> collect) throws DatabaseException {
558 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
559 Layer0 L0 = Layer0.getInstance(graph);
561 graph.deny(visualisation, DN.Diagram_Visualisations_sizeContributions);
562 for (Pair<String, DynamicSizeContribution> coll : collect) {
563 Resource sizeContribution = graph.newResource();
564 graph.claim(sizeContribution, L0.InstanceOf, DN.Diagram_Visualisations_SizeContribution);
565 graph.claimLiteral(sizeContribution, L0.HasName, coll.first);
567 DynamicSizeContribution contr = coll.second;
568 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionContributorName, coll.first);
569 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionLabel, contr.getLabel());
570 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionModuleName, contr.getModuleName());
571 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionModuleAttribute, contr.getAttributeName());
572 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionUnit, contr.getUnit());
573 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionVariableGain, contr.getVariableGain());
574 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionVariableBias, contr.getVariableBias());
575 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultSizeMap, contr.getDefaultSizeMap().getLabel());
576 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultMin, contr.getDefaultMin());
577 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultMax, contr.getDefaultMax());
578 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionUsed, contr.isUsed());
579 graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionUseDefault, contr.isUseDefault());
581 graph.claim(visualisation, DN.Diagram_Visualisations_sizeContributions, sizeContribution);
585 public static void setActiveVisualisation(WriteGraph graph, Resource diagram, Resource visualisationTemplate) throws DatabaseException {
586 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
587 graph.deny(diagram, DN.Diagram_hasActiveVisualisation);
588 graph.claim(diagram, DN.Diagram_hasActiveVisualisation, visualisationTemplate);