Revision 8659 trunk/extensions/extGraph_predes/src/com/iver/cit/gvsig/graph/GenerateNetworkExtension.java

View differences:

GenerateNetworkExtension.java
40 40
 */
41 41
package com.iver.cit.gvsig.graph;
42 42

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

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

  
48 52
import com.iver.andami.PluginServices;
......
56 60
import com.iver.cit.gvsig.fmap.MapControl;
57 61
import com.iver.cit.gvsig.fmap.core.FShape;
58 62
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
63
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
59 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;
60 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;
61 70
import com.iver.cit.gvsig.fmap.layers.FLayer;
71
import com.iver.cit.gvsig.fmap.layers.FLayers;
62 72
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
63 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;
64 77
import com.iver.cit.gvsig.graph.core.writers.NetworkFileRedWriter;
65 78
import com.iver.cit.gvsig.graph.core.writers.NetworkGvTableWriter;
66 79
import com.iver.cit.gvsig.graph.gui.wizard.NetWizard;
......
68 81
import com.iver.cit.gvsig.project.documents.view.IProjectView;
69 82
import com.iver.cit.gvsig.project.documents.view.gui.IView;
70 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;
71 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;
72 90

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

  
77 95
	public void initialize() {
78 96
	}
......
81 99
		IView view = (View) PluginServices.getMDIManager().getActiveWindow();
82 100
		MapControl mapControl = view.getMapControl();
83 101
		MapContext map = mapControl.getMapContext();
84
		SingleLayerIterator lyrIterator = new SingleLayerIterator(map
85
				.getLayers());
102
		FLayers tocLyrs = map.getLayers();
103
		SingleLayerIterator lyrIterator = new SingleLayerIterator(tocLyrs);
