Revision 37504 branches/v2_0_0_prep/extensions/extEditing/src/org/gvsig/editing/gui/cad/tools/SelectionCADTool.java

View differences:

SelectionCADTool.java
26 26
import java.awt.geom.Point2D;
27 27
import java.util.ArrayList;
28 28

  
29
import org.cresques.cts.ICoordTrans;
29 30
import org.slf4j.Logger;
30 31
import org.slf4j.LoggerFactory;
31 32

  
......
41 42
import org.gvsig.fmap.dal.exception.ReadException;
42 43
import org.gvsig.fmap.dal.feature.EditableFeature;
43 44
import org.gvsig.fmap.dal.feature.Feature;
44
import org.gvsig.fmap.dal.feature.FeatureSelection;
45 45
import org.gvsig.fmap.dal.feature.FeatureSet;
46 46
import org.gvsig.fmap.dal.feature.FeatureStore;
47 47
import org.gvsig.fmap.dal.feature.exception.NeedEditingModeException;
......
70 70
    protected Point2D firstPoint;
71 71

  
72 72
    protected String nextState;
73
    // Registros de los que se ha seleccionado alg?n handler.
74
    protected ArrayList rowselectedHandlers = new ArrayList();
73
    
74
    // These two arrays are used to save the current selected features and
75
    // geometries. The selected geometries contains an instance of the
76
    // geometry that can be reprojected.
77
    protected ArrayList selectedGeometries = new ArrayList();
78
    protected ArrayList selectedFeatures = new ArrayList(); 
79
    
75 80
    protected String type = PluginServices.getText(this, "simple");
76 81

  
77 82
    protected boolean multipleSelection = false;
......
169 174
        DisposableIterator iterator = null;
170 175
        try {
171 176
            featureStore.beginEditingGroup(description);
172

  
173
            iterator =
174
                ((FeatureSelection) featureStore.getSelection()).fastIterator();
175

  
176
            while (iterator.hasNext()) {
177
                Feature feature = (Feature) iterator.next();
178

  
179
                Geometry geometry =
180
                    (feature.getDefaultGeometry()).cloneGeometry();
181

  
182
                // Movemos los handlers que hemos seleccionado
183
                // previamente dentro del m?todo select()
184
                Handler[] handlers =
185
                    geometry.getHandlers(Geometry.SELECTHANDLER);
177
            ICoordTrans coordTrans = getVLE().getLayer().getCoordTrans();
178
            for (int i=0 ; i<selectedFeatures.size() ; i++){
179
                Feature feature = (Feature) selectedFeatures.get(i);
180
                
181
                Geometry geometry = (Geometry)selectedGeometries.get(i);
182
                
183
                // Draw the moved geometry. It has been reprojected in the
184
                // select handler method
186 185
                for (int k = 0; k < selectedHandlers.size(); k++) {
187 186
                    Handler h = (Handler) selectedHandlers.get(k);
188
                    for (int j = 0; j < handlers.length; j++) {
189
                        if (h.getPoint().equals(handlers[j].getPoint())) {
190
                            handlers[j].set(x, y);
191
                        }
192
                    }
193
                }
187
                    h.set(x, y);
188
                }                            
189
                             
190
                //If the layer is reprojected, It is necessary
191
                //to reproject the geometry
192
                if (coordTrans != null){
193
                    geometry = geometry.cloneGeometry();
194
                    geometry.reProject(coordTrans.getInverted());
195
                }              
196
                
194 197
                EditableFeature eFeature = feature.getEditable();
195 198
                eFeature.setDefaultGeometry(geometry);
196 199
                featureStore.update(eFeature);
197

  
198 200
            }
199 201

  
200 202
            firstPoint = new Point2D.Double(x, y);
......
277 279

  
278 280
            return;
279 281
        } else
282
            //If there is a handler to move...
280 283
            if (status.equals("Selection.WithHandlers")) {
281
                // Movemos los handlers que hemos seleccionado
282
                // previamente dentro del m?todo select()
283
                double xPrev = 0;
284
                double yPrev = 0;
285
                for (int k = 0; k < selectedHandler.size(); k++) {
286
                    Handler h = (Handler) selectedHandler.get(k);
287
                    xPrev = h.getPoint().getX();
288
                    yPrev = h.getPoint().getY();
289
                    h.set(x, y);
290
                }
291
                // Y una vez movidos los v?rtices (handles)
292
                // redibujamos la nueva geometr?a.
293
                for (int i = 0; i < rowselectedHandlers.size(); i++) {
294
                    Feature feature = (Feature) rowselectedHandlers.get(i);
295

  
296
                    Geometry geom =
297
                        (feature.getDefaultGeometry()).cloneGeometry();
298
                    renderer.setColor(Color.gray);
299
                    renderer.draw(geom,
300
                        mapControlManager.getAxisReferenceSymbol());
301
                }
302
                for (int k = 0; k < selectedHandler.size(); k++) {
303
                    Handler h = (Handler) selectedHandler.get(k);
304
                    h.set(xPrev, yPrev);
305
                }
306
                return;
284
                drawWithHandlers(renderer, x, y, selectedHandler);
307 285
            }
308 286
    }
287
    
288
    /**
289
     * Draw method to draw a geometry with handlers
290
     * 
291
     * @param mapControlDrawer
292
     *            object used to draw.
293
     * @param x
294
     *            selected x coordinate.
295
     * @param y
296
     *            selected y coordinate.
297
     * @param selectedHandlers
298
     *            the selected handlers
299
     */
300
    protected void drawWithHandlers(MapControlDrawer mapControlDrawer, double x,
301
        double y, ArrayList selectedHandlers) {
302
        // Moving the handlers that have been selected
303
        // in the selectHandlers method
304
        double xPrev = 0;
305
        double yPrev = 0;
306
        for (int k = 0; k < selectedHandlers.size(); k++) {
307
            Handler h = (Handler) selectedHandlers.get(k);
308
            xPrev = h.getPoint().getX();
309
            yPrev = h.getPoint().getY();
310
            h.set(x, y);
311
        }
312
       
313
        // Draw the moved geometry. It has been reprojected in the
314
        // select handler method
315
        for (int i = 0; i < selectedGeometries.size(); i++) {
316
            Geometry geom = (Geometry) selectedGeometries.get(i);
309 317

  
318
            mapControlDrawer.setColor(Color.gray);
319
            mapControlDrawer.draw(geom,
320
                mapControlManager.getAxisReferenceSymbol());
321
        }
322
        for (int k = 0; k < selectedHandlers.size(); k++) {
323
            Handler h = (Handler) selectedHandlers.get(k);
324
            h.set(xPrev, yPrev);
325
        } 
326
    }
327

  
310 328
    /**
311 329
     * Add a diferent option.
312 330
     * 
......
410 428
        Point2D auxPoint = new Point2D.Double(x, y);
411 429

  
412 430
        VectorialLayerEdited vle = getVLE();
431
        
432
        //Gets the current selected handlers 
413 433
        ArrayList selectedHandler = vle.getSelectedHandler();
414 434
        FeatureSet selection = null;
415 435
        DisposableIterator iterator = null;
......
421 441
                countSel);
422 442
            selectedHandler.clear();
423 443

  
444
            //Clear the previous selection
445
            clearCurrentSelection();
446
            
424 447
            // Se comprueba si se pincha en una gemometr?a
425 448
            PluginServices.getMDIManager().setWaitCursor();
426 449

  
......
429 452
                    .toMapDistance(mapControlManager.getTolerance());
430 453

  
431 454
            Handler[] handlers = null;
432
            rowselectedHandlers.clear();
455
            
456
            
457
            selectedGeometries.clear();
433 458
            iterator = selection.fastIterator();
459
            ICoordTrans coordTrans = getVLE().getLayer().getCoordTrans();
434 460
            while (iterator.hasNext()) {
435 461
                Feature feature = (Feature) iterator.next();
436
                handlers =
437
                    (feature.getDefaultGeometry())
438
                        .getHandlers(Geometry.SELECTHANDLER);
462
                
463
                //If the layer is reprojected, the tolerance is not applicable. It is necessary
464
                //to reproject the geometry
465
                Geometry geometry = feature.getDefaultGeometry();
466
                if (coordTrans != null){
467
                    geometry = geometry.cloneGeometry();
468
                    geometry.reProject(coordTrans);
469
                }
470
                
471
                handlers = geometry.getHandlers(Geometry.SELECTHANDLER);
439 472

  
440 473
                // y miramos los handlers de cada entidad seleccionada
441 474
                double min = tam;
......
446 479
                    if (distance <= min) {
447 480
                        min = distance;
448 481
                        selectedHandler.add(handlers[j]);
449
                        rowselectedHandlers.add(feature);
482
                        selectedGeometries.add(geometry);
483
                        selectedFeatures.add(feature);
450 484
                    }
451 485
                }
452 486
            }
......
461 495

  
462 496
        return selectedHandler.size();
463 497
    }
498
    
499
    protected void clearCurrentSelection(){
500
        selectedFeatures.clear();
501
        selectedGeometries.clear();
502
    }
464 503

  
465 504
    public String getType() {
466 505
        return type;

Also available in: Unified diff