Statistics
| Revision:

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

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.LayerCollectionEvent;
35
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
36
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
37
import com.iver.cit.gvsig.fmap.layers.LayerDrawingListener;
38
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
39
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
40
import com.iver.cit.gvsig.fmap.rendering.Legend;
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.iver.cit.gvsig.project.documents.view.gui.View;
46
import com.vividsolutions.jts.geom.Geometry;
47

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

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

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

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

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

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

    
103
                String strEPSG = vp.getProjection().getAbrev().substring(5);
104
                IRowEdited[] feats;
105

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

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

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

    
139
                double x1;
140
                double y1;
141
                double w1;
142
                double h1;
143

    
144
                if (firstPoint.getX() < lastPoint.getX()) {
145
                        x1 = firstPoint.getX();
146
                        w1 = lastPoint.getX() - firstPoint.getX();
147
                } else {
148
                        x1 = lastPoint.getX();
149
                        w1 = firstPoint.getX() - lastPoint.getX();
150
                }
151

    
152
                if (firstPoint.getY() < lastPoint.getY()) {
153
                        y1 = firstPoint.getY();
154
                        h1 = lastPoint.getY() - firstPoint.getY();
155
                } else {
156
                        y1 = lastPoint.getY();
157
                        h1 = firstPoint.getY() - lastPoint.getY();
158
                }
159

    
160
                Rectangle2D rect = new Rectangle2D.Double(x1, y1, w1, h1);
161

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

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

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

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

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

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

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

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

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

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

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

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

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

    
414
        public void beforeGraphicLayerDraw(LayerDrawEvent e) throws CancelationException {
415
        }
416

    
417
        public void afterLayerGraphicDraw(LayerDrawEvent e) throws CancelationException {
418
        }
419
        private static boolean contains(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.contains(geometry2);
424
        }
425
        private static boolean intersects(IGeometry g1,IGeometry g2) {
426
                Geometry geometry1=g1.toJTSGeometry();
427
                Geometry geometry2=g2.toJTSGeometry();
428
                if (geometry1==null || geometry2==null)return false;
429
                return geometry1.intersects(geometry2);
430
        }
431

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

    
451
        }
452

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

    
466
        }
467

    
468
        public ArrayList getSnappers() {
469
                return snappers;
470
        }
471

    
472
        public ArrayList getLayersToSnap() {
473
                return layersToSnap;
474
        }
475

    
476
        public void setLayersToSnap(ArrayList layersToSnap) {
477
                this.layersToSnap = layersToSnap;
478

    
479
        }
480

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

    
492
        public void setLegend(Legend legend) {
493
                this.legend=legend;
494
        }
495
        public Legend getLegend() {
496
                return legend;
497
        }
498
}