Statistics
| Revision:

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

History | View | Annotate | Download (15.2 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.fmap.AtomicEvent;
15
import com.iver.cit.gvsig.fmap.AtomicEventListener;
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.IRow;
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.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.FLyrVect;
32
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
33
import com.iver.cit.gvsig.fmap.layers.LayerDrawingListener;
34
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
35
import com.iver.cit.gvsig.gui.cad.CADTool;
36
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
37
import com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool;
38
import com.vividsolutions.jts.geom.Geometry;
39

    
40
public class VectorialLayerEdited extends DefaultLayerEdited implements LayerDrawingListener{
41
        private ArrayList selectedHandler = new ArrayList();
42
        private ArrayList selectedRow = new ArrayList();
43
        private Point2D lastPoint;
44
        private Point2D firstPoint;
45
        private CADTool cadtool=null;
46

    
47
        public VectorialLayerEdited(FLayer lyr)
48
        {
49
                super(lyr);
50
                lyr.getFMap().addLayerDrawingListener(this);
51
        }
52

    
53
        public ArrayList getSelectedHandler() {
54
                return selectedHandler;
55
        }
56

    
57
        public ArrayList getSelectedRow() {
58
                return selectedRow;
59
        }
60

    
61
        public void clearSelection() {
62
                selectedHandler.clear();
63
                selectedRow.clear();
64
        }
65
        /**
66
         * @return Returns the selectedRow.
67
         */
68
        public IFeature[] getSelectedRowsCache() {
69
                return (IFeature[]) selectedRow.toArray(new IFeature[0]);
70
        }
71
        public void selectWithPoint(double x, double y){
72
                firstPoint = new Point2D.Double(x, y);
73
                VectorialEditableAdapter vea = getVEA();
74
                FBitSet selection = vea.getSelection();
75
                selectedRow.clear();
76
                selectedHandler.clear();
77

    
78
                // Se comprueba si se pincha en una gemometr?a
79
                ViewPort vp=getLayer().getFMap().getViewPort();
80
                double tam =vp.toMapDistance(SelectionCADTool.tolerance);
81
                Rectangle2D rect = new Rectangle2D.Double(firstPoint.getX() - tam,
82
                                firstPoint.getY() - tam, tam * 2, tam * 2);
83

    
84
                String strEPSG = vp.getProjection().getAbrev().substring(5);
85
                IRowEdited[] feats;
86

    
87
                try {
88
                        feats = vea.getFeatures(rect, strEPSG);
89
                        selection.clear();
90
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
91
                        Graphics2D gs = selectionImage.createGraphics();
92
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
93
                        Graphics2D gh = handlersImage.createGraphics();
94
                        for (int i = 0; i < feats.length; i++) {
95
                                IFeature feat = (IFeature) feats[i].getLinkedRow();
96
                                IGeometry geom = feat.getGeometry();
97

    
98
                                if (geom.intersects(rect)) { // , 0.1)){
99
                                        selection.set(feats[i].getIndex(), true);
100
                                        selectedRow.add(feats[i]);
101
                                        geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
102
                                        drawHandlers(geom.cloneGeometry(),gh,vp);
103
                                }
104
                        }
105
                        vea.setSelectionImage(selectionImage);
106
                        vea.setHandlersImage(handlersImage);
107
                } catch (DriverException e1) {
108
                        e1.printStackTrace();
109
                }
110

    
111
        }
112
        public void selectWithSecondPoint(double x, double y) {
113
                VectorialEditableAdapter vea = getVEA();
114
                FBitSet selection = vea.getSelection();
115
                lastPoint = new Point2D.Double(x, y);
116
                ViewPort vp=getLayer().getFMap().getViewPort();
117
                selection.clear();
118
                selectedRow.clear();
119

    
120
                double x1;
121
                double y1;
122
                double w1;
123
                double h1;
124

    
125
                if (firstPoint.getX() < lastPoint.getX()) {
126
                        x1 = firstPoint.getX();
127
                        w1 = lastPoint.getX() - firstPoint.getX();
128
                } else {
129
                        x1 = lastPoint.getX();
130
                        w1 = firstPoint.getX() - lastPoint.getX();
131
                }
132

    
133
                if (firstPoint.getY() < lastPoint.getY()) {
134
                        y1 = firstPoint.getY();
135
                        h1 = lastPoint.getY() - firstPoint.getY();
136
                } else {
137
                        y1 = lastPoint.getY();
138
                        h1 = firstPoint.getY() - lastPoint.getY();
139
                }
140

    
141
                Rectangle2D rect = new Rectangle2D.Double(x1, y1, w1, h1);
142

    
143
                String strEPSG = vp.getProjection().getAbrev().substring(5);
144
                IRowEdited[] feats;
145
                try {
146
                        feats = vea.getFeatures(rect, strEPSG);
147
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
148
                        Graphics2D gs = selectionImage.createGraphics();
149
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
150
                        Graphics2D gh = handlersImage.createGraphics();
151
                        for (int i = 0; i < feats.length; i++) {
152
                                IGeometry geom = ((IFeature) feats[i].getLinkedRow())
153
                                                .getGeometry();
154

    
155
                                if (firstPoint.getX() < lastPoint.getX()) {
156
                                        if (rect.contains(geom.getBounds2D())) {
157
                                                selectedRow.add(feats[i]);
158
                                                selection.set(feats[i].getIndex(), true);
159
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
160
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
161
                                        }
162
                                } else {
163
                                        if (geom.intersects(rect)) { // , 0.1)){
164
                                                selectedRow.add(feats[i]);
165
                                                selection.set(feats[i].getIndex(), true);
166
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
167
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
168
                                        }
169
                                }
170
                        }
171
                        vea.setSelectionImage(selectionImage);
172
                        vea.setHandlersImage(handlersImage);
173
                } catch (DriverException e) {
174
                        e.printStackTrace();
175
                }
176

    
177
        }
178
        public void selectInsidePolygon(IGeometry polygon) {
179
                VectorialEditableAdapter vea = getVEA();
180
                FBitSet selection = vea.getSelection();
181
                ViewPort vp=getLayer().getFMap().getViewPort();
182
                selection.clear();
183
                selectedRow.clear();
184
                Rectangle2D rect = polygon.getBounds2D();
185

    
186
                String strEPSG = vp.getProjection().getAbrev().substring(5);
187
                IRowEdited[] feats;
188
                try {
189
                        feats = vea.getFeatures(rect, strEPSG);
190
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
191
                        Graphics2D gs = selectionImage.createGraphics();
192
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
193
                        Graphics2D gh = handlersImage.createGraphics();
194
                        for (int i = 0; i < feats.length; i++) {
195
                                IGeometry geom = ((IFeature) feats[i].getLinkedRow())
196
                                        .getGeometry();
197
                                        if (contains(polygon,geom)) {
198
                                                selectedRow.add(feats[i]);
199
                                                selection.set(feats[i].getIndex(), true);
200
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
201
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
202
                                        }
203
                        }
204
                        vea.setSelectionImage(selectionImage);
205
                        vea.setHandlersImage(handlersImage);
206
                } catch (DriverException e) {
207
                        e.printStackTrace();
208
                }
209
        }
210

    
211
        public void selectCrossPolygon(IGeometry polygon) {
212
                VectorialEditableAdapter vea = getVEA();
213
                FBitSet selection = vea.getSelection();
214
                ViewPort vp=getLayer().getFMap().getViewPort();
215
                selection.clear();
216
                selectedRow.clear();
217
                Rectangle2D rect = polygon.getBounds2D();
218

    
219
                String strEPSG = vp.getProjection().getAbrev().substring(5);
220
                IRowEdited[] feats;
221
                try {
222
                        feats = vea.getFeatures(rect, strEPSG);
223
                        BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
224
                        Graphics2D gs = selectionImage.createGraphics();
225
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
226
                        Graphics2D gh = handlersImage.createGraphics();
227
                        for (int i = 0; i < feats.length; i++) {
228
                                IGeometry geom = ((IFeature) feats[i].getLinkedRow())
229
                                        .getGeometry();
230
                                        if (contains(polygon,geom) || intersects(polygon,geom)) {
231
                                                selectedRow.add(feats[i]);
232
                                                selection.set(feats[i].getIndex(), true);
233
                                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
234
                                                drawHandlers(geom.cloneGeometry(),gh,vp);
235
                                        }
236
                        }
237
                        vea.setSelectionImage(selectionImage);
238
                        vea.setHandlersImage(handlersImage);
239
                } catch (DriverException e) {
240
                        e.printStackTrace();
241
                }
242
        }
243

    
244
        public void selectOutPolygon(IGeometry polygon) {
245
                VectorialEditableAdapter vea = getVEA();
246
                FBitSet selection = vea.getSelection();
247
                ViewPort vp=getLayer().getFMap().getViewPort();
248
                selection.clear();
249
                selectedRow.clear();
250

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

    
304
        public void refreshSelectionCache(Point2D firstPoint,CADToolAdapter cta){
305
                VectorialEditableAdapter vea = getVEA();
306
                FBitSet selection = vea.getSelection();
307
                double min = java.lang.Double.MAX_VALUE;
308
//                 Cogemos las entidades seleccionadas
309
                clearSelection();
310
                ViewPort vp=getLayer().getFMap().getViewPort();
311
                BufferedImage selectionImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
312
                Graphics2D gs = selectionImage.createGraphics();
313
                BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(), vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
314
                Graphics2D gh = handlersImage.createGraphics();
315
                for (int i = selection.nextSetBit(0); i >= 0; i = selection
316
                                .nextSetBit(i + 1)) {
317
                        Handler[] handlers = null;
318

    
319
                        DefaultRowEdited dre = null;
320
                        try {
321
                                dre = (DefaultRowEdited)(vea.getRow(i));
322
                                IFeature feat=(DefaultFeature)dre.getLinkedRow();
323
                                IGeometry geom=feat.getGeometry();
324
                                handlers = geom.getHandlers(IGeometry.SELECTHANDLER);
325
                                selectedRow.add(dre);
326
                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
327
                                drawHandlers(geom.cloneGeometry(),gh,vp);
328
                                // y miramos los handlers de cada entidad seleccionada
329
                                min = cta.getMapControl().getViewPort()
330
                                                .toMapDistance(SelectionCADTool.tolerance);
331
                                for (int j = 0; j < handlers.length; j++) {
332
                                        Point2D handlerPoint = handlers[j].getPoint();
333
                                        double distance = firstPoint.distance(handlerPoint);
334
                                        if (distance <= min) {
335
                                                min = distance;
336
                                                selectedHandler.add(handlers[j]);
337
                                        }
338
                                }
339
                        } catch (DriverIOException e) {
340
                                e.printStackTrace();
341
                        } catch (IOException e) {
342
                                e.printStackTrace();
343
                        }
344
                }
345
                vea.setSelectionImage(selectionImage);
346
                vea.setHandlersImage(handlersImage);
347
        }
348

    
349
        public void drawHandlers(IGeometry geom, Graphics2D gs, ViewPort vp) {
350
                Handler[] handlers = geom.getHandlers(IGeometry.SELECTHANDLER);
351
                FGraphicUtilities.DrawHandlers(gs, vp.getAffineTransform(), handlers);
352
        }
353
        public Image getSelectionImage(){
354
                return getVEA().getSelectionImage();
355
        }
356
        public Image getHandlersImage() {
357
                return getVEA().getHandlersImage();
358
        }
359
        public VectorialEditableAdapter getVEA(){
360
                if (((FLyrVect)getLayer()).getSource() instanceof VectorialEditableAdapter)
361
                        return (VectorialEditableAdapter)((FLyrVect)getLayer()).getSource();
362
                else
363
                        return null;
364
        }
365

    
366
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
367
                if (((FLyrVect) getLayer()).getSource() instanceof VectorialEditableAdapter) {
368
                        VectorialEditableAdapter vea = (VectorialEditableAdapter) ((FLyrVect) getLayer())
369
                                        .getSource();
370
                        ViewPort vp = getLayer().getFMap().getViewPort();
371
                        BufferedImage selectionImage = new BufferedImage(
372
                                        vp.getImageWidth(), vp.getImageHeight(),
373
                                        BufferedImage.TYPE_INT_ARGB);
374
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
375
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
376
                        Graphics2D gs = selectionImage.createGraphics();
377
                        Graphics2D gh = handlersImage.createGraphics();
378
                        for (int i = 0; i < selectedRow.size(); i++) {
379
                                IFeature feat = (IFeature) ((IRowEdited) selectedRow.get(i))
380
                                                .getLinkedRow();
381
                                IGeometry geom = feat.getGeometry();
382
                                geom.cloneGeometry().draw(gs, vp, CADTool.drawingSymbol);
383
                                drawHandlers(geom.cloneGeometry(), gh, vp);
384
                        }
385
                        vea.setSelectionImage(selectionImage);
386
                        vea.setHandlersImage(handlersImage);
387
                }
388
        }
389

    
390
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
391
        }
392

    
393
        public void beforeGraphicLayerDraw(LayerDrawEvent e) throws CancelationException {
394
        }
395

    
396
        public void afterLayerGraphicDraw(LayerDrawEvent e) throws CancelationException {
397
        }
398
        private static boolean contains(IGeometry g1,IGeometry g2) {
399
                Geometry geometry1=g1.toJTSGeometry();
400
                Geometry geometry2=g2.toJTSGeometry();
401
                if (geometry1==null || geometry2==null)return false;
402
                return geometry1.contains(geometry2);
403
        }
404
        private static boolean intersects(IGeometry g1,IGeometry g2) {
405
                Geometry geometry1=g1.toJTSGeometry();
406
                Geometry geometry2=g2.toJTSGeometry();
407
                if (geometry1==null || geometry2==null)return false;
408
                return geometry1.intersects(geometry2);
409
        }
410

    
411
        public void activationGained(LayerEvent e) {
412

    
413
                if (cadtool!=null){
414
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
415
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
416
                }
417
        }
418

    
419
        public void activationLost(LayerEvent e) {
420
                try{
421
                        cadtool=CADExtension.getCADTool();
422
                }catch (EmptyStackException e1) {
423
                        cadtool=new SelectionCADTool();
424
                        cadtool.init();
425
                }
426

    
427
        }
428
}