1 package org.simantics.district.imports.ui;
3 import java.io.IOException;
4 import java.nio.file.Path;
7 import org.apache.commons.csv.CSVRecord;
8 import org.eclipse.jface.viewers.IStructuredSelection;
9 import org.eclipse.jface.wizard.Wizard;
10 import org.eclipse.ui.IImportWizard;
11 import org.eclipse.ui.IWorkbench;
12 import org.geotools.geometry.DirectPosition2D;
13 import org.geotools.referencing.CRS;
14 import org.opengis.geometry.DirectPosition;
15 import org.opengis.geometry.MismatchedDimensionException;
16 import org.opengis.referencing.FactoryException;
17 import org.opengis.referencing.crs.CoordinateReferenceSystem;
18 import org.opengis.referencing.operation.MathTransform;
19 import org.opengis.referencing.operation.TransformException;
20 import org.simantics.Simantics;
21 import org.simantics.databoard.Bindings;
22 import org.simantics.db.Resource;
23 import org.simantics.db.WriteGraph;
24 import org.simantics.db.exception.DatabaseException;
25 import org.simantics.db.request.Write;
26 import org.simantics.district.imports.DistrictImportUtils;
27 import org.simantics.district.network.DistrictNetworkUtil;
28 import org.simantics.district.network.ontology.DistrictNetworkResource;
29 import org.simantics.district.network.ui.DNEdgeBuilder;
31 public class CSVImportWizard extends Wizard implements IImportWizard {
33 private CSVImportModel model;
35 public CSVImportWizard() {
36 setWindowTitle("Import CSV data");
41 public void init(IWorkbench workbench, IStructuredSelection selection) {
42 model = new CSVImportModel();
43 addPage(new CSVImportWizardFirstPage(model));
44 addPage(new CSVImportWizardPage(model));
45 addPage(new ComponentMappingPage(model));
49 public boolean performFinish() {
53 Path csvFile = model.getSource();
54 char delim = model.getDelimiter();
56 List<CSVRecord> rows = DistrictImportUtils.readRows(csvFile, delim, -1);
58 Path wktFile = model.getWKTFile();
60 int xCoordColumnIndex = model.getXCoordIndex();
61 int yCoordColumnIndex = model.getYCoordIndex();
62 int zCoordColumnIndex = model.getZCoordIndex();
64 int startXCoordColumnIndex = model.getStartXCoordIndex();
65 int startYCoordColumnIndex = model.getStartYCoordIndex();
66 int startZValueColumnIndex = model.getStartZCoordIndex();
67 int endXCoordColumnIndex = model.getEndXCoordIndex();
68 int endYCoordColumnIndex = model.getEndYCoordIndex();
69 int endZValueColumnIndex = model.getEndZCoordIndex();
71 int mappingColumn = model.getComponentMappingIndex();
74 CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:3879");
75 CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326");
76 MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
78 Simantics.getSession().syncRequest(new Write() {
81 public void perform(WriteGraph graph) throws DatabaseException {
82 for (int k = 1; k < rows.size(); k++) {
83 CSVRecord row = rows.get(k);
85 String mappingValue = row.get(mappingColumn);
88 if (model.isVertexImport()) {
89 String xCoords = row.get(xCoordColumnIndex);
90 String yCoords = row.get(yCoordColumnIndex);
91 double xCoord = Double.parseDouble(xCoords);
92 double yCoord = Double.parseDouble(yCoords);
94 String zs = row.get(zCoordColumnIndex);
95 double z = Double.parseDouble(zs);
97 DirectPosition2D targetPos = new DirectPosition2D();
98 DirectPosition2D sourcePos = new DirectPosition2D(xCoord, yCoord);
99 DirectPosition res = transform.transform(sourcePos, targetPos);
100 double[] coords = res.getCoordinate();
101 Resource vertex = DistrictNetworkUtil.createVertex(graph, model.getParentDiagram(), new double[] { coords[1], -coords[0]}, model.getComponentMappings().get(mappingValue));
102 graph.claimLiteral(vertex, DistrictNetworkResource.getInstance(graph).Vertex_HasElevation, z, Bindings.DOUBLE);
104 String startXCoords = row.get(startXCoordColumnIndex);
105 String startYCoords = row.get(startYCoordColumnIndex);
106 String endXCoords = row.get(endXCoordColumnIndex);
107 String endYCoords = row.get(endYCoordColumnIndex);
109 double startXCoord = Double.parseDouble(startXCoords);
110 double startYCoord = Double.parseDouble(startYCoords);
112 double endXCoord = Double.parseDouble(endXCoords);
113 double endYCoord = Double.parseDouble(endYCoords);
115 DirectPosition2D startTargetPos = new DirectPosition2D();
116 DirectPosition2D startSourcePos = new DirectPosition2D(startXCoord, startYCoord);
117 DirectPosition startRes = transform.transform(startSourcePos, startTargetPos);
118 double[] startCoords = startRes.getCoordinate();
120 DirectPosition2D endTargetPos = new DirectPosition2D();
121 DirectPosition2D endSourcePos = new DirectPosition2D(endXCoord, endYCoord);
122 DirectPosition endRes = transform.transform(endSourcePos, endTargetPos);
123 double[] endCoords = endRes.getCoordinate();
125 Resource edge = DNEdgeBuilder.create(graph, model.getParentDiagram(), new double[] { startCoords[1], -startCoords[0]}, new double[] { endCoords[1], -endCoords[0]}, 0.0000001);
126 graph.claim(edge, DistrictNetworkResource.getInstance(graph).HasMapping, model.getComponentMappings().get(mappingValue));
127 // graph.claimLiteral(edge, DistrictNetworkResource.getInstance(graph).Edge_HasDiameter, value);
129 } catch (MismatchedDimensionException | TransformException | DatabaseException e) {
137 } catch (FactoryException | DatabaseException e) {
141 } catch (IOException e) {