From ac6ad8ff2b20a10e85e7b12c1af670500daebdd4 Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Mon, 30 Jul 2018 10:19:22 +0300 Subject: [PATCH 1/1] Stash for edge styling & import progress monitoring gitlab #2 Change-Id: I6f2b2349936641c9b4405335dc81bf7dbbce401c --- .../district/imports/ui/CSVImportWizard.java | 36 ++++++---- .../graph.tg | Bin 25552 -> 25809 bytes .../graph/DistrictNetwork.pgraph | 22 +++++++ .../ontology/DistrictNetworkResource.java | 6 ++ .../district/network/ui/DNEdgeBuilder.java | 62 +++++++++++------- .../network/ui/DistrictDiagramViewer.java | 10 +++ .../ui/DistrictPanZoomRotateHandler.java | 53 +++++++++++++++ .../DistrictNetworkEdgeElementFactory.java | 4 +- .../DistrictNetworkVertexElementFactory.java | 4 +- .../ui/nodes/DistrictNetworkEdgeNode.java | 18 ++++- .../ui/nodes/DistrictNetworkVertexNode.java | 22 +++++-- .../network/ui/nodes/NetworkDrawingNode.java | 4 +- .../ui/participants/DNTranslateMode.java | 6 +- .../META-INF/MANIFEST.MF | 3 +- org.simantics.district.network/adapters.xml | 11 ++++ .../scl/Simantics/District.scl | 5 ++ .../district/network/DistrictNetworkUtil.java | 17 ++++- 17 files changed, 229 insertions(+), 54 deletions(-) create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java diff --git a/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizard.java b/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizard.java index 80bf1447..76c30d98 100644 --- a/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizard.java +++ b/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizard.java @@ -2,6 +2,8 @@ package org.simantics.district.imports.ui; import java.lang.reflect.InvocationTargetException; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.apache.commons.csv.CSVRecord; @@ -23,13 +25,16 @@ import org.simantics.Simantics; import org.simantics.databoard.Bindings; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.exception.DatabaseException; import org.simantics.db.request.Write; +import org.simantics.diagram.stubs.DiagramResource; import org.simantics.district.imports.DistrictImportUtils; import org.simantics.district.network.DistrictNetworkUtil; import org.simantics.district.network.ontology.DistrictNetworkResource; import org.simantics.district.network.ui.DNEdgeBuilder; -import org.simantics.maps.MapScalingTransform; +import org.simantics.district.network.ui.DNEdgeBuilder.ResourceVertex; +import org.simantics.layer0.Layer0; import org.simantics.utils.ui.ExceptionUtils; public class CSVImportWizard extends Wizard implements IImportWizard { @@ -38,6 +43,7 @@ public class CSVImportWizard extends Wizard implements IImportWizard { public CSVImportWizard() { setWindowTitle("Import CSV data"); + setNeedsProgressMonitor(true); } @@ -56,12 +62,12 @@ public class CSVImportWizard extends Wizard implements IImportWizard { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - monitor.beginTask("Importing CSV", 1000); try { Path csvFile = model.getSource(); char delim = model.getDelimiter(); List rows = DistrictImportUtils.readRows(csvFile, delim, -1); + monitor.beginTask("Importing CSV", rows.size()); // Path wktFile = model.getWKTFile(); @@ -127,6 +133,13 @@ public class CSVImportWizard extends Wizard implements IImportWizard { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + Collection vertices = graph.syncRequest(new ObjectsWithType(model.getParentDiagram(), Layer0.getInstance(graph).ConsistsOf, DistrictNetworkResource.getInstance(graph).Vertex)); + List vv = new ArrayList<>(vertices.size()); + for (Resource vertex : vertices) { + double[] existingCoords = graph.getRelatedValue2(vertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); + vv.add(new ResourceVertex(vertex, existingCoords)); + } + for (int k = 1; k < rows.size(); k++) { CSVRecord row = rows.get(k); @@ -136,7 +149,7 @@ public class CSVImportWizard extends Wizard implements IImportWizard { if (model.isVertexImport()) { String xCoords = row.get(xCoordColumnIndex); String yCoords = row.get(yCoordColumnIndex); - double xCoord = - Double.parseDouble(xCoords); // make negative for now + double xCoord = Double.parseDouble(xCoords); double yCoord = Double.parseDouble(yCoords); double z = 0; @@ -159,9 +172,9 @@ public class CSVImportWizard extends Wizard implements IImportWizard { DirectPosition res = actualTransform.transform(sourcePos, targetPos); coords = res.getCoordinate(); } else { - coords = new double[] { xCoord / MapScalingTransform.getScaleX(), yCoord / MapScalingTransform.getScaleY() }; + coords = new double[] { xCoord, yCoord }; } - Resource vertex = DistrictNetworkUtil.createVertex(graph, model.getParentDiagram(), new double[] { coords[1], -coords[0]}, model.getComponentMappings().get(mappingValue)); + Resource vertex = DistrictNetworkUtil.createVertex(graph, model.getParentDiagram(), coords, model.getComponentMappings().get(mappingValue)); writeStringValue(graph, row, idColumn, vertex, DN.HasId); @@ -192,10 +205,10 @@ public class CSVImportWizard extends Wizard implements IImportWizard { String endXCoords = row.get(endXCoordColumnIndex); String endYCoords = row.get(endYCoordColumnIndex); - double startXCoord = - Double.parseDouble(startXCoords); // make negative + double startXCoord = Double.parseDouble(startXCoords); // make negative double startYCoord = Double.parseDouble(startYCoords); - double endXCoord = - Double.parseDouble(endXCoords); // make negative + double endXCoord = Double.parseDouble(endXCoords); // make negative double endYCoord = Double.parseDouble(endYCoords); double[] startCoords; @@ -211,11 +224,11 @@ public class CSVImportWizard extends Wizard implements IImportWizard { DirectPosition endRes = actualTransform.transform(endSourcePos, endTargetPos); endCoords = endRes.getCoordinate(); } else { - startCoords = new double[] { startXCoord / MapScalingTransform.getScaleX(), startYCoord / MapScalingTransform.getScaleY() }; - endCoords = new double[] { endXCoord / MapScalingTransform.getScaleX(), endYCoord / MapScalingTransform.getScaleY() }; + startCoords = new double[] { startXCoord , startYCoord }; + endCoords = new double[] { endXCoord , endYCoord }; } - - Resource edge = DNEdgeBuilder.create(graph, model.getParentDiagram(), model.getComponentMappings().get(mappingValue), new double[] { startCoords[1], -startCoords[0]}, new double[] { endCoords[1], -endCoords[0]}, padding); + + Resource edge = DNEdgeBuilder.create(graph, vv, model.getParentDiagram(), model.getComponentMappings().get(mappingValue), startCoords, endCoords, padding); writeStringValue(graph, row, idColumn, edge, DN.HasId); writeValue(graph, row, diameterColumnIndex, edge, DN.Edge_HasDiameter); @@ -229,6 +242,7 @@ public class CSVImportWizard extends Wizard implements IImportWizard { } catch (MismatchedDimensionException | TransformException | DatabaseException e) { throw new DatabaseException(e); } + monitor.worked(1); } } }); diff --git a/org.simantics.district.network.ontology/graph.tg b/org.simantics.district.network.ontology/graph.tg index be35590cce833b30baf3448c0490abb4740de784..2bda23f8d57b1aa466c0c304240c0d739b4338d0 100644 GIT binary patch literal 25809 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 Ay8r+H literal 25552 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 b%*qoFy>a)4E_w#T+^eacT6OQ(`OE(o2L5%2 diff --git a/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph b/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph index 75716c69..64dbb60f 100644 --- a/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph +++ b/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph @@ -354,6 +354,9 @@ DN.DistrictProfile : DIA.Profile DN.DistrictProfile.entry1 L0.HasLabel "Id" @DIA.groupStyleProfileEntry DN.ComponentIdStyle DN.Groups.ElementGroup + DN.DistrictProfile.entry2 + L0.HasLabel "Edge Node Styling" + @DIA.groupStyleProfileEntry DN.EdgeNodeStyle DN.Groups.ElementGroup DN.Groups : L0.Library @@ -375,3 +378,22 @@ DN.ComponentIdStyle : DIA.ResourceSCLTextGridStyle """ "String -> Variable -> (String, String, String)" @G2D.fontProperty DIA.TextElement.font "Arial" 30 G2D.FontStyle.normal_font_style + +//DN.EdgeNodeGroup : DIA.Group + +//DN.Profiles : L0.Library + +DN.EdgeNodeStyle : DIA.Style + +// Templates + +//groupStyleEntry : L0.Template +// @template %subject %style %group +// %subject : DIA.GroupStyleProfileEntry +// DIA.ProfileEntry.HasStyle %style +// DIA.ProfileEntry.HasGroup %group + + +//DN.Profiles.EdgeNodeStyle +// L0.HasLabel "Edge Node Style" +// @groupStyleEntry DN.EdgeNodeStyle DN.EdgeNodeGroup diff --git a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java index 32aabfa2..d1e9ebd1 100644 --- a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java +++ b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java @@ -25,11 +25,13 @@ public class DistrictNetworkResource { public final Resource DistrictProfile; public final Resource DistrictProfile_entry; public final Resource DistrictProfile_entry1; + public final Resource DistrictProfile_entry2; public final Resource EPSG_4326; public final Resource Edge; public final Resource EdgeDefaultMapping; public final Resource EdgeDefaultMapping_Inverse; public final Resource EdgeMappingParameterType; + public final Resource EdgeNodeStyle; public final Resource Edge_HasDiameter; public final Resource Edge_HasDiameter_Inverse; public final Resource Edge_HasFlowArea; @@ -214,11 +216,13 @@ public class DistrictNetworkResource { public static final String DistrictProfile = "http://www.simantics.org/DistrictNetwork-1.0/DistrictProfile"; public static final String DistrictProfile_entry = "http://www.simantics.org/DistrictNetwork-1.0/DistrictProfile/entry"; public static final String DistrictProfile_entry1 = "http://www.simantics.org/DistrictNetwork-1.0/DistrictProfile/entry1"; + public static final String DistrictProfile_entry2 = "http://www.simantics.org/DistrictNetwork-1.0/DistrictProfile/entry2"; public static final String EPSG_4326 = "http://www.simantics.org/DistrictNetwork-1.0/EPSG_4326"; public static final String Edge = "http://www.simantics.org/DistrictNetwork-1.0/Edge"; public static final String EdgeDefaultMapping = "http://www.simantics.org/DistrictNetwork-1.0/EdgeDefaultMapping"; public static final String EdgeDefaultMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/EdgeDefaultMapping/Inverse"; public static final String EdgeMappingParameterType = "http://www.simantics.org/DistrictNetwork-1.0/EdgeMappingParameterType"; + public static final String EdgeNodeStyle = "http://www.simantics.org/DistrictNetwork-1.0/EdgeNodeStyle"; public static final String Edge_HasDiameter = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasDiameter"; public static final String Edge_HasDiameter_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasDiameter/Inverse"; public static final String Edge_HasFlowArea = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasFlowArea"; @@ -413,11 +417,13 @@ public class DistrictNetworkResource { DistrictProfile = getResourceOrNull(graph, URIs.DistrictProfile); DistrictProfile_entry = getResourceOrNull(graph, URIs.DistrictProfile_entry); DistrictProfile_entry1 = getResourceOrNull(graph, URIs.DistrictProfile_entry1); + DistrictProfile_entry2 = getResourceOrNull(graph, URIs.DistrictProfile_entry2); EPSG_4326 = getResourceOrNull(graph, URIs.EPSG_4326); Edge = getResourceOrNull(graph, URIs.Edge); EdgeDefaultMapping = getResourceOrNull(graph, URIs.EdgeDefaultMapping); EdgeDefaultMapping_Inverse = getResourceOrNull(graph, URIs.EdgeDefaultMapping_Inverse); EdgeMappingParameterType = getResourceOrNull(graph, URIs.EdgeMappingParameterType); + EdgeNodeStyle = getResourceOrNull(graph, URIs.EdgeNodeStyle); Edge_HasDiameter = getResourceOrNull(graph, URIs.Edge_HasDiameter); Edge_HasDiameter_Inverse = getResourceOrNull(graph, URIs.Edge_HasDiameter_Inverse); Edge_HasFlowArea = getResourceOrNull(graph, URIs.Edge_HasFlowArea); diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNEdgeBuilder.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNEdgeBuilder.java index c2238d8e..0270fea0 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNEdgeBuilder.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNEdgeBuilder.java @@ -1,7 +1,9 @@ package org.simantics.district.network.ui; import java.awt.geom.Rectangle2D; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import org.simantics.databoard.Bindings; import org.simantics.db.Resource; @@ -37,10 +39,16 @@ public class DNEdgeBuilder { } public static Resource create(WriteGraph graph, Resource diagramResource, double[] start, double[] end, double padding) throws DatabaseException { - return create(graph, diagramResource, null, start, end, padding); + Collection vertices = graph.syncRequest(new ObjectsWithType(diagramResource, Layer0.getInstance(graph).ConsistsOf, DistrictNetworkResource.getInstance(graph).Vertex)); + List vv = new ArrayList<>(vertices.size()); + for (Resource vertex : vertices) { + double[] existingCoords = graph.getRelatedValue2(vertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); + vv.add(new ResourceVertex(vertex, existingCoords)); + } + return create(graph, vv, diagramResource, null, start, end, padding); } - public static Resource create(WriteGraph graph, Resource diagramResource, Resource mapping, double[] start, double[] end, double padding) throws DatabaseException { + public static Resource create(WriteGraph graph, Collection vertices, Resource diagramResource, Resource mapping, double[] start, double[] end, double padding) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); @@ -48,24 +56,23 @@ public class DNEdgeBuilder { Resource edge = getOrCreateEdge(graph, diagramResource, mapping); // 2. Add vertices - Collection vertices = graph.syncRequest(new ObjectsWithType(diagramResource, Layer0.getInstance(graph).ConsistsOf, DistrictNetworkResource.getInstance(graph).Vertex)); - Resource startVertex = getOrCreateVertex(graph, diagramResource, vertices, start, padding); - Resource endVertex = getOrCreateVertex(graph, diagramResource, vertices, end, padding); + Resource startVertex = getOrCreateVertex(graph, diagramResource, vertices, start, padding, null); + Resource endVertex = getOrCreateVertex(graph, diagramResource, vertices, end, padding, startVertex); graph.claim(edge, DN.HasStartVertex, startVertex); graph.claim(edge, DN.HasEndVertex, endVertex); // We need to put GraphLayer to newLayers so... - for (Resource layer : graph.getObjects(diagramResource, DiagramResource.getInstance(graph).HasLayer)) { - IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class); - - GraphLayer gl = layerUtil.loadLayer(graph, layer); - gl.forEachTag(tag -> { - DiagramGraphUtil.tag(graph, startVertex, tag, true); - DiagramGraphUtil.tag(graph, endVertex, tag, true); - }); - } - +// for (Resource layer : graph.getObjects(diagramResource, DiagramResource.getInstance(graph).HasLayer)) { +// IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class); +// +// GraphLayer gl = layerUtil.loadLayer(graph, layer); +// gl.forEachTag(tag -> { +// DiagramGraphUtil.tag(graph, startVertex, tag, true); +// DiagramGraphUtil.tag(graph, endVertex, tag, true); +// }); +// } +// return edge; } public void create(WriteGraph graph, double[] start, double[] end, double padding) throws DatabaseException { @@ -85,23 +92,24 @@ public class DNEdgeBuilder { glm.putElementOnVisibleLayers(diagram, graph, res); } - private static Resource getOrCreateVertex(WriteGraph graph, Resource diagramResource, Collection vertices, double[] coords, double padding) throws DatabaseException { + private static Resource getOrCreateVertex(WriteGraph graph, Resource diagramResource, Collection vertices, double[] coords, double padding, Resource startVertex) throws DatabaseException { Resource vertex = null; double halfPadding = padding / 2; double maxDistance = Double.MAX_VALUE; - for (Resource vertx : vertices) { - double[] existingCoords = graph.getRelatedValue2(vertx, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); - Rectangle2D existing = new Rectangle2D.Double(existingCoords[0] - halfPadding, existingCoords[1] - halfPadding, padding, padding); + for (ResourceVertex vertx : vertices) { + Rectangle2D existing = new Rectangle2D.Double(vertx.coords[0] - halfPadding, vertx.coords[1] - halfPadding, padding, padding); Rectangle2D tobecreated = new Rectangle2D.Double(coords[0] - halfPadding, coords[1] - halfPadding, padding, padding); if (existing.intersects(tobecreated)) { - double dist = Math.sqrt((Math.pow(coords[0] - existingCoords[0], 2) + (Math.pow(coords[1] - existingCoords[1], 2)))); - if (dist <= maxDistance) { - vertex = vertx; + double dist = Math.sqrt((Math.pow(coords[0] - vertx.coords[0], 2) + (Math.pow(coords[1] - vertx.coords[1], 2)))); + if (dist <= maxDistance && !vertx.vertex.equals(startVertex)) { + vertex = vertx.vertex; + maxDistance = dist; } } } if (vertex == null) { vertex = DistrictNetworkUtil.createVertex(graph, diagramResource, coords); + vertices.add(new ResourceVertex(vertex, coords)); } return vertex; } @@ -110,4 +118,14 @@ public class DNEdgeBuilder { return DistrictNetworkUtil.createEdge(graph, diagramResource, mapping); } + public static class ResourceVertex { + + final Resource vertex; + final double[] coords; + + public ResourceVertex(Resource vertex, double[] coords) { + this.vertex = vertex; + this.coords = coords; + } + } } diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictDiagramViewer.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictDiagramViewer.java index 8187002b..9d07f037 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictDiagramViewer.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictDiagramViewer.java @@ -15,6 +15,7 @@ import org.simantics.g2d.participant.BackgroundPainter; import org.simantics.g2d.participant.GridPainter; import org.simantics.g2d.participant.PanZoomRotateHandler; import org.simantics.g2d.participant.RenderingQualityInteractor; +import org.simantics.g2d.participant.ZoomToAreaHandler; import org.simantics.maps.MapScalingTransform; import org.simantics.maps.eclipse.MapPainter; import org.simantics.modeling.ui.diagramEditor.DiagramViewer; @@ -58,4 +59,13 @@ public class DistrictDiagramViewer extends DiagramViewer { ctx.add(new MapRulerPainter()); ctx.add(new BackgroundPainter()); } + + protected void addViewManipulationParticipants(CanvasContext ctx) { + ctx.add(new DistrictPanZoomRotateHandler()); + //ctx.add(new MousePanZoomInteractor()); + //ctx.add(new MultitouchPanZoomRotateInteractor()); + // ctx.add( new OrientationRestorer() ); + ctx.add(new ZoomToAreaHandler()); + } + } diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java new file mode 100644 index 00000000..1a4f83d8 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java @@ -0,0 +1,53 @@ +package org.simantics.district.network.ui; + +import org.simantics.g2d.participant.PanZoomRotateHandler; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent; +import org.simantics.scenegraph.g2d.nodes.NavigationNode; + +public class DistrictPanZoomRotateHandler extends PanZoomRotateHandler { + + public DistrictPanZoomRotateHandler() { + } + + @Override + protected Class getNavigationNodeClass() { + return DistrictNavigationNode.class; + } + + public static class DistrictNavigationNode extends NavigationNode { + + private static final long serialVersionUID = 5452897272925816875L; + + @Override + public Double getZoomInLimit() { + return super.getZoomInLimit(); + } + + @Override + public Double getZoomOutLimit() { + return super.getZoomOutLimit(); + } + + @Override + public boolean mouseWheelMoved(MouseWheelMovedEvent me) { + if (navigationEnabled && zoomEnabled) { + double scroll = Math.min(0.9, -me.wheelRotation / 20.0); + double z = 1 - scroll; + double dx = (me.controlPosition.getX() - transform.getTranslateX()) / transform.getScaleX(); + double dy = (me.controlPosition.getY() - transform.getTranslateY()) / transform.getScaleY(); + dx = dx * (1 - z); + dy = dy * (1 - z); + double limitedScale = limitScaleFactor(z); + if (limitedScale != 1.0) { + translate(dx, dy); + scale(z, z); + transformChanged(); + dropQuality(); + repaint(); + } + } + return false; + } + + } +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkEdgeElementFactory.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkEdgeElementFactory.java index 36d57308..1003a9b2 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkEdgeElementFactory.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkEdgeElementFactory.java @@ -49,7 +49,9 @@ public class DistrictNetworkEdgeElementFactory extends SyncElementFactory { @Override public void load(ReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource edgeResource, IElement element) throws DatabaseException { - + if (!graph.hasStatement(edgeResource)) + return; // already deleted + Resource startVertex = graph.getSingleObject(edgeResource, DN.HasStartVertex); Resource endVertex = graph.getSingleObject(edgeResource, DN.HasEndVertex); diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkVertexElementFactory.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkVertexElementFactory.java index 431beb52..1fc38bf6 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkVertexElementFactory.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictNetworkVertexElementFactory.java @@ -45,7 +45,9 @@ public class DistrictNetworkVertexElementFactory extends SyncElementFactory { @Override public void load(ReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource vertexResource, IElement element) throws DatabaseException { - + if (!graph.hasStatement(vertexResource)) + return; // already deleted + double[] coords = graph.getRelatedValue(vertexResource, DIA.HasLocation); DistrictNetworkVertex vertex = new DistrictNetworkVertex(coords); diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java index 745f2a80..03080275 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java @@ -31,6 +31,8 @@ public class DistrictNetworkEdgeNode extends G2DNode { private Color color; + private Double stroke; + @Override public void init() { } @@ -61,7 +63,12 @@ public class DistrictNetworkEdgeNode extends G2DNode { g2d.setColor(color); if (STROKE != null) { if (scaleStroke && STROKE instanceof BasicStroke) { - BasicStroke bs = GeometryUtils.scaleStroke(STROKE, (float) (1.0 / GeometryUtils.getScale(g2d.getTransform()))); + double str; + if (stroke != null) + str = stroke; + else + str = 1.0; + BasicStroke bs = GeometryUtils.scaleStroke(STROKE, (float) (str / GeometryUtils.getScale(g2d.getTransform()))); g2d.setStroke(bs); } else { g2d.setStroke(STROKE); @@ -82,9 +89,9 @@ public class DistrictNetworkEdgeNode extends G2DNode { public static Path2D calculatePath(DistrictNetworkEdge edge) { // Convert to screen coordinates double startX = ModelledCRS.longitudeToX(edge.getStartPoint().getX()); - double startY = ModelledCRS.latitudeToY(edge.getStartPoint().getY()); + double startY = ModelledCRS.latitudeToY(-edge.getStartPoint().getY()); // Invert for Simantics double endX = ModelledCRS.longitudeToX(edge.getEndPoint().getX()); - double endY = ModelledCRS.latitudeToY(edge.getEndPoint().getY()); + double endY = ModelledCRS.latitudeToY(-edge.getEndPoint().getY());// Invert for Simantics // render Path2D path = new Path2D.Double(); @@ -126,4 +133,9 @@ public class DistrictNetworkEdgeNode extends G2DNode { return color; } + @PropertySetter(value = "stroke") + public void setStroke(Double stroke) { + this.stroke = stroke / 100; + } + } diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java index c566981e..99eb3cc1 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java @@ -24,10 +24,10 @@ public class DistrictNetworkVertexNode extends G2DNode { private static final long serialVersionUID = -2641639101400236719L; private DistrictNetworkVertex vertex; - private static final double left = -0.5; - private static final double top = -0.5; - private static final double width = 1; - private static final double height = 1; + private static final double left = -0.25; + private static final double top = -0.25; + private static final double width = 0.5; + private static final double height = 0.5; private static final Rectangle2D NORMAL = new Rectangle2D.Double(left, top, width, height); private static final Rectangle2D HOVERED = new Rectangle2D.Double(left * 3, top * 3, width * 3, height * 3); @@ -40,6 +40,8 @@ public class DistrictNetworkVertexNode extends G2DNode { private Rectangle2D bounds; + private Double strokee; + @Override public void init() { setZIndex(2); @@ -65,7 +67,11 @@ public class DistrictNetworkVertexNode extends G2DNode { double scaleRecip = 1; if (scaleStroke) { double scale = GeometryUtils.getScale(g2d.getTransform()); - + double str; + if (strokee != null) + str = strokee; + else + str = 1.0; //System.out.println("scale: " + scale); scaleRecip = 1.0 / scale; } @@ -131,7 +137,7 @@ public class DistrictNetworkVertexNode extends G2DNode { private static Point2D calculatePoint2D(DistrictNetworkVertex vertex) { Point2D point= vertex.getPoint(); double x = ModelledCRS.longitudeToX(point.getX()); - double y = ModelledCRS.latitudeToY(point.getY()); + double y = ModelledCRS.latitudeToY(-point.getY()); // Inverse because Simantics Diagram is inverted // Apply the scaling Point2D res = new Point2D.Double(x, y); @@ -162,4 +168,8 @@ public class DistrictNetworkVertexNode extends G2DNode { return color; } + @PropertySetter(value = "stroke") + public void setStroke(Double stroke) { + this.strokee = stroke / 10; + } } diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java index 1ccde2c7..aaf26a10 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java @@ -166,10 +166,10 @@ public class NetworkDrawingNode extends G2DNode { double scaleY = getTransform().getScaleY(); double scaleX = getTransform().getScaleX(); - double startLat = ModelledCRS.yToLatitude(start.getY() / scaleY); + double startLat = ModelledCRS.yToLatitude(-start.getY() / scaleY); double startLon = ModelledCRS.xToLongitude(start.getX() / scaleX); - double endLat = ModelledCRS.yToLatitude(end.getY() / scaleY); + double endLat = ModelledCRS.yToLatitude(-end.getY() / scaleY); double endLon = ModelledCRS.xToLongitude(end.getX() / scaleX); double[] startCoords = new double[] { startLon, startLat }; diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DNTranslateMode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DNTranslateMode.java index fda0fc71..fdc333b2 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DNTranslateMode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DNTranslateMode.java @@ -5,8 +5,6 @@ import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Collection; -import javax.xml.bind.DataBindingException; - import org.simantics.Simantics; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; @@ -55,7 +53,7 @@ public class DNTranslateMode extends TranslateMode { AffineTransform at = ElementUtils.getLocalTransform(e, new AffineTransform()); if (graph.isInstanceOf(res, DN.Vertex)) { - double lat = ModelledCRS.yToLatitude(y + (dy / at.getScaleY())); + double lat = ModelledCRS.yToLatitude(y + (-dy / at.getScaleY())); double lon = ModelledCRS.xToLongitude(x + (dx / at.getScaleX())); // write to db @@ -75,7 +73,7 @@ public class DNTranslateMode extends TranslateMode { CommentMetadata cm = graph.getMetadata(CommentMetadata.class); graph.addMetadata(cm.add("Translated " + transformed.size() + " " + (transformed.size() == 1 ? "element" : "elements") - + " by (" + dx + "," + dy + ") mm.")); + + " by (" + dx + "," + -dy + ") mm.")); } } }); diff --git a/org.simantics.district.network/META-INF/MANIFEST.MF b/org.simantics.district.network/META-INF/MANIFEST.MF index 47d74d8e..2d1fe771 100644 --- a/org.simantics.district.network/META-INF/MANIFEST.MF +++ b/org.simantics.district.network/META-INF/MANIFEST.MF @@ -12,5 +12,6 @@ Require-Bundle: org.simantics.db, org.simantics.db.layer0, org.simantics.district.maps, org.simantics.district.geotools;bundle-version="1.0.0", - org.simantics.diagram + org.simantics.diagram, + org.simantics.scenegraph.profile;bundle-version="1.0.0" Export-Package: org.simantics.district.network diff --git a/org.simantics.district.network/adapters.xml b/org.simantics.district.network/adapters.xml index 590741aa..adb325ce 100644 --- a/org.simantics.district.network/adapters.xml +++ b/org.simantics.district.network/adapters.xml @@ -8,4 +8,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/org.simantics.district.network/scl/Simantics/District.scl b/org.simantics.district.network/scl/Simantics/District.scl index c92cc4cc..6318d755 100644 --- a/org.simantics.district.network/scl/Simantics/District.scl +++ b/org.simantics.district.network/scl/Simantics/District.scl @@ -78,3 +78,8 @@ translateElement elem = do () else () () + +importJava "org.simantics.district.network.DistrictNetworkUtil" where + createVertex :: Resource -> Vector Double -> Resource -> Resource + createEdge :: Resource -> Resource -> Resource + diff --git a/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java b/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java index 165e6e96..40e8fc1d 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java +++ b/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java @@ -22,7 +22,7 @@ public class DistrictNetworkUtil { public static Resource createEdge(WriteGraph graph, Resource composite) throws DatabaseException { return createEdge(graph, composite, graph.getPossibleObject(composite, DistrictNetworkResource.getInstance(graph).EdgeDefaultMapping)); } - + public static Resource createEdge(WriteGraph graph, Resource composite, Resource mapping) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); @@ -39,14 +39,25 @@ public class DistrictNetworkUtil { graph.claim(composite, L0.ConsistsOf, L0.PartOf, edge); claimFreshElementName(graph, composite, edge); + + // We need to put GraphLayer to newLayers so... + for (Resource layer : graph.getObjects(composite, DiagramResource.getInstance(graph).HasLayer)) { + IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class); + + GraphLayer gl = layerUtil.loadLayer(graph, layer); + gl.forEachTag(tag -> { + DiagramGraphUtil.tag(graph, edge, tag, true); + }); + } + return edge; } - + public static Resource createVertex(WriteGraph graph, Resource composite, double[] coords) throws DatabaseException { Resource defaultVertexMapping = graph.getPossibleObject(composite, DistrictNetworkResource.getInstance(graph).VertexDefaultMapping); return createVertex(graph, composite, coords, defaultVertexMapping); } - + public static Resource createVertex(WriteGraph graph, Resource composite, double[] coords, Resource mapping) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); -- 2.45.2