]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java
Add support for setting pipeType from CSV import
[simantics/district.git] / org.simantics.district.imports / src / org / simantics / district / imports / DistrictImportUtils.java
index b3b997b3ef3303104382247a6842880782290355..836ebd02dd758e609ec4e12341acc348722ee720 100644 (file)
@@ -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 {
@@ -235,6 +228,7 @@ public class DistrictImportUtils {
         int xCoordColumnIndex = model.getXCoordIndex();
         int yCoordColumnIndex = model.getYCoordIndex();
         int zCoordColumnIndex = model.getZCoordIndex();
+        int altElevationIndex = model.getAlternativeElevationIndex();
         int supplyTempColumnIndex = model.getSupplyTempIndex();
         int returnTempColumnIndex = model.getReturnTempIndex();
         int supplyPressureColumnIndex = model.getSupplyPressureIndex();
@@ -242,6 +236,7 @@ public class DistrictImportUtils {
         int dpIndex = model.getDeltaPressureIndex();
         int dtIndex = model.getDeltaTemperatureIndex();
         int heatPowerIndex = model.getHeatPowerIndex();
+        int peakPowerIndex = model.getPeakPowerIndex();
         int valvePositionIndex = model.getValvePositionIndx();
         int nominalHeadMIndex = model.getNominalHeadMIndex();
         int nominalHeadBIndex = model.getNominalHeadBIndex();
@@ -254,6 +249,7 @@ public class DistrictImportUtils {
         int flowAreaIndex = model.getFlowAreaIndex();
         int nominalPressureLossIndex = model.getNominalPressureLossIndex();
         int addressIndex = model.getAddressIndex();
+        int regionIndex = model.getRegionIndex();
         
         int mappingColumn = model.getComponentMappingIndex();
         int idColumn = model.getIdIndex();
@@ -303,7 +299,7 @@ public class DistrictImportUtils {
                                     }
                                 }
                             }
-                
+                            
                             double[] coords;
                             if (actualDoTransform) {
                                 DirectPosition2D targetPos = new DirectPosition2D();
@@ -321,6 +317,8 @@ public class DistrictImportUtils {
                             
                             writeStringValue(graph, row, idColumn, vertex, DN.HasId);
                             
+                            writeValue(graph, row, altElevationIndex, vertex, DN.Vertex_HasAltElevation);
+                            
                             writeValue(graph, row, supplyTempColumnIndex, vertex, DN.Vertex_HasSupplyTemperature);
                             writeValue(graph, row, returnTempColumnIndex, vertex, DN.Vertex_HasReturnTemperature);
                             writeValue(graph, row, supplyPressureColumnIndex, vertex, DN.Vertex_HasSupplyPressure);
@@ -328,6 +326,7 @@ public class DistrictImportUtils {
                             writeValue(graph, row, dpIndex, vertex, DN.Vertex_HasDeltaPressure);
                             writeValue(graph, row, dtIndex, vertex, DN.Vertex_HasDeltaTemperature);
                             writeValue(graph, row, heatPowerIndex, vertex, DN.Vertex_HasHeatPower);
+                            writeValue(graph, row, peakPowerIndex, vertex, DN.Vertex_HasPeakPower);
                             writeValue(graph, row, valvePositionIndex, vertex, DN.Vertex_HasValvePosition);
                             writeValue(graph, row, nominalHeadMIndex, vertex, DN.Vertex_HasNominalHeadM);
                             writeValue(graph, row, nominalHeadBIndex, vertex, DN.Vertex_HasNominalHeadB);
@@ -340,6 +339,7 @@ public class DistrictImportUtils {
                             writeValue(graph, row, flowAreaIndex, vertex, DN.Vertex_HasFlowArea);
                             writeValue(graph, row, nominalPressureLossIndex, vertex, DN.Vertex_HasNominalPressureLoss);
                             writeStringValue(graph, row, addressIndex, vertex, DN.Vertex_HasAddress);
+                            writeStringValue(graph, row, regionIndex, vertex, DN.HasRegion);
                         } catch (DatabaseException | MismatchedDimensionException | TransformException e) {
                             throw new RuntimeException(e);
                         }
@@ -361,6 +361,7 @@ public class DistrictImportUtils {
         Path csvFile = model.getSource();
         char delim = model.getDelimiter();
 
+        Set<String> writtenIds = new HashSet<>();
         
         int startXCoordColumnIndex = model.getStartXCoordIndex();
         int startYCoordColumnIndex = model.getStartYCoordIndex();
@@ -377,6 +378,8 @@ public class DistrictImportUtils {
         int kSupplyIndex = model.getkSupplyIndex();
         int lengthIndex = model.getLengthIndex();
         int detailedGeometryIndex = model.getDetailedGeometryIndex();
+        int regionIndex = model.getRegionIndex();
+        int pipeTypeIndex = model.getPipeTypeIndex();
         
         int mappingColumn = model.getComponentMappingIndex();
         int idColumn = model.getIdIndex();
@@ -399,24 +402,7 @@ public class DistrictImportUtils {
         
         double halfPadding = padding / 2;
         
-        Quadtree vv = Simantics.getSession().syncRequest(new UniqueRead<Quadtree>() {
-
-            @Override
-            public Quadtree perform(ReadGraph graph) throws DatabaseException {
-                Collection<Resource> 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() {
             
@@ -430,60 +416,67 @@ public class DistrictImportUtils {
                     
                     DistrictImportUtils.consumeCSV(csvFile, delim, true, row -> {
                         try {
-                            String mappingValue = row.get(mappingColumn);
-                            
-                            String startXCoords = row.get(startXCoordColumnIndex);
-                            String startYCoords = row.get(startYCoordColumnIndex);
-                            String startZCoords = row.get(startZValueColumnIndex);
-                            String endXCoords = row.get(endXCoordColumnIndex);
-                            String endYCoords = row.get(endYCoordColumnIndex);
-                            String endZCoords = row.get(endZValueColumnIndex);
-                            
-                            double startXCoord = Double.parseDouble(startXCoords); // make negative
-                            double startYCoord = Double.parseDouble(startYCoords);
-                            double startZCoord = Double.parseDouble(startZCoords);
                             
-                            double endXCoord = Double.parseDouble(endXCoords); // make negative
-                            double endYCoord = Double.parseDouble(endYCoords);
-                            double endZCoord = Double.parseDouble(endZCoords);
-                            
-                            double[] startCoords;
-                            double[] endCoords;
-                            if (actualDoTransform) {
-                                DirectPosition2D startTargetPos = new DirectPosition2D();
-                                DirectPosition2D startSourcePos = new DirectPosition2D(startXCoord, startYCoord);
-                                DirectPosition startRes = actualTransform.transform(startSourcePos, startTargetPos);
-                                startCoords = startRes.getCoordinate();
+                            String idValue = row.get(idColumn);
+                            if (!writtenIds.contains(idValue)) {
+                                writtenIds.add(idValue);
+                                String mappingValue = row.get(mappingColumn);
                                 
-                                DirectPosition2D endTargetPos = new DirectPosition2D();
-                                DirectPosition2D endSourcePos = new DirectPosition2D(endXCoord, endYCoord);
-                                DirectPosition endRes = actualTransform.transform(endSourcePos, endTargetPos);
-                                endCoords = endRes.getCoordinate();
-                            } else {
-                                startCoords = new double[] { startXCoord , startYCoord };
-                                endCoords = new double[] { endXCoord , endYCoord };
-                            }
-                            
-                            // Switch to (longitude, latitude)
-                            flipAxes(startCoords);
-                            flipAxes(endCoords);
-                            
-                            Optional<Resource> oedge = DNEdgeBuilder.create(graph, vv, model.getParentDiagram(), model.getComponentMappings().get(mappingValue), startCoords, startZCoord, endCoords, endZCoord, new double[0], padding, true);
-                            if (oedge.isPresent()) {
-                                Resource edge = oedge.get();
-                                writeStringValue(graph, row, idColumn, edge, DN.HasId);
+                                String startXCoords = row.get(startXCoordColumnIndex);
+                                String startYCoords = row.get(startYCoordColumnIndex);
+                                String startZCoords = row.get(startZValueColumnIndex);
+                                String endXCoords = row.get(endXCoordColumnIndex);
+                                String endYCoords = row.get(endYCoordColumnIndex);
+                                String endZCoords = row.get(endZValueColumnIndex);
+                                
+                                double startXCoord = Double.parseDouble(startXCoords); // make negative
+                                double startYCoord = Double.parseDouble(startYCoords);
+                                double startZCoord = Double.parseDouble(startZCoords);
+                                
+                                double endXCoord = Double.parseDouble(endXCoords); // make negative
+                                double endYCoord = Double.parseDouble(endYCoords);
+                                double endZCoord = Double.parseDouble(endZCoords);
                                 
-                                writeValue(graph, row, diameterColumnIndex, edge, DN.Edge_HasDiameter);
-                                writeValue(graph, row, outerDiameterColumnIndex, edge, DN.Edge_HasOuterDiameter);
-                                writeValue(graph, row, nominalMassFlowIndex, edge, DN.Edge_HasNominalMassFlow);
-                                writeValue(graph, row, tGroundIndex, edge, DN.Edge_HasTGround);
-                                writeValue(graph, row, kReturnIndex, edge, DN.Edge_HasKReturn);
-                                writeValue(graph, row, kSupplyIndex, edge, DN.Edge_HasKSupply);
-                                writeValue(graph, row, edgeFlowAreaIndex, edge, DN.Edge_HasFlowArea);
-                                writeValue(graph, row, lengthIndex, edge, DN.Edge_HasLength);
-                                writeDoubleArrayFromString(graph, row, detailedGeometryIndex, edge, DN.Edge_HasGeometry, actualTransform);
+                                double[] startCoords;
+                                double[] endCoords;
+                                if (actualDoTransform) {
+                                    DirectPosition2D startTargetPos = new DirectPosition2D();
+                                    DirectPosition2D startSourcePos = new DirectPosition2D(startXCoord, startYCoord);
+                                    DirectPosition startRes = actualTransform.transform(startSourcePos, startTargetPos);
+                                    startCoords = startRes.getCoordinate();
+                                    
+                                    DirectPosition2D endTargetPos = new DirectPosition2D();
+                                    DirectPosition2D endSourcePos = new DirectPosition2D(endXCoord, endYCoord);
+                                    DirectPosition endRes = actualTransform.transform(endSourcePos, endTargetPos);
+                                    endCoords = endRes.getCoordinate();
+                                } else {
+                                    startCoords = new double[] { startXCoord , startYCoord };
+                                    endCoords = new double[] { endXCoord , endYCoord };
+                                }
+                                
+                                // Switch to (longitude, latitude)
+                                flipAxes(startCoords);
+                                flipAxes(endCoords);
+                                
+                                Optional<Resource> 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();
+                                    
+                                    writeStringValue(graph, row, idColumn, edge, DN.HasId);
+                                    
+                                    writeValue(graph, row, diameterColumnIndex, edge, DN.Edge_HasDiameter);
+                                    writeValue(graph, row, outerDiameterColumnIndex, edge, DN.Edge_HasOuterDiameter);
+                                    writeValue(graph, row, nominalMassFlowIndex, edge, DN.Edge_HasNominalMassFlow);
+                                    writeValue(graph, row, tGroundIndex, edge, DN.Edge_HasTGround);
+                                    writeValue(graph, row, kReturnIndex, edge, DN.Edge_HasKReturn);
+                                    writeValue(graph, row, kSupplyIndex, edge, DN.Edge_HasKSupply);
+                                    writeValue(graph, row, edgeFlowAreaIndex, edge, DN.Edge_HasFlowArea);
+                                    writeValue(graph, row, lengthIndex, edge, DN.Edge_HasLength);
+                                    writeStringValue(graph, row, regionIndex, edge, DN.HasRegion);
+                                    writeStringValue(graph, row, pipeTypeIndex, edge, DN.Edge_HasType);
+                                    writeDoubleArrayFromString(graph, row, detailedGeometryIndex, edge, DN.Edge_HasGeometry, actualTransform);
+                                }
                             }
-                            
                             return true;
                         } catch (DatabaseException | MismatchedDimensionException | TransformException e) {
                             throw new RuntimeException(e);
@@ -514,7 +507,8 @@ public class DistrictImportUtils {
                     }
                     graph.claimLiteral(subject, relation, Double.parseDouble(stringValue), Bindings.DOUBLE);
                 } catch (NumberFormatException e) {
-                    throw new DatabaseException(e);
+                    LOGGER.error("Could not parse {} {} {} {}", row, index, subject, relation, e);
+                    //throw new DatabaseException(e);
                 }
             }
         }