Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.stretch / src / main / java / org / gvsig / vectorediting / lib / prov / stretch / StretchEditingProvider.java @ 335

History | View | Annotate | Download (18.7 KB)

1
package org.gvsig.vectorediting.lib.prov.stretch;
2

    
3

    
4

    
5

    
6
import java.awt.geom.AffineTransform;
7
import java.util.ArrayList;
8
import java.util.HashMap;
9
import java.util.Iterator;
10
import java.util.List;
11
import java.util.Map;
12

    
13
import org.slf4j.Logger;
14
import org.slf4j.LoggerFactory;
15

    
16
import org.gvsig.fmap.dal.exception.DataException;
17
import org.gvsig.fmap.dal.feature.EditableFeature;
18
import org.gvsig.fmap.dal.feature.Feature;
19
import org.gvsig.fmap.dal.feature.FeatureSelection;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.geom.Geometry;
22
import org.gvsig.fmap.geom.GeometryLocator;
23
import org.gvsig.fmap.geom.GeometryManager;
24
import org.gvsig.fmap.geom.aggregate.Aggregate;
25
import org.gvsig.fmap.geom.aggregate.MultiCurve;
26
import org.gvsig.fmap.geom.aggregate.MultiPoint;
27
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
28
import org.gvsig.fmap.geom.aggregate.MultiSurface;
29
import org.gvsig.fmap.geom.exception.CreateGeometryException;
30
import org.gvsig.fmap.geom.operation.GeometryOperationException;
31
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
32
import org.gvsig.fmap.geom.primitive.Curve;
33
import org.gvsig.fmap.geom.primitive.Point;
34
import org.gvsig.fmap.geom.primitive.Primitive;
35
import org.gvsig.fmap.geom.primitive.Surface;
36
import org.gvsig.fmap.geom.type.GeometryType;
37
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
38
import org.gvsig.tools.ToolsLocator;
39
import org.gvsig.tools.dispose.DisposableIterator;
40
import org.gvsig.tools.dynobject.DynObject;
41
import org.gvsig.tools.exception.BaseException;
42
import org.gvsig.tools.i18n.I18nManager;
43
import org.gvsig.tools.service.spi.ProviderServices;
44
import org.gvsig.vectorediting.lib.api.DrawingStatus;
45
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
46
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
47
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
48
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
49
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
50
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
51
import org.gvsig.vectorediting.lib.prov.stretch.operation.StretchOperation;
52
import org.gvsig.vectorediting.lib.prov.stretch.operation.StretchOperationUtils;
53
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
54
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
55
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
56
import org.gvsig.vectorediting.lib.spi.EditingProvider;
57
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
58
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
59
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
60
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
61

    
62
public class StretchEditingProvider extends AbstractEditingProvider implements
63
    EditingProvider {
64

    
65
    private static Logger logger = LoggerFactory.getLogger(StretchEditingProvider.class);
66

    
67
    private I18nManager i18nManager = ToolsLocator.getI18nManager();
68

    
69
    private EditingServiceParameter selectionParameter;
70

    
71
    private EditingServiceParameter geometryParameter;
72

    
73
    private EditingServiceParameter firstPointParameter;
74

    
75
    private EditingServiceParameter secondPointParameter;
76

    
77
    private Map<EditingServiceParameter, Object> values;
78

    
79
    private FeatureStore featureStore;
80

    
81
    public StretchEditingProvider(ProviderServices providerServices,
82
        DynObject parameters) {
83
        super(providerServices);
84
        this.featureStore =
85
            (FeatureStore) parameters
86
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
87

    
88
        this.selectionParameter =
89
            new DefaultEditingServiceParameter("selection",
90
                i18nManager.getTranslation("selection"), TYPE.SELECTION);
91

    
92
        this.geometryParameter =
93
            new DefaultEditingServiceParameter("Draw geometry",
94
                "draw_geometry_to_select_vertex", Geometry.TYPES.MULTISURFACE, TYPE.GEOMETRY);
95

    
96
        this.firstPointParameter =
97
            new DefaultEditingServiceParameter("first_point",
98
                i18nManager.getTranslation("first_point"), TYPE.VALUE, TYPE.POSITION);
99

    
100
        this.secondPointParameter =
101
            new DefaultEditingServiceParameter("second_point",
102
                i18nManager.getTranslation("second_point"), TYPE.VALUE, TYPE.POSITION);
103

    
104
    }
105

    
106
    public List<EditingServiceParameter> getParameters() {
107
        List<EditingServiceParameter> list =
108
            new ArrayList<EditingServiceParameter>();
109
        list.add(selectionParameter);
110
        list.add(geometryParameter);
111
        list.add(firstPointParameter);
112
        list.add(secondPointParameter);
113
        return list;
114
    }
115

    
116
    private void validateAndInsertValue(EditingServiceParameter param,
117
        Object value) throws InvalidEntryException {
118
        if (param == selectionParameter) {
119
            if (value instanceof FeatureSelection) {
120
                values.put(param, value);
121
                return;
122
            }
123
        } else if (param == firstPointParameter) {
124
            if (value instanceof Point) {
125
                values.put(param, value);
126
                return;
127
            }
128
        } else if (param == secondPointParameter) {
129
            if (value instanceof Point) {
130
                values.put(param, value);
131
                return;
132
            }
133
        } else if (param == geometryParameter) {
134
            if (value instanceof Geometry) {
135

    
136
                // Before set value checks if some geometry intersects the
137
                // geometry received as parameter.
138
                Geometry geometry = (Geometry) value;
139
                FeatureSelection selection =
140
                    (FeatureSelection) values.get(selectionParameter);
141
                DisposableIterator it = null;
142

    
143
                try {
144
                    it = selection.fastIterator();
145

    
146
                    while (it.hasNext()) {
147
                        Feature feature = (Feature) it.next();
148

    
149
                        Geometry defaultGeometry = feature.getDefaultGeometry();
150
                        if (defaultGeometry.intersects(geometry) || defaultGeometry.contains(geometry)) {
151
                            values.put(param, value);
152
                            return;
153
                        }
154
                    }
155
                    throw new InvalidEntryException(null);
156
                } catch (BaseException e) {
157
                    throw new InvalidEntryException(e);
158
                } finally {
159
                    it.dispose();
160
                }
161
            }
162
        }
163
    }
164

    
165
    public EditingServiceParameter next() {
166
        if (values.get(selectionParameter) == null) {
167
            return this.selectionParameter;
168
        } else if (values.get(geometryParameter) == null) {
169
            return this.geometryParameter;
170
        } else if (values.get(firstPointParameter) == null) {
171
            return this.firstPointParameter;
172
        } else if (values.get(secondPointParameter) == null) {
173
            return this.secondPointParameter;
174
        }
175
        return null;
176
    }
177

    
178
    public static Geometry applyTransform(Geometry geometry, AffineTransform at,
179
        Geometry roi) throws CreateGeometryException,
180
        GeometryOperationNotSupportedException, GeometryOperationException {
181
        if (geometry instanceof MultiPrimitive) {
182
            GeometryManager geometryManager = GeometryLocator.getGeometryManager();
183
            MultiPrimitive aggregate = (MultiPrimitive)geometry;
184
            GeometryType geometryType = aggregate.getGeometryType();
185
            MultiPrimitive newAggregate = (MultiPrimitive) geometryManager.create(geometryType.getType(), geometryType.getSubType());
186
            for (int i = 0; i < aggregate.getPrimitivesNumber(); i++) {
187
                Primitive primitive = aggregate.getPrimitiveAt(i);
188
                StretchOperation operation = StretchOperationUtils.getOperation(primitive);
189
                if (operation != null) {
190
                    Geometry element = operation.transform(at, primitive, roi);
191
                    if (element instanceof MultiPrimitive) {
192
                        for (int j = 0; j < ((MultiPrimitive)element).getPrimitivesNumber(); j++) {
193
                            newAggregate.addPrimitive(((MultiPrimitive)element).getPrimitiveAt(j));
194
                        }
195
                    } else if(element instanceof Primitive){
196
                        newAggregate.addPrimitive((Primitive)element);
197
                    } else {
198
                        logger.warn("StretchOperation has returned a not-supported geometry type. "+operation.toString()+" "+element.getClass().getName());
199
                    }
200
                } else {
201
                    newAggregate.addPrimitive(primitive);
202
                }
203
            }
204
            return newAggregate;
205
        } else if (geometry instanceof Primitive) {
206
            StretchOperation operation = StretchOperationUtils.getOperation((Primitive)geometry);
207
            if (operation != null) {
208
                return operation.transform(at, (Primitive)geometry, roi);
209
            }
210
        }
211
        return geometry;
212
    }
213

    
214

    
215
    public static List<Point> getSelectedVertex(Geometry geometry,
216
        Geometry roi) throws CreateGeometryException,
217
        GeometryOperationNotSupportedException, GeometryOperationException {
218
        List<Point> selectedVertex = new ArrayList<Point>();
219
        if (geometry instanceof MultiPrimitive) {
220
            MultiPrimitive aggregate = (MultiPrimitive)geometry;
221
            for (int i = 0; i < aggregate.getPrimitivesNumber(); i++) {
222
                Primitive primitive = aggregate.getPrimitiveAt(i);
223
                StretchOperation operation = StretchOperationUtils.getOperation(primitive);
224
                if (operation != null) {
225
                    selectedVertex.addAll(operation.getSelectedVertex(primitive, roi));
226
                }
227
            }
228
        } else if (geometry instanceof Primitive) {
229
            Primitive primitive = (Primitive)geometry;
230
            StretchOperation operation = StretchOperationUtils.getOperation(primitive);
231
            if (operation != null) {
232
                selectedVertex.addAll(operation.getSelectedVertex(primitive, roi));
233
            }
234
        }
235
        return selectedVertex;
236
    }
237

    
238

    
239
    public DrawingStatus getDrawingStatus(Point mousePosition)
240
        throws DrawServiceException {
241
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
242
        EditingProviderManager editingProviderManager =
243
            EditingProviderLocator.getProviderManager();
244
        ISymbol selectedVertexEditingSymbol = editingProviderManager.getSymbol("selected-vertex-editing");
245
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
246
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("poligon-symbol-editing");
247
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
248

    
249
        FeatureSelection selection =
250
            (FeatureSelection) values.get(this.selectionParameter);
251
        try {
252
            if ((selection != null) && !selection.isEmpty()) {
253
                Geometry geometry = (Geometry) values.get(this.geometryParameter);
254
                if (geometry != null) {
255
                    //
256
                    List<Point> selectedVertex = new ArrayList<Point>();
257
                    DisposableIterator it = null;
258

    
259
                    try {
260
                        it = selection.fastIterator();
261

    
262
                        while (it.hasNext()) {
263
                            Feature feature = (Feature) it.next();
264
                            Geometry featureGeometry = feature.getDefaultGeometry();
265
                            List<Point> vertex = getSelectedVertex(featureGeometry, geometry);
266
                            if(vertex != null){
267
                                selectedVertex.addAll(vertex);
268
                            }
269
                        }
270
                    } catch (BaseException e) {
271
                        throw new InvalidEntryException(e);
272
                    } finally {
273
                        it.dispose();
274
                    }
275

    
276
                    if(!selectedVertex.isEmpty()){
277
                        for (Iterator<Point> iterator = selectedVertex.iterator(); iterator.hasNext();) {
278
                            Point point = (Point) iterator.next();
279
                            drawingStatus.addStatus(point, selectedVertexEditingSymbol, "");
280
                        }
281
                    }
282

    
283
                    Point firstPoint = (Point) values.get(this.firstPointParameter);
284
                    if (firstPoint != null){
285
                        AffineTransform at = getMoveAffineTransform(firstPoint, mousePosition);
286

    
287
                        if(!selectedVertex.isEmpty()){
288
                            for (Iterator<Point> iterator = selectedVertex.iterator(); iterator.hasNext();) {
289
                                Point point = (Point) ((Point) iterator.next()).cloneGeometry();
290
                                point.transform(at);
291
                                drawingStatus.addStatus(point, selectedVertexEditingSymbol, "");
292
                            }
293
                        }
294

    
295
                        it = null;
296
                        try {
297
                            it = selection.fastIterator();
298

    
299
                            while (it.hasNext()) {
300
                                Feature feature = (Feature) it.next();
301
                                Geometry featureGeometry = feature.getDefaultGeometry();
302
                                Geometry transformedGeometry = applyTransform(featureGeometry, at, geometry);
303
                                ISymbol symbol=null;
304
                                if(transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve){
305
                                    symbol = lineSymbolEditing;
306
                                } else if(transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface){
307
                                    symbol = polygonSymbolEditing;
308
                                } else if(transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint){
309
                                    symbol = auxiliaryPointSymbolEditing;
310
                                }
311
                                if(transformedGeometry instanceof Aggregate){
312
                                    int primitivesNumber = ((Aggregate)transformedGeometry).getPrimitivesNumber();
313
                                    for (int i = 0; i < primitivesNumber; i++) {
314
                                        drawingStatus.addStatus(((Aggregate)transformedGeometry).getPrimitiveAt(i), symbol, "");
315
                                    }
316
                                } else {
317
                                    drawingStatus.addStatus(transformedGeometry, symbol, "");
318
                                }
319
                            }
320
                        } catch (BaseException e) {
321
                            throw new InvalidEntryException(e);
322
                        } finally {
323
                            it.dispose();
324
                        }
325
                    }
326
                }
327
                return drawingStatus;
328
            }
329
        } catch (Exception e) {
330
            throw new DrawServiceException(e);
331
        }
332
        return null;
333
    }
334

    
335
    private AffineTransform getMoveAffineTransform(Point p1, Point p2) {
336

    
337
        AffineTransform translate =
338
            AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
339
                p2.getY() - p1.getY());
340

    
341
        return translate;
342
    }