86 104
		while (lyrIterator.hasNext()) {
87 105
			FLayer lyr = lyrIterator.next();
88
			if ((lyr.isActive()) && (lyr instanceof FLyrVect))
89
			{
106
			if ((lyr.isActive()) && (lyr instanceof FLyrVect)) {
90 107
				FLyrVect lyrVect = (FLyrVect) lyr;
91 108
				int shapeType;
92 109
				try {
93 110
					shapeType = lyrVect.getShapeType();
94
					if (shapeType == FShape.LINE)
95
					{
111
					if (shapeType == FShape.LINE) {
96 112
						if (actionCommand.equalsIgnoreCase("GENERATE_RED")) {
97
							generateRedNetwork(lyrVect);
113
							generateRedNetwork(lyrVect, tocLyrs);
98 114
							return;
99 115
						}
100 116
					}
......
106 122
			}
107 123
		}
108 124

  
109

  
110 125
	}
111 126

  
112

  
113 127
	private void generateNetwork(FLyrVect lyr) {
114 128
		NetworkGvTableWriter netBuilder = new NetworkGvTableWriter();
115 129
		// Por ahora, a pelo, pero hay que sacar un cuadro
......
117 131
		// Tambi?n un cuadro de di?logo para seleccionar
118 132
		// en qu? tablas quiere escribir, y su formato
119 133
		// (dbf, postgres, etc)
120
		String fieldType = "tipored"; String fieldDist = "length"; String fieldSense = "sen";
134
		String fieldType = "tipored";
135
		String fieldDist = "length";
136
		String fieldSense = "sen";
121 137
		String fieldCost = "cost";
122 138
		try {
123 139
			netBuilder.setLayer(lyr);
......
142 158
			// TODO Auto-generated catch block
143 159
			e1.printStackTrace();
144 160
		}
145
		JOptionPane.showMessageDialog(null, PluginServices.getText(this, "done"));
161
		JOptionPane.showMessageDialog(null, PluginServices
162
				.getText(this, "done"));
146 163
	}
164
	
165
	class GenerateRedNetworkAfterCleanTask extends AbstractMonitorableTask {
166
		IMonitorableTask cleanTask;
167
		LineCleanGeoprocess cleanGeoprocess;
147 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
	}
148 233
	
149
	class GenerateRedNetworkTask extends AbstractMonitorableTask{
234
	
235
	
236

  
237
	class GenerateRedNetworkTask extends AbstractMonitorableTask {
150 238
		FLyrVect layer;
239

  
151 240
		File redFile;
241

  
152 242
		NetworkFileRedWriter netBuilder;
243
		
244
		
245

  
153 246
		/**
154 247
		 * Constructor
155
		 * */
156
		GenerateRedNetworkTask(FLyrVect layer, File redFile, NetworkFileRedWriter netBuilder){
248
		 */
249
		GenerateRedNetworkTask(FLyrVect layer, File redFile,
250
				NetworkFileRedWriter netBuilder) {
157 251
			this.layer = layer;
158 252
			this.redFile = redFile;
159 253
			this.netBuilder = netBuilder;
......
163 257
				numShapes = layer.getSource().getShapeCount();
164 258
				setFinalStep(numShapes);
165 259
				setDeterminatedProcess(true);
166
				setStatusMessage(PluginServices.
167
						getText(this, "Generando_red_a_partir_de_capa_lineal"));
260
				setStatusMessage(PluginServices.getText(this,
261
						"Generando_red_a_partir_de_capa_lineal"));
168 262
			} catch (DriverIOException e) {
169 263
				// TODO Auto-generated catch block
170 264
				e.printStackTrace();
171 265
			}
172
			
266

  
173 267
		}
174
		
268

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

  
183 278
		public String getNote() {
184
			return "Procesando linea..."  + 
185
			" " +
186
			getCurrentStep()+ 
187
			" "+
188
			"de"+
189
			" "+
190
			getFinishStep();
279
			return "Procesando linea..." + " " + getCurrentStep() + " " + "de"
280
					+ " " + getFinishStep();
191 281
		}
192 282

  
193 283
		public void cancel() {
194 284
			setCanceled(true);
195 285
		}
196 286
	}
197
	
198
	
199
	private void generateRedNetwork(FLyrVect lyr) {
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) {
200 364
		lyr.createSpatialIndex();
201 365
		NetworkFileRedWriter netBuilder = new NetworkFileRedWriter();
202 366
		// Por ahora, a pelo, pero hay que sacar un cuadro
......
205 369
		// en qu? tablas quiere escribir, y su formato
206 370
		// (dbf, postgres, etc)
207 371

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

  
213 375
		NetWizard wiz = new NetWizard(icon, lyr);
214 376
		PluginServices.getMDIManager().addWindow(wiz);
215
		if(!wiz.wasFinishPressed())
377
		if (!wiz.wasFinishPressed())
216 378
			return;
217
//		try {
218
			String fieldType = wiz.getFieldType();
219
			String fieldLength = wiz.getFieldLength();
220
			String fieldCost = wiz.getFieldCost();
221
			String fieldSense = wiz.getFieldSense();
222
			netBuilder.setLayer(lyr);
223
			netBuilder.setFieldType(fieldType);
224
			netBuilder.setFieldDist(fieldLength);
225
			netBuilder.setFieldSense(fieldSense);
226
			netBuilder.setFieldCost(fieldCost);
227
			File redFile = NetworkUtils.getNetworkFile(lyr);
228
			
229
			boolean cleanOrigLyr = wiz.getCleanOriginalLayer();
230
			boolean applySnap = wiz.getApplySnapTolerance();
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){
231 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);
232 409
			
233
//			netBuilder.createRedFile(lyr, redFile);
234
			
235
			GenerateRedNetworkTask task = new GenerateRedNetworkTask(lyr, redFile, netBuilder);
410
		}else{
411
			GenerateRedNetworkTask task = new GenerateRedNetworkTask(lyr, redFile,
412
					netBuilder);
236 413
			PluginServices.cancelableBackgroundExecution(task);
237
			
238
			
239
//		} catch (DriverException e1) {
240
//			// TODO Auto-generated catch block
241
//			e1.printStackTrace();
242
//
243
//		}
244
//		JOptionPane.showMessageDialog(null, PluginServices.getText(this, "done"));
245

  
414
		}
246 415
	}
247 416

  
248

  
249 417
	public boolean isEnabled() {
250 418
		return true;
251 419
	}
......
263 431
			MapContext mapa = model.getMapContext();
264 432
			FLayer[] activeLayers = mapa.getLayers().getActives();
265 433
			if (activeLayers.length > 0)
266
				if (activeLayers[0] instanceof FLyrVect){
434
				if (activeLayers[0] instanceof FLyrVect) {
267 435
					FLyrVect lyrVect = (FLyrVect) activeLayers[0];
268
					int shapeType ;
436
					int shapeType;
269 437
					try {
270 438
						shapeType = lyrVect.getShapeType();
271 439
						if (shapeType == FShape.LINE)
......
274 442
						// TODO Auto-generated catch block
275 443
						e.printStackTrace();
276 444
					}
277
				}	
445
				}
278 446
		}
279 447
		return false;
280 448

  

Also available in: Unified diff