Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.editing.app / org.gvsig.editing.app.mainplugin / src / main / java / org / gvsig / editing / gui / cad / tools / ScaleCADTool.java @ 40557

History | View | Annotate | Download (17.7 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.editing.gui.cad.tools;
25

    
26
import java.awt.Image;
27
import java.awt.event.InputEvent;
28
import java.awt.geom.AffineTransform;
29
import java.awt.geom.Point2D;
30
import java.awt.geom.Point2D.Double;
31
import java.util.ArrayList;
32

    
33
import javax.swing.JOptionPane;
34

    
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

    
38
import org.gvsig.andami.PluginServices;
39
import org.gvsig.andami.messages.NotificationManager;
40
import org.gvsig.app.ApplicationLocator;
41
import org.gvsig.editing.CADExtension;
42
import org.gvsig.editing.gui.cad.CADTool;
43
import org.gvsig.editing.gui.cad.DefaultCADTool;
44
import org.gvsig.editing.gui.cad.exception.CommandException;
45
import org.gvsig.editing.gui.cad.tools.smc.ScaleCADToolContext;
46
import org.gvsig.editing.gui.cad.tools.smc.ScaleCADToolContext.ScaleCADToolState;
47
import org.gvsig.editing.layers.VectorialLayerEdited;
48
import org.gvsig.fmap.dal.exception.DataException;
49
import org.gvsig.fmap.dal.exception.ReadException;
50
import org.gvsig.fmap.dal.feature.EditableFeature;
51
import org.gvsig.fmap.dal.feature.Feature;
52
import org.gvsig.fmap.dal.feature.FeatureSelection;
53
import org.gvsig.fmap.dal.feature.FeatureSet;
54
import org.gvsig.fmap.dal.feature.FeatureStore;
55
import org.gvsig.fmap.geom.Geometry;
56
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
57
import org.gvsig.fmap.geom.exception.CreateGeometryException;
58
import org.gvsig.fmap.geom.primitive.Point;
59
import org.gvsig.fmap.geom.type.GeometryType;
60
import org.gvsig.fmap.mapcontext.ViewPort;
61
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
62
import org.gvsig.tools.dispose.DisposableIterator;
63

    
64
/**
65
 * DOCUMENT ME!
66
 * 
67
 * @author Vicente Caballero Navarro
68
 */
69
public class ScaleCADTool extends DefaultCADTool {
70

    
71
    private static Logger logger = LoggerFactory.getLogger(ScaleCADTool.class);
72
    
73
    private ScaleCADToolContext _fsm;
74
    private Point2D firstPoint;
75
    private Point2D lastPoint;
76
    private Point2D scalePoint;
77
    private Double orr;
78
    private Double frr;
79
    private Double ore;
80
    private Double fre;
81

    
82
    /**
83
     * M?todo de incio, para poner el c?digo de todo lo que se requiera de una
84
     * carga previa a la utilizaci?n de la herramienta.
85
     */
86
    public void init() {
87
        _fsm = new ScaleCADToolContext(this);
88
    }
89

    
90
    /*
91
     * (non-Javadoc)
92
     * 
93
     * @see
94
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
95
     * .layers.FBitSet,
96
     * double, double)
97
     */
98
    public void transition(double x, double y, InputEvent event) {
99
        _fsm.addPoint(x, y, event);
100
    }
101

    
102
    /*
103
     * (non-Javadoc)
104
     * 
105
     * @see
106
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
107
     * .layers.FBitSet,
108
     * double)
109
     */
110
    public void transition(double d) {
111
        _fsm.addValue(d);
112
    }
113

    
114
    /*
115
     * (non-Javadoc)
116
     * 
117
     * @see
118
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
119
     * .layers.FBitSet,
120
     * java.lang.String)
121
     */
122
    public void transition(String s) throws CommandException {
123
        if (!super.changeCommand(s)) {
124
            _fsm.addOption(s);
125
        }
126
    }
127

    
128
    /**
129
     * DOCUMENT ME!
130
     */
131
    public void selection() {
132
        FeatureSet selection = null;
133
        try {
134
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
135
            if (selection.getSize() == 0
136
                && !SelectionCADTool.isInstance(CADExtension.getCADTool(), true)) {
137
                CADExtension.setCADTool("_selection", false);
138
                ((SelectionCADTool) CADExtension.getCADTool())
139
                    .setNextTool("_scale");
140
            }
141
        } catch (ReadException e) {
142
            // TODO Auto-generated catch block
143
            e.printStackTrace();
144
        } catch (DataException e) {
145
            // TODO Auto-generated catch block
146
            e.printStackTrace();
147
        }
148
    }
149

    
150
    /**
151
     * Equivale al transition del prototipo pero sin pasarle como par?metro el
152
     * editableFeatureSource que ya estar? creado.
153
     * 
154
     * @param x
155
     *            par?metro x del punto que se pase en esta transici?n.
156
     * @param y
157
     *            par?metro y del punto que se pase en esta transici?n.
158
     */
159
    public void addPoint(double x, double y, InputEvent event) {
160
        ScaleCADToolState actualState =
161
            (ScaleCADToolState) _fsm.getPreviousState();
162
        String status = actualState.getName();
163

    
164
        if (status.equals("Scale.PointMain")) {
165
            firstPoint = new Point2D.Double(x, y);
166
            scalePoint = firstPoint;
167
        } else
168
            if (status.equals("Scale.ScaleFactorOrReference")) {
169
                PluginServices.getMDIManager().setWaitCursor();
170
                lastPoint = new Point2D.Double(x, y);
171

    
172
                // double w;
173
                // double h;
174
                // w = lastPoint.getX() - firstPoint.getX();
175
                // h = lastPoint.getY() - firstPoint.getY();
176

    
177
                try {
178
                    double size =
179
                        getCadToolAdapter()
180
                            .getMapControl()
181
                            .getViewPort()
182
                            .toMapDistance(
183
                                getCadToolAdapter().getMapControl().getWidth());
184
                    scale(firstPoint.distance(lastPoint) / (size / 40));
185
                } catch (ReadException e) {
186
                    NotificationManager.addError(e.getMessage(), e);
187
                }
188

    
189
                PluginServices.getMDIManager().restoreCursor();
190
            } else
191
                if (status.equals("Scale.PointOriginOrScaleFactor")) {
192
                    orr = new Point2D.Double(x, y);
193
                } else
194
                    if (status.equals("Scale.EndPointReference")) {
195
                        frr = new Point2D.Double(x, y);
196
                    } else
197
                        if (status.equals("Scale.OriginPointScale")) {
198
                            ore = new Point2D.Double(x, y);
199
                            firstPoint = ore;
200
                        } else
201
                            if (status.equals("Scale.EndPointScale")) {
202
                                fre = new Point2D.Double(x, y);
203

    
204
                                double distrr = orr.distance(frr);
205
                                double distre = ore.distance(fre);
206
                                double escalado = distre / distrr;
207

    
208
                                try {
209
                                    scale(escalado);
210
                                } catch (ReadException e) {
211
                                    NotificationManager.addError(
212
                                        e.getMessage(), e);
213
                                }
214
                            }
215

    
216
    }
217

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

    
237
            // ArrayList selectedRow = getSelectedRows();
238
            Point2D currentPoint = new Point2D.Double(x, y);
239
            long selectionCount = selection.getSize();
240
            if (status.equals("Scale.ScaleFactorOrReference")) {
241
                VectorialLayerEdited vle = getVLE();
242
                ViewPort vp = vle.getLayer().getMapContext().getViewPort();
243
                Point2D point =
244
                    vp.fromMapPoint(firstPoint.getX(), firstPoint.getY());
245
                double size =
246
                    getCadToolAdapter()
247
                        .getMapControl()
248
                        .getViewPort()
249
                        .toMapDistance(
250
                            getCadToolAdapter().getMapControl().getWidth());
251
                double scale = firstPoint.distance(currentPoint) / (size / 40);
252
                renderer.drawLine(firstPoint, currentPoint,
253
                    mapControlManager.getAxisReferenceSymbol());
254

    
255
                if (selectionCount < CADTool.TOPGEOMETRY) {
256
                    iterator = selection.iterator();
257
                    while (iterator.hasNext()) {
258
                        Feature feature = (Feature) iterator.next();
259

    
260
                        // }
261
                        // for (int i = 0; i < selectionCount; i++) {
262
                        // DefaultFeature fea = (DefaultFeature)
263
                        // ((DefaultRowEdited) selectedRow
264
                        // .get(i)).getLinkedRow();
265
                        Geometry geometry =
266
                            (feature.getDefaultGeometry()).cloneGeometry();
267

    
268
                        try {
269
                            Point po = geomManager.createPoint(
270
                                firstPoint.getX(),
271
                                firstPoint.getY(),
272
                                SUBTYPES.GEOM2D);
273
                            
274
                            geometry.scale(po, scale, scale);
275
                        } catch (CreateGeometryException cge) {
276
                            logger.info("Error while scaling geometry", cge);
277
                            ApplicationLocator.getManager().message("Unable to scale geometry",
278
                                JOptionPane.ERROR_MESSAGE);
279
                        }
280

    
281
                        renderer.draw(geometry,
282
                            mapControlManager.getAxisReferenceSymbol());
283
                    }
284

    
285
                } else {
286
                    AffineTransform at = new AffineTransform();
287
                    at.setToTranslation(point.getX(), point.getY());
288
                    at.scale(scale, scale);
289
                    at.translate(-point.getX(), -point.getY());
290
                    Image imgSel = vle.getSelectionImage();
291
                    renderer.drawImage(imgSel, at);
292
                }
293
                PluginServices.getMainFrame().getStatusBar()
294
                    .setMessage("5", "Factor = " + scale);
295
            } else
296
                if (status.equals("Scale.EndPointScale")) {
297
                    VectorialLayerEdited vle = getVLE();
298
                    ViewPort vp = vle.getLayer().getMapContext().getViewPort();
299
                    Point2D point =
300
                        vp.fromMapPoint(scalePoint.getX(), scalePoint.getY());
301

    
302
                    double distrr = orr.distance(frr);
303
                    double distre = ore.distance(currentPoint);
304
                    double escalado = distre / distrr;
305
                    if (selectionCount < CADTool.TOPGEOMETRY) {
306
                        iterator = selection.iterator();
307
                        while (iterator.hasNext()) {
308
                            Feature feature = (Feature) iterator.next();
309
                            // for (int i = 0; i < selectedRow.size(); i++) {
310
                            // DefaultFeature fea = (DefaultFeature)
311
                            // ((DefaultRowEdited) selectedRow
312
                            // .get(i)).getLinkedRow();
313
                            Geometry geometry =
314
                                (feature.getDefaultGeometry()).cloneGeometry();
315

    
316
                            try {
317
                                Point po = geomManager.createPoint(
318
                                    scalePoint.getX(),
319
                                    scalePoint.getY(),
320
                                    SUBTYPES.GEOM2D);
321
                                
322
                                geometry.scale(po, escalado, escalado);
323
                            } catch (CreateGeometryException cge) {
324
                                logger.info("Error while scaling geometry", cge);
325
                                ApplicationLocator.getManager().message("Unable to scale geometry",
326
                                    JOptionPane.ERROR_MESSAGE);
327
                            }
328

    
329
                            renderer.draw(geometry,
330
                                mapControlManager.getAxisReferenceSymbol());
331
                        }
332
                    } else {
333
                        AffineTransform at = new AffineTransform();
334
                        at.setToTranslation(point.getX(), point.getY());
335
                        at.scale(escalado, escalado);
336
                        at.translate(-point.getX(), -point.getY());
337
                        Image imgSel = vle.getSelectionImage();
338
                        renderer.drawImage(imgSel, at);
339
                    }
340
                    renderer.drawLine(firstPoint, new Point2D.Double(x, y),
341
                        mapControlManager.getAxisReferenceSymbol());
342
                }
343
        } catch (DataException e) {
344
            e.printStackTrace();
345
        } finally {
346
            if (iterator != null) {
347
                iterator.dispose();
348
            }
349
        }
350
    }
