From: jsimomaa Date: Sun, 26 Jan 2020 16:09:50 +0000 (+0200) Subject: Support searching nearby vertices in network diagram X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=adaf5cd394f4a08ea8e692377d24d2611c28f954;p=simantics%2Fdistrict.git Support searching nearby vertices in network diagram gitlab #75 Change-Id: I53e9230fd99abb29712c46fa7214cfcd628dee83 --- diff --git a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java index 083b58d5..cad063fd 100644 --- a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java +++ b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java @@ -29,24 +29,17 @@ import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; import org.simantics.Simantics; import org.simantics.databoard.Bindings; -import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; -import org.simantics.db.common.request.ObjectsWithType; -import org.simantics.db.common.request.UniqueRead; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.util.Layer0Utils; -import org.simantics.diagram.stubs.DiagramResource; import org.simantics.district.network.DNEdgeBuilder; import org.simantics.district.network.DistrictNetworkUtil; import org.simantics.district.network.ontology.DistrictNetworkResource; -import org.simantics.layer0.Layer0; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.simantics.district.network.DistrictNetworkUtil.ResourceVertex; -import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.index.quadtree.Quadtree; public class DistrictImportUtils { @@ -408,24 +401,7 @@ public class DistrictImportUtils { double halfPadding = padding / 2; - Quadtree vv = Simantics.getSession().syncRequest(new UniqueRead() { - - @Override - public Quadtree perform(ReadGraph graph) throws DatabaseException { - Collection vertices = graph.syncRequest(new ObjectsWithType(model.getParentDiagram(), Layer0.getInstance(graph).ConsistsOf, DistrictNetworkResource.getInstance(graph).Vertex)); - Quadtree vv = new Quadtree(); - for (Resource vertex : vertices) { - double[] coords = graph.getRelatedValue2(vertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); - double x1 = coords[0] - halfPadding; - double y1= coords[1] - halfPadding; - double x2 = coords[0] + halfPadding; - double y2= coords[1] + halfPadding; - Envelope e = new Envelope(x1, x2, y1, y2); - vv.insert(e, new ResourceVertex(vertex, coords, true)); - } - return vv; - } - }); + Quadtree existingVertices = DistrictNetworkUtil.existingVertices(model.getParentDiagram(), halfPadding); Simantics.getSession().syncRequest(new WriteRequest() { @@ -480,8 +456,8 @@ public class DistrictImportUtils { // Switch to (longitude, latitude) flipAxes(startCoords); flipAxes(endCoords); - - Optional oedge = DNEdgeBuilder.create(graph, vv, model.getParentDiagram(), model.getComponentMappings().get(mappingValue), startCoords, startZCoord, endCoords, endZCoord, new double[0], padding, true); + + Optional oedge = DNEdgeBuilder.create(graph, existingVertices, model.getParentDiagram(), model.getComponentMappings().get(mappingValue), startCoords, startZCoord, endCoords, endZCoord, new double[0], padding, true); if (oedge.isPresent()) { Resource edge = oedge.get(); diff --git a/org.simantics.district.network/scl/Simantics/District.scl b/org.simantics.district.network/scl/Simantics/District.scl index 0e79ef77..5eaa0576 100644 --- a/org.simantics.district.network/scl/Simantics/District.scl +++ b/org.simantics.district.network/scl/Simantics/District.scl @@ -8,6 +8,7 @@ import "MSet" as MSet importJava "org.simantics.district.network.DistrictNetworkUtil" where calculateDistance :: Resource -> Resource -> Double + nearbyVertices :: Resource -> Double -> [Resource] importJava "org.simantics.district.network.ModelledCRS" where xToLongitude :: Double -> Double 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 0047057c..2bb29660 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 @@ -8,6 +8,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.simantics.Simantics; import org.simantics.databoard.Bindings; import org.simantics.datatypes.literal.RGB; import org.simantics.datatypes.literal.RGB.Integer; @@ -15,7 +16,9 @@ import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.BinaryRead; import org.simantics.db.common.request.IndexRoot; +import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.request.ResourceRead; import org.simantics.db.common.utils.OrderedSetUtils; import org.simantics.db.exception.BindingException; @@ -39,6 +42,9 @@ import org.simantics.operation.Layer0X; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.index.quadtree.Quadtree; + public class DistrictNetworkUtil { private static final Logger LOGGER = LoggerFactory.getLogger(DistrictNetworkUtil.class); @@ -387,5 +393,77 @@ public class DistrictNetworkUtil { return results; } + public static List nearbyResourceVertices(ReadGraph graph, Resource diagramResource, Resource vertex, Double padding) throws DatabaseException { + double halfPadding = padding / 2; + + Quadtree existingVertices = graph.syncRequest(new ExistingVerticesRead(diagramResource, halfPadding), TransientCacheListener.instance()); + double[] coords = graph.getRelatedValue(vertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); + double x1 = coords[0] - halfPadding; + double y1= coords[1] - halfPadding; + double x2 = coords[0] + halfPadding; + double y2= coords[1] + halfPadding; + Envelope e = new Envelope(x1, x2, y1, y2); + + List result = existingVertices.query(e); + @SuppressWarnings("unchecked") + List vertices = (List) result; + + Rectangle2D vertexRectangle = new Rectangle2D.Double(coords[0] - halfPadding, coords[1] - halfPadding, padding, padding); + + // let's sort by distance + List sortedVertices = vertices.stream().filter(rv -> { + if (rv.vertex.equals(vertex)) + return false; + + Rectangle2D nearbyRectangle = new Rectangle2D.Double(rv.coords[0] - halfPadding, rv.coords[1] - halfPadding, padding, padding); + return vertexRectangle.intersects(nearbyRectangle); + }).sorted((o1, o2) -> { + double disto1 = Math.sqrt((Math.pow(coords[0] - o1.coords[0], 2) + (Math.pow(coords[1] - o1.coords[1], 2)))); + double disto2 = Math.sqrt((Math.pow(coords[0] - o2.coords[0], 2) + (Math.pow(coords[1] - o2.coords[1], 2)))); + + if (o1.vertex.getResourceId() == 2554883) { + System.err.println("here we are"); + } + + return Double.compare(disto1, disto2); + }).collect(Collectors.toList()); + return sortedVertices; + } + + public static List nearbyVertices(ReadGraph graph, Resource vertex, double padding) throws DatabaseException { + Resource diagramResource = graph.getSingleObject(vertex, Layer0.getInstance(graph).PartOf); + return nearbyResourceVertices(graph, diagramResource, vertex, padding) + .stream() + .map(rv -> rv.vertex) + .collect(Collectors.toList()); + } + + public static Quadtree existingVertices(Resource diagramResource, Double padding) throws DatabaseException { + Quadtree vv = Simantics.getSession().syncRequest(new ExistingVerticesRead(diagramResource, padding)); + return vv; + } + + public static class ExistingVerticesRead extends BinaryRead { + + public ExistingVerticesRead(Resource diagramResource, Double padding) { + super(diagramResource, padding); + } + + @Override + public Quadtree perform(ReadGraph graph) throws DatabaseException { + Collection vertices = graph.syncRequest(new ObjectsWithType(parameter, Layer0.getInstance(graph).ConsistsOf, DistrictNetworkResource.getInstance(graph).Vertex)); + Quadtree vv = new Quadtree(); + for (Resource vertex : vertices) { + double[] coords = graph.getRelatedValue2(vertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); + double x1 = coords[0] - parameter2; + double y1= coords[1] - parameter2; + double x2 = coords[0] + parameter2; + double y2= coords[1] + parameter2; + Envelope e = new Envelope(x1, x2, y1, y2); + vv.insert(e, new ResourceVertex(vertex, coords, true)); + } + return vv; + } + } }