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 @ 333

History | View | Annotate | Download (18.4 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.MultiPrimitive;
27
import org.gvsig.fmap.geom.aggregate.MultiSurface;
28
import org.gvsig.fmap.geom.exception.CreateGeometryException;
29
import org.gvsig.fmap.geom.operation.GeometryOperationException;
30
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
31
import org.gvsig.fmap.geom.primitive.Curve;
32
import org.gvsig.fmap.geom.primitive.Point;
33
import org.gvsig.fmap.geom.primitive.Primitive;
34
import org.gvsig.fmap.geom.primitive.Surface;
35
import org.gvsig.fmap.geom.type.GeometryType;
36
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dispose.DisposableIterator;
39
import org.gvsig.tools.dynobject.DynObject;
40
import org.gvsig.tools.exception.BaseException;
41
import org.gvsig.tools.i18n.I18nManager;
42
import org.gvsig.tools.service.spi.ProviderServices;
43
import org.gvsig.vectorediting.lib.api.DrawingStatus;
44
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
45
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
46
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
47
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
48
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
49
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
50
import org.gvsig.vectorediting.lib.prov.stretch.operation.StretchOperation;
51
import org.gvsig.vectorediting.lib.prov.stretch.operation.StretchOperationUtils;
52
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
53
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
54
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
55
import org.gvsig.vectorediting.lib.spi.EditingProvider;
56
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
57
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
58
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
59
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
60

    
61
public class StretchEditingProvider extends AbstractEditingProvider implements
62
    EditingProvider {
63

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

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

    
68
    private EditingServiceParameter selectionParameter;
69

    
70
    private EditingServiceParameter geometryParameter;
71

    
72
    private EditingServiceParameter firstPointParameter;
73

    
74
    private EditingServiceParameter secondPointParameter;
75

    
76
    private Map<EditingServiceParameter, Object> values;
77

    
78
    private FeatureStore featureStore;
79

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

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

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

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

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

    
103
    }
104

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

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

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

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

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

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

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

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

    
213

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

    
237

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

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

    
257
                    try {
258
                        it = selection.fastIterator();
259

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

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

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

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

    
293
                        it = null;
294
                        try {
295
                            it = selection.fastIterator();
296

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

    
331
    private AffineTransform getMoveAffineTransform(Point p1, Point p2) {
332

    
333
        AffineTransform translate =
334
            AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
335
                p2.getY() - p1.getY());
336

    
337
        return translate;
338
    }
339

    
340
    public void stop() {
341
        values.clear();
342
    }
343

    
344

    
345

    
346
    public void setValue(Object value) throws InvalidEntryException {
347
        EditingServiceParameter param = next();
348
        validateAndInsertValue(param, value);
349
    }
350

    
351
    public void finishAndStore() throws FinishServiceException {
352

    
353
        FeatureSelection selection =
354
            (FeatureSelection) values.get(selectionParameter);
355

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

    
369
                            DisposableIterator it = null;
370

    
371
                            try {
372
                                it = selection.fastIterator();
373

    
374
                                while (it.hasNext()) {
375
                                    Feature feature = (Feature) it.next();
376
                                    Geometry featureGeometry =
377
                                        feature.getDefaultGeometry();
378

    
379
                                    Geometry geom =
380
                                        applyTransform(featureGeometry, at,
381
                                            geometry);
382

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

    
404
    public Geometry finish() throws FinishServiceException {
405
        return null;
406
    }
407

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

    
427
    public String getName() {
428
        return StretchEditingProviderFactory.PROVIDER_NAME;
429
    }
430

    
431
}