Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting.symmetry / trunk / org.gvsig.vectorediting.symmetry / org.gvsig.vectorediting.symmetry.lib / org.gvsig.vectorediting.symmetry.lib.prov / org.gvsig.vectorediting.symmetry.lib.prov.symmetry / src / main / java / org / gvsig / vectorediting / symmetry / lib / prov / symmetry / SymmetryEditingProvider.java @ 2874

History | View | Annotate | Download (17.1 KB)

1 159 llmarques
/**
2
 * gvSIG. Desktop Geographic Information System.
3 122 llmarques
 *
4 159 llmarques
 * 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 122 llmarques
 */
24 159 llmarques
25 122 llmarques
package org.gvsig.vectorediting.symmetry.lib.prov.symmetry;
26
27
import java.awt.geom.AffineTransform;
28
import java.util.ArrayList;
29
import java.util.HashMap;
30 195 llmarques
import java.util.LinkedHashMap;
31 122 llmarques
import java.util.List;
32
import java.util.Map;
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.EditableFeature;
35
import org.gvsig.fmap.dal.feature.Feature;
36
import org.gvsig.fmap.dal.feature.FeatureSelection;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.geom.Geometry;
39
import org.gvsig.fmap.geom.GeometryLocator;
40 336 fdiaz
import org.gvsig.fmap.geom.aggregate.Aggregate;
41
import org.gvsig.fmap.geom.aggregate.MultiCurve;
42
import org.gvsig.fmap.geom.aggregate.MultiPoint;
43
import org.gvsig.fmap.geom.aggregate.MultiSurface;
44 122 llmarques
import org.gvsig.fmap.geom.operation.GeometryOperationException;
45
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
46 336 fdiaz
import org.gvsig.fmap.geom.primitive.Curve;
47 122 llmarques
import org.gvsig.fmap.geom.primitive.Line;
48
import org.gvsig.fmap.geom.primitive.Point;
49 2618 fdiaz
import org.gvsig.fmap.geom.primitive.Primitive;
50 336 fdiaz
import org.gvsig.fmap.geom.primitive.Surface;
51
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
52 122 llmarques
import org.gvsig.tools.ToolsLocator;
53 2725 fdiaz
import org.gvsig.tools.dataTypes.DataTypes;
54 122 llmarques
import org.gvsig.tools.dispose.DisposableIterator;
55
import org.gvsig.tools.dynobject.DynObject;
56
import org.gvsig.tools.i18n.I18nManager;
57
import org.gvsig.tools.service.spi.ProviderServices;
58
import org.gvsig.vectorediting.lib.api.DrawingStatus;
59
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
60
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
61
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
62
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
63
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
64
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
65
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
66
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
67
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
68 2725 fdiaz
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions;
69 122 llmarques
import org.gvsig.vectorediting.lib.spi.EditingProvider;
70
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
71 336 fdiaz
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
72
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
73 122 llmarques
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
74
75 159 llmarques
public class SymmetryEditingProvider extends AbstractEditingProvider implements
76 241 llmarques
    EditingProvider {
77 122 llmarques
78 2618 fdiaz
    private final EditingServiceParameter selectionParameter;
79 122 llmarques
80 2618 fdiaz
    private final EditingServiceParameter firstPointParameter;
81 122 llmarques
82 2618 fdiaz
    private final EditingServiceParameter secondPointParameter;
83 122 llmarques
84 2618 fdiaz
    private final EditingServiceParameter deleteOriginalGeometriesParameter;
85 122 llmarques
86 159 llmarques
    private Map<EditingServiceParameter, Object> values;
87 122 llmarques
88 2618 fdiaz
    private final Map<String, String> options;
89 195 llmarques
90 2618 fdiaz
    private final FeatureStore featureStore;
91 122 llmarques
92 159 llmarques
    public SymmetryEditingProvider(ProviderServices providerServices,
93
        DynObject parameters) {
94
        super(providerServices);
95 2618 fdiaz
96
        I18nManager i18nManager = ToolsLocator.getI18nManager();
97
98 159 llmarques
        this.featureStore =
99
            (FeatureStore) parameters
100 241 llmarques
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
101 195 llmarques
102
        this.selectionParameter =
103 241 llmarques
            new DefaultEditingServiceParameter("selection",
104 195 llmarques
                i18nManager.getTranslation("selection"), TYPE.SELECTION);
105
106
        this.firstPointParameter =
107 228 llmarques
            new DefaultEditingServiceParameter("first_point_of_symmetry_axis",
108 195 llmarques
                i18nManager.getTranslation("first_point_of_symmetry_axis"),
109
                TYPE.POSITION);
110
111
        this.secondPointParameter =
112 228 llmarques
            new DefaultEditingServiceParameter("second_point_of_symmetry_axis",
113 195 llmarques
                i18nManager.getTranslation("second_point_of_symmetry_axis"),
114
                TYPE.POSITION);
115
116 2618 fdiaz
        this.options = new LinkedHashMap<>();
117 195 llmarques
        options.put(i18nManager.getTranslation("short_yes"),
118
            "delete_original_geometries");
119
        options.put(i18nManager.getTranslation("short_no"),
120
            "keep_original_geometries");
121
122 241 llmarques
        EditingProviderServices editingProviderServices =
123
            (EditingProviderServices) getProviderServices();
124
125 2725 fdiaz
        DefaultEditingServiceParameterOptions deleteOriginalGeometriesOptions2 = new DefaultEditingServiceParameterOptions()
126
                .add("delete_original_geometries", true, i18nManager.getTranslation("_yes"))
127
                .add("keep_original_geometries", false, i18nManager.getTranslation("_no"));
128 241 llmarques
129 2725 fdiaz
        String consoleMsg
130
                = editingProviderServices.makeConsoleMessage(
131
                        "delete_original_geometries_question", deleteOriginalGeometriesOptions2);
132
133
        this.deleteOriginalGeometriesParameter
134
                = new DefaultEditingServiceParameter(
135
                        i18nManager.getTranslation("delete_original_geometries"),
136
                        consoleMsg,
137
                        deleteOriginalGeometriesOptions2,
138 2874 fdiaz
                        false,
139 2725 fdiaz
                        TYPE.OPTION).setDataType(DataTypes.BOOLEAN);;
140 159 llmarques
    }
141 122 llmarques
142 2618 fdiaz
    @Override
143 159 llmarques
    public DrawingStatus getDrawingStatus(Point mousePosition)
144
        throws DrawServiceException {
145 336 fdiaz
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
146
        EditingProviderManager editingProviderManager =
147
            EditingProviderLocator.getProviderManager();
148
        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
149
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
150
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
151
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
152 122 llmarques
153 336 fdiaz
154 159 llmarques
        FeatureSelection selected =
155
            (FeatureSelection) values.get(selectionParameter);
156
        try {
157 227 llmarques
            if ((selected != null) && !selected.isEmpty()) {
158 159 llmarques
                Point p1 = (Point) values.get(firstPointParameter);
159
                if (p1 != null) {
160
                    Object p2Value = values.get(secondPointParameter);
161 2618 fdiaz
                    Point p2;
162 227 llmarques
                    if ((p2Value != null) && (p2Value instanceof Point)) {
163 159 llmarques
                        p2 = (Point) p2Value;
164
                    } else {
165
                        p2 = mousePosition;
166
                    }
167
                    Line line;
168
                    line =
169
                        GeometryLocator.getGeometryManager().createLine(
170
                            featureStore.getDefaultFeatureType()
171 241 llmarques
                                .getDefaultGeometryAttribute().getGeomType()
172
                                .getSubType());
173 159 llmarques
                    line.addVertex(p1);
174
                    line.addVertex(p2);
175 122 llmarques
176 336 fdiaz
                    drawingStatus.addStatus(line, auxiliaryLineSymbolEditing, "");
177 122 llmarques
178 159 llmarques
                    DisposableIterator it;
179
                    it = selected.fastIterator();
180 1975 omartinez
181 159 llmarques
                    AffineTransform at;
182
                    try {
183
                        at = getSymmetryAffineTransform(p1, p2);
184
                    } catch (Exception e) {
185
                        throw new DrawServiceException(e);
186
                    }
187 122 llmarques
188 159 llmarques
                    while (it.hasNext()) {
189
                        Feature feat = (Feature) it.next();
190 2618 fdiaz
191
                        ISymbol previewSymbol = this.getPreviewSymbol(feat);
192
193 336 fdiaz
                        Geometry transformedGeometry = feat.getDefaultGeometry().cloneGeometry();
194
                        transformedGeometry.transform(at);
195
196
                        ISymbol symbol=null;
197
                        if(transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve){
198
                            symbol = lineSymbolEditing;
199
                        } else if(transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface){
200
                            symbol = polygonSymbolEditing;
201
                        } else if(transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint){
202
                            symbol = auxiliaryPointSymbolEditing;
203
                        }
204
                        if(transformedGeometry instanceof Aggregate){
205
                            int primitivesNumber = ((Aggregate)transformedGeometry).getPrimitivesNumber();
206
                            for (int i = 0; i < primitivesNumber; i++) {
207 2618 fdiaz
                                final Primitive primitive = ((Aggregate)transformedGeometry).getPrimitiveAt(i);
208
                                drawingStatus.addStatus(primitive, symbol, "");
209
                                drawingStatus.addStatus(primitive, previewSymbol, "");
210 336 fdiaz
                            }
211
                        } else {
212
                            drawingStatus.addStatus(transformedGeometry, symbol, "");
213 2618 fdiaz
                            drawingStatus.addStatus(transformedGeometry, previewSymbol, "");
214 336 fdiaz
                        }
215 159 llmarques
                    }
216
                    it.dispose();
217
                }
218 336 fdiaz
                return drawingStatus;
219 159 llmarques
            }
220
        } catch (Exception e) {
221
            throw new DrawServiceException(e);
222
        }
223
        return null;
224
    }
225 122 llmarques
226 159 llmarques
    private AffineTransform getSymmetryAffineTransform(Point axisP1,
227
        Point axisP2) throws GeometryOperationNotSupportedException,
228
        GeometryOperationException {
229 122 llmarques
230 159 llmarques
        AffineTransform translate =
231
            AffineTransform
232 241 llmarques
                .getTranslateInstance(-axisP1.getX(), -axisP1.getY());
233 122 llmarques
234 183 llmarques
        EditingProviderServices editingProviderServices =
235
            (EditingProviderServices) getProviderServices();
236
        Double angle = -editingProviderServices.getAngle(axisP1, axisP2);
237 159 llmarques
        AffineTransform rotate = AffineTransform.getRotateInstance(angle);
238 122 llmarques
239 159 llmarques
        AffineTransform symmetry = new AffineTransform(1, 0, 0, -1, 0, 0);
240
        AffineTransform inverseRotate =
241
            AffineTransform.getRotateInstance(-angle);
242
        AffineTransform inverseTranslate =
243
            AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY());
244
        AffineTransform at = new AffineTransform(translate);
245 122 llmarques
246 159 llmarques
        at.preConcatenate(rotate);
247
        at.preConcatenate(symmetry);
248
        at.preConcatenate(inverseRotate);
249
        at.preConcatenate(inverseTranslate);
250
        return at;
251
    }
