Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 5571

History | View | Annotate | Download (14.7 KB)

1
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
import javax.swing.JComponent;
10
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
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
49

    
50
public class ExportTo extends Extension {
51

    
52
        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
        /**
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
                                                        int resp = JOptionPane.showConfirmDialog(
167
                                                                        (JComponent) PluginServices.getMDIManager().getActiveView(),
168
                                                                        "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
                        } catch (DriverIOException e) {
193
                                e.printStackTrace();
194
                                NotificationManager.addError(e.getMessage(), e);
195
                        }
196

    
197
                }
198
        }
199

    
200
        public void saveToPostGIS(FLyrVect layer) throws EditionException, DriverIOException {
201
                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
        
251
        private void writeFeatures(FLyrVect layer, IWriter writer) throws DriverException, DriverIOException
252
        {
253
                PluginServices.cancelableBackgroundExecution(new WriterTask(layer, writer));
254
        }
255

    
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
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer)
268
                        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

    
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
                if (bitSet.cardinality() == 0) {
294
                        rowCount = va.getShapeCount();
295
                        for (int i = 0; i < rowCount; i++) {
296
                                IGeometry geom = va.getShape(i);
297

    
298
                                progress.setProgress(i);
299
                                if (progress.isCanceled())
300
                                        break;
301

    
302
                                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
                        int counter = 0;
312
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
313
                                        .nextSetBit(i + 1)) {
314
                                IGeometry geom = va.getShape(i);
315

    
316
                                progress.setProgress(counter++);
317
                                if (progress.isCanceled())
318
                                        break;
319

    
320
                                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
                progress.close();
334
        }
335

    
336
        public void saveToDxf(FLyrVect layer) throws EditionException, DriverIOException {
337
                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
        public void saveToShp(FLyrVect layer) throws EditionException, DriverIOException {
380
                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
                                // ficheros
401
                                {
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
                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
                        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
}