]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizard.java
Enhancements to district functionalities and code
[simantics/district.git] / org.simantics.district.imports.ui / src / org / simantics / district / imports / ui / CSVImportWizard.java
1 package org.simantics.district.imports.ui;
2
3 import java.io.IOException;
4 import java.nio.file.Path;
5 import java.util.List;
6
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;
30
31 public class CSVImportWizard extends Wizard implements IImportWizard {
32
33     private CSVImportModel model;
34     
35     public CSVImportWizard() {
36         setWindowTitle("Import CSV data");
37     }
38     
39     
40     @Override
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));
46     }
47     
48     @Override
49     public boolean performFinish() {
50         try {
51             
52             
53             Path csvFile = model.getSource();
54             char delim = model.getDelimiter();
55             
56             List<CSVRecord> rows = DistrictImportUtils.readRows(csvFile, delim, -1);
57             
58             Path wktFile = model.getWKTFile();
59             
60             int xCoordColumnIndex = model.getXCoordIndex();
61             int yCoordColumnIndex = model.getYCoordIndex();
62             int zCoordColumnIndex = model.getZCoordIndex();
63             
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();
70             
71             int mappingColumn = model.getComponentMappingIndex();
72             
73             try {
74                 CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:3879");
75                 CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326");
76                 MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
77                 
78                 Simantics.getSession().syncRequest(new Write() {
79                     
80                     @Override
81                     public void perform(WriteGraph graph) throws DatabaseException {
82                         for (int k = 1; k < rows.size(); k++) {
83                             CSVRecord row = rows.get(k);
84                             
85                             String mappingValue = row.get(mappingColumn);
86
87                             try {
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);
93                                     
94                                     String zs = row.get(zCoordColumnIndex);
95                                     double z = Double.parseDouble(zs);
96                                     
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);
103                                 } else {
104                                     String startXCoords = row.get(startXCoordColumnIndex);
105                                     String startYCoords = row.get(startYCoordColumnIndex);
106                                     String endXCoords = row.get(endXCoordColumnIndex);
107                                     String endYCoords = row.get(endYCoordColumnIndex);
108                                     
109                                     double startXCoord = Double.parseDouble(startXCoords);
110                                     double startYCoord = Double.parseDouble(startYCoords);
111                                     
112                                     double endXCoord = Double.parseDouble(endXCoords);
113                                     double endYCoord = Double.parseDouble(endYCoords);
114                                     
115                                     DirectPosition2D startTargetPos = new DirectPosition2D();
116                                     DirectPosition2D startSourcePos = new DirectPosition2D(startXCoord, startYCoord);
117                                     DirectPosition startRes = transform.transform(startSourcePos, startTargetPos);
118                                     double[] startCoords = startRes.getCoordinate();
119                                     
120                                     DirectPosition2D endTargetPos = new DirectPosition2D();
121                                     DirectPosition2D endSourcePos = new DirectPosition2D(endXCoord, endYCoord);
122                                     DirectPosition endRes = transform.transform(endSourcePos, endTargetPos);
123                                     double[] endCoords = endRes.getCoordinate();
124                                     
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);
128                                 }
129                             } catch (MismatchedDimensionException | TransformException | DatabaseException e) {
130                                 e.printStackTrace();
131                             }
132                             
133                         }
134                     }
135                 });
136                 return true;
137             } catch (FactoryException | DatabaseException e) {
138                 e.printStackTrace();
139             }
140             
141         } catch (IOException e) {
142             e.printStackTrace();
143         }
144         return false;
145     }
146
147 }