343

    
344
    public void stop() {
345
        values.clear();
346
    }
347

    
348

    
349

    
350
    public void setValue(Object value) throws InvalidEntryException {
351
        EditingServiceParameter param = next();
352
        validateAndInsertValue(param, value);
353
    }
354

    
355
    public void finishAndStore() throws FinishServiceException {
356

    
357
        FeatureSelection selection =
358
            (FeatureSelection) values.get(selectionParameter);
359

    
360
        try {
361
            if ((selection != null) && !selection.isEmpty()) {
362
                Geometry geometry = (Geometry) values.get(this.geometryParameter);
363
                if (geometry != null) {
364
                    Point firstPoint =
365
                        (Point) values.get(this.firstPointParameter);
366
                    if (firstPoint != null) {
367
                        Point secondPoint =
368
                            (Point) values.get(this.secondPointParameter);
369
                        if (secondPoint != null) {
370
                            AffineTransform at =
371
                                getMoveAffineTransform(firstPoint, secondPoint);
372

    
373
                            DisposableIterator it = null;
374

    
375
                            try {
376
                                it = selection.fastIterator();
377

    
378
                                while (it.hasNext()) {
379
                                    Feature feature = (Feature) it.next();
380
                                    Geometry featureGeometry =
381
                                        feature.getDefaultGeometry();
382

    
383
                                    Geometry geom =
384
                                        applyTransform(featureGeometry, at,
385
                                            geometry);
386

    
387
                                    EditableFeature editableFeature =
388
                                        feature.getEditable();
389
                                    editableFeature.setDefaultGeometry(geom);
390
                                    ((EditingProviderServices) getProviderServices())
391
                                        .updateFeatureInFeatureStore(
392
                                            editableFeature, featureStore);
393
                                }
394
                            } catch (BaseException e) {
395
                                throw new FinishServiceException(e);
396
                            } finally {
397
                                it.dispose();
398
                            }
399
                        }
400
                    }
401
                }
402
            }
403
        } catch (DataException e) {
404
            throw new FinishServiceException(e);
405
        }
406
    }
407

    
408
    public Geometry finish() throws FinishServiceException {
409
        return null;
410
    }
411

    
412
    public void start() throws StartServiceException {
413
        this.values = new HashMap<EditingServiceParameter, Object>();
414
        FeatureSelection selected = null;
415
        if (featureStore != null) {
416
            try {
417
                selected =
418
                    (FeatureSelection) featureStore.getFeatureSelection()
419
                        .clone();
420
            } catch (DataException e) {
421
                throw new StartServiceException(e);
422
            } catch (CloneNotSupportedException e) {
423
                // Do nothing
424
            }
425
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
426
                values.put(selectionParameter, selected);
427
            }
428
        }
429
    }
430

    
431
    public String getName() {
432
        return StretchEditingProviderFactory.PROVIDER_NAME;
433
    }
434

    
435
}