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

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

    
57
public class StretchEditingProvider extends AbstractEditingProvider implements
58
    EditingProvider {
59

    
60
    private static Logger logger = LoggerFactory.getLogger(StretchEditingProvider.class);
61

    
62
    private I18nManager i18nManager = ToolsLocator.getI18nManager();
63

    
64
    private EditingServiceParameter selectionParameter;
65

    
66
    private EditingServiceParameter geometryParameter;
67

    
68
    private EditingServiceParameter firstPointParameter;
69

    
70
    private EditingServiceParameter secondPointParameter;
71

    
72
    private Map<EditingServiceParameter, Object> values;
73

    
74
    private FeatureStore featureStore;
75

    
76
    public StretchEditingProvider(ProviderServices providerServices,
77
        DynObject parameters) {
78
        super(providerServices);
79
        this.featureStore =
80
            (FeatureStore) parameters
81
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
82

    
83
        this.selectionParameter =
84
            new DefaultEditingServiceParameter("selection",
85
                i18nManager.getTranslation("selection"), TYPE.SELECTION);
86

    
87
        this.geometryParameter =
88
            new DefaultEditingServiceParameter("Draw geometry",
89
                "draw_geometry_to_select_vertex", Geometry.TYPES.MULTISURFACE, TYPE.GEOMETRY);
90

    
91
        this.firstPointParameter =
92
            new DefaultEditingServiceParameter("first_point",
93
                i18nManager.getTranslation("first_point"), TYPE.VALUE, TYPE.POSITION);
94

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

    
99
    }
100

    
101
    public List<EditingServiceParameter> getParameters() {
102
        List<EditingServiceParameter> list =
103
            new ArrayList<EditingServiceParameter>();
104
        list.add(selectionParameter);
105
        list.add(geometryParameter);
106
        list.add(firstPointParameter);
107
        list.add(secondPointParameter);
108
        return list;
109
    }
110

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

    
131
                // Before set value checks if some geometry intersects the
132
                // geometry received as parameter.
133
                Geometry geometry = (Geometry) value;
134
                FeatureSelection selection =
135
                    (FeatureSelection) values.get(selectionParameter);
136
                DisposableIterator it = null;
137

    
138
                try {
139
                    it = selection.fastIterator();
140

    
141
                    while (it.hasNext()) {
142
                        Feature feature = (Feature) it.next();
143

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

    
160
    public EditingServiceParameter next() {
161
        if (values.get(selectionParameter) == null) {
162
            return this.selectionParameter;
163
        } else if (values.get(geometryParameter) == null) {
164
            return this.geometryParameter;
165
        } else if (values.get(firstPointParameter) == null) {
166
            return this.firstPointParameter;
167
        } else if (values.get(secondPointParameter) == null) {
168
            return this.secondPointParameter;
169
        }
170
        return null;
171
    }
172

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

    
209

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

    
233

    
234
    public DrawingStatus getDrawingStatus(Point mousePosition)
235
        throws DrawServiceException {
236
        DefaultDrawingStatus geometries = new DefaultDrawingStatus();
237
        EditingProviderManager editingProviderManager =
238
            EditingProviderLocator.getProviderManager();
239
        ISymbol selectedVertexEditingSymbol = editingProviderManager.getSymbol("selected-vertex-editing");
240

    
241
        FeatureSelection selection =
242
            (FeatureSelection) values.get(this.selectionParameter);
243
        try {
244
            if ((selection != null) && !selection.isEmpty()) {
245
                Geometry geometry = (Geometry) values.get(this.geometryParameter);
246
                if (geometry != null) {
247
                    //
248
                    List<Point> selectedVertex = new ArrayList<Point>();
249
                    DisposableIterator it = null;
250

    
251
                    try {
252
                        it = selection.fastIterator();
253

    
254
                        while (it.hasNext()) {
255
                            Feature feature = (Feature) it.next();
256
                            Geometry featureGeometry = feature.getDefaultGeometry();
257
                            List<Point> vertex = getSelectedVertex(featureGeometry, geometry);
258
                            if(vertex != null){
259
                                selectedVertex.addAll(vertex);
260
                            }
261
                        }
262
                    } catch (BaseException e) {
263
                        throw new InvalidEntryException(e);
264
                    } finally {
265
                        it.dispose();
266
                    }
267

    
268
                    if(!selectedVertex.isEmpty()){
269
                        for (Iterator<Point> iterator = selectedVertex.iterator(); iterator.hasNext();) {
270
                            Point point = (Point) iterator.next();
271
                            geometries.addStatus(point, selectedVertexEditingSymbol, "");
272
                        }
273
                    }
274

    
275
                    Point firstPoint = (Point) values.get(this.firstPointParameter);
276
                    if (firstPoint != null){
277
                        AffineTransform at = getMoveAffineTransform(firstPoint, mousePosition);
278

    
279
                        if(!selectedVertex.isEmpty()){
280
                            for (Iterator<Point> iterator = selectedVertex.iterator(); iterator.hasNext();) {
281
                                Point point = (Point) ((Point) iterator.next()).cloneGeometry();
282
                                point.transform(at);
283
                                geometries.addStatus(point, selectedVertexEditingSymbol, "");
284
                            }
285
                        }
286

    
287
                        it = null;
288
                        try {
289
                            it = selection.fastIterator();
290

    
291
                            while (it.hasNext()) {
292
                                Feature feature = (Feature) it.next();
293
                                Geometry featureGeometry = feature.getDefaultGeometry();
294
                                geometries.addGeometry(applyTransform(featureGeometry, at, geometry));
295
                            }
296
                        } catch (BaseException e) {
297
                            throw new InvalidEntryException(e);
298
                        } finally {
299
                            it.dispose();
300
                        }
301
                    }
302
                }
303
                return geometries;
304
            }
305
        } catch (Exception e) {
306
            throw new DrawServiceException(e);
307
        }
308
        return null;
309
    }
310

    
311
    private AffineTransform getMoveAffineTransform(Point p1, Point p2) {
312

    
313
        AffineTransform translate =
314
            AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
315
                p2.getY() - p1.getY());
316

    
317
        return translate;
318
    }
319

    
320
    public void stop() {
321
        values.clear();
322
    }
323

    
324

    
325

    
326
    public void setValue(Object value) throws InvalidEntryException {
327
        EditingServiceParameter param = next();
328
        validateAndInsertValue(param, value);
329
    }
330

    
331
    public void finishAndStore() throws FinishServiceException {
332

    
333
        FeatureSelection selection =
334
            (FeatureSelection) values.get(selectionParameter);
335

    
336
        try {
337
            if ((selection != null) && !selection.isEmpty()) {
338
                Geometry geometry = (Geometry) values.get(this.geometryParameter);
339
                if (geometry != null) {
340
                    Point firstPoint =
341
                        (Point) values.get(this.firstPointParameter);
342
                    if (firstPoint != null) {
343
                        Point secondPoint =
344
                            (Point) values.get(this.secondPointParameter);
345
                        if (secondPoint != null) {
346
                            AffineTransform at =
347
                                getMoveAffineTransform(firstPoint, secondPoint);
348

    
349
                            DisposableIterator it = null;
350

    
351
                            try {
352
                                it = selection.fastIterator();
353

    
354
                                while (it.hasNext()) {
355
                                    Feature feature = (Feature) it.next();
356
                                    Geometry featureGeometry =
357
                                        feature.getDefaultGeometry();
358

    
359
                                    Geometry geom =
360
                                        applyTransform(featureGeometry, at,
361
                                            geometry);
362

    
363
                                    EditableFeature editableFeature =
364
                                        feature.getEditable();
365
                                    editableFeature.setDefaultGeometry(geom);
366
                                    ((EditingProviderServices) getProviderServices())
367
                                        .updateFeatureInFeatureStore(
368
                                            editableFeature, featureStore);
369
                                }
370
                            } catch (BaseException e) {
371
                                throw new FinishServiceException(e);
372
                            } finally {
373
                                it.dispose();
374
                            }
375
                        }
376
                    }
377
                }
378
            }
379
        } catch (DataException e) {
380
            throw new FinishServiceException(e);
381
        }
382
    }
383

    
384
    public Geometry finish() throws FinishServiceException {
385
        return null;
386
    }
387

    
388
    public void start() throws StartServiceException {
389
        this.values = new HashMap<EditingServiceParameter, Object>();
390
        FeatureSelection selected = null;
391
        if (featureStore != null) {
392
            try {
393
                selected =
394
                    (FeatureSelection) featureStore.getFeatureSelection()
395
                        .clone();
396
            } catch (DataException e) {
397
                throw new StartServiceException(e);
398
            } catch (CloneNotSupportedException e) {
399
                // Do nothing
400
            }
401
            if ((selected != null) && (selected.getSelectedCount() > 0)) {
402
                values.put(selectionParameter, selected);
403
            }
404
        }
405
    }
406

    
407
    public String getName() {
408
        return StretchEditingProviderFactory.PROVIDER_NAME;
409
    }
410

    
411
}