Statistics
| Revision:

svn-gvsig-desktop / tags / v1_1_Build_1008 / extensions / extCAD / src / com / iver / cit / gvsig / layers / VectorialLayerEdited.java @ 12520

History | View | Annotate | Download (17.3 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.andami.ui.mdiManager.IWindow;
14
import com.iver.cit.gvsig.CADExtension;
15
import com.iver.cit.gvsig.StartEditing;
16
import com.iver.cit.gvsig.ViewCommandStackExtension;
17
import com.iver.cit.gvsig.fmap.DriverException;
18
import com.iver.cit.gvsig.fmap.ViewPort;
19
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
20
import com.iver.cit.gvsig.fmap.core.Handler;
21
import com.iver.cit.gvsig.fmap.core.IFeature;
22
import com.iver.cit.gvsig.fmap.core.IGeometry;
23
import com.iver.cit.gvsig.fmap.core.v02.FGraphicUtilities;
24
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
25
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
26
import com.iver.cit.gvsig.fmap.edition.IEditableSource;
27
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
28
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
29
import com.iver.cit.gvsig.fmap.layers.CancelationException;
30
import com.iver.cit.gvsig.fmap.layers.FBitSet;
31
import com.iver.cit.gvsig.fmap.layers.FLayer;
32
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
33
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
34
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
35
import com.iver.cit.gvsig.fmap.layers.LayerDrawingListener;
36
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
37
import com.iver.cit.gvsig.fmap.rendering.Legend;
38
import com.iver.cit.gvsig.gui.cad.CADTool;
39
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
40
import com.iver.cit.gvsig.gui.cad.DefaultCADTool;
41
import com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool;
42
import com.iver.cit.gvsig.project.documents.view.gui.View;
43
import com.vividsolutions.jts.geom.Geometry;
44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
429
        public void activationGained(LayerEvent e) {
430
                if (ViewCommandStackExtension.csd!=null){
431
                        ViewCommandStackExtension.csd.setModel(((IEditableSource) ((FLyrVect)getLayer()).getSource())
432
                                                        .getCommandRecord());
433
                }
434
                IWindow window=PluginServices.getMDIManager().getActiveWindow();
435
                if (window instanceof View){
436
                        View view=(View)window;
437
                        if (e.getSource().isEditing()){
438
                                view.showConsole();
439
                        }
440
                }
441
                if (cadtool!=null){
442
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
443
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
444
                        StartEditing.startCommandsApplicable(null,(FLyrVect)getLayer());
445
                        CADExtension.initFocus();
446
                }
447

    
448
        }
449

    
450
        public void activationLost(LayerEvent e) {
451
                try{
452
                        cadtool=CADExtension.getCADTool();
453
                        IWindow window=PluginServices.getMDIManager().getActiveWindow();
454
                        if (window instanceof View){
455
                                View view=(View)window;
456
                                view.hideConsole();
457
                        }
458
                }catch (EmptyStackException e1) {
459
                        cadtool=new SelectionCADTool();
460
                        cadtool.init();
461
                }
462

    
463
        }
464

    
465
        public ArrayList getSnappers() {
466
                return snappers;
467
        }
468

    
469
        public ArrayList getLayersToSnap() {
470
                return layersToSnap;
471
        }
472

    
473
        public void setLayersToSnap(ArrayList layersToSnap) {
474
                this.layersToSnap = layersToSnap;
475

    
476
        }
477

    
478
        public void setSelectionCache(ArrayList selectedRowAux) {
479
                clearSelection();
480
                VectorialEditableAdapter vea=getVEA();
481
                FBitSet selection=vea.getSelection();
482
                selectedRow.addAll(selectedRowAux);
483
                for (int i = 0;i < selectedRow.size(); i++) {
484
                          IRowEdited edRow = (IRowEdited) selectedRow.get(i);
485
                          selection.set(edRow.getIndex());
486
                }
487
        }
488

    
489
        public void setLegend(Legend legend) {
490
                this.legend=legend;
491
        }
492
        public Legend getLegend() {
493
                return legend;
494
        }
495
}