Statistics
| Revision:

root / trunk / extensions / extCAD / src / com / iver / cit / gvsig / layers / VectorialLayerEdited.java @ 6312

History | View | Annotate | Download (16.8 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.fmap.rendering.Legend;
40
import com.iver.cit.gvsig.gui.View;
41
import com.iver.cit.gvsig.gui.cad.CADTool;
42
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
43
import com.iver.cit.gvsig.gui.cad.snapping.ISnapper;
44
import com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool;
45
import com.vividsolutions.jts.geom.Geometry;
46

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

    
54
        private ArrayList snappers = new ArrayList();
55
        private ArrayList layersToSnap = new ArrayList();
56
        private Legend legend;
57

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

    
66
        public ArrayList getSelectedHandler() {
67
                return selectedHandler;
68
        }
69

    
70
        public ArrayList getSelectedRow() {
71
                return selectedRow;
72
        }
73

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

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

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

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

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

    
135
                double x1;
136
                double y1;
137
                double w1;
138
                double h1;
139

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

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

    
156
                Rectangle2D rect = new Rectangle2D.Double(x1, y1, w1, h1);
157

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

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

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

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

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

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

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

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

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

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

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

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

    
407
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
408
        }
409

    
410
        public void beforeGraphicLayerDraw(LayerDrawEvent e) throws CancelationException {
411
        }
412

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

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

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

    
441
        }
442

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

    
451
        }
452

    
453
        public ArrayList getSnappers() {
454
                return snappers;
455
        }
456

    
457
        public ArrayList getLayersToSnap() {
458
                return layersToSnap;
459
        }
460

    
461
        public void setLayersToSnap(ArrayList layersToSnap) {
462
                this.layersToSnap = layersToSnap;
463

    
464
        }
465

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

    
477
        public void setLegend(Legend legend) {
478
                this.legend=legend;
479
        }
480
        public Legend getLegend() {
481
                return legend;
482
        }
483
}