Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting.measure / trunk / org.gvsig.vectorediting.measure / org.gvsig.vectorediting.measure.lib / org.gvsig.vectorediting.measure.lib.prov / org.gvsig.vectorediting.measure.lib.prov.measure / src / main / java / org / gvsig / vectorediting / measure / lib / prov / measure / MeasureEditingProvider.java @ 1517

History | View | Annotate | Download (16.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2014 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 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
 * 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

    
25
package org.gvsig.vectorediting.measure.lib.prov.measure;
26

    
27
import java.awt.geom.AffineTransform;
28
import java.util.ArrayList;
29
import java.util.HashMap;
30
import java.util.LinkedHashMap;
31
import java.util.List;
32
import java.util.Map;
33

    
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.feature.EditableFeature;
36
import org.gvsig.fmap.dal.feature.Feature;
37
import org.gvsig.fmap.dal.feature.FeatureSelection;
38
import org.gvsig.fmap.dal.feature.FeatureStore;
39
import org.gvsig.fmap.geom.Geometry;
40
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.aggregate.Aggregate;
42
import org.gvsig.fmap.geom.aggregate.MultiCurve;
43
import org.gvsig.fmap.geom.aggregate.MultiPoint;
44
import org.gvsig.fmap.geom.aggregate.MultiSurface;
45
import org.gvsig.fmap.geom.operation.GeometryOperationException;
46
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
47
import org.gvsig.fmap.geom.primitive.Curve;
48
import org.gvsig.fmap.geom.primitive.Line;
49
import org.gvsig.fmap.geom.primitive.Point;
50
import org.gvsig.fmap.geom.primitive.Surface;
51
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
52
import org.gvsig.tools.ToolsLocator;
53
import org.gvsig.tools.dispose.DisposableIterator;
54
import org.gvsig.tools.dynobject.DynObject;
55
import org.gvsig.tools.i18n.I18nManager;
56
import org.gvsig.tools.service.spi.ProviderServices;
57
import org.gvsig.vectorediting.lib.api.DrawingStatus;
58
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
59
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
60
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
61
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
62
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
63
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
64
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
65
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
66
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
67
import org.gvsig.vectorediting.lib.spi.EditingProvider;
68
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
69
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
70
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
71
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
72

    
73
public class MeasureEditingProvider extends AbstractEditingProvider implements
74
    EditingProvider {
75

    
76
    private I18nManager i18nManager = ToolsLocator.getI18nManager();
77

    
78
    private EditingServiceParameter selectionParameter;
79

    
80
    private EditingServiceParameter firstPointParameter;
81

    
82
    private EditingServiceParameter secondPointParameter;
83

    
84
    private EditingServiceParameter deleteOriginalGeometriesParameter;
85

    
86
    private boolean deleteOriginalGeometries = false;
87

    
88
    private Map<EditingServiceParameter, Object> values;
89

    
90
    private Map<String, String> options;
91

    
92
    private FeatureStore featureStore;
93

    
94
    public MeasureEditingProvider(ProviderServices providerServices,
95
        DynObject parameters) {
96
        super(providerServices);
97
        this.featureStore =
98
            (FeatureStore) parameters
99
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
100

    
101
        this.selectionParameter =
102
            new DefaultEditingServiceParameter("selection",
103
                i18nManager.getTranslation("selection"), TYPE.SELECTION);
104

    
105
        this.firstPointParameter =
106
            new DefaultEditingServiceParameter("first_point_of_measure_axis",
107
                i18nManager.getTranslation("first_point_of_measure_axis"),
108
                TYPE.POSITION);
109

    
110
        this.secondPointParameter =
111
            new DefaultEditingServiceParameter("second_point_of_measure_axis",
112
                i18nManager.getTranslation("second_point_of_measure_axis"),
113
                TYPE.POSITION);
114

    
115
        this.options = new LinkedHashMap<String, String>();
116
        options.put(i18nManager.getTranslation("short_yes"),
117
            "delete_original_geometries");
118
        options.put(i18nManager.getTranslation("short_no"),
119
            "keep_original_geometries");
120

    
121
        EditingProviderServices editingProviderServices =
122
            (EditingProviderServices) getProviderServices();
123

    
124
        String consoleMsg =
125
            editingProviderServices.makeConsoleMessage(
126
                "delete_original_geometries_question", options);
127

    
128
        this.deleteOriginalGeometriesParameter =
129
            new DefaultEditingServiceParameter("Delete original geometries",
130
                consoleMsg, options, TYPE.OPTION);
131
    }
132

    
133
    public DrawingStatus getDrawingStatus(Point mousePosition)
134
        throws DrawServiceException {
135
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
136
        EditingProviderManager editingProviderManager =
137
            EditingProviderLocator.getProviderManager();
138
        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
139
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
140
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
141
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
142

    
143

    
144
        FeatureSelection selected =
145
            (FeatureSelection) values.get(selectionParameter);
146
        try {
147
            if ((selected != null) && !selected.isEmpty()) {
148
                Point p1 = (Point) values.get(firstPointParameter);
149
                if (p1 != null) {
150
                    Object p2Value = values.get(secondPointParameter);
151
                    Point p2 = null;
152
                    if ((p2Value != null) && (p2Value instanceof Point)) {
153
                        p2 = (Point) p2Value;
154
                    } else {
155
                        p2 = mousePosition;
156
                    }
157
                    Line line;
158
                    line =
159
                        GeometryLocator.getGeometryManager().createLine(
160
                            featureStore.getDefaultFeatureType()
161
                                .getDefaultGeometryAttribute().getGeomType()
162
                                .getSubType());
163
                    line.addVertex(p1);
164
                    line.addVertex(p2);
165

    
166
                    drawingStatus.addStatus(line, auxiliaryLineSymbolEditing, "");
167

    
168
                    DisposableIterator it;
169
                    it = selected.fastIterator();
170

    
171
                    AffineTransform at;
172
                    try {
173
                        at = getSymmetryAffineTransform(p1, p2);
174
                    } catch (Exception e) {
175
                        throw new DrawServiceException(e);
176
                    }
177

    
178
                    while (it.hasNext()) {
179
                        Feature feat = (Feature) it.next();
180
                        Geometry transformedGeometry = feat.getDefaultGeometry().cloneGeometry();
181
                        transformedGeometry.transform(at);
182

    
183
                        ISymbol symbol=null;
184
                        if(transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve){
185
                            symbol = lineSymbolEditing;
186
                        } else if(transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface){
187
                            symbol = polygonSymbolEditing;
188
                        } else if(transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint){
189
                            symbol = auxiliaryPointSymbolEditing;
190
                        }
191
                        if(transformedGeometry instanceof Aggregate){
192
                            int primitivesNumber = ((Aggregate)transformedGeometry).getPrimitivesNumber();
193
                            for (int i = 0; i < primitivesNumber; i++) {
194
                                drawingStatus.addStatus(((Aggregate)transformedGeometry).getPrimitiveAt(i), symbol, "");
195
                            }
196
                        } else {
197
                            drawingStatus.addStatus(transformedGeometry, symbol, "");
198
                        }
199
                    }
200
                    it.dispose();
201
                }
202
                return drawingStatus;
203
            }
204
        } catch (Exception e) {
205
            throw new DrawServiceException(e);
206
        }
207
        return null;
208
    }
209

    
210
    private AffineTransform getSymmetryAffineTransform(Point axisP1,
211
        Point axisP2) throws GeometryOperationNotSupportedException,
212
        GeometryOperationException {
213

    
214
        AffineTransform translate =
215
            AffineTransform
216
                .getTranslateInstance(-axisP1.getX(), -axisP1.getY());
217

    
218
        EditingProviderServices editingProviderServices =
219
            (EditingProviderServices) getProviderServices();
220
        Double angle = -editingProviderServices.getAngle(axisP1, axisP2);
221
        AffineTransform rotate = AffineTransform.getRotateInstance(angle);
222

    
223
        AffineTransform symmetry = new AffineTransform(1, 0, 0, -1, 0, 0);
224
        AffineTransform inverseRotate =
225
            AffineTransform.getRotateInstance(-angle);
226
        AffineTransform inverseTranslate =
227
            AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY());
228
        AffineTransform at = new AffineTransform(translate);
229

    
230
        at.preConcatenate(rotate);
231
        at.preConcatenate(symmetry);
232
        at.preConcatenate(inverseRotate);
233
        at.preConcatenate(inverseTranslate);
234
        return at;
235
    }
236

    
237
    public EditingServiceParameter next() {
238
        if (values.get(selectionParameter) == null) {
239
            return this.selectionParameter;
240
        } else if (values.get(firstPointParameter) == null) {
241
            return this.firstPointParameter;
242
        } else if (values.get(secondPointParameter) == null) {
243
            return this.secondPointParameter;
244
        } else if (values.get(deleteOriginalGeometriesParameter) == null) {
245
            return this.deleteOriginalGeometriesParameter;
246
        }
247
        return null;
248
    }
249

    
250
    public void stop() {
251
        values.clear();
252
    }
253

    
254
    private void validateAndInsertValue(EditingServiceParameter param,
255
        Object value) throws InvalidEntryException {
256
        if (param == selectionParameter) {
257
            if (value instanceof FeatureSelection) {
258
                values.put(param, value);
259
                return;
260
            }
261
        } else if (param == firstPointParameter) {
262
            if (value instanceof Point) {
263
                values.put(param, value);
264
                return;
265
            }
266
        } else if (param == secondPointParameter) {
267
            if (value instanceof Point) {
268
                values.put(param, value);
269
                return;
270
            }
271
        } else if (param == deleteOriginalGeometriesParameter) {
272
            if (value instanceof String) {
273
                if (((String) value).trim().equalsIgnoreCase(
274
                    i18nManager.getTranslation("short_yes"))) {
275
                    deleteOriginalGeometries = true;
276
                } else if (((String) value).trim().equalsIgnoreCase(
277
                    i18nManager.getTranslation("short_no"))) {
278
                    deleteOriginalGeometries = false;
279
                } else {
280
                    throw new InvalidEntryException(null);
281
                }
282
                values.put(param, value);
283
            }
284
        }
285

    
286
    }
287

    
288
    public List<EditingServiceParameter> getParameters() {
289
        List<EditingServiceParameter> list =
290
            new ArrayList<EditingServiceParameter>();
291
        list.add(selectionParameter);
292
        list.add(firstPointParameter);
293
        list.add(secondPointParameter);
294
        return list;
295
    }
296

    
297
    public void setValue(Object value) throws InvalidEntryException {
298
        EditingServiceParameter param = next();
299
        validateAndInsertValue(param, value);
300
    }
301

    
302
    public void finishAndStore() throws FinishServiceException {
303

    
304
        FeatureSelection selected =
305
            (FeatureSelection) values.get(selectionParameter);
306
        try {
307
            if (!selected.isEmpty()) {
308
                Point p1 = (Point) values.get(firstPointParameter);
309
                Point p2 = (Point) values.get(secondPointParameter);
310
                if ((p1 != null) && (p2 != null)) {
311

    
312
                    AffineTransform at;
313
                    try {
314
                        at = getSymmetryAffineTransform(p1, p2);
315
                    } catch (GeometryOperationNotSupportedException e) {
316
                        throw new FinishServiceException(e);
317
                    } catch (GeometryOperationException e) {
318
                        throw new FinishServiceException(e);
319
                    }
320

    
321
                    DisposableIterator it;
322
                    it = selected.fastIterator();
323

    
324
                    while (it.hasNext()) {
325
                        Feature feature = (Feature) it.next();
326
                        Geometry geom =
327
                            feature.getDefaultGeometry().cloneGeometry();
328
                        geom.transform(at);
329
                        if (this.deleteOriginalGeometries) {
330
                            // Se sustituye la geometr?a original por la
331
                            // calculada
332
                            EditableFeature editableFeature =
333
                                feature.getEditable();
334
                            editableFeature.setDefaultGeometry(geom);
335
                            ((EditingProviderServices) getProviderServices())
336
                                .updateFeatureInFeatureStore(editableFeature,
337
                                    featureStore);
338
                        } else {
339
                            // Se crea una feature nueva copiando los valores de
340
                            // la feature original excepto aquellos que sean PK
341
                            EditingProviderServices editingProviderServices =
342
                                (EditingProviderServices) getProviderServices();
343
                            EditableFeature editableFeature =
344
                                editingProviderServices
345
                                    .getFeatureCopyWithoutPK(featureStore,
346
                                        feature);
347
                            editableFeature.setDefaultGeometry(geom);
348
                            editingProviderServices
349
                                .insertFeatureIntoFeatureStore(editableFeature,
350
                                    featureStore);
351
                        }
352
                    }
353
                    it.dispose();
354
                    featureStore.getFeatureSelection().deselectAll();
355
                }
356
            }
357
        } catch (DataException e) {
358
            throw new FinishServiceException(e);
359
        }
360
    }
361

    
362
    public Geometry finish() throws FinishServiceException {
363
        return null;
364
    }
365

    
366
    public void start() throws StartServiceException {
367
        this.values = new HashMap<EditingServiceParameter, Object>();
368
        FeatureSelection selected = null;
369
        if (featureStore != null) {
370
            try {
371
                selected =
372
                    (FeatureSelection) featureStore.getFeatureSelection()
373
                        .clone();
374
            } catch (DataException e) {
375
                throw new StartServiceException(e);
376
            } catch (CloneNotSupportedException e) {
377
                // Do nothing
378
            }
379
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
380
                values.put(selectionParameter, selected);
381
            }
382
        }
383
    }
384

    
385
    public String getName() {
386
        return MeasureEditingProviderFactory.PROVIDER_NAME;
387
    }
388

    
389
}