]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java
First version of elevation server based on GeoTIFF files
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / NetworkDrawingNode.java
index 00728e894e5f64c398c57ec3e86b953bff5bd81c..6c13f90d254668444cf668ffc73ef2237df3ef84 100644 (file)
@@ -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;
@@ -29,6 +30,8 @@ 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<Point2D> 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()));
                 }