Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGraph_predes / src / com / iver / cit / gvsig / graph / GenerateNetworkExtension.java @ 8659

History | View | Annotate | Download (14 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.graph;
42

    
43
import java.awt.Component;
44
import java.io.File;
45
import java.io.FileNotFoundException;
46
import java.util.HashMap;
47

    
48
import javax.swing.ImageIcon;
49
import javax.swing.JFileChooser;
50
import javax.swing.JOptionPane;
51

    
52
import com.iver.andami.PluginServices;
53
import com.iver.andami.messages.NotificationManager;
54
import com.iver.andami.plugins.Extension;
55
import com.iver.andami.preferences.IPreference;
56
import com.iver.andami.preferences.IPreferenceExtension;
57
import com.iver.andami.ui.mdiManager.IWindow;
58
import com.iver.cit.gvsig.fmap.DriverException;
59
import com.iver.cit.gvsig.fmap.MapContext;
60
import com.iver.cit.gvsig.fmap.MapControl;
61
import com.iver.cit.gvsig.fmap.core.FShape;
62
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
63
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
64
import com.iver.cit.gvsig.fmap.edition.EditionException;
65
import com.iver.cit.gvsig.fmap.edition.IWriter;
66
import com.iver.cit.gvsig.fmap.edition.ShpSchemaManager;
67
import com.iver.cit.gvsig.fmap.edition.writers.dbf.DbfWriter;
68
import com.iver.cit.gvsig.fmap.edition.writers.shp.MultiShpWriter;
69
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
70
import com.iver.cit.gvsig.fmap.layers.FLayer;
71
import com.iver.cit.gvsig.fmap.layers.FLayers;
72
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
73
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
74
import com.iver.cit.gvsig.geoprocess.core.fmap.GeoprocessException;
75
import com.iver.cit.gvsig.geoprocess.core.fmap.XTypes;
76
import com.iver.cit.gvsig.geoprocess.core.gui.AddResultLayerTask;
77
import com.iver.cit.gvsig.graph.core.writers.NetworkFileRedWriter;
78
import com.iver.cit.gvsig.graph.core.writers.NetworkGvTableWriter;
79
import com.iver.cit.gvsig.graph.gui.wizard.NetWizard;
80
import com.iver.cit.gvsig.graph.preferences.RoutePage;
81
import com.iver.cit.gvsig.project.documents.view.IProjectView;
82
import com.iver.cit.gvsig.project.documents.view.gui.IView;
83
import com.iver.cit.gvsig.project.documents.view.gui.View;
84
import com.iver.cit.gvsig.topology.lineclean.fmap.LineCleanGeoprocess;
85
import com.iver.utiles.SimpleFileFilter;
86
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
87
import com.iver.utiles.swing.threads.IMonitorableTask;
88
import com.iver.utiles.swing.threads.MonitorableDecoratorMainFirst;
89
import com.iver.utiles.swing.threads.MonitorableTaskQueue;
90

    
91
public class GenerateNetworkExtension extends Extension implements
92
                IPreferenceExtension {
93
        private static final IPreference thePreferencePage = new RoutePage();
94

    
95
        public void initialize() {
96
        }
97

    
98
        public void execute(String actionCommand) {
99
                IView view = (View) PluginServices.getMDIManager().getActiveWindow();
100
                MapControl mapControl = view.getMapControl();
101
                MapContext map = mapControl.getMapContext();
102
                FLayers tocLyrs = map.getLayers();
103
                SingleLayerIterator lyrIterator = new SingleLayerIterator(tocLyrs);
104
                while (lyrIterator.hasNext()) {
105
                        FLayer lyr = lyrIterator.next();
106
                        if ((lyr.isActive()) && (lyr instanceof FLyrVect)) {
107
                                FLyrVect lyrVect = (FLyrVect) lyr;
108
                                int shapeType;
109
                                try {
110
                                        shapeType = lyrVect.getShapeType();
111
                                        if (shapeType == FShape.LINE) {
112
                                                if (actionCommand.equalsIgnoreCase("GENERATE_RED")) {
113
                                                        generateRedNetwork(lyrVect, tocLyrs);
114
                                                        return;
115
                                                }
116
                                        }
117
                                } catch (DriverException e) {
118
                                        e.printStackTrace();
119
                                        NotificationManager.addError(e);
120
                                }
121

    
122
                        }
123
                }
124

    
125
        }
126

    
127
        private void generateNetwork(FLyrVect lyr) {
128
                NetworkGvTableWriter netBuilder = new NetworkGvTableWriter();
129
                // Por ahora, a pelo, pero hay que sacar un cuadro
130
                // de di?logo para hecer el mapping.
131
                // Tambi?n un cuadro de di?logo para seleccionar
132
                // en qu? tablas quiere escribir, y su formato
133
                // (dbf, postgres, etc)
134
                String fieldType = "tipored";
135
                String fieldDist = "length";
136
                String fieldSense = "sen";
137
                String fieldCost = "cost";
138
                try {
139
                        netBuilder.setLayer(lyr);
140
                        netBuilder.setFieldType(fieldType);
141
                        netBuilder.setFieldDist(fieldDist);
142
                        netBuilder.setFieldSense(fieldSense);
143
                        netBuilder.setFieldCost(fieldCost);
144
                        DbfWriter nodeWriter = new DbfWriter();
145
                        nodeWriter.setFile(new File("c:/nodes.dbf"));
146

    
147
                        DbfWriter edgeWriter = new DbfWriter();
148
                        edgeWriter.setFile(new File("c:/edges.dbf"));
149

    
150
                        netBuilder.setEdgeWriter(edgeWriter);
151
                        netBuilder.setNodeWriter(nodeWriter);
152

    
153
                        netBuilder.writeNetwork();
154
                } catch (DriverException e1) {
155
                        // TODO Auto-generated catch block
156
                        e1.printStackTrace();
157
                } catch (EditionException e1) {
158
                        // TODO Auto-generated catch block
159
                        e1.printStackTrace();
160
                }
161
                JOptionPane.showMessageDialog(null, PluginServices
162
                                .getText(this, "done"));
163
        }
164
        
165
        class GenerateRedNetworkAfterCleanTask extends AbstractMonitorableTask {
166
                IMonitorableTask cleanTask;
167
                LineCleanGeoprocess cleanGeoprocess;
168

    
169
                File redFile;
170

    
171
                NetworkFileRedWriter netBuilder;
172
                
173
                
174

    
175
                /**
176
                 * Constructor
177
                 */
178
                GenerateRedNetworkAfterCleanTask(FLyrVect layer, File redFile,
179
                                NetworkFileRedWriter netBuilder, 
180
                                IMonitorableTask cleanTask, LineCleanGeoprocess geoprocess) {
181
                        this.redFile = redFile;
182
                        this.netBuilder = netBuilder;
183
                        this.cleanTask = cleanTask;
184
                        this.cleanGeoprocess = geoprocess;
185
                        setInitialStep(0);
186
                        setDeterminatedProcess(true);
187
                        setStatusMessage(PluginServices.getText(this,
188
                        "Generando_red_a_partir_de_capa_lineal"));
189
                }
190

    
191
                public void run() throws Exception {
192
                        //TODO Esto creo que no vale, porque estamos esperando a que el thread del CLEAN acabe
193
                        //y esto come mucho procesador
194
                        
195
                        //Probar a crear un PluginServices.enqueue(Task1, Task2)
196
                        //de forma que el thread de la task2 se quede esperando al de la task1
197
                        
198
                        while(! cleanTask.isFinished() || ! cleanTask.isCanceled()){
199
                                Thread.sleep(1000);
200
                        }
201
                        if(cleanTask.isCanceled())
202
                                return;
203
                        FLyrVect layer = (FLyrVect) cleanGeoprocess.getResult();
204
                        int numShapes;
205
                        try {         
206
                                numShapes = layer.getSource().getShapeCount();
207
                                setFinalStep(numShapes);
208
                                
209
                                
210
                        } catch (DriverIOException e) {
211
                                // TODO Auto-generated catch block
212
                                e.printStackTrace();
213
                        }
214
                        
215
                        
216
                        netBuilder.setLayer(layer);
217
                        netBuilder.setCancellableMonitorable(this);
218
                        netBuilder.setRedFile(redFile);
219
                        netBuilder.writeNetwork();
220
                        JOptionPane.showMessageDialog(null, PluginServices.getText(this,
221
                                        "done"));
222
                }
223

    
224
                public String getNote() {
225
                        return "Procesando linea..." + " " + getCurrentStep() + " " + "de"
226
                                        + " " + getFinishStep();
227
                }
228

    
229
                public void cancel() {
230
                        setCanceled(true);
231
                }
232
        }
233
        
234
        
235
        
236

    
237
        class GenerateRedNetworkTask extends AbstractMonitorableTask {
238
                FLyrVect layer;
239

    
240
                File redFile;
241

    
242
                NetworkFileRedWriter netBuilder;
243
                
244
                
245

    
246
                /**
247
                 * Constructor
248
                 */
249
                GenerateRedNetworkTask(FLyrVect layer, File redFile,
250
                                NetworkFileRedWriter netBuilder) {
251
                        this.layer = layer;
252
                        this.redFile = redFile;
253
                        this.netBuilder = netBuilder;
254
                        setInitialStep(0);
255
                        int numShapes;
256
                        try {
257
                                numShapes = layer.getSource().getShapeCount();
258
                                setFinalStep(numShapes);
259
                                setDeterminatedProcess(true);
260
                                setStatusMessage(PluginServices.getText(this,
261
                                                "Generando_red_a_partir_de_capa_lineal"));
262
                        } catch (DriverIOException e) {
263
                                // TODO Auto-generated catch block
264
                                e.printStackTrace();
265
                        }
266

    
267
                }
268

    
269
                public void run() throws Exception {
270
                        netBuilder.setLayer(layer);
271
                        netBuilder.setCancellableMonitorable(this);
272
                        netBuilder.setRedFile(redFile);
273
                        netBuilder.writeNetwork();
274
                        JOptionPane.showMessageDialog(null, PluginServices.getText(this,
275
                                        "done"));
276
                }
277

    
278
                public String getNote() {
279
                        return "Procesando linea..." + " " + getCurrentStep() + " " + "de"
280
                                        + " " + getFinishStep();
281
                }
282

    
283
                public void cancel() {
284
                        setCanceled(true);
285
                }
286
        }
287

    
288
        /**
289
         * It returns a geoprocess to make a CLEAN of the input layer 
290
         * */
291
        private LineCleanGeoprocess createCleanGeoprocess(FLyrVect lineLyr) {
292
                 File outputFile = null;
293
                 JOptionPane.showMessageDialog(null,
294
                                PluginServices.getText(null, "Especifique_fichero_shp_resultante"),
295
                                PluginServices.getText(null, "Fichero_para_capa_corregida"),
296
                                JOptionPane.INFORMATION_MESSAGE);
297
                 JFileChooser jfc = new JFileChooser();
298
                SimpleFileFilter filterShp = new SimpleFileFilter("shp", PluginServices
299
                                .getText(this, "shp_files"));
300
                jfc.setFileFilter(filterShp);
301
                if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
302
                        File newFile = jfc.getSelectedFile();
303
                        String path = newFile.getAbsolutePath();
304
                        if (newFile.exists()) {
305
                                int resp = JOptionPane.showConfirmDialog(
306
                                                (Component) PluginServices.getMainFrame(),
307
                                                PluginServices.getText(this,
308
                                                                "fichero_ya_existe_seguro_desea_guardarlo"),
309
                                                PluginServices.getText(this, "guardar"),
310
                                                JOptionPane.YES_NO_OPTION);
311
                                if (resp != JOptionPane.YES_OPTION) {
312
                                        return null;
313
                                }
314
                        }// if
315
                        if (!(path.toLowerCase().endsWith(".shp"))) {
316
                                path = path + ".shp";
317
                        }
318
                        outputFile = new File(path);
319
                } else {
320
                        return null;
321
                }
322
                LineCleanGeoprocess geoprocess = new LineCleanGeoprocess(lineLyr);
323
                SHPLayerDefinition definition = (SHPLayerDefinition) geoprocess
324
                                .createLayerDefinition();
325
                definition.setFile(outputFile);
326
                ShpSchemaManager schemaManager = new ShpSchemaManager(outputFile
327
                                .getAbsolutePath());
328
                IWriter writer = null;
329
                try {
330
                        int shapeType = definition.getShapeType();
331
                        if (shapeType != XTypes.MULTI) {
332
                                writer = new ShpWriter();
333
                                ((ShpWriter) writer).setFile(definition.getFile());
334
                                writer.initialize(definition);
335
                        } else {
336
                                writer = new MultiShpWriter();
337
                                ((MultiShpWriter) writer).setFile(definition.getFile());
338
                                writer.initialize(definition);
339
                        }
340
                } catch (Exception e1) {
341
                        String error = PluginServices.getText(this,
342
                                        "Error_escritura_resultados");
343
                        String errorDescription = PluginServices.getText(this,
344
                                        "Error_preparar_escritura_resultados");
345
                }
346
                geoprocess.setResultLayerProperties(writer, schemaManager);
347
                HashMap params = new HashMap();
348
                params.put("layer_selection", new Boolean(false));
349
                try {
350
                        geoprocess.setParameters(params);
351
                        geoprocess.checkPreconditions();
352
                        return geoprocess;
353
                        
354
                } catch (GeoprocessException e) {
355
                        String error = PluginServices.getText(this, "Error_ejecucion");
356
                        String errorDescription = PluginServices.getText(this,
357
                                        "Error_fallo_geoproceso");
358
                        return null;
359
                }
360

    
361
        }
362

    
363
        private void generateRedNetwork(FLyrVect lyr, FLayers tocLyrs) {
364
                lyr.createSpatialIndex();
365
                NetworkFileRedWriter netBuilder = new NetworkFileRedWriter();
366
                // Por ahora, a pelo, pero hay que sacar un cuadro
367
                // de di?logo para hecer el mapping.
368
                // Tambi?n un cuadro de di?logo para seleccionar
369
                // en qu? tablas quiere escribir, y su formato
370
                // (dbf, postgres, etc)
371

    
372
                ImageIcon icon = new ImageIcon(this.getClass().getClassLoader()
373
                                .getResource("images/net-wizard-logo.jpg"));
374

    
375
                NetWizard wiz = new NetWizard(icon, lyr);
376
                PluginServices.getMDIManager().addWindow(wiz);
377
                if (!wiz.wasFinishPressed())
378
                        return;
379
                // try {
380
                String fieldType = wiz.getFieldType();
381
                String fieldLength = wiz.getFieldLength();
382
                String fieldCost = wiz.getFieldCost();
383
                String fieldSense = wiz.getFieldSense();
384
                netBuilder.setLayer(lyr);
385
                netBuilder.setFieldType(fieldType);
386
                netBuilder.setFieldDist(fieldLength);
387
                netBuilder.setFieldSense(fieldSense);
388
                netBuilder.setFieldCost(fieldCost);
389
                File redFile = NetworkUtils.getNetworkFile(lyr);
390

    
391
                boolean cleanOrigLyr = wiz.getCleanOriginalLayer();
392
                LineCleanGeoprocess clean = null;
393
                if(cleanOrigLyr)
394
                        clean = createCleanGeoprocess(lyr);
395
                boolean applySnap = wiz.getApplySnapTolerance();
396
                if(applySnap){
397
                        double snapTolerance = wiz.getSnapTolerance();
398
                        netBuilder.setSnapTolerance(snapTolerance);
399
                }        
400
                if(clean != null){
401
                        //we wont start the process of network creation
402
                        //until clean geoprocess will be finished
403
                        IMonitorableTask cleanTask = clean.createTask();
404
                        GenerateRedNetworkAfterCleanTask task = new 
405
                        GenerateRedNetworkAfterCleanTask(lyr, redFile,
406
                                        netBuilder, cleanTask, clean );
407
                        PluginServices.cancelableBackgroundExecution(cleanTask);
408
                        PluginServices.cancelableBackgroundExecution(task);
409
                        
410
                }else{
411
                        GenerateRedNetworkTask task = new GenerateRedNetworkTask(lyr, redFile,
412
                                        netBuilder);
413
                        PluginServices.cancelableBackgroundExecution(task);
414
                }
415
        }
416

    
417
        public boolean isEnabled() {
418
                return true;
419
        }
420

    
421
        public boolean isVisible() {
422
                IWindow f = PluginServices.getMDIManager().getActiveWindow();
423

    
424
                if (f == null) {
425
                        return false;
426
                }
427

    
428
                if (f instanceof View) {
429
                        View vista = (View) f;
430
                        IProjectView model = vista.getModel();
431
                        MapContext mapa = model.getMapContext();
432
                        FLayer[] activeLayers = mapa.getLayers().getActives();
433
                        if (activeLayers.length > 0)
434
                                if (activeLayers[0] instanceof FLyrVect) {
435
                                        FLyrVect lyrVect = (FLyrVect) activeLayers[0];
436
                                        int shapeType;
437
                                        try {
438
                                                shapeType = lyrVect.getShapeType();
439
                                                if (shapeType == FShape.LINE)
440
                                                        return true;
441
                                        } catch (DriverException e) {
442
                                                // TODO Auto-generated catch block
443
                                                e.printStackTrace();
444
                                        }
445
                                }
446
                }
447
                return false;
448

    
449
        }
450

    
451
        public IPreference getPreferencesPage() {
452
                return thePreferencePage;
453
        }
454

    
455
}