Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extCAD / src / com / iver / cit / gvsig / gui / cad / DefaultCADTool.java @ 23424

History | View | Annotate | Download (17.3 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.gui.cad;
42

    
43
import java.awt.Color;
44
import java.awt.Graphics;
45
import java.awt.Graphics2D;
46
import java.awt.event.MouseEvent;
47
import java.awt.geom.AffineTransform;
48
import java.awt.geom.Point2D;
49
import java.awt.geom.Rectangle2D;
50
import java.awt.image.BufferedImage;
51
import java.util.ArrayList;
52
import java.util.Iterator;
53

    
54
import org.apache.log4j.Logger;
55
import org.gvsig.fmap.data.DataException;
56
import org.gvsig.fmap.data.ReadException;
57
import org.gvsig.fmap.data.commands.CommandsRecord;
58
import org.gvsig.fmap.data.feature.AbstractFeature;
59
import org.gvsig.fmap.data.feature.Feature;
60
import org.gvsig.fmap.data.feature.FeatureCollection;
61
import org.gvsig.fmap.data.feature.FeatureStore;
62
import org.gvsig.fmap.geom.Geometry;
63
import org.gvsig.fmap.geom.GeometryFactory;
64
import org.gvsig.fmap.geom.GeometryManager;
65
import org.gvsig.fmap.geom.handler.Handler;
66
import org.gvsig.fmap.geom.operation.Draw;
67
import org.gvsig.fmap.geom.operation.DrawOperationContext;
68
import org.gvsig.fmap.geom.operation.GeometryOperationException;
69
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
70
import org.gvsig.fmap.geom.primitive.DefaultEnvelope;
71
import org.gvsig.fmap.geom.primitive.Envelope;
72
import org.gvsig.fmap.geom.primitive.GeneralPathX;
73
import org.gvsig.fmap.mapcontext.ViewPort;
74
import org.gvsig.fmap.mapcontext.layers.SpatialCache;
75
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
76
import org.gvsig.fmap.mapcontext.rendering.symbols.FGraphicUtilities;
77
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
78
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbologyFactory;
79

    
80
import com.iver.andami.PluginServices;
81
import com.iver.andami.messages.NotificationManager;
82
import com.iver.cit.gvsig.CADExtension;
83
import com.iver.cit.gvsig.gui.cad.exception.CommandException;
84
import com.iver.cit.gvsig.layers.VectorialLayerEdited;
85
import com.iver.cit.gvsig.project.documents.view.gui.View;
86
import com.iver.utiles.console.JConsole;
87

    
88
/**
89
 * DOCUMENT ME!
90
 *
91
 * @author Vicente Caballero Navarro
92
 */
93
public abstract class DefaultCADTool implements CADTool {
94
        public static ISymbol selectionSymbol = SymbologyFactory.
95
        createDefaultSymbolByShapeType(Geometry.TYPES.GEOMETRY, new Color(255, 0,0, 100)); // Le ponemos una transparencia
96
        public static ISymbol axisReferencesSymbol = SymbologyFactory.
97
        createDefaultSymbolByShapeType(Geometry.TYPES.GEOMETRY, new Color(100, 100, 100, 100));
98
        public static ISymbol geometrySelectSymbol = SymbologyFactory.
99
        createDefaultSymbolByShapeType(Geometry.TYPES.GEOMETRY, Color.RED);
100
        public static ISymbol handlerSymbol = SymbologyFactory.
101
        createDefaultSymbolByShapeType(Geometry.TYPES.GEOMETRY, Color.ORANGE);
102
        private static Logger logger = Logger.getLogger(DefaultCADTool.class
103
                        .getName());
104
        private CADToolAdapter cadToolAdapter;
105

    
106
        private String question;
107

    
108
        private String[] currentdescriptions;
109

    
110
        private String tool = "selection";
111

    
112
        private DefaultCADTool previousTool;
113

    
114
        private ArrayList temporalCache = new ArrayList();
115
        protected GeometryFactory geomFactory=GeometryManager.getInstance().getGeometryFactory();
116
        public void addTemporalCache(Geometry geom) {
117
                temporalCache.add(geom);
118
                insertSpatialCache(geom);
119
        }
120
        public void clearTemporalCache() {
121
                Geometry[] geoms=(Geometry[])temporalCache.toArray(new Geometry[0]);
122
                for (int i=0;i<geoms.length;i++) {
123
                        removeSpatialCache(geoms[i]);
124
                }
125
                temporalCache.clear();
126
        }
127
        private void insertSpatialCache(Geometry geom) {
128
                VectorialLayerEdited vle = getVLE();
129
                SpatialCache spatialCache=((FLyrVect)vle.getLayer()).getSpatialCache();
130
                Envelope r=geom.getEnvelope();
131
                if (geom.getType()==Geometry.TYPES.POINT) {
132
                        r = new DefaultEnvelope(r.getMinimum(0),r.getMinimum(1),r.getMinimum(0)+1,r.getMinimum(1)+1);//Rectangle2D.Double(r.getX(),r.getY(),1,1);
133
                }
134
                spatialCache.insert(r,geom);
135

    
136
        }
137
        private void removeSpatialCache(Geometry geom) {
138
                VectorialLayerEdited vle = getVLE();
139
                SpatialCache spatialCache=((FLyrVect)vle.getLayer()).getSpatialCache();
140
                Envelope r=geom.getEnvelope();
141
                if (geom.getType()==Geometry.TYPES.POINT) {
142
                        r = new DefaultEnvelope(r.getMinimum(0),r.getMinimum(1),r.getMinimum(0)+1,r.getMinimum(1)+1);//Rectangle2D.Double(r.getX(),r.getY(),1,1);
143
                }
144
                spatialCache.remove(r,geom);
145

    
146
        }
147
        /**
148
         * DOCUMENT ME!
149
         */
150
        public void draw(Geometry geometry) {
151
                if (geometry != null) {
152
                        BufferedImage img = getCadToolAdapter().getMapControl().getImage();
153
                        Graphics2D gImag = (Graphics2D) img.getGraphics();
154
                        ViewPort vp = getCadToolAdapter().getMapControl().getViewPort();
155
                        DrawOperationContext doc=new DrawOperationContext();
156
                        doc.setGraphics((Graphics2D)gImag);
157
                        doc.setViewPort(vp);
158
                        doc.setSymbol(DefaultCADTool.geometrySelectSymbol);
159
                try {
160
                        geometry.cloneGeometry().invokeOperation(Draw.CODE,doc);
161
                        } catch (GeometryOperationNotSupportedException e) {
162
                                e.printStackTrace();
163
                        } catch (GeometryOperationException e) {
164
                                e.printStackTrace();
165
                        }
166
//                        geometry.draw(gImag, vp, DefaultCADTool.selectionSymbol);
167
                }
168
        }
169

    
170
        /**
171
         * DOCUMENT ME!
172
         *
173
         * @param cta
174
         *            DOCUMENT ME!
175
         */
176
        public void setCadToolAdapter(CADToolAdapter cta) {
177
                cadToolAdapter = cta;
178
        }
179

    
180
        /**
181
         * DOCUMENT ME!
182
         *
183
         * @return DOCUMENT ME!
184
         */
185
        public CADToolAdapter getCadToolAdapter() {
186
                return cadToolAdapter;
187
        }
188

    
189
        public VectorialLayerEdited getVLE() {
190
                return (VectorialLayerEdited) CADExtension.getEditionManager()
191
                                .getActiveLayerEdited();
192
        }
193

    
194
        /**
195
         * DOCUMENT ME!
196
         *
197
         * @param g
198
         *            DOCUMENT ME!
199
         * @param firstPoint
200
         *            DOCUMENT ME!
201
         * @param endPoint
202
         *            DOCUMENT ME!
203
         */
204
        public void drawLine(Graphics2D g, Point2D firstPoint, Point2D endPoint, ISymbol symbol) {
205
                GeneralPathX elShape = new GeneralPathX(GeneralPathX.WIND_EVEN_ODD, 2);
206
                elShape.moveTo(firstPoint.getX(), firstPoint.getY());
207
                elShape.lineTo(endPoint.getX(), endPoint.getY());
208
                GeometryFactory geomFactory=GeometryManager.getInstance().getGeometryFactory();
209
                DrawOperationContext doc=new DrawOperationContext();
210
                doc.setGraphics(g);
211
                doc.setViewPort(getCadToolAdapter().getMapControl().getViewPort());
212
                doc.setSymbol(symbol);
213
                try {
214
                        geomFactory.createPolyline2D(elShape).invokeOperation(Draw.CODE,doc);
215
                } catch (GeometryOperationNotSupportedException e) {
216
                        e.printStackTrace();
217
                } catch (GeometryOperationException e) {
218
                        e.printStackTrace();
219
                }
220
//                draw(g,
221
//                                getCadToolAdapter().getMapControl().getViewPort(),
222
//                                        symbol);
223
        }
224

    
225
        /**
226
         * DOCUMENT ME!
227
         *
228
         * @param geometry
229
         *            DOCUMENT ME!
230
         */
231
        public void addGeometry(Geometry geometry) {
232
                VectorialLayerEdited vle=getVLE();
233

    
234
                try {
235
                        FeatureStore featureStore = ((FLyrVect)vle.getLayer()).getFeatureStore();
236
                        // Deber?amos comprobar que lo que escribimos es correcto:
237
                        // Lo hacemos en el VectorialAdapter, justo antes de
238
                        // a?adir, borrar o modificar una feature
239
                        Feature feature=featureStore.createDefaultFeature(true);
240
//                        int numAttr = vea.getRecordset().getFieldCount();
241
//                        Value[] values = new Value[numAttr];
242
//                        for (int i = 0; i < numAttr; i++) {
243
//                                values[i] = ValueFactory.createNullValue();
244
//                        }
245
//                        String newFID = vea.getNewFID();
246
//                                DefaultFeature df = new DefaultFeature(geometry, values, newFID);
247
                        feature.editing();
248
                        feature.setGeometry(featureStore.getDefaultFeatureType().getDefaultGeometry(),geometry);
249
                        featureStore.insert(feature);
250
//                        int index = vea.addRow(df, getName(), EditionEvent.GRAPHIC);
251
//                                VectorialLayerEdited vle = getVLE();
252
                                clearSelection();
253
                                //ArrayList selectedRow = vle.getSelectedRow();
254

    
255

    
256
                                ViewPort vp = vle.getLayer().getMapContext().getViewPort();
257
                                BufferedImage selectionImage = new BufferedImage(vp
258
                                                .getImageWidth(), vp.getImageHeight(),
259
                                                BufferedImage.TYPE_INT_ARGB);
260
                                Graphics2D gs = selectionImage.createGraphics();
261
//                                int inversedIndex=vea.getInversedIndex(index);
262
                                FeatureCollection selection=(FeatureCollection)featureStore.getSelection();
263
//                                selection.add(feature);
264
//                                vle.addSelectionCache(new DefaultRowEdited(df,
265
//                                                IRowEdited.STATUS_ADDED, inversedIndex ));
266
//                                vea.getSelection().set(inversedIndex);
267
//                                Geometry geom = (Geometry)feature.getDefaultGeometry();
268
                                DrawOperationContext doc=new DrawOperationContext();
269
                                doc.setGraphics(gs);
270
                                doc.setViewPort(vp);
271
                                doc.setSymbol(DefaultCADTool.selectionSymbol);
272
                                geometry.cloneGeometry().invokeOperation(Draw.CODE,doc);
273
//                                draw(gs, vp, DefaultCADTool.selectionSymbol);
274
                                vle.drawHandlers(geometry.cloneGeometry(), gs, vp);
275
                                vle.setSelectionImage(selectionImage);
276
                                insertSpatialCache(geometry);
277
                } catch (ReadException e) {
278
                        NotificationManager.addError(e.getMessage(),e);
279
                        return;
280
                } catch (GeometryOperationNotSupportedException e) {
281
                        NotificationManager.addError(e.getMessage(),e);
282
                        return;
283
                } catch (GeometryOperationException e) {
284
                        NotificationManager.addError(e.getMessage(),e);
285
                        return;
286
                } catch (DataException e) {
287
                        NotificationManager.addError(e.getMessage(),e);
288
                        return;
289
                }
290
                draw(geometry.cloneGeometry());
291
        }
292

    
293

    
294

    
295
        /**
296
         * DOCUMENT ME!
297
         *
298
         * @param geometry
299
         *            DOCUMENT ME!
300
         */
301
        public void modifyFeature(Feature feature, Feature oldFeature) {
302
                try {
303
                        CommandsRecord cr=((FLyrVect)getVLE().getLayer()).getFeatureStore().getCommandsRecord();
304
                        cr.update(feature, oldFeature);
305
                } catch (ReadException e) {
306
                        NotificationManager.addError(e.getMessage(),e);
307
                }
308
                draw(((Geometry)feature.getDefaultGeometry()).cloneGeometry());
309
        }
310

    
311
        /**
312
         * DOCUMENT ME!
313
         *
314
         * @param geometry
315
         *            DOCUMENT ME!
316
         * @param values
317
         *            DOCUMENT ME!
318
         */
319
        public Feature addGeometry(Geometry geometry, Object[] values) {
320
//                int index = 0;
321
                try {
322
                FeatureStore featureStore = ((FLyrVect)getVLE().getLayer()).getFeatureStore();
323
                Feature feature=featureStore.createDefaultFeature(true);
324
                feature.editing();
325
                feature.setGeometry(featureStore.getDefaultFeatureType().getDefaultGeometry(),geometry);
326
                for (int i = 0; i < values.length; i++) {
327
                        feature.set(i,values[i]);
328
                }
329
                        featureStore.insert(feature);
330
                        return feature;
331
                } catch (DataException e) {
332
                        // TODO Auto-generated catch block
333
                        e.printStackTrace();
334
                }
335
//                try {
336
//                        String newFID = vea.getNewFID();
337
//                        DefaultFeature df = new DefaultFeature(geometry, values, newFID);
338
//                        index = vea.addRow(df, getName(), EditionEvent.GRAPHIC);
339
//                        insertSpatialCache(geometry);
340
//                } catch (ValidateRowException e) {
341
//                        NotificationManager.addError(e);
342
//                } catch (ReadException e) {
343
//                        NotificationManager.addError(e);
344
//                }
345
//                return vea.getInversedIndex(index);
346
                return null;
347
        }
348

    
349
        /**
350
         * Devuelve la cadena que corresponde al estado en el que nos encontramos.
351
         *
352
         * @return Cadena para mostrar por consola.
353
         */
354
        public String getQuestion() {
355
                return question;
356
        }
357

    
358
        /**
359
         * Actualiza la cadena que corresponde al estado actual.
360
         *
361
         * @param s
362
         *            Cadena que aparecer? en consola.
363
         */
364
        public void setQuestion(String s) {
365
                question = s;
366
                // ConsoleToken.addQuestion(s);
367
        }
368

    
369
        /**
370
         * Provoca un repintado "soft" de la capa activa en edici?n. Las capas por
371
         * debajo de ella no se dibujan de verdad, solo se dibuja la que est? en
372
         * edici?n y las que est?n por encima de ella en el TOC.
373
         */
374
        public void refresh() {
375
                // getCadToolAdapter().getMapControl().drawMap(false);
376
                getVLE().getLayer().setDirty(true);
377

    
378
                getCadToolAdapter().getMapControl().rePaintDirtyLayers();
379
        }
380

    
381
        /*
382
         * public void drawHandlers(Graphics g, FBitSet sel, AffineTransform at)
383
         * throws DriverIOException { for (int i = sel.nextSetBit(0); i >= 0; i =
384
         * sel.nextSetBit(i + 1)) { IGeometry ig =
385
         * getCadToolAdapter().getVectorialAdapter() .getShape(i).cloneGeometry();
386
         * if (ig == null) continue; Handler[] handlers =
387
         * ig.getHandlers(IGeometry.SELECTHANDLER);
388
         * FGraphicUtilities.DrawHandlers((Graphics2D) g, at, handlers); } }
389
         */
390
        public void drawHandlers(Graphics g, ArrayList selectedRows,
391
                        AffineTransform at) {
392
                FeatureCollection selection=null;
393
                try {
394
                        selection = (FeatureCollection)((FLyrVect)getVLE().getLayer()).getFeatureStore().getSelection();
395
                } catch (ReadException e) {
396
                        // TODO Auto-generated catch block
397
                        e.printStackTrace();
398
                }
399
                Iterator iterator=selection.iterator();
400
                while (iterator.hasNext()) {
401
                        Feature feature = (Feature) iterator.next();
402

    
403
//                }
404
//                for (int i = 0; i < selectedRows.size(); i++) {
405
//                        IRowEdited edRow = (IRowEdited) selectedRows.get(i);
406
//                        IFeature feat = (IFeature) edRow.getLinkedRow();
407
                        // IFeature feat = (IFeature) selectedRows.get(i);
408
                        Geometry ig = ((Geometry)feature.getDefaultGeometry()).cloneGeometry();
409
                        if (ig == null)
410
                                continue;
411
                        Handler[] handlers = ig.getHandlers(Geometry.SELECTHANDLER);
412
                        FGraphicUtilities.DrawHandlers((Graphics2D) g, at, handlers,DefaultCADTool.handlerSymbol);
413
                }
414
        }
415

    
416
        public void setDescription(String[] currentdescriptions) {
417
                this.currentdescriptions = currentdescriptions;
418
        }
419

    
420
        public String[] getDescriptions() {
421
                return currentdescriptions;
422
        }
423

    
424
        /*
425
         * (non-Javadoc)
426
         *
427
         * @see com.iver.cit.gvsig.gui.cad.CADTool#end()
428
         */
429
        public void end() {
430
                CADExtension.setCADTool("_selection", true);
431
                PluginServices.getMainFrame().setSelectedTool("_selection");
432
                CADTool cadtool=CADExtension.getCADTool();
433
                cadtool.setPreviosTool(this);
434
        }
435

    
436
        public void init() {
437
// jaume, should not be necessary
438
//                CADTool.drawingSymbol.setOutlined(true);
439
//                CADTool.drawingSymbol.setOutlineColor(Color.GREEN);
440

    
441
        }
442

    
443
//        protected ArrayList getSelectedRows() {
444
//                VectorialLayerEdited vle = getVLE();
445
//                ArrayList selectedRow = vle.getSelectedRow();
446
//                return selectedRow;
447
//        }
448

    
449
        protected ArrayList getSelectedHandlers() {
450
                VectorialLayerEdited vle = getVLE();
451
                ArrayList selectedHandlers = vle.getSelectedHandler();
452
                return selectedHandlers;
453
        }
454

    
455
        public void clearSelection() throws ReadException {
456
                VectorialLayerEdited vle = getVLE();
457
                FeatureCollection selection=(FeatureCollection)((FLyrVect)vle.getLayer()).getFeatureStore().getSelection();
458
//                ArrayList selectedRow = vle.getSelectedRow();
459
                ArrayList selectedHandlers = vle.getSelectedHandler();
460
                selection.clear();
461
                selectedHandlers.clear();
462
//                VectorialEditableAdapter vea = vle.getVEA();
463
//                FBitSet selection = vea.getSelection();
464
//                selection.clear();
465
                vle.setSelectionImage(null);
466
                vle.setHandlersImage(null);
467

    
468
        }
469

    
470
        public String getNextTool() {
471
                return tool;
472
        }
473

    
474
        public void setNextTool(String tool) {
475
                this.tool = tool;
476
        }
477

    
478
        public boolean changeCommand(String name) throws CommandException {
479
                CADTool[] cadtools = CADExtension.getCADTools();
480
                for (int i = 0; i < cadtools.length; i++) {
481
                        CADTool ct = cadtools[i];
482
                        if (name.equalsIgnoreCase(ct.getName())
483
                                        || name.equalsIgnoreCase(ct.toString())) {
484
                                int type = Geometry.TYPES.POINT;
485
                                try {
486
                                        type = ((FLyrVect) getVLE().getLayer()).getShapeType();
487
                                } catch (ReadException e) {
488
                                        throw new CommandException(e);
489
                                }
490
                                if (ct.isApplicable(type)) {
491
                                        getCadToolAdapter().setCadTool(ct);
492
                                        ct.init();
493
                                        View vista = (View) PluginServices.getMDIManager()
494
                                                        .getActiveWindow();
495
                                        vista.getConsolePanel().addText("\n" + ct.getName(),
496
                                                        JConsole.COMMAND);
497
                                        String question=ct.getQuestion();
498
                                        vista.getConsolePanel().addText(
499
                                                        "\n" + "#" + question + " > ", JConsole.MESSAGE);
500
                                        return true;
501
                                }
502
                                throw new CommandException(name);
503
                        }
504
                }
505
                return false;
506
        }
507

    
508
        public boolean isApplicable(int shapeType) {
509
                return true;
510
        }
511

    
512
        public abstract String toString();
513

    
514
        public void throwValueException(String s, double d) {
515
                View vista = (View) PluginServices.getMDIManager().getActiveWindow();
516
                vista.getConsolePanel().addText(s + " : " + d, JConsole.ERROR);
517
        }
518

    
519
        public void throwOptionException(String s, String o) {
520
                View vista = (View) PluginServices.getMDIManager().getActiveWindow();
521
                vista.getConsolePanel().addText(s + " : " + o, JConsole.ERROR);
522
        }
523

    
524
        public void throwPointException(String s, double x, double y) {
525
                View vista = (View) PluginServices.getMDIManager().getActiveWindow();
526
                vista.getConsolePanel().addText(s + " : " + " X = " + x + ", Y = " + y,
527
                                JConsole.ERROR);
528
        }
529

    
530
        public void setPreviosTool(DefaultCADTool tool) {
531
                previousTool=tool;
532
        }
533
        public void restorePreviousTool() {
534
                CADExtension.setCADTool(previousTool.toString(), true);
535
                PluginServices.getMainFrame().setSelectedTool(previousTool.toString());
536
        }
537
        public void endTransition(double x, double y, MouseEvent e) {
538
                // TODO Auto-generated method stub
539

    
540
        }
541

    
542
}