Statistics
| Revision:

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

History | View | Annotate | Download (15.7 KB)

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

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

    
12
import com.iver.andami.PluginServices;
13
import com.iver.cit.gvsig.CADExtension;
14
import com.iver.cit.gvsig.StartEditing;
15
import com.iver.cit.gvsig.ViewCommandStackExtension;
16
import com.iver.cit.gvsig.fmap.DriverException;
17
import com.iver.cit.gvsig.fmap.ViewPort;
18
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
19
import com.iver.cit.gvsig.fmap.core.Handler;
20
import com.iver.cit.gvsig.fmap.core.IFeature;
21
import com.iver.cit.gvsig.fmap.core.IGeometry;
22
import com.iver.cit.gvsig.fmap.core.v02.FGraphicUtilities;
23
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
24
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
25
import com.iver.cit.gvsig.fmap.edition.IEditableSource;
26
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
27
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
28
import com.iver.cit.gvsig.fmap.layers.CancelationException;
29
import com.iver.cit.gvsig.fmap.layers.FBitSet;
30
import com.iver.cit.gvsig.fmap.layers.FLayer;
31
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
32
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
33
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
34
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
35
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
36
import com.iver.cit.gvsig.fmap.layers.LayerDrawingListener;
37
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
38
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
39
import com.iver.cit.gvsig.gui.View;
40
import com.iver.cit.gvsig.gui.cad.CADTool;
41
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
42
import com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool;
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
        public VectorialLayerEdited(FLayer lyr)
53
        {
54
                super(lyr);
55
                lyr.getFMap().addLayerDrawingListener(this);
56
        }
57

    
58
        public ArrayList getSelectedHandler() {
59
                return selectedHandler;
60
        }
61

    
62
        public ArrayList getSelectedRow() {
63
                return selectedRow;
64
        }
65

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

    
83
                // Se comprueba si se pincha en una gemometr?a
84
                ViewPort vp=getLayer().getFMap().getViewPort();
85
                double tam =vp.toMapDistance(SelectionCADTool.tolerance);
86
                Rectangle2D rect = new Rectangle2D.Double(firstPoint.getX() - tam,
87
                                firstPoint.getY() - tam, tam * 2, tam * 2);
88

    
89
                String strEPSG = vp.getProjection().getAbrev().substring(5);
90
                IRowEdited[] feats;
91

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

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

    
116
        }
117
        public void selectWithSecondPoint(double x, double y) {
118
                VectorialEditableAdapter vea = getVEA();
119
                FBitSet selection = vea.getSelection();
120
                lastPoint = new Point2D.Double(x, y);
121
                ViewPort vp=getLayer().getFMap().getViewPort();
122
                selection.clear();
123
                selectedRow.clear();
124

    
125
                double x1;
126
                double y1;
127
                double w1;
128
                double h1;
129

    
130
                if (firstPoint.getX() < lastPoint.getX()) {
131
                        x1 = firstPoint.getX();
132
                        w1 = lastPoint.getX() - firstPoint.getX();
133
                } else {
134
                        x1 = lastPoint.getX();
135
                        w1 = firstPoint.getX() - lastPoint.getX();
136
                }
137

    
138
                if (firstPoint.getY() < lastPoint.getY()) {
139
                        y1 = firstPoint.getY();
140
                        h1 = lastPoint.getY() - firstPoint.getY();
141
                } else {
142
                        y1 = lastPoint.getY();
143
                        h1 = firstPoint.getY() - lastPoint.getY();
144
                }
145

    
146
                Rectangle2D rect = new Rectangle2D.Double(x1, y1, w1, h1);
147

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

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

    
182
        }
183
        public void selectInsidePolygon(IGeometry polygon) {
184
                VectorialEditableAdapter vea = getVEA();
185
                FBitSet selection = vea.getSelection();
186
                ViewPort vp=getLayer().getFMap().getViewPort();
187
                selection.clear();
188
                selectedRow.clear();
189
                Rectangle2D rect = polygon.getBounds2D();
190

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

    
216
        public void selectCrossPolygon(IGeometry polygon) {
217
                VectorialEditableAdapter vea = getVEA();
218
                FBitSet selection = vea.getSelection();
219
                ViewPort vp=getLayer().getFMap().getViewPort();
220
                selection.clear();
221
                selectedRow.clear();
222
                Rectangle2D rect = polygon.getBounds2D();
223

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

    
249
        public void selectOutPolygon(IGeometry polygon) {
250
                VectorialEditableAdapter vea = getVEA();
251
                FBitSet selection = vea.getSelection();
252
                ViewPort vp=getLayer().getFMap().getViewPort();
253
                selection.clear();
254
                selectedRow.clear();
255

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

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

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

    
354
        public void drawHandlers(IGeometry geom, Graphics2D gs, ViewPort vp) {
355
                if (!(getLayer() instanceof FLyrAnnotation)){
356
                        Handler[] handlers = geom.getHandlers(IGeometry.SELECTHANDLER);
357
                        FGraphicUtilities.DrawHandlers(gs, vp.getAffineTransform(), handlers);
358
                }
359
        }
360
        public Image getSelectionImage(){
361
                return getVEA().getSelectionImage();
362
        }
363
        public Image getHandlersImage() {
364
                return getVEA().getHandlersImage();
365
        }
366
        public VectorialEditableAdapter getVEA(){
367
                if (((FLyrVect)getLayer()).getSource() instanceof VectorialEditableAdapter)
368
                        return (VectorialEditableAdapter)((FLyrVect)getLayer()).getSource();
369
                else
370
                        return null;
371
        }
372

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

    
397
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
398
        }
399

    
400
        public void beforeGraphicLayerDraw(LayerDrawEvent e) throws CancelationException {
401
        }
402

    
403
        public void afterLayerGraphicDraw(LayerDrawEvent e) throws CancelationException {
404
        }
405
        private static boolean contains(IGeometry g1,IGeometry g2) {
406
                Geometry geometry1=g1.toJTSGeometry();
407
                Geometry geometry2=g2.toJTSGeometry();
408
                if (geometry1==null || geometry2==null)return false;
409
                return geometry1.contains(geometry2);
410
        }
411
        private static boolean intersects(IGeometry g1,IGeometry g2) {
412
                Geometry geometry1=g1.toJTSGeometry();
413
                Geometry geometry2=g2.toJTSGeometry();
414
                if (geometry1==null || geometry2==null)return false;
415
                return geometry1.intersects(geometry2);
416
        }
417

    
418
        public void activationGained(LayerEvent e) {
419
                if (ViewCommandStackExtension.csd!=null){
420
                        ViewCommandStackExtension.csd.setModel(((IEditableSource) ((FLyrVect)getLayer()).getSource())
421
                                                        .getCommandRecord());
422
                }
423

    
424
                if (cadtool!=null){
425
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
426
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
427
                        StartEditing.startCommandsApplicable(null,(FLyrVect)getLayer());
428
                }
429

    
430
        }
431

    
432
        public void activationLost(LayerEvent e) {
433
                try{
434
                        cadtool=CADExtension.getCADTool();
435
                }catch (EmptyStackException e1) {
436
                        cadtool=new SelectionCADTool();
437
                        cadtool.init();
438
                }
439

    
440
        }
441
}