X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fnodes%2FNetworkDrawingNode.java;h=4d527c1a1c5fe038af161fafe706f668a133f267;hb=refs%2Fchanges%2F46%2F2946%2F3;hp=524bf7221e42133f76b0644130760af8fd43842a;hpb=0f88160c295af4ba04ce434bbe58ffea1d3d651d;p=simantics%2Fdistrict.git 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 524bf722..4d527c1a 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 @@ -11,6 +11,7 @@ import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.TimeUnit; import org.simantics.Simantics; import org.simantics.db.Resource; @@ -20,15 +21,17 @@ import org.simantics.db.exception.DatabaseException; import org.simantics.db.request.Write; import org.simantics.diagram.elements.DiagramNodeUtil; import org.simantics.diagram.ui.DiagramModelHints; +import org.simantics.district.network.DNEdgeBuilder; import org.simantics.district.network.DistrictNetworkUtil; import org.simantics.district.network.ModelledCRS; import org.simantics.district.network.ontology.DistrictNetworkResource; -import org.simantics.district.network.ui.DNEdgeBuilder; import org.simantics.district.network.ui.NetworkDrawingParticipant; import org.simantics.g2d.canvas.Hints; import org.simantics.g2d.canvas.ICanvasContext; import org.simantics.g2d.canvas.IToolMode; import org.simantics.g2d.diagram.IDiagram; +import org.simantics.maps.elevation.server.SingletonTiffTileInterface; +import org.simantics.maps.elevation.server.prefs.MapsElevationServerPreferences; import org.simantics.scenegraph.g2d.G2DNode; import org.simantics.scenegraph.g2d.events.EventTypes; import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent; @@ -38,9 +41,14 @@ import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent; import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent; import org.simantics.scenegraph.utils.GeometryUtils; import org.simantics.scenegraph.utils.NodeUtil; +import org.simantics.utils.threads.ThreadUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class NetworkDrawingNode extends G2DNode { + private static final Logger LOGGER = LoggerFactory.getLogger(NetworkDrawingNode.class); + static class DrawingNode { private List routeNodes = new ArrayList<>(); @@ -55,8 +63,6 @@ public class NetworkDrawingNode extends G2DNode { private Resource diagramResource; - private boolean committed; - private NetworkDrawingParticipant participant; private IDiagram diagram; @@ -67,6 +73,7 @@ public class NetworkDrawingNode extends G2DNode { 4.0f, new float[]{4.0f}, 0.0f); private static final Color BLUE_ALPHA = new Color(0, 0, 255, 100); + private static final Color RED_ALPHA = new Color(255, 0, 0, 100); private boolean scaleStroke = true; @@ -123,8 +130,13 @@ public class NetworkDrawingNode extends G2DNode { } g2d.setColor(BLUE_ALPHA); - g2d.draw(path); + + g2d.setColor(RED_ALPHA); + BasicStroke stroke = GeometryUtils.scaleStroke(DASHED_STROKE, (float) (1.0 / GeometryUtils.getScale(g2d.getTransform()))); + g2d.setStroke(stroke); + Point2D currentPoint = path.getCurrentPoint(); + g2d.draw(new Rectangle2D.Double(currentPoint.getX() - 0.0001 / 2, currentPoint.getY() - 0.0001 / 2, 0.0001, 0.0001)); } g2d.setStroke(oldStroke); @@ -159,15 +171,39 @@ public class NetworkDrawingNode extends G2DNode { double scale = getTransform().getScaleY(); double x = ModelledCRS.xToLongitude(pos.getX() / scale); double y = ModelledCRS.yToLatitude(-pos.getY() / scale); - Simantics.getSession().asyncRequest(new Write() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - graph.markUndoPoint(); - Resource defaultMapping = graph.getSingleObject(diagramResource, DistrictNetworkResource.getInstance(graph).VertexDefaultMapping); - DistrictNetworkUtil.createVertex(graph, diagramResource, new double[] { x, y }, 0, defaultMapping); // TODO: elevation can be fetched from e.g. elevation API + + double elevation = 0; + if (MapsElevationServerPreferences.useElevationServer()) { + // ok! we use new elevation API to resolve possible elevations for the starting points + try { + elevation = SingletonTiffTileInterface.lookup(x, y).doubleValue(); + } catch (Exception ee) { + LOGGER.error("Could not get elevation from tiff interface", ee); } - }); + } + final double felevation = elevation; + + boolean leftButton = e.button == MouseEvent.LEFT_BUTTON; + + ThreadUtils.getNonBlockingWorkExecutor().schedule(() -> { + Simantics.getSession().asyncRequest(new Write() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + graph.markUndoPoint(); + Resource mapping = null; + if (leftButton) { + mapping = graph.getSingleObject(diagramResource, DistrictNetworkResource.getInstance(graph).LeftClickDefaultMapping); + } else { + mapping = graph.getSingleObject(diagramResource, DistrictNetworkResource.getInstance(graph).RightClickDefaultMapping); + } + if (mapping == null) { + mapping = graph.getSingleObject(diagramResource, DistrictNetworkResource.getInstance(graph).VertexDefaultMapping); + } + DistrictNetworkUtil.createVertex(graph, diagramResource, new double[] { x, y }, felevation, mapping); + } + }); + }, 100, TimeUnit.MILLISECONDS); } repaint(); return true; @@ -216,15 +252,28 @@ public class NetworkDrawingNode extends G2DNode { detailedGeometryCoords[i++] = lat; } + double startElevation = 0; + double endElevation = 0; + if (MapsElevationServerPreferences.useElevationServer()) { + // ok! we use new elevation API to resolve possible elevations for the starting points + try { + startElevation = SingletonTiffTileInterface.lookup(startLat, startLon).doubleValue(); + endElevation = SingletonTiffTileInterface.lookup(endLat, endLon).doubleValue(); + } catch (Exception e) { + LOGGER.error("Could not get elevation from tiff interface", e); + } + } + final double se = startElevation; + final double ee = endElevation; DNEdgeBuilder builder = new DNEdgeBuilder(diagramResource, diagram); Simantics.getSession().asyncRequest(new WriteRequest() { - + @Override public void perform(WriteGraph graph) throws DatabaseException { - builder.create(graph, startCoords, 0, endCoords, 0, detailedGeometryCoords, padding); + builder.create(graph, startCoords, se, endCoords, ee, detailedGeometryCoords, padding); } }); - + } @Override @@ -232,10 +281,6 @@ public class NetworkDrawingNode extends G2DNode { // check ToolMode IToolMode mode = getToolMode(); if (mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) { - if (committed) { - committed = false; - return false; - } if (e.button == MouseEvent.RIGHT_BUTTON && !nodes.isEmpty()) { nodes.remove(nodes.size() - 1); } else if (e.button == MouseEvent.LEFT_BUTTON) { @@ -254,7 +299,6 @@ public class NetworkDrawingNode extends G2DNode { } currentRouteNode = null; nodes.clear(); - committed = true; } else if (currentRouteNode != null) { currentRouteNode.routeNodes.add(new Point2D.Double(localPos.getX(), localPos.getY())); } @@ -276,22 +320,21 @@ public class NetworkDrawingNode extends G2DNode { @Override protected boolean mouseMoved(MouseMovedEvent e) { IToolMode mode = getToolMode(); - if (mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) { - boolean repaint = false; - Point2D p = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double()); - if (participant.pickHoveredElement(p)) { - repaint = true; - } - if (!nodes.isEmpty()) { - currentMousePos = p; - - repaint(); - return true; - } - currentMousePos = null; - if (repaint == true) - repaint(); + boolean repaint = false; + Point2D p = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double()); + boolean isConnectionTool = mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK); + if (participant.pickHoveredElement(p, isConnectionTool)) { + repaint = true; + } + if (!nodes.isEmpty()) { + currentMousePos = p; + + repaint(); + return true; } + currentMousePos = null; + if (repaint == true) + repaint(); return super.mouseMoved(e); }