252 122 llmarques
253 2618 fdiaz
    @Override
254 159 llmarques
    public EditingServiceParameter next() {
255
        if (values.get(selectionParameter) == null) {
256
            return this.selectionParameter;
257
        } else if (values.get(firstPointParameter) == null) {
258
            return this.firstPointParameter;
259
        } else if (values.get(secondPointParameter) == null) {
260
            return this.secondPointParameter;
261
        } else if (values.get(deleteOriginalGeometriesParameter) == null) {
262
            return this.deleteOriginalGeometriesParameter;
263
        }
264
        return null;
265
    }
266 122 llmarques
267 2618 fdiaz
    @Override
268 159 llmarques
    public void stop() {
269 231 llmarques
        values.clear();
270 159 llmarques
    }
271 122 llmarques
272 159 llmarques
    private void validateAndInsertValue(EditingServiceParameter param,
273
        Object value) throws InvalidEntryException {
274 2618 fdiaz
275
        I18nManager i18nManager = ToolsLocator.getI18nManager();
276
277
278 159 llmarques
        if (param == selectionParameter) {
279
            if (value instanceof FeatureSelection) {
280
                values.put(param, value);
281
            }
282
        } else if (param == firstPointParameter) {
283
            if (value instanceof Point) {
284
                values.put(param, value);
285
            }
286
        } else if (param == secondPointParameter) {
287
            if (value instanceof Point) {
288
                values.put(param, value);
289
            }
290
        } else if (param == deleteOriginalGeometriesParameter) {
291 2725 fdiaz
            values.put(param, param.getOptions2().getValue(value, param.getDefaultValue()));
292 159 llmarques
        }
293 122 llmarques
294 159 llmarques
    }
