X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2FDistrictNetworkUtil.java;h=2bb29660930b82c9a30e010a118538fe73230c96;hb=adaf5cd394f4a08ea8e692377d24d2611c28f954;hp=0047057c0dca98a3f4b7243dde01c3595a0ba281;hpb=7b29ec0924722d1388606d54fc398afb5b32b8d4;p=simantics%2Fdistrict.git 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; + } + } }