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 {
int flowAreaIndex = model.getFlowAreaIndex();
int nominalPressureLossIndex = model.getNominalPressureLossIndex();
int addressIndex = model.getAddressIndex();
+ int regionIndex = model.getRegionIndex();
int mappingColumn = model.getComponentMappingIndex();
int idColumn = model.getIdIndex();
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);
}
Path csvFile = model.getSource();
char delim = model.getDelimiter();
+ Set<String> writtenIds = new HashSet<>();
int startXCoordColumnIndex = model.getStartXCoordIndex();
int startYCoordColumnIndex = model.getStartYCoordIndex();
int kSupplyIndex = model.getkSupplyIndex();
int lengthIndex = model.getLengthIndex();
int detailedGeometryIndex = model.getDetailedGeometryIndex();
+ int regionIndex = model.getRegionIndex();
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() {
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);
- 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 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();
+
+ 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);
+ writeDoubleArrayFromString(graph, row, detailedGeometryIndex, edge, DN.Edge_HasGeometry, actualTransform);
+ }
}
-
return true;
} catch (DatabaseException | MismatchedDimensionException | TransformException e) {
throw new RuntimeException(e);
}
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);
}
}
}
double y = Double.parseDouble(p[1]);
if (actualTransform != null) {
DirectPosition2D targetPos = new DirectPosition2D();
- DirectPosition2D sourcePos = new DirectPosition2D(x, y);
+ DirectPosition2D sourcePos = new DirectPosition2D(y, x);
DirectPosition res = actualTransform.transform(sourcePos, targetPos);
double[] coords = res.getCoordinate();
x = coords[1];