295 122 llmarques
296 2618 fdiaz
    @Override
297 159 llmarques
    public List<EditingServiceParameter> getParameters() {
298
        List<EditingServiceParameter> list =
299 2618 fdiaz
            new ArrayList<>();
300 159 llmarques
        list.add(selectionParameter);
301
        list.add(firstPointParameter);
302
        list.add(secondPointParameter);
303 2725 fdiaz
        list.add(deleteOriginalGeometriesParameter);
304 159 llmarques
        return list;
305
    }
306 122 llmarques
307 2205 fdiaz
    @Override
308
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
309
        validateAndInsertValue(parameter, value);
310
    }
311
312 2618 fdiaz
    @Override
313 159 llmarques
    public void setValue(Object value) throws InvalidEntryException {
314
        EditingServiceParameter param = next();
315
        validateAndInsertValue(param, value);
316
    }
317 122 llmarques
318 2618 fdiaz
    @Override
319 159 llmarques
    public void finishAndStore() throws FinishServiceException {
320 122 llmarques
321 159 llmarques
        FeatureSelection selected =
322
            (FeatureSelection) values.get(selectionParameter);
323 2725 fdiaz
        final Boolean deleteOriginalGeometriesValue = (Boolean) values.get(deleteOriginalGeometriesParameter);
324
325 159 llmarques
        try {
326
            if (!selected.isEmpty()) {
327
                Point p1 = (Point) values.get(firstPointParameter);
328
                Point p2 = (Point) values.get(secondPointParameter);
329 227 llmarques
                if ((p1 != null) && (p2 != null)) {
330 122 llmarques
331 159 llmarques
                    AffineTransform at;
332
                    try {
333
                        at = getSymmetryAffineTransform(p1, p2);
334 2618 fdiaz
                    } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
335 159 llmarques
                        throw new FinishServiceException(e);
336
                    }
337 122 llmarques
338 159 llmarques
                    DisposableIterator it;
339
                    it = selected.fastIterator();
340 122 llmarques
341 159 llmarques
                    while (it.hasNext()) {
342
                        Feature feature = (Feature) it.next();
343
                        Geometry geom =
344 227 llmarques
                            feature.getDefaultGeometry().cloneGeometry();
345 159 llmarques
                        geom.transform(at);
346 2725 fdiaz
                        if (deleteOriginalGeometriesValue) {
347 159 llmarques
                            // Se sustituye la geometr?a original por la
348
                            // calculada
349
                            EditableFeature editableFeature =
350
                                feature.getEditable();
351
                            editableFeature.setDefaultGeometry(geom);
352
                            ((EditingProviderServices) getProviderServices())
353 241 llmarques
                                .updateFeatureInFeatureStore(editableFeature,
354
                                    featureStore);
355 159 llmarques
                        } else {
356
                            // Se crea una feature nueva copiando los valores de
357
                            // la feature original excepto aquellos que sean PK
358 183 llmarques
                            EditingProviderServices editingProviderServices =
359
                                (EditingProviderServices) getProviderServices();
360 159 llmarques
                            EditableFeature editableFeature =
361
                                editingProviderServices
362 2614 fdiaz
                                    .getFeatureCopyWithoutUniqueIndex(featureStore,
363 241 llmarques
                                        feature);
364 159 llmarques
                            editableFeature.setDefaultGeometry(geom);
365 255 llmarques
                            editingProviderServices
366 241 llmarques
                                .insertFeatureIntoFeatureStore(editableFeature,
367
                                    featureStore);
368 159 llmarques
                        }
369
                    }
370
                    it.dispose();
371
                    featureStore.getFeatureSelection().deselectAll();
372
                }
373
            }
374
        } catch (DataException e) {
375
            throw new FinishServiceException(e);
376
        }
377
    }
378 122 llmarques
379 2618 fdiaz
    @Override
380 159 llmarques
    public Geometry finish() throws FinishServiceException {
381
        return null;
382
    }
383 122 llmarques
384 2618 fdiaz
    @Override
385 159 llmarques
    public void start() throws StartServiceException {
386 2618 fdiaz
        this.values = new HashMap<>();
387 159 llmarques
        FeatureSelection selected = null;
388
        if (featureStore != null) {
389
            try {
390
                selected =
391
                    (FeatureSelection) featureStore.getFeatureSelection()
392 241 llmarques
                        .clone();
393 159 llmarques
            } catch (DataException e) {
394
                throw new StartServiceException(e);
395
            } catch (CloneNotSupportedException e) {
396
                // Do nothing
397
            }
398 227 llmarques
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
399 159 llmarques
                values.put(selectionParameter, selected);
400
            }
401
        }
402
    }
403 122 llmarques
404 2618 fdiaz
    @Override
405 159 llmarques
    public String getName() {
406
        return SymmetryEditingProviderFactory.PROVIDER_NAME;
407
    }
408 122 llmarques
409
}