root / trunk / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 5571
History | View | Annotate | Download (14.7 KB)
1 | 5267 | fjp | package com.iver.cit.gvsig; |
---|---|---|---|
2 | |||
3 | import java.awt.Component; |
||
4 | import java.io.File; |
||
5 | import java.sql.Connection; |
||
6 | import java.sql.DriverManager; |
||
7 | import java.sql.SQLException; |
||
8 | |||
9 | 5284 | fjp | import javax.swing.JComponent; |
10 | 5267 | fjp | import javax.swing.JFileChooser; |
11 | import javax.swing.JOptionPane; |
||
12 | import javax.swing.ProgressMonitor; |
||
13 | |||
14 | import com.hardcode.driverManager.DriverLoadException; |
||
15 | import com.hardcode.gdbms.engine.values.Value; |
||
16 | import com.iver.andami.PluginServices; |
||
17 | import com.iver.andami.messages.NotificationManager; |
||
18 | import com.iver.andami.plugins.Extension; |
||
19 | import com.iver.cit.gvsig.fmap.DriverException; |
||
20 | import com.iver.cit.gvsig.fmap.FMap; |
||
21 | import com.iver.cit.gvsig.fmap.core.DefaultFeature; |
||
22 | import com.iver.cit.gvsig.fmap.core.FShape; |
||
23 | import com.iver.cit.gvsig.fmap.core.IFeature; |
||
24 | import com.iver.cit.gvsig.fmap.core.IGeometry; |
||
25 | import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition; |
||
26 | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
||
27 | import com.iver.cit.gvsig.fmap.drivers.FieldDescription; |
||
28 | import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition; |
||
29 | import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter; |
||
30 | import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited; |
||
31 | import com.iver.cit.gvsig.fmap.edition.EditionException; |
||
32 | import com.iver.cit.gvsig.fmap.edition.IWriter; |
||
33 | import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping; |
||
34 | import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter; |
||
35 | import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter; |
||
36 | import com.iver.cit.gvsig.fmap.layers.FBitSet; |
||
37 | import com.iver.cit.gvsig.fmap.layers.FLayer; |
||
38 | import com.iver.cit.gvsig.fmap.layers.FLayers; |
||
39 | import com.iver.cit.gvsig.fmap.layers.FLyrVect; |
||
40 | import com.iver.cit.gvsig.fmap.layers.LayerFactory; |
||
41 | import com.iver.cit.gvsig.fmap.layers.ReadableVectorial; |
||
42 | import com.iver.cit.gvsig.fmap.layers.SelectableDataSource; |
||
43 | import com.iver.cit.gvsig.gui.View; |
||
44 | import com.iver.cit.gvsig.jdbc_spatial.DlgConnection; |
||
45 | import com.iver.cit.gvsig.jdbc_spatial.gui.jdbcwizard.ConnectionSettings; |
||
46 | import com.iver.cit.gvsig.project.ProjectView; |
||
47 | import com.iver.utiles.SimpleFileFilter; |
||
48 | 5317 | fjp | import com.iver.utiles.swing.threads.AbstractMonitorableTask; |
49 | 5267 | fjp | |
50 | public class ExportTo extends Extension { |
||
51 | |||
52 | 5284 | fjp | private class WriterTask extends AbstractMonitorableTask |
53 | { |
||
54 | FLyrVect lyrVect; |
||
55 | IWriter writer; |
||
56 | int rowCount;
|
||
57 | ReadableVectorial va; |
||
58 | SelectableDataSource sds; |
||
59 | FBitSet bitSet; |
||
60 | public WriterTask(FLyrVect lyr, IWriter writer) throws DriverException, DriverIOException |
||
61 | { |
||
62 | this.lyrVect = lyr;
|
||
63 | this.writer = writer;
|
||
64 | |||
65 | setInitialStep(0);
|
||
66 | setDeterminatedProcess(true);
|
||
67 | setStatusMessage(PluginServices.getText(this, "exportando_features")); |
||
68 | |||
69 | va = lyrVect.getSource(); |
||
70 | sds = lyrVect.getRecordset(); |
||
71 | |||
72 | bitSet = sds.getSelection(); |
||
73 | |||
74 | if (bitSet.cardinality() == 0) |
||
75 | rowCount = va.getShapeCount(); |
||
76 | else
|
||
77 | rowCount = bitSet.cardinality(); |
||
78 | |||
79 | setFinalStep(rowCount); |
||
80 | |||
81 | } |
||
82 | public void run() throws Exception { |
||
83 | |||
84 | // Creamos la tabla.
|
||
85 | writer.preProcess(); |
||
86 | |||
87 | if (bitSet.cardinality() == 0) { |
||
88 | rowCount = va.getShapeCount(); |
||
89 | for (int i = 0; i < rowCount; i++) { |
||
90 | IGeometry geom = va.getShape(i); |
||
91 | |||
92 | reportStep(); |
||
93 | setNote(PluginServices.getText(this, "exporting_") + i); |
||
94 | if (isCanceled())
|
||
95 | break;
|
||
96 | |||
97 | if (geom != null) { |
||
98 | Value[] values = sds.getRow(i);
|
||
99 | IFeature feat = new DefaultFeature(geom, values, "" + i); |
||
100 | DefaultRowEdited edRow = new DefaultRowEdited(feat,
|
||
101 | DefaultRowEdited.STATUS_ADDED, i); |
||
102 | writer.process(edRow); |
||
103 | } |
||
104 | } |
||
105 | } else {
|
||
106 | int counter = 0; |
||
107 | for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet |
||
108 | .nextSetBit(i + 1)) {
|
||
109 | IGeometry geom = va.getShape(i); |
||
110 | |||
111 | reportStep(); |
||
112 | setNote(PluginServices.getText(this, "exporting_") + counter); |
||
113 | if (isCanceled())
|
||
114 | break;
|
||
115 | |||
116 | if (geom != null) { |
||
117 | Value[] values = sds.getRow(i);
|
||
118 | IFeature feat = new DefaultFeature(geom, values, "" + i); |
||
119 | DefaultRowEdited edRow = new DefaultRowEdited(feat,
|
||
120 | DefaultRowEdited.STATUS_ADDED, i); |
||
121 | |||
122 | writer.process(edRow); |
||
123 | } |
||
124 | } |
||
125 | |||
126 | } |
||
127 | |||
128 | writer.postProcess(); |
||
129 | |||
130 | JOptionPane.showMessageDialog(
|
||
131 | (JComponent) PluginServices.getMDIManager().getActiveView()
|
||
132 | , PluginServices.getText(this, "capa_exportada"), "Export", |
||
133 | JOptionPane.INFORMATION_MESSAGE);
|
||
134 | |||
135 | } |
||
136 | |||
137 | } |
||
138 | |||
139 | 5267 | fjp | /**
|
140 | * @see com.iver.andami.plugins.IExtension#initialize()
|
||
141 | */
|
||
142 | public void initialize() { |
||
143 | } |
||
144 | |||
145 | /**
|
||
146 | * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
|
||
147 | */
|
||
148 | public void execute(String actionCommand) { |
||
149 | com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager() |
||
150 | .getActiveView(); |
||
151 | |||
152 | if (f instanceof View) { |
||
153 | View vista = (View) f; |
||
154 | ProjectView model = vista.getModel(); |
||
155 | FMap mapa = model.getMapContext(); |
||
156 | FLayers layers = mapa.getLayers(); |
||
157 | FLayer[] actives = layers.getActives();
|
||
158 | try {
|
||
159 | // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
|
||
160 | for (int i = 0; i < actives.length; i++) { |
||
161 | if (actives[i] instanceof FLyrVect) { |
||
162 | FLyrVect lv = (FLyrVect) actives[i]; |
||
163 | int numSelec = lv.getRecordset().getSelection()
|
||
164 | .cardinality(); |
||
165 | if (numSelec > 0) { |
||
166 | 5284 | fjp | int resp = JOptionPane.showConfirmDialog( |
167 | (JComponent) PluginServices.getMDIManager().getActiveView(),
|
||
168 | 5267 | fjp | "se_van_a_guardar_" + numSelec
|
169 | + " features_desea_continuar",
|
||
170 | "Export", JOptionPane.YES_NO_OPTION); |
||
171 | if (resp == JOptionPane.NO_OPTION) { |
||
172 | continue;
|
||
173 | } |
||
174 | } // if numSelec > 0
|
||
175 | if (actionCommand.equals("SHP")) { |
||
176 | saveToShp(lv); |
||
177 | } |
||
178 | if (actionCommand.equals("DXF")) { |
||
179 | saveToDxf(lv); |
||
180 | } |
||
181 | if (actionCommand.equals("POSTGIS")) { |
||
182 | saveToPostGIS(lv); |
||
183 | } |
||
184 | } // actives[i]
|
||
185 | } // for
|
||
186 | } catch (EditionException e) {
|
||
187 | e.printStackTrace(); |
||
188 | NotificationManager.addError(e.getMessage(), e); |
||
189 | } catch (DriverException e) {
|
||
190 | e.printStackTrace(); |
||
191 | NotificationManager.addError(e.getMessage(), e); |
||
192 | 5284 | fjp | } catch (DriverIOException e) {
|
193 | e.printStackTrace(); |
||
194 | NotificationManager.addError(e.getMessage(), e); |
||
195 | 5267 | fjp | } |
196 | |||
197 | } |
||
198 | } |
||
199 | |||
200 | 5284 | fjp | public void saveToPostGIS(FLyrVect layer) throws EditionException, DriverIOException { |
201 | 5267 | fjp | try {
|
202 | String tableName = JOptionPane.showInputDialog(PluginServices |
||
203 | .getText(this, "intro_tablename")); |
||
204 | if (tableName == null) |
||
205 | return;
|
||
206 | DlgConnection dlg = new DlgConnection();
|
||
207 | dlg.setModal(true);
|
||
208 | dlg.setVisible(true);
|
||
209 | ConnectionSettings cs = dlg.getConnSettings(); |
||
210 | if (cs == null) |
||
211 | return;
|
||
212 | Connection conex = DriverManager.getConnection(cs |
||
213 | .getConnectionString(), cs.getUser(), cs.getPassw()); |
||
214 | |||
215 | DBLayerDefinition dbLayerDef = new DBLayerDefinition();
|
||
216 | dbLayerDef.setCatalogName(cs.getDb()); |
||
217 | dbLayerDef.setTableName(tableName); |
||
218 | dbLayerDef.setShapeType(layer.getShapeType()); |
||
219 | SelectableDataSource sds = layer.getRecordset(); |
||
220 | FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
|
||
221 | dbLayerDef.setFieldsDesc(fieldsDescrip); |
||
222 | dbLayerDef.setFieldGeometry("the_geom");
|
||
223 | dbLayerDef.setFieldID("gid");
|
||
224 | |||
225 | dbLayerDef.setWhereClause("");
|
||
226 | String strSRID = layer.getProjection().getAbrev().substring(5); |
||
227 | dbLayerDef.setSRID_EPSG(strSRID); |
||
228 | dbLayerDef.setConnection(conex); |
||
229 | |||
230 | PostGISWriter writer = new PostGISWriter(); // (PostGISWriter)LayerFactory.getWM().getWriter("PostGIS |
||
231 | // Writer");
|
||
232 | writer.setWriteAll(true);
|
||
233 | writer.setCreateTable(true);
|
||
234 | writer.initialize(dbLayerDef); |
||
235 | writeFeatures(layer, writer); |
||
236 | |||
237 | } catch (DriverException e) {
|
||
238 | e.printStackTrace(); |
||
239 | throw new EditionException(e); |
||
240 | } catch (DriverLoadException e) {
|
||
241 | throw new EditionException(e); |
||
242 | } catch (SQLException e) { |
||
243 | throw new EditionException(e); |
||
244 | } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
|
||
245 | e.printStackTrace(); |
||
246 | throw new EditionException(e); |
||
247 | } |
||
248 | |||
249 | } |
||
250 | 5284 | fjp | |
251 | private void writeFeatures(FLyrVect layer, IWriter writer) throws DriverException, DriverIOException |
||
252 | { |
||
253 | PluginServices.cancelableBackgroundExecution(new WriterTask(layer, writer));
|
||
254 | } |
||
255 | 5267 | fjp | |
256 | /**
|
||
257 | * @param layer
|
||
258 | * FLyrVect to obtain features. If selection, only selected
|
||
259 | * features will be precessed.
|
||
260 | * @param writer
|
||
261 | * (Must be already initialized)
|
||
262 | * @throws EditionException
|
||
263 | * @throws DriverException
|
||
264 | * @throws DriverIOException
|
||
265 | * @throws com.hardcode.gdbms.engine.data.driver.DriverException
|
||
266 | */
|
||
267 | 5284 | fjp | public void writeFeaturesNoThread(FLyrVect layer, IWriter writer) |
268 | 5267 | fjp | throws EditionException, DriverException, DriverIOException,
|
269 | com.hardcode.gdbms.engine.data.driver.DriverException { |
||
270 | ReadableVectorial va = layer.getSource(); |
||
271 | SelectableDataSource sds = layer.getRecordset(); |
||
272 | |||
273 | // Creamos la tabla.
|
||
274 | writer.preProcess(); |
||
275 | |||
276 | int rowCount;
|
||
277 | FBitSet bitSet = layer.getRecordset().getSelection(); |
||
278 | 5284 | fjp | |
279 | if (bitSet.cardinality() == 0) |
||
280 | rowCount = va.getShapeCount(); |
||
281 | else
|
||
282 | rowCount = bitSet.cardinality(); |
||
283 | |||
284 | ProgressMonitor progress = new ProgressMonitor( |
||
285 | (JComponent) PluginServices.getMDIManager().getActiveView(),
|
||
286 | PluginServices.getText(this, "exportando_features"), |
||
287 | PluginServices.getText(this, "exportando_features"), 0, |
||
288 | rowCount); |
||
289 | |||
290 | progress.setMillisToDecideToPopup(200);
|
||
291 | progress.setMillisToPopup(500);
|
||
292 | |||
293 | 5267 | fjp | if (bitSet.cardinality() == 0) { |
294 | rowCount = va.getShapeCount(); |
||
295 | for (int i = 0; i < rowCount; i++) { |
||
296 | IGeometry geom = va.getShape(i); |
||
297 | |||
298 | 5284 | fjp | progress.setProgress(i); |
299 | if (progress.isCanceled())
|
||
300 | break;
|
||
301 | |||
302 | 5267 | fjp | if (geom != null) { |
303 | Value[] values = sds.getRow(i);
|
||
304 | IFeature feat = new DefaultFeature(geom, values, "" + i); |
||
305 | DefaultRowEdited edRow = new DefaultRowEdited(feat,
|
||
306 | DefaultRowEdited.STATUS_ADDED, i); |
||
307 | writer.process(edRow); |
||
308 | } |
||
309 | } |
||
310 | } else {
|
||
311 | 5284 | fjp | int counter = 0; |
312 | 5267 | fjp | for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet |
313 | .nextSetBit(i + 1)) {
|
||
314 | IGeometry geom = va.getShape(i); |
||
315 | |||
316 | 5284 | fjp | progress.setProgress(counter++); |
317 | if (progress.isCanceled())
|
||
318 | break;
|
||
319 | |||
320 | 5267 | fjp | if (geom != null) { |
321 | Value[] values = sds.getRow(i);
|
||
322 | IFeature feat = new DefaultFeature(geom, values, "" + i); |
||
323 | DefaultRowEdited edRow = new DefaultRowEdited(feat,
|
||
324 | DefaultRowEdited.STATUS_ADDED, i); |
||
325 | |||
326 | writer.process(edRow); |
||
327 | } |
||
328 | } |
||
329 | |||
330 | } |
||
331 | |||
332 | writer.postProcess(); |
||
333 | 5284 | fjp | progress.close(); |
334 | 5267 | fjp | } |
335 | |||
336 | 5284 | fjp | public void saveToDxf(FLyrVect layer) throws EditionException, DriverIOException { |
337 | 5267 | fjp | try {
|
338 | JFileChooser jfc = new JFileChooser(); |
||
339 | SimpleFileFilter filterShp = new SimpleFileFilter("dxf", |
||
340 | PluginServices.getText(this, "dxf_files")); |
||
341 | jfc.setFileFilter(filterShp); |
||
342 | if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) { |
||
343 | File newFile = jfc.getSelectedFile();
|
||
344 | String path = newFile.getAbsolutePath();
|
||
345 | if (!(path.toLowerCase().endsWith(".dxf"))) { |
||
346 | path = path + ".dxf";
|
||
347 | } |
||
348 | newFile = new File(path); |
||
349 | |||
350 | DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter( |
||
351 | "DXF Writer");
|
||
352 | SHPLayerDefinition lyrDef = new SHPLayerDefinition();
|
||
353 | SelectableDataSource sds = layer.getRecordset(); |
||
354 | FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
|
||
355 | lyrDef.setFieldsDesc(fieldsDescrip); |
||
356 | lyrDef.setFile(newFile); |
||
357 | lyrDef.setName(newFile.getName()); |
||
358 | lyrDef.setShapeType(layer.getShapeType()); |
||
359 | writer.setFile(newFile); |
||
360 | writer.initialize(lyrDef); |
||
361 | writer.setProjection(layer.getProjection()); |
||
362 | DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
|
||
363 | // TODO: Recuperar aqu? los campos del cuadro de di?logo.
|
||
364 | writer.setFieldMapping(fieldsMapping); |
||
365 | |||
366 | writeFeatures(layer, writer); |
||
367 | } |
||
368 | |||
369 | } catch (DriverException e) {
|
||
370 | e.printStackTrace(); |
||
371 | throw new EditionException(e); |
||
372 | } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
|
||
373 | e.printStackTrace(); |
||
374 | throw new EditionException(e); |
||
375 | } |
||
376 | |||
377 | } |
||
378 | |||
379 | 5284 | fjp | public void saveToShp(FLyrVect layer) throws EditionException, DriverIOException { |
380 | 5267 | fjp | try {
|
381 | JFileChooser jfc = new JFileChooser(); |
||
382 | SimpleFileFilter filterShp = new SimpleFileFilter("shp", |
||
383 | PluginServices.getText(this, "shp_files")); |
||
384 | jfc.setFileFilter(filterShp); |
||
385 | if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) { |
||
386 | File newFile = jfc.getSelectedFile();
|
||
387 | String path = newFile.getAbsolutePath();
|
||
388 | if (!(path.toLowerCase().endsWith(".shp"))) { |
||
389 | path = path + ".shp";
|
||
390 | } |
||
391 | newFile = new File(path); |
||
392 | |||
393 | ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter( |
||
394 | "Shape Writer");
|
||
395 | SHPLayerDefinition lyrDef = new SHPLayerDefinition();
|
||
396 | SelectableDataSource sds = layer.getRecordset(); |
||
397 | FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
|
||
398 | lyrDef.setFieldsDesc(fieldsDescrip); |
||
399 | if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3 |
||
400 | 5284 | fjp | // ficheros
|
401 | 5267 | fjp | { |
402 | // puntos
|
||
403 | String aux = path.replaceFirst(".shp", "_points.shp"); |
||
404 | File filePoints = new File(aux); |
||
405 | lyrDef.setFile(filePoints); |
||
406 | lyrDef.setName(filePoints.getName()); |
||
407 | lyrDef.setShapeType(FShape.POINT); |
||
408 | writer.setFile(filePoints); |
||
409 | lyrDef.setFile(filePoints); |
||
410 | writer.initialize(lyrDef); |
||
411 | writeFeatures(layer, writer); |
||
412 | |||
413 | // Lineas
|
||
414 | aux = path.replaceFirst(".shp", "_line.shp"); |
||
415 | File fileLines = new File(aux); |
||
416 | lyrDef.setFile(fileLines); |
||
417 | lyrDef.setName(fileLines.getName()); |
||
418 | lyrDef.setShapeType(FShape.LINE); |
||
419 | writer.setFile(fileLines); |
||
420 | lyrDef.setFile(fileLines); |
||
421 | writer.initialize(lyrDef); |
||
422 | writeFeatures(layer, writer); |
||
423 | |||
424 | // Pol?gonos
|
||
425 | aux = path.replaceFirst(".shp", "_polygons.shp"); |
||
426 | File filePolygons = new File(aux); |
||
427 | lyrDef.setFile(filePolygons); |
||
428 | lyrDef.setName(filePolygons.getName()); |
||
429 | lyrDef.setShapeType(FShape.POLYGON); |
||
430 | writer.setFile(filePolygons); |
||
431 | lyrDef.setFile(filePolygons); |
||
432 | writer.initialize(lyrDef); |
||
433 | writeFeatures(layer, writer); |
||
434 | } else {
|
||
435 | lyrDef.setFile(newFile); |
||
436 | lyrDef.setName(newFile.getName()); |
||
437 | lyrDef.setShapeType(layer.getShapeType()); |
||
438 | writer.setFile(newFile); |
||
439 | writer.initialize(lyrDef); |
||
440 | |||
441 | writeFeatures(layer, writer); |
||
442 | |||
443 | } |
||
444 | } |
||
445 | } catch (DriverException e) {
|
||
446 | e.printStackTrace(); |
||
447 | throw new EditionException(e); |
||
448 | } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
|
||
449 | e.printStackTrace(); |
||
450 | throw new EditionException(e); |
||
451 | } |
||
452 | |||
453 | } |
||
454 | |||
455 | /**
|
||
456 | * @see com.iver.andami.plugins.IExtension#isEnabled()
|
||
457 | */
|
||
458 | public boolean isEnabled() { |
||
459 | 5562 | fjp | int status = EditionUtilities.getEditionStatus();
|
460 | if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE)
|
||
461 | || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)) |
||
462 | { |
||
463 | return true; |
||
464 | } |
||
465 | else
|
||
466 | 5267 | fjp | return false; |
467 | } |
||
468 | |||
469 | /**
|
||
470 | * @see com.iver.andami.plugins.IExtension#isVisible()
|
||
471 | */
|
||
472 | public boolean isVisible() { |
||
473 | com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager() |
||
474 | .getActiveView(); |
||
475 | |||
476 | if (f == null) { |
||
477 | return false; |
||
478 | } |
||
479 | |||
480 | if (f.getClass() == View.class) { |
||
481 | return true; |
||
482 | } else {
|
||
483 | return false; |
||
484 | } |
||
485 | |||
486 | } |
||
487 | |||
488 | } |