Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2060 / extensions / extEditing / src / org / gvsig / editing / gui / cad / tools / ScaleCADTool.java @ 39348

History | View | Annotate | Download (17.7 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22
package org.gvsig.editing.gui.cad.tools;
23

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

    
31
import javax.swing.JOptionPane;
32

    
33
import org.slf4j.Logger;
34
import org.slf4j.LoggerFactory;
35

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
218
    }
219

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

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

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

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

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

    
283
                        renderer.draw(geometry,
284
                            mapControlManager.getAxisReferenceSymbol());
285
                    }
286

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

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

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

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

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

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

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

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

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

    
427
                EditableFeature eFeature = feature.getEditable();
428
                eFeature.setGeometry(featureStore.getDefaultFeatureType()
429
                    .getDefaultGeometryAttributeName(), geometry);
430
                featureStore.update(eFeature);
431

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

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

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

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

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