Revision 4445 trunk/extensions/extCAD/src/com/iver/cit/gvsig/gui/cad/tools/SelectionCADTool.java

View differences:

SelectionCADTool.java
50 50
import com.iver.cit.gvsig.fmap.core.IFeature;
51 51
import com.iver.cit.gvsig.fmap.core.IGeometry;
52 52
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
53
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
53 54
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
54 55
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
55 56
import com.iver.cit.gvsig.fmap.layers.FBitSet;
......
65 66
import java.awt.event.InputEvent;
66 67
import java.awt.geom.Point2D;
67 68
import java.awt.geom.Rectangle2D;
69
import java.io.IOException;
68 70

  
69 71
import java.util.ArrayList;
70 72

  
......
84 86

  
85 87
	private String tool = "selection";
86 88

  
87
	private String state;
89
	private String nextState;
88 90

  
89 91
	/**
90 92
	 * Crea un nuevo LineCADTool.
......
108 110
	 *      double, double)
109 111
	 */
110 112
	public void transition(double x, double y, InputEvent event) {
111
		System.out.println("TRANSICION DESDE ESTADO " + getState() + " x= " + x
113
		System.out.println("TRANSICION DESDE ESTADO " + _fsm.getState() + " x= " + x
112 114
				+ " y=" + y);
113 115
		_fsm.addPoint(x, y, event);
116
		System.out.println("ESTADO ACTUAL: " + getStatus());
117
		
114 118
	}
115 119

  
116 120
	/*
......
133 137
		_fsm.addOption(s);
134 138
	}
135 139

  
136
	public String getState() {
137
		return state;
140
	public String getNextState() {
141
		return nextState;
138 142
	}
139 143

  
140
	public boolean select(double x, double y) {
141
		firstPoint = new Point2D.Double(x, y);
142 144

  
143
		FBitSet selection = getCadToolAdapter().getVectorialAdapter()
144
				.getSelection();
145
		VectorialLayerEdited vle = (VectorialLayerEdited) CADExtension
146
				.getEditionManager().getActiveLayerEdited();
147
		ArrayList selectedHandler = vle.getSelectedHandler();
148
		ArrayList selectedRow = vle.getSelectedRow();
149
		ArrayList selectedRowIndex = vle.getSelectedRowIndex();
150

  
151
		// Se comprueba si se pincha en una gemometr?a
152
		PluginServices.getMDIManager().setWaitCursor();
153

  
154
		double tam = getCadToolAdapter().getMapControl().getViewPort()
155
				.toMapDistance(tolerance);
156
		Rectangle2D rect = new Rectangle2D.Double(firstPoint.getX() - tam,
157
				firstPoint.getY() - tam, tam * 2, tam * 2);
158
		VectorialEditableAdapter vea = getCadToolAdapter()
159
				.getVectorialAdapter();
160
		String strEPSG = getCadToolAdapter().getMapControl().getViewPort()
161
				.getProjection().getAbrev().substring(5);
162
		IRowEdited[] feats;
163
		FBitSet prevSelection = (FBitSet) selection.clone();
164

  
165
		try {
166
			feats = vea.getFeatures(rect, strEPSG);
167
			selection.clear();
168

  
169
			for (int i = 0; i < feats.length; i++) {
170
				IFeature feat = (IFeature) feats[i].getLinkedRow();
171
				IGeometry geom = feat.getGeometry();
172

  
173
				if (geom.intersects(rect)) { // , 0.1)){
174
					selection.set(feats[i].getIndex(), true);
175
				}
176
			}
177
		} catch (DriverException e1) {
178
			e1.printStackTrace();
179
		}
180

  
181
		boolean isTheSame = false;
182

  
183
		if ((prevSelection.cardinality() != 0)
184
				&& selection.intersects(prevSelection)
185
				&& !selection.equals(prevSelection)) {
186
			selection = prevSelection;
187
			getCadToolAdapter().getVectorialAdapter().setSelection(selection);
188
			isTheSame = true;
189
		}
190

  
191
		if (selection.cardinality() > 0) {
192
			// Se comprueba si se pincha un handler. El m?s cercano (o los m?s
193
			// cercanos si hay empate)
194
			selectedRow.clear();
195
			selectedRowIndex.clear();
196
			selectedHandler.clear();
197
			vle.refreshSelectionCache(firstPoint, getCadToolAdapter());
198
		}
199

  
200
		PluginServices.getMDIManager().restoreCursor();
201

  
202
		if (((selection.cardinality() > 0) && (selectedHandler.size() > 0))
203
				|| isTheSame) {
204
			state = "Selection.EndPoint";
205
		} else if (selection.cardinality() > 0) {
206
			state = "Selection.FirstPoint";
207
		} else {
208
			state = "Selection.SecondPoint";
209
		}
210

  
211
		return true;
212
	}
213

  
214 145
	/**
215 146
	 * Equivale al transition del prototipo pero sin pasarle como par? metro el
216 147
	 * editableFeatureSource que ya estar? creado.
......
226 157
		SelectionCADToolState actualState = (SelectionCADToolState) _fsm
227 158
				.getPreviousState();
228 159
		String status = actualState.getName();
229
		FBitSet selection = getCadToolAdapter().getVectorialAdapter()
230
				.getSelection();
160
		System.out.println("PREVIOUSSTATE =" + status);
161
		/* FBitSet selection = getCadToolAdapter().getVectorialAdapter()
162
				.getSelection(); */
231 163
		VectorialLayerEdited vle = (VectorialLayerEdited) CADExtension
232 164
				.getEditionManager().getActiveLayerEdited();
233 165
		ArrayList selectedHandler = vle.getSelectedHandler();
234 166
		ArrayList selectedRow = vle.getSelectedRow();
235
		ArrayList selectedRowIndex = vle.getSelectedRowIndex();
167
		// ArrayList selectedRowIndex = vle.getSelectedRowIndex();
236 168

  
237
		try {
238 169
			if (status.equals("Selection.FirstPoint")) {
239 170
			} else if (status.equals("Selection.SecondPoint")) {
240 171
				lastPoint = new Point2D.Double(x, y);
241
				selection.clear();
172
				// selection.clear();
173
				selectedRow.clear();
242 174

  
243 175
				double x1;
244 176
				double y1;
......
267 199
						.getVectorialAdapter();
268 200
				String strEPSG = getCadToolAdapter().getMapControl()
269 201
						.getViewPort().getProjection().getAbrev().substring(5);
270
				IRowEdited[] feats = vea.getFeatures(rect, strEPSG);
202
				IRowEdited[] feats;
203
				try {
204
					feats = vea.getFeatures(rect, strEPSG);
271 205

  
272
				for (int i = 0; i < feats.length; i++) {
273
					IGeometry geom = ((IFeature) feats[i].getLinkedRow())
274
							.getGeometry();
275

  
276
					if (firstPoint.getX() < lastPoint.getX()) {
277
						if (rect.contains(geom.getBounds2D())) {
278
							selection.set(feats[i].getIndex(), true);
206
					for (int i = 0; i < feats.length; i++) {
207
						IGeometry geom = ((IFeature) feats[i].getLinkedRow())
208
								.getGeometry();
209
	
210
						if (firstPoint.getX() < lastPoint.getX()) {
211
							if (rect.contains(geom.getBounds2D())) {
212
								selectedRow.add(feats[i]);
213
							}
214
						} else {
215
							if (geom.intersects(rect)) { // , 0.1)){
216
								selectedRow.add(feats[i]);
217
							}
279 218
						}
280
					} else {
281
						if (geom.intersects(rect)) { // , 0.1)){
282
							selection.set(feats[i].getIndex(), true);
283
						}
284 219
					}
220
				} catch (DriverException e) {
221
					// TODO Auto-generated catch block
222
					e.printStackTrace();
285 223
				}
286 224

  
287 225
				PluginServices.getMDIManager().restoreCursor();
288
			} else if (status.equals("Selection.EndPoint")) {
226
				if (selectedRow.size() > 0)
227
				{
228
					nextState = "Selection.WithSelectedFeatures";
229
				}
230
				else 
231
					nextState = "Selection.FirstPoint";
232

  
233
			} else if (status.equals("Selection.WithHandlers")) {
289 234
				for (int i = 0; i < selectedRow.size(); i++) {
290
					DefaultFeature row = (DefaultFeature) selectedRow.get(i);
291
					int index = ((Integer) selectedRowIndex.get(i)).intValue();
235
					IRowEdited row = (IRowEdited) selectedRow.get(i);
236
					// int index = ((Integer) selectedRowIndex.get(i)).intValue();
292 237

  
293 238
					// Movemos los handlers que hemos seleccionado
294 239
					// previamente dentro del m?todo select()
......
297 242
						h.set(x, y);
298 243
					}
299 244

  
300
					modifyFeature(index, row);
245
					modifyFeature(row.getIndex(), (IFeature) row.getLinkedRow());
301 246
				}
302 247
			}
303
		} catch (DriverException e) {
304
			e.printStackTrace();
305
		}
306 248
	}
307 249

  
308 250
	/**
......
321 263
	public void drawOperation(Graphics g, double x, double y) {
322 264
		SelectionCADToolState actualState = _fsm.getState();
323 265
		String status = actualState.getName();
324
		FBitSet selection = getCadToolAdapter().getVectorialAdapter()
325
				.getSelection();
266
		/* FBitSet selection = getCadToolAdapter().getVectorialAdapter()
267
				.getSelection(); */
326 268
		VectorialLayerEdited vle = (VectorialLayerEdited) CADExtension
327 269
				.getEditionManager().getActiveLayerEdited();
328 270
		ArrayList selectedHandler = vle.getSelectedHandler();
329 271
		ArrayList selectedRow = vle.getSelectedRow();
330
		ArrayList selectedRowIndex = vle.getSelectedRowIndex();
272
		// ArrayList selectedRowIndex = vle.getSelectedRowIndex();
331 273

  
332
		if (selection.cardinality() == 0) {
274
		/* if (selection.cardinality() == 0) {
333 275
			selectedRow.clear();
334 276
			selectedRowIndex.clear();
335 277
			selectedHandler.clear();
336
		}
278
		} */
337 279

  
338 280
		drawHandlers(g, selectedRow, getCadToolAdapter().getMapControl()
339 281
				.getViewPort().getAffineTransform());
......
350 292
			ShapeFactory.createPolyline2D(elShape).draw((Graphics2D) g,
351 293
					getCadToolAdapter().getMapControl().getViewPort(),
352 294
					CADTool.selectSymbol);
353
		} else if (status.equals("Selection.EndPoint")) {
295
		} else if (status.equals("Selection.WithHandlers")) {
354 296
			// Movemos los handlers que hemos seleccionado
355 297
			// previamente dentro del m?todo select()
356 298
			for (int k = 0; k < selectedHandler.size(); k++) {
......
361 303
			// Y una vez movidos los v?rtices (handles)
362 304
			// redibujamos la nueva geometr?a.
363 305
			for (int i = 0; i < selectedRow.size(); i++) {
364
				IGeometry geom = ((IFeature) selectedRow.get(i)).getGeometry()
306
				IRowEdited rowEd = (IRowEdited) selectedRow.get(i);
307
				IGeometry geom = ((IFeature) rowEd.getLinkedRow()).getGeometry()
365 308
						.cloneGeometry();
366 309
				g.setColor(Color.gray);
367 310
				geom.draw((Graphics2D) g, getCadToolAdapter().getMapControl()
......
417 360
	public String getName() {
418 361
		return "SELECCION";
419 362
	}
363

  
364
	public boolean selectFeatures(double x, double y) {
365
		SelectionCADToolState actualState = (SelectionCADToolState) _fsm
366
		.getState();
367

  
368
		String status = actualState.getName();
369
		if (!status.equals("Selection.FirstPoint")) return true;
370
		
371
		firstPoint = new Point2D.Double(x, y);
372

  
373
//		FBitSet selection = getCadToolAdapter().getVectorialAdapter()
374
//				.getSelection();
375
		VectorialLayerEdited vle = (VectorialLayerEdited) CADExtension
376
				.getEditionManager().getActiveLayerEdited();
377
		ArrayList selectedRow = vle.getSelectedRow();
378
		ArrayList selectedHandler = vle.getSelectedHandler();
379
		selectedRow.clear();
380
		selectedHandler.clear();
381
		
382
		// ArrayList selectedRowIndex = vle.getSelectedRowIndex();
383

  
384
		// Se comprueba si se pincha en una gemometr?a
385
		PluginServices.getMDIManager().setWaitCursor();
386

  
387
		double tam = getCadToolAdapter().getMapControl().getViewPort()
388
				.toMapDistance(tolerance);
389
		Rectangle2D rect = new Rectangle2D.Double(firstPoint.getX() - tam,
390
				firstPoint.getY() - tam, tam * 2, tam * 2);
391
		VectorialEditableAdapter vea = getCadToolAdapter()
392
				.getVectorialAdapter();
393
		String strEPSG = getCadToolAdapter().getMapControl().getViewPort()
394
				.getProjection().getAbrev().substring(5);
395
		IRowEdited[] feats;
396
		 
397
		try {
398
			feats = vea.getFeatures(rect, strEPSG);
399
//			selection.clear();
400

  
401
			for (int i = 0; i < feats.length; i++) {
402
				IFeature feat = (IFeature) feats[i].getLinkedRow();
403
				IGeometry geom = feat.getGeometry();
404

  
405
				if (geom.intersects(rect)) { // , 0.1)){
406
//					selection.set(feats[i].getIndex(), true);
407
					selectedRow.add(feats[i]);
408
				}
409
			}
410
		} catch (DriverException e1) {
411
			e1.printStackTrace();
412
		}		
413
		PluginServices.getMDIManager().restoreCursor();
414
		if (selectedRow.size() > 0)
415
		{
416
			nextState = "Selection.WithSelectedFeatures";
417
			return true;
418
		}
419
		if (nextState.equals("Selection.SecondPoint"))
420
			nextState = "Selection.FirstPoint";
421
		else
422
			nextState = "Selection.SecondPoint";
423
		return true; // Truco de Vicente
424
	}
425

  
426
	public int selectHandlers(double x, double y) {
427
		// firstPoint = new Point2D.Double(x, y);
428
		
429
		Point2D auxPoint = new Point2D.Double(x, y);
430

  
431
		VectorialLayerEdited vle = (VectorialLayerEdited) CADExtension
432
				.getEditionManager().getActiveLayerEdited();
433
		ArrayList selectedHandler = vle.getSelectedHandler();
434
		ArrayList selectedRow = vle.getSelectedRow();
435
		System.out.println("DENTRO DE selectHandlers. selectedRow.size= " + selectedRow.size());
436
		selectedHandler.clear();
437
		
438
		// Se comprueba si se pincha en una gemometr?a
439
		PluginServices.getMDIManager().setWaitCursor();
440

  
441
		double tam = getCadToolAdapter().getMapControl().getViewPort()
442
				.toMapDistance(tolerance);
443
		
444
		Handler[] handlers = null;
445
		for (int i=0; i < selectedRow.size(); i++)
446
		{
447
			IRowEdited rowEd = (IRowEdited) selectedRow.get(i);
448
			
449
			IFeature fea = (IFeature) rowEd.getLinkedRow();
450
			handlers = fea.getGeometry().getHandlers(IGeometry.SELECTHANDLER);
451
			// y miramos los handlers de cada entidad seleccionada
452
			double min = tam;
453
			// int hSel = -1;
454
			for (int j = 0; j < handlers.length; j++) {
455
				Point2D handlerPoint = handlers[j].getPoint();
456
				double distance = auxPoint.distance(handlerPoint);
457
				if (distance <= min) {
458
					min = distance;
459
					//hSel = j;
460
					selectedHandler.add(handlers[j]);
461
				}
462
			}
463
		}
464
		PluginServices.getMDIManager().restoreCursor();
465
		
466
		int numHandlesSelected = selectedHandler.size();
467
		
468
		/* if (numHandlesSelected == 0)
469
			selectFeatures(x,y); */
470

  
471
		return numHandlesSelected;
472
	}
420 473
}

Also available in: Unified diff