351

    
352
    /**
353
     * Add a diferent option.
354
     * 
355
     * @param s
356
     *            Diferent option.
357
     */
358
    public void addOption(String s) {
359
        ScaleCADToolState actualState =
360
            (ScaleCADToolState) _fsm.getPreviousState();
361
        String status = actualState.getName();
362
        if (status.equals("Scale.ScaleFactorOrReference")) {
363
            /*
364
             * try { scale(2); } catch (DriverIOException e) { // TODO
365
             * Auto-generated catch block e.printStackTrace(); } catch
366
             * (IOException e) { // TODO Auto-generated catch block
367
             * e.printStackTrace(); }
368
             */
369
        }
370
    }
371

    
372
    /*
373
     * (non-Javadoc)
374
     * 
375
     * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
376
     */
377
    public void addValue(double d) {
378
        ScaleCADToolState actualState =
379
            (ScaleCADToolState) _fsm.getPreviousState();
380
        String status = actualState.getName();
381
        if (status.equals("Scale.ScaleFactorOrReference")) {
382
            try {
383
                scale(d);
384
            } catch (ReadException e) {
385
                NotificationManager.addError(e.getMessage(), e);
386
            }
387
        }
388
    }
389

    
390
    private void scale(double scaleFactor) throws ReadException {
391
        VectorialLayerEdited vle = getVLE();
392
        DisposableIterator iterator = null;
393
        try {
394
            FeatureStore featureStore = vle.getFeatureStore();
395

    
396
            featureStore.beginEditingGroup(getName());
397
            iterator =
398
                ((FeatureSelection) featureStore.getSelection()).iterator();
399
            ArrayList selectedRowAux = new ArrayList();
400
            while (iterator.hasNext()) {
401
                Feature feature = (Feature) iterator.next();
402

    
403
                // }
404
                // for (int i = 0; i < selectedRow.size(); i++) {
405
                // IRowEdited edRow = (IRowEdited) selectedRow.get(i);
406
                // DefaultFeature fea = (DefaultFeature)
407
                // edRow.getLinkedRow().cloneRow();
408
                Geometry geometry =
409
                    (feature.getDefaultGeometry()).cloneGeometry();
410
                
411
                
412
                try {
413
                    Point po = geomManager.createPoint(
414
                        scalePoint.getX(),
415
                        scalePoint.getY(),
416
                        SUBTYPES.GEOM2D);
417
                    
418
                    geometry.scale(po, scaleFactor, scaleFactor);
419
                } catch (CreateGeometryException cge) {
420
                    logger.info("Error while scaling geometry", cge);
421
                    ApplicationLocator.getManager().message("Unable to scale geometry",
422
                        JOptionPane.ERROR_MESSAGE);
423
                }
424

    
425
                super.updateGeometry(featureStore, feature, geometry);
426
//                EditableFeature eFeature = feature.getEditable();
427
//                eFeature.setGeometry(featureStore.getDefaultFeatureType()
428
//                    .getDefaultGeometryAttributeName(), geometry);
429
//                featureStore.update(eFeature);
430

    
431
                // vea.modifyRow(edRow.getIndex(),
432
                // fea,getName(),EditionEvent.GRAPHIC);
433
                selectedRowAux.add(feature);
434
            }
435
            featureStore.endEditingGroup();
436
        } catch (DataException e) {
437
            // TODO Auto-generated catch block
438
            e.printStackTrace();
439
        } finally {
440
            if (iterator != null) {
441
                iterator.dispose();
442
            }
443
        }
444
        // vle.setSelectionCache(VectorialLayerEdited.NOTSAVEPREVIOUS,
445
        // selectedRowAux);
446
        // clearSelection();
447
        // selectedRow.addAll(selectedRowAux);
448
    }
449

    
450
    public String getName() {
451
        return PluginServices.getText(this, "scale_");
452
    }
453

    
454
    public String toString() {
455
        return "_scale";
456
    }
457

    
458
    @Override
459
    public boolean isApplicable(GeometryType geometryType) {
460
        return true;
461
    }
462

    
463
    @Override
464
    protected int[] getSupportedGeometryTypes() {
465
        return null;
466
    }
467
}