Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extEditing / src / org / gvsig / editing / gui / cad / tools / ScaleCADTool.java @ 30335

History | View | Annotate | Download (12.8 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 org.gvsig.editing.gui.cad.tools;
42

    
43
import java.awt.Image;
44
import java.awt.event.InputEvent;
45
import java.awt.geom.AffineTransform;
46
import java.awt.geom.Point2D;
47
import java.awt.geom.Point2D.Double;
48
import java.awt.image.ImagingOpException;
49
import java.util.ArrayList;
50

    
51
import org.gvsig.andami.PluginServices;
52
import org.gvsig.andami.messages.NotificationManager;
53
import org.gvsig.editing.CADExtension;
54
import org.gvsig.editing.gui.cad.CADTool;
55
import org.gvsig.editing.gui.cad.DefaultCADTool;
56
import org.gvsig.editing.gui.cad.exception.CommandException;
57
import org.gvsig.editing.gui.cad.tools.smc.ScaleCADToolContext;
58
import org.gvsig.editing.gui.cad.tools.smc.ScaleCADToolContext.ScaleCADToolState;
59
import org.gvsig.editing.layers.VectorialLayerEdited;
60
import org.gvsig.fmap.dal.exception.DataException;
61
import org.gvsig.fmap.dal.exception.ReadException;
62
import org.gvsig.fmap.dal.feature.DisposableIterator;
63
import org.gvsig.fmap.dal.feature.EditableFeature;
64
import org.gvsig.fmap.dal.feature.Feature;
65
import org.gvsig.fmap.dal.feature.FeatureSelection;
66
import org.gvsig.fmap.dal.feature.FeatureSet;
67
import org.gvsig.fmap.dal.feature.FeatureStore;
68
import org.gvsig.fmap.geom.Geometry;
69
import org.gvsig.fmap.geom.operation.Draw;
70
import org.gvsig.fmap.geom.operation.DrawOperationContext;
71
import org.gvsig.fmap.geom.operation.GeometryOperationException;
72
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
73
import org.gvsig.fmap.geom.util.UtilFunctions;
74
import org.gvsig.fmap.mapcontext.ViewPort;
75
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
76

    
77

    
78
/**
79
 * DOCUMENT ME!
80
 *
81
 * @author Vicente Caballero Navarro
82
 */
83
public class ScaleCADTool extends DefaultCADTool {
84
        private ScaleCADToolContext _fsm;
85
        private Point2D firstPoint;
86
        private Point2D lastPoint;
87
        private Point2D scalePoint;
88
        private Double orr;
89
        private Double frr;
90
        private Double ore;
91
        private Double fre;
92

    
93
        /**
94
         * Crea un nuevo PolylineCADTool.
95
         */
96
        public ScaleCADTool() {
97
        }
98

    
99
        /**
100
         * M?todo de incio, para poner el c?digo de todo lo que se requiera de una
101
         * carga previa a la utilizaci?n de la herramienta.
102
         */
103
        public void init() {
104
                _fsm = new ScaleCADToolContext(this);
105
        }
106

    
107
        /*
108
         * (non-Javadoc)
109
         *
110
         * @see com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap.layers.FBitSet,
111
         *      double, double)
112
         */
113
        public void transition(double x, double y, InputEvent event) {
114
                _fsm.addPoint(x, y, event);
115
        }
116

    
117
        /*
118
         * (non-Javadoc)
119
         *
120
         * @see com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap.layers.FBitSet,
121
         *      double)
122
         */
123
        public void transition(double d) {
124
                _fsm.addValue(d);
125
        }
126

    
127
        /*
128
         * (non-Javadoc)
129
         *
130
         * @see com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap.layers.FBitSet,
131
         *      java.lang.String)
132
         */
133
        public void transition(String s) throws CommandException {
134
                if (!super.changeCommand(s)) {
135
                        _fsm.addOption(s);
136
                }
137
        }
138

    
139
        /**
140
         * DOCUMENT ME!
141
         */
142
        public void selection() {
143
                FeatureSet selection = null;
144
                try {
145
                        selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
146
                        if (selection.getSize() == 0
147
                                        && !CADExtension
148
                                                        .getCADTool()
149
                                                        .getClass()
150
                                                        .getName()
151
                                                        .equals(
152
                                                                        "com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool")) {
153
                                CADExtension.setCADTool("_selection", false);
154
                                ((SelectionCADTool) CADExtension.getCADTool())
155
                                                .setNextTool("_scale");
156
                        }
157
                } catch (ReadException e) {
158
                        // TODO Auto-generated catch block
159
                        e.printStackTrace();
160
                } catch (DataException e) {
161
                        // TODO Auto-generated catch block
162
                        e.printStackTrace();
163
                }
164
        }
165

    
166
        /**
167
         * Equivale al transition del prototipo pero sin pasarle como par?metro el
168
         * editableFeatureSource que ya estar? creado.
169
         *
170
         * @param x
171
         *            par?metro x del punto que se pase en esta transici?n.
172
         * @param y
173
         *            par?metro y del punto que se pase en esta transici?n.
174
         */
175
        public void addPoint(double x, double y, InputEvent event) {
176
                ScaleCADToolState actualState = (ScaleCADToolState) _fsm
177
                                .getPreviousState();
178
                String status = actualState.getName();
179

    
180
                if (status.equals("Scale.PointMain")) {
181
                        firstPoint = new Point2D.Double(x, y);
182
                        scalePoint = firstPoint;
183
                } else if (status.equals("Scale.ScaleFactorOrReference")) {
184
                        PluginServices.getMDIManager().setWaitCursor();
185
                        lastPoint = new Point2D.Double(x, y);
186

    
187
                        // double w;
188
                        // double h;
189
                        // w = lastPoint.getX() - firstPoint.getX();
190
                        // h = lastPoint.getY() - firstPoint.getY();
191

    
192
                        try {
193
                                double size = getCadToolAdapter().getMapControl().getViewPort()
194
                                                .toMapDistance(
195
                                                                getCadToolAdapter().getMapControl().getWidth());
196
                                scale(firstPoint.distance(lastPoint) / (size / 40));
197
                        } catch (ReadException e) {
198
                                NotificationManager.addError(e.getMessage(), e);
199
                        }
200

    
201
                        PluginServices.getMDIManager().restoreCursor();
202
                } else if (status.equals("Scale.PointOriginOrScaleFactor")) {
203
                        orr = new Point2D.Double(x, y);
204
                } else if (status.equals("Scale.EndPointReference")) {
205
                        frr = new Point2D.Double(x, y);
206
                } else if (status.equals("Scale.OriginPointScale")) {
207
                        ore = new Point2D.Double(x, y);
208
                        firstPoint = ore;
209
                } else if (status.equals("Scale.EndPointScale")) {
210
                        fre = new Point2D.Double(x, y);
211

    
212
                        double distrr = orr.distance(frr);
213
                        double distre = ore.distance(fre);
214
                        double escalado = distre / distrr;
215

    
216
                        try {
217
                                scale(escalado);
218
                        } catch (ReadException e) {
219
                                NotificationManager.addError(e.getMessage(), e);
220
                        }
221
                }
222

    
223
        }
224

    
225
        /**
226
         * M?todo para dibujar la lo necesario para el estado en el que nos
227
         * encontremos.
228
         *
229
         * @param g
230
         *            Graphics sobre el que dibujar.
231
         * @param x
232
         *            par?metro x del punto que se pase para dibujar.
233
         * @param y
234
         *            par?metro x del punto que se pase para dibujar.
235
         */
236
        public void drawOperation(MapControlDrawer renderer, double x, double y) {
237
                ScaleCADToolState actualState = _fsm.getState();
238
                String status = actualState.getName();
239
                FeatureSet selection = null;
240
                DisposableIterator iterator = null;
241
                try {
242
                        selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
243

    
244
                        // ArrayList selectedRow = getSelectedRows();
245
                        Point2D currentPoint = new Point2D.Double(x, y);
246
                        long selectionCount = selection.getSize();
247
                        if (status.equals("Scale.ScaleFactorOrReference")) {
248
                                VectorialLayerEdited vle = getVLE();
249
                                ViewPort vp = vle.getLayer().getMapContext().getViewPort();
250
                                Point2D point = vp.fromMapPoint(firstPoint.getX(), firstPoint
251
                                                .getY());
252
                                double size = getCadToolAdapter().getMapControl().getViewPort()
253
                                                .toMapDistance(
254
                                                                getCadToolAdapter().getMapControl().getWidth());
255
                                double scale = firstPoint.distance(currentPoint) / (size / 40);
256
                                renderer.drawLine(firstPoint, currentPoint,
257
                                                mapControlManager.getAxisReferenceSymbol());
258
                                
259
                                if (selectionCount < CADTool.TOPGEOMETRY) {
260
                                        iterator = selection.iterator();
261
                                        while (iterator.hasNext()) {
262
                                                Feature feature = (Feature) iterator.next();
263

    
264
                                                // }
265
                                                // for (int i = 0; i < selectionCount; i++) {
266
                                                // DefaultFeature fea = (DefaultFeature)
267
                                                // ((DefaultRowEdited) selectedRow
268
                                                // .get(i)).getLinkedRow();
269
                                                Geometry geometry = (feature
270
                                                                .getDefaultGeometry()).cloneGeometry();
271

    
272
                                                UtilFunctions.scaleGeom(geometry, firstPoint, scale,
273
                                                                scale);
274

    
275
                                                renderer.draw(geometry, mapControlManager.getAxisReferenceSymbol());
276
                                        }
277

    
278
                                } else {
279
                                        AffineTransform at = new AffineTransform();
280
                                        at.setToTranslation(point.getX(), point.getY());
281
                                        at.scale(scale, scale);
282
                                        at.translate(-point.getX(), -point.getY());
283
                                        Image imgSel = vle.getSelectionImage();
284
                                        renderer.drawImage(imgSel, at);                                        
285
                                }
286
                                PluginServices.getMainFrame().getStatusBar().setMessage("5",
287
                                                "Factor = " + scale);
288
                        } else if (status.equals("Scale.EndPointScale")) {
289
                                VectorialLayerEdited vle = getVLE();
290
                                ViewPort vp = vle.getLayer().getMapContext().getViewPort();
291
                                Point2D point = vp.fromMapPoint(scalePoint.getX(), scalePoint
292
                                                .getY());
293

    
294
                                double distrr = orr.distance(frr);
295
                                double distre = ore.distance(currentPoint);
296
                                double escalado = distre / distrr;
297
                                if (selectionCount < CADTool.TOPGEOMETRY) {
298
                                        iterator = selection.iterator();
299
                                        while (iterator.hasNext()) {
300
                                                Feature feature = (Feature) iterator.next();
301
                                                // for (int i = 0; i < selectedRow.size(); i++) {
302
                                                // DefaultFeature fea = (DefaultFeature)
303
                                                // ((DefaultRowEdited) selectedRow
304
                                                // .get(i)).getLinkedRow();
305
                                                Geometry geometry = (feature
306
                                                                .getDefaultGeometry()).cloneGeometry();
307
                                                UtilFunctions.scaleGeom(geometry, scalePoint, escalado,
308
                                                                escalado);
309

    
310
                                                renderer.draw(geometry, mapControlManager.getAxisReferenceSymbol());
311
                                        }
312
                                } else {
313
                                        AffineTransform at = new AffineTransform();
314
                                        at.setToTranslation(point.getX(), point.getY());
315
                                        at.scale(escalado, escalado);
316
                                        at.translate(-point.getX(), -point.getY());
317
                                        Image imgSel = vle.getSelectionImage();
318
                                        renderer.drawImage(imgSel, at);                                        
319
                                }
320
                                renderer.drawLine(firstPoint, new Point2D.Double(x, y),
321
                                                mapControlManager.getAxisReferenceSymbol());
322
                        }
323
                } catch (DataException e) {
324
                        e.printStackTrace();
325
                } finally {
326
                        if (iterator != null) {
327
                                iterator.dispose();
328
                        }
329
                }
330
        }
331

    
332
        /**
333
         * Add a diferent option.
334
         *
335
         * @param s
336
         *            Diferent option.
337
         */
338
        public void addOption(String s) {
339
                ScaleCADToolState actualState = (ScaleCADToolState) _fsm
340
                                .getPreviousState();
341
                String status = actualState.getName();
342
                if (status.equals("Scale.ScaleFactorOrReference")) {
343
                        /*
344
                         * try { scale(2); } catch (DriverIOException e) { // TODO
345
                         * Auto-generated catch block e.printStackTrace(); } catch
346
                         * (IOException e) { // TODO Auto-generated catch block
347
                         * e.printStackTrace(); }
348
                         */
349
                }
350
        }
351

    
352
        /*
353
         * (non-Javadoc)
354
         *
355
         * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
356
         */
357
        public void addValue(double d) {
358
                ScaleCADToolState actualState = (ScaleCADToolState) _fsm
359
                                .getPreviousState();
360
                String status = actualState.getName();
361
                if (status.equals("Scale.ScaleFactorOrReference")) {
362
                        try {
363
                                scale(d);
364
                        } catch (ReadException e) {
365
                                NotificationManager.addError(e.getMessage(), e);
366
                        }
367
                }
368
        }
369

    
370
        private void scale(double scaleFactor) throws ReadException {
371
                VectorialLayerEdited vle = getVLE();
372
                DisposableIterator iterator = null;
373
                try {
374
                        FeatureStore featureStore = vle.getFeatureStore();
375

    
376
                        featureStore.beginEditingGroup(getName());
377
                        iterator = ((FeatureSelection) featureStore.getSelection())
378
                                        .iterator();
379
                        ArrayList selectedRowAux = new ArrayList();
380
                        while (iterator.hasNext()) {
381
                                Feature feature = (Feature) iterator.next();
382

    
383
                                // }
384
                                // for (int i = 0; i < selectedRow.size(); i++) {
385
                                // IRowEdited edRow = (IRowEdited) selectedRow.get(i);
386
                                // DefaultFeature fea = (DefaultFeature)
387
                                // edRow.getLinkedRow().cloneRow();
388
                                Geometry geometry = (feature.getDefaultGeometry())
389
                                                .cloneGeometry();
390
                                UtilFunctions.scaleGeom(geometry, scalePoint, scaleFactor,
391
                                                scaleFactor);
392

    
393
                                EditableFeature eFeature = feature.getEditable();
394
                                eFeature.setGeometry(featureStore.getDefaultFeatureType()
395
                                                .getDefaultGeometryAttributeName(), geometry);
396
                                featureStore.update(eFeature);
397

    
398
                                // vea.modifyRow(edRow.getIndex(),
399
                                // fea,getName(),EditionEvent.GRAPHIC);
400
                                selectedRowAux.add(feature);
401
                        }
402
                        featureStore.endEditingGroup();
403
                } catch (DataException e) {
404
                        // TODO Auto-generated catch block
405
                        e.printStackTrace();
406
                } finally {
407
                        if (iterator != null) {
408
                                iterator.dispose();
409
                        }
410
                }
411
                // vle.setSelectionCache(VectorialLayerEdited.NOTSAVEPREVIOUS,
412
                // selectedRowAux);
413
                // clearSelection();
414
                // selectedRow.addAll(selectedRowAux);
415
        }
416

    
417
        public String getName() {
418
                return PluginServices.getText(this, "scale_");
419
        }
420

    
421
        public String toString() {
422
                return "_scale";
423
        }
424

    
425
}