package org.simantics.district.imports;
import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
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 {
public static Map<String, Integer> readCSVHeader(Path source, CSVFormat format, boolean firstAsHeader) throws IOException {
if (firstAsHeader)
format = format.withFirstRecordAsHeader();
- try (CSVParser parser = format.parse(Files.newBufferedReader(source))) {
+ try (CSVParser parser = format.parse(Files.newBufferedReader(source, Charset.defaultCharset()))) {
return parser.getHeaderMap();
}
}
}
public static void consumeCSV(Path source, char delim, boolean firstAsHeader, Function<CSVRecord, Boolean> consumer) throws IOException {
- CSVFormat format = CSVFormat.newFormat(delim);
+ consumeCSV(Files.newBufferedReader(source), delim, firstAsHeader, consumer);
+ }
+
+ public static void consumeCSV(Reader reader, char delim, boolean firstAsHeader,
+ Function<CSVRecord, Boolean> consumer) throws IOException {
+ CSVFormat format = CSVFormat.newFormat(delim).withQuote('"');
if (firstAsHeader) {
format = format.withFirstRecordAsHeader();
}
- try (CSVParser parser = format.parse(Files.newBufferedReader(source))) {
+ try (CSVParser parser = format.parse(reader)) {
Iterator<CSVRecord> records = parser.iterator();
while (records.hasNext()) {
Boolean cont = consumer.apply(records.next());
int lengthIndex = model.getLengthIndex();
int detailedGeometryIndex = model.getDetailedGeometryIndex();
int regionIndex = model.getRegionIndex();
+ int pipeTypeIndex = model.getPipeTypeIndex();
+ int pipeCodeIndex = model.getPipeCodeIndex();
+ int installationYearIndex = model.getInstallationYearIndex();
+ int wallThicknessIndex = model.getWallThicknessIndex();
+ int insulationConductivityIndex = model.getInsulationConductivityIndex();
+ int pipeSizeDNIndex = model.getPipeSizeDNIndex();
+ int roughnessIndex = model.getRoughnessIndex();
+ int structureIndex = model.getStructureIndex();
int mappingColumn = model.getComponentMappingIndex();
int idColumn = model.getIdIndex();
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() {
// 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);
+
+ 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();
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);
+ writeStringValue(graph, row, pipeCodeIndex, edge, DN.Edge_HasPipeCode);
+ writeIntegerValue(graph, row, installationYearIndex, edge, DN.Edge_HasInstallationYear);
+ writeValue(graph, row, wallThicknessIndex, edge, DN.Edge_HasWallThickness);
+ writeValue(graph, row, insulationConductivityIndex, edge, DN.Edge_HasInsulationConductivity);
+ writeIntegerValue(graph, row, pipeSizeDNIndex, edge, DN.Edge_HasPipeSizeDN);
+ writeValue(graph, row, roughnessIndex, edge, DN.Edge_HasRoughness);
+ writeStringValue(graph, row, structureIndex, edge, DN.Edge_HasStructure);
}
}
return true;
}
}
+ private static void writeIntegerValue(WriteGraph graph, CSVRecord row, int index, Resource subject, Resource relation) throws DatabaseException {
+ if (index != -1) {
+ String stringValue = row.get(index);
+ if (!stringValue.isEmpty()) {
+ try {
+ if (stringValue.startsWith("\"") && stringValue.endsWith("\"")) {
+ stringValue = stringValue.substring(1, stringValue.length() - 1);
+ }
+ graph.claimLiteral(subject, relation, Integer.parseInt(stringValue), Bindings.INTEGER);
+ } catch (NumberFormatException e) {
+ LOGGER.error("Could not parse {} {} {} {}", row, index, subject, relation, e);
+ //throw new DatabaseException(e);
+ }
+ }
+ }
+ }
+
private static void writeStringValue(WriteGraph graph, CSVRecord row, int index, Resource subject, Resource relation) throws DatabaseException {
if (index != -1) {
String stringValue = row.get(index);