Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / layers / VectorialLayerEdited.java @ 5985

History | View | Annotate | Download (16.7 KB)

1
package com.iver.cit.gvsig.layers;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.Image;
5
import java.awt.geom.Point2D;
6
import java.awt.geom.Rectangle2D;
7
import java.awt.image.BufferedImage;
8
import java.io.IOException;
9
import java.util.ArrayList;
10
import java.util.EmptyStackException;
11

    
12
import com.iver.andami.PluginServices;
13
import com.iver.cit.gvsig.CADExtension;
14
import com.iver.cit.gvsig.StartEditing;
15
import com.iver.cit.gvsig.ViewCommandStackExtension;
16
import com.iver.cit.gvsig.fmap.DriverException;
17
import com.iver.cit.gvsig.fmap.ViewPort;
18
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
19
import com.iver.cit.gvsig.fmap.core.Handler;
20
import com.iver.cit.gvsig.fmap.core.IFeature;
21
import com.iver.cit.gvsig.fmap.core.IGeometry;
22
import com.iver.cit.gvsig.fmap.core.v02.FGraphicUtilities;
23
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
24
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
25
import com.iver.cit.gvsig.fmap.edition.IEditableSource;
26
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
27
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
28
import com.iver.cit.gvsig.fmap.layers.CancelationException;
29
import com.iver.cit.gvsig.fmap.layers.FBitSet;
30
import com.iver.cit.gvsig.fmap.layers.FLayer;
31
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
32
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
33
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
34
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
35
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
36
import com.iver.cit.gvsig.fmap.layers.LayerDrawingListener;
37
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
38
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
39
import com.iver.cit.gvsig.gui.View;
40
import com.iver.cit.gvsig.gui.cad.CADTool;
41
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
42
import com.iver.cit.gvsig.gui.cad.snapping.ISnapper;
43
import com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool;
44
import com.vividsolutions.jts.geom.Geometry;
45

    
46
public class VectorialLayerEdited extends DefaultLayerEdited implements LayerDrawingListener{
47
        private ArrayList selectedHandler = new ArrayList();
48
        private ArrayList selectedRow = new ArrayList();
49
        private Point2D lastPoint;
50
        private Point2D firstPoint;
51
        private CADTool cadtool=null;
52

    
53
        private ArrayList snappers = new ArrayList();
54
        private ArrayList layersToSnap = new ArrayList();
55

    
56
        public VectorialLayerEdited(FLayer lyr)
57
        {
58
                super(lyr);
59
                lyr.getFMap().addLayerDrawingListener(this);
60
                // Por defecto, siempre hacemos snapping sobre la capa en edici?n.
61
                layersToSnap.add(lyr);
62
        }
63

    
64
        public ArrayList getSelectedHandler() {
65
                return selectedHandler;
66
        }
67

    
68
        public ArrayList getSelectedRow() {
69
                return selectedRow;
70
        }
71

    
72
        public void clearSelection() {
73
                selectedHandler.clear();
74
                selectedRow.clear();
75
                FBitSet selection=getVEA().getSelection();
76
                selection.clear();
77
        }
78
        /**
79
         * @return Returns the selectedRow.
80
         */
81
        public IFeature[] getSelectedRowsCache() {
82
                return (IFeature[]) selectedRow.toArray(new IFeature[0]);
83
        }
84
        public void selectWithPoint(double x, double y,boolean multipleSelection){
85
                firstPoint = new Point2D.Double(x, y);
86
                VectorialEditableAdapter vea = getVEA();
87
                FBitSet selection = vea.getSelection();
88
                if (!multipleSelection) {
89
                        clearSelection();
90
                }
91
                // Se comprueba si se pincha en una gemometr?a
92
                ViewPort vp=getLayer().getFMap().getViewPort();
93
                double tam =vp.toMapDistance(SelectionCADTool.tolerance);
94
                Rectangle2D rect = new Rectangle2D.Double(firstPoint.getX() - tam,
95
                                firstPoint.getY() - tam, tam * 2, tam * 2);
96

    
97
                String strEPSG = vp.getProjection().getAbrev().substring(5);
98
                IRowEdited[] feats;
99

    
100
                try {
101
                        feats = vea.getFeatures(rect, strEPSG);
102
                        selection.clear();
103
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
104
                        Graphics2D gs = selectionImage.createGraphics();
105
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
106
                        Graphics2D gh = handlersImage.createGraphics();
107
                        for (int i = 0; i < feats.length; i++) {
108
                                IFeature feat = (IFeature) feats[i].getLinkedRow();
109
                                IGeometry geom = feat.getGeometry();
110

    
111
                                if (geom.intersects(rect)) { // , 0.1)){
112
                                        selection.set(feats[i].getIndex(), true);
113
                                        selectedRow.add(feats[i]);
114
                                        geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
115
                                        drawHandlers(geom.cloneGeometry(),gh,vp);
116
                                }
117
                        }
118
                        vea.setSelectionImage(selectionImage);
119
                        vea.setHandlersImage(handlersImage);
120
                } catch (DriverException e1) {
121
                        e1.printStackTrace();
122
                }
123

    
124
        }
125
        public void selectWithSecondPoint(double x, double y) {
126
                VectorialEditableAdapter vea = getVEA();
127
                FBitSet selection = vea.getSelection();
128
                lastPoint = new Point2D.Double(x, y);
129
                ViewPort vp=getLayer().getFMap().getViewPort();
130
                selection.clear();
131
                selectedRow.clear();
132

    
133
                double x1;
134
                double y1;
135
                double w1;
136
                double h1;
137

    
138
                if (firstPoint.getX() < lastPoint.getX()) {
139
                        x1 = firstPoint.getX();
140
                        w1 = lastPoint.getX() - firstPoint.getX();
141
                } else {
142
                        x1 = lastPoint.getX();
143
                        w1 = firstPoint.getX() - lastPoint.getX();
144
                }
145

    
146
                if (firstPoint.getY() < lastPoint.getY()) {
147
                        y1 = firstPoint.getY();
148
                        h1 = lastPoint.getY() - firstPoint.getY();
149
                } else {
150
                        y1 = lastPoint.getY();
151
                        h1 = firstPoint.getY() - lastPoint.getY();
152
                }
153

    
154
                Rectangle2D rect = new Rectangle2D.Double(x1, y1, w1, h1);
155

    
156
                String strEPSG = vp.getProjection().getAbrev().substring(5);
157
                IRowEdited[] feats;
158
                try {
159
                        feats = vea.getFeatures(rect, strEPSG);
160
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
161
                        Graphics2D gs = selectionImage.createGraphics();
162
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
163
                        Graphics2D gh = handlersImage.createGraphics();
164
                        for (int i = 0; i < feats.length; i++) {
165
                                IGeometry geom = ((IFeature) feats[i].getLinkedRow())
166
                                                .getGeometry();
167

    
168
                                if (firstPoint.getX() < lastPoint.getX()) {
169
                                        if (rect.contains(geom.getBounds2D())) {
170
                                                selectedRow.add(feats[i]);
171
                                                selection.set(feats[i].getIndex(), true);
172
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
173
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
174
                                        }
175
                                } else {
176
                                        if (geom.intersects(rect)) { // , 0.1)){
177
                                                selectedRow.add(feats[i]);
178
                                                selection.set(feats[i].getIndex(), true);
179
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
180
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
181
                                        }
182
                                }
183
                        }
184
                        vea.setSelectionImage(selectionImage);
185
                        vea.setHandlersImage(handlersImage);
186
                } catch (DriverException e) {
187
                        e.printStackTrace();
188
                }
189

    
190
        }
191
        public void selectInsidePolygon(IGeometry polygon) {
192
                VectorialEditableAdapter vea = getVEA();
193
                FBitSet selection = vea.getSelection();
194
                ViewPort vp=getLayer().getFMap().getViewPort();
195
                selection.clear();
196
                selectedRow.clear();
197
                Rectangle2D rect = polygon.getBounds2D();
198

    
199
                String strEPSG = vp.getProjection().getAbrev().substring(5);
200
                IRowEdited[] feats;
201
                try {
202
                        feats = vea.getFeatures(rect, strEPSG);
203
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
204
                        Graphics2D gs = selectionImage.createGraphics();
205
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
206
                        Graphics2D gh = handlersImage.createGraphics();
207
                        for (int i = 0; i < feats.length; i++) {
208
                                IGeometry geom = ((IFeature) feats[i].getLinkedRow())
209
                                        .getGeometry();
210
                                        if (contains(polygon,geom)) {
211
                                                selectedRow.add(feats[i]);
212
                                                selection.set(feats[i].getIndex(), true);
213
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
214
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
215
                                        }
216
                        }
217
                        vea.setSelectionImage(selectionImage);
218
                        vea.setHandlersImage(handlersImage);
219
                } catch (DriverException e) {
220
                        e.printStackTrace();
221
                }
222
        }
223

    
224
        public void selectCrossPolygon(IGeometry polygon) {
225
                VectorialEditableAdapter vea = getVEA();
226
                FBitSet selection = vea.getSelection();
227
                ViewPort vp=getLayer().getFMap().getViewPort();
228
                selection.clear();
229
                selectedRow.clear();
230
                Rectangle2D rect = polygon.getBounds2D();
231

    
232
                String strEPSG = vp.getProjection().getAbrev().substring(5);
233
                IRowEdited[] feats;
234
                try {
235
                        feats = vea.getFeatures(rect, strEPSG);
236
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
237
                        Graphics2D gs = selectionImage.createGraphics();
238
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
239
                        Graphics2D gh = handlersImage.createGraphics();
240
                        for (int i = 0; i < feats.length; i++) {
241
                                IGeometry geom = ((IFeature) feats[i].getLinkedRow())
242
                                        .getGeometry();
243
                                        if (contains(polygon,geom) || intersects(polygon,geom)) {
244
                                                selectedRow.add(feats[i]);
245
                                                selection.set(feats[i].getIndex(), true);
246
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
247
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
248
                                        }
249
                        }
250
                        vea.setSelectionImage(selectionImage);
251
                        vea.setHandlersImage(handlersImage);
252
                } catch (DriverException e) {
253
                        e.printStackTrace();
254
                }
255
        }
256

    
257
        public void selectOutPolygon(IGeometry polygon) {
258
                VectorialEditableAdapter vea = getVEA();
259
                FBitSet selection = vea.getSelection();
260
                ViewPort vp=getLayer().getFMap().getViewPort();
261
                selection.clear();
262
                selectedRow.clear();
263

    
264
                try {
265
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
266
                        Graphics2D gs = selectionImage.createGraphics();
267
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
268
                        Graphics2D gh = handlersImage.createGraphics();
269
                        for (int i = 0; i < vea.getRowCount(); i++) {
270
                                IRowEdited rowEd=(IRowEdited)vea.getRow(i);
271
                                IGeometry geom = ((IFeature)rowEd.getLinkedRow())
272
                                                .getGeometry();
273
                                        if (!contains(polygon,geom) && !intersects(polygon,geom)) {
274
                                                selectedRow.add(rowEd);
275
                                                selection.set(rowEd.getIndex(), true);
276
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
277
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
278
                                        }
279
                        }
280
                        vea.setSelectionImage(selectionImage);
281
                        vea.setHandlersImage(handlersImage);
282
                } catch (DriverIOException e) {
283
                        e.printStackTrace();
284
                } catch (IOException e) {
285
                        e.printStackTrace();
286
                }
287
        }
288
        public void selectAll() {
289
                VectorialEditableAdapter vea = getVEA();
290
                FBitSet selection = vea.getSelection();
291
                ViewPort vp=getLayer().getFMap().getViewPort();
292
                selection.clear();
293
                selectedRow.clear();
294
                try {
295
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
296
                        Graphics2D gs = selectionImage.createGraphics();
297
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
298
                        Graphics2D gh = handlersImage.createGraphics();
299
                        for (int i = 0; i < vea.getRowCount(); i++) {
300
                                IRowEdited rowEd=(IRowEdited)vea.getRow(i);
301
                                IGeometry geom = ((IFeature)rowEd.getLinkedRow())
302
                                                .getGeometry();
303
                                selectedRow.add(rowEd);
304
                                selection.set(rowEd.getIndex(), true);
305
                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
306
                                drawHandlers(geom.cloneGeometry(),gh,vp);
307
                        }
308
                        vea.setSelectionImage(selectionImage);
309
                        vea.setHandlersImage(handlersImage);
310
                } catch (DriverIOException e) {
311
                        e.printStackTrace();
312
                } catch (IOException e) {
313
                        e.printStackTrace();
314
                }
315
        }
316

    
317
        public void refreshSelectionCache(Point2D firstPoint,CADToolAdapter cta){
318
                VectorialEditableAdapter vea = getVEA();
319
                FBitSet selection = vea.getSelection();
320
                double min = java.lang.Double.MAX_VALUE;
321
//                 Cogemos las entidades seleccionadas
322
                clearSelection();
323
                ViewPort vp=getLayer().getFMap().getViewPort();
324
                BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
325
                Graphics2D gs = selectionImage.createGraphics();
326
                BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
327
                Graphics2D gh = handlersImage.createGraphics();
328
                for (int i = selection.nextSetBit(0); i >= 0; i = selection
329
                                .nextSetBit(i + 1)) {
330
                        Handler[] handlers = null;
331

    
332
                        DefaultRowEdited dre = null;
333
                        try {
334
                                dre = (DefaultRowEdited)(vea.getRow(i));
335
                                IFeature feat=(DefaultFeature)dre.getLinkedRow();
336
                                IGeometry geom=feat.getGeometry();
337
                                handlers = geom.getHandlers(IGeometry.SELECTHANDLER);
338
                                selectedRow.add(dre);
339
                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
340
                                drawHandlers(geom.cloneGeometry(),gh,vp);
341
                                // y miramos los handlers de cada entidad seleccionada
342
                                min = cta.getMapControl().getViewPort()
343
                                                .toMapDistance(SelectionCADTool.tolerance);
344
                                for (int j = 0; j < handlers.length; j++) {
345
                                        Point2D handlerPoint = handlers[j].getPoint();
346
                                        double distance = firstPoint.distance(handlerPoint);
347
                                        if (distance <= min) {
348
                                                min = distance;
349
                                                selectedHandler.add(handlers[j]);
350
                                        }
351
                                }
352
                        } catch (DriverIOException e) {
353
                                e.printStackTrace();
354
                        } catch (IOException e) {
355
                                e.printStackTrace();
356
                        }
357
                }
358
                vea.setSelectionImage(selectionImage);
359
                vea.setHandlersImage(handlersImage);
360
        }
361

    
362
        public void drawHandlers(IGeometry geom, Graphics2D gs, ViewPort vp) {
363
                if (!(getLayer() instanceof FLyrAnnotation)){
364
                        Handler[] handlers = geom.getHandlers(IGeometry.SELECTHANDLER);
365
                        FGraphicUtilities.DrawHandlers(gs, vp.getAffineTransform(), handlers);
366
                }
367
        }
368
        public Image getSelectionImage(){
369
                return getVEA().getSelectionImage();
370
        }
371
        public Image getHandlersImage() {
372
                return getVEA().getHandlersImage();
373
        }
374
        public VectorialEditableAdapter getVEA(){
375
                if (((FLyrVect)getLayer()).getSource() instanceof VectorialEditableAdapter)
376
                        return (VectorialEditableAdapter)((FLyrVect)getLayer()).getSource();
377
                else
378
                        return null;
379
        }
380

    
381
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
382
                if (((FLyrVect) getLayer()).getSource() instanceof VectorialEditableAdapter) {
383
                        VectorialEditableAdapter vea = (VectorialEditableAdapter) ((FLyrVect) getLayer())
384
                                        .getSource();
385
                        ViewPort vp = getLayer().getFMap().getViewPort();
386
                        BufferedImage selectionImage = new BufferedImage(
387
                                        vp.getImageWidth(), vp.getImageHeight(),
388
                                        BufferedImage.TYPE_INT_ARGB);
389
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
390
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
391
                        Graphics2D gs = selectionImage.createGraphics();
392
                        Graphics2D gh = handlersImage.createGraphics();
393
                        for (int i = 0; i < selectedRow.size(); i++) {
394
                                IFeature feat = (IFeature) ((IRowEdited) selectedRow.get(i))
395
                                                .getLinkedRow();
396
                                IGeometry geom = feat.getGeometry();
397
                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
398
                                drawHandlers(geom.cloneGeometry(), gh, vp);
399
                        }
400
                        vea.setSelectionImage(selectionImage);
401
                        vea.setHandlersImage(handlersImage);
402
                }
403
        }
404

    
405
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
406
        }
407

    
408
        public void beforeGraphicLayerDraw(LayerDrawEvent e) throws CancelationException {
409
        }
410

    
411
        public void afterLayerGraphicDraw(LayerDrawEvent e) throws CancelationException {
412
        }
413
        private static boolean contains(IGeometry g1,IGeometry g2) {
414
                Geometry geometry1=g1.toJTSGeometry();
415
                Geometry geometry2=g2.toJTSGeometry();
416
                if (geometry1==null || geometry2==null)return false;
417
                return geometry1.contains(geometry2);
418
        }
419
        private static boolean intersects(IGeometry g1,IGeometry g2) {
420
                Geometry geometry1=g1.toJTSGeometry();
421
                Geometry geometry2=g2.toJTSGeometry();
422
                if (geometry1==null || geometry2==null)return false;
423
                return geometry1.intersects(geometry2);
424
        }
425

    
426
        public void activationGained(LayerEvent e) {
427
                if (ViewCommandStackExtension.csd!=null){
428
                        ViewCommandStackExtension.csd.setModel(((IEditableSource) ((FLyrVect)getLayer()).getSource())
429
                                                        .getCommandRecord());
430
                }
431

    
432
                if (cadtool!=null){
433
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
434
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
435
                        StartEditing.startCommandsApplicable(null,(FLyrVect)getLayer());
436
                        CADExtension.initFocus();
437
                }
438

    
439
        }
440

    
441
        public void activationLost(LayerEvent e) {
442
                try{
443
                        cadtool=CADExtension.getCADTool();
444
                }catch (EmptyStackException e1) {
445
                        cadtool=new SelectionCADTool();
446
                        cadtool.init();
447
                }
448

    
449
        }
450

    
451
        public ArrayList getSnappers() {
452
                return snappers;
453
        }
454

    
455
        public ArrayList getLayersToSnap() {
456
                return layersToSnap;
457
        }
458

    
459
        public void setLayersToSnap(ArrayList layersToSnap) {
460
                this.layersToSnap = layersToSnap;
461

    
462
        }
463

    
464
        public void setSelectionCache(ArrayList selectedRowAux) {
465
                clearSelection();
466
                VectorialEditableAdapter vea=getVEA();
467
                FBitSet selection=vea.getSelection();
468
                selectedRow.addAll(selectedRowAux);
469
                for (int i = 0;i < selectedRow.size(); i++) {
470
                          IRowEdited edRow = (IRowEdited) selectedRow.get(i);
471
                          selection.set(edRow.getIndex());
472
                }
473
        }
474

    
475
}