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.arc / src / main / java / org / gvsig / vectorediting / lib / prov / arc / ArcEditingProvider.java @ 2616

History | View | Annotate | Download (10.8 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.lib.prov.arc;
26

    
27
import java.util.ArrayList;
28
import java.util.HashMap;
29
import java.util.List;
30
import java.util.Map;
31
import org.gvsig.fmap.dal.feature.FeatureStore;
32
import org.gvsig.fmap.geom.Geometry;
33
import org.gvsig.fmap.geom.GeometryLocator;
34
import org.gvsig.fmap.geom.aggregate.MultiCurve;
35
import org.gvsig.fmap.geom.primitive.Curve;
36
import org.gvsig.fmap.geom.primitive.Point;
37
import org.gvsig.fmap.geom.type.GeometryType;
38
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
39
import org.gvsig.tools.dynobject.DynObject;
40
import org.gvsig.tools.service.spi.ProviderServices;
41
import org.gvsig.vectorediting.lib.api.DrawingStatus;
42
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
43
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
44
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
45
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
46
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
47
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
48
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
49
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
50
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
51
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
52
import org.gvsig.vectorediting.lib.spi.EditingProvider;
53
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
54
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
55
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
56
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
57

    
58
/**
59
 * @author llmarques
60
 *
61
 */
62
public class ArcEditingProvider extends AbstractEditingProvider implements
63
EditingProvider {
64

    
65
    private final EditingServiceParameter startPoint;
66

    
67
    private final EditingServiceParameter endPoint;
68

    
69
    private final EditingServiceParameter middlePoint;
70

    
71
    private Map<EditingServiceParameter, Object> values;
72

    
73
    private final FeatureStore featureStore;
74

    
75
    /**
76
     * Default constructor.
77
     *
78
     * @param providerServices
79
     *            available services for this provider
80
     * @param parameters
81
     *            of this provider
82
     */
83
    public ArcEditingProvider(ProviderServices providerServices,
84
        DynObject parameters) {
85
        super(providerServices);
86

    
87
        this.featureStore =
88
            (FeatureStore) parameters
89
            .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
90

    
91
        this.startPoint =
92
            new DefaultEditingServiceParameter("start_point", "start_point",
93
                TYPE.POSITION);
94

    
95
        this.endPoint =
96
            new DefaultEditingServiceParameter("end_point", "end_point",
97
                TYPE.POSITION);
98

    
99
        this.middlePoint =
100
            new DefaultEditingServiceParameter("middle_point", "middle_point",
101
                TYPE.POSITION);
102
    }
103

    
104
    @Override
105
    public EditingServiceParameter next() {
106
        if (values.get(startPoint) == null) {
107
            return this.startPoint;
108
        } else if (values.get(endPoint) == null) {
109
            return this.endPoint;
110
        } else if (values.get(middlePoint) == null) {
111
            return this.middlePoint;
112
        }
113
        return null;
114
    }
115

    
116
    @Override
117
    public DrawingStatus getDrawingStatus(Point mousePosition)
118
        throws DrawServiceException {
119
        DefaultDrawingStatus geometries = new DefaultDrawingStatus();
120

    
121
        EditingProviderManager editingProviderManager =
122
            EditingProviderLocator.getProviderManager();
123
        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
124
        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
125
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
126
        
127
        ISymbol previewSymbol = this.getPreviewSymbol();
128

    
129
        EditingProviderServices editingProviderServices =
130
            (EditingProviderServices) getProviderServices();
131

    
132
        if ((values != null) && (values.get(startPoint) != null)) {
133

    
134
            Point startPointValue = (Point) values.get(startPoint);
135
            geometries.addStatus(startPointValue, auxiliaryPointSymbolEditing, "");
136

    
137
            if (values.get(endPoint) == null) {
138

    
139
                try {
140
                    int subtype =
141
                        editingProviderServices.getSubType(featureStore);
142
                    Curve line =
143
                        editingProviderServices.createLine(startPointValue,
144
                            mousePosition, subtype);
145
                    geometries.addStatus(line, auxiliaryLineSymbolEditing, "");
146

    
147

    
148
                } catch (Exception e) {
149
                    throw new DrawServiceException(e);
150
                }
151

    
152
                return geometries;
153

    
154
            } else {
155

    
156
                Point endPointValue = (Point) values.get(endPoint);
157
                geometries.addStatus(endPointValue, auxiliaryPointSymbolEditing, "");
158

    
159
                try {
160
                    int subtype =
161
                        editingProviderServices.getSubType(featureStore);
162
                    Curve line1 =
163
                        editingProviderServices.createLine(startPointValue,mousePosition, subtype);
164
                    geometries.addStatus(line1, auxiliaryLineSymbolEditing, "");
165
                    Curve line2 =
166
                        editingProviderServices.createLine(endPointValue,mousePosition, subtype);
167
                    geometries.addStatus(line2, auxiliaryLineSymbolEditing, "");
168

    
169
                    Point center =
170
                        editingProviderServices.getCenter(startPointValue,
171
                            mousePosition, endPointValue, subtype);
172
                    geometries.addStatus(center, auxiliaryPointSymbolEditing, "");
173

    
174
                    Curve arc =
175
                        editingProviderServices.createArc(startPointValue,
176
                            mousePosition, endPointValue, subtype);
177
                    geometries.addStatus(arc, lineSymbolEditing, "");
178
                    geometries.addStatus(arc, previewSymbol, "");
179

    
180
                } catch (Exception e) {
181
                    throw new DrawServiceException(e);
182
                }
183

    
184
                return geometries;
185
            }
186
        }
187
        return null;
188
    }
189

    
190
    @Override
191
    public void stop() throws StopServiceException {
192
        values.clear();
193
    }
194

    
195
    @Override
196
    public List<EditingServiceParameter> getParameters() {
197
        List<EditingServiceParameter> parameters =
198
            new ArrayList<>();
199
        parameters.add(startPoint);
200
        parameters.add(endPoint);
201
        parameters.add(middlePoint);
202
        return parameters;
203
    }
204

    
205
    @Override
206
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
207
        validateAndInsertValue(parameter, value);
208
    }
209

    
210
    @Override
211
    public void setValue(Object value) throws InvalidEntryException {
212
        EditingServiceParameter param = next();
213
        validateAndInsertValue(param, value);
214
    }
215

    
216
    private void validateAndInsertValue(EditingServiceParameter param,
217
        Object value) throws InvalidEntryException {
218
        if (param == startPoint) {
219
            if (value instanceof Point) {
220
                values.put(param, value);
221
                return;
222
            }
223
        } else if (param == endPoint) {
224
            if (value instanceof Point) {
225
                if(((Point)value).equals((Point)values.get(startPoint))){
226
                    throw new InvalidEntryException(null);
227
                }
228
                values.put(param, value);
229
                return;
230
            }
231
        } else if (param == middlePoint) {
232
            if (value instanceof Point) {
233
                if(((Point)value).equals((Point)values.get(startPoint)) || ((Point)value).equals((Point)values.get(endPoint))){
234
                    throw new InvalidEntryException(null);
235
                }
236
                values.put(param, value);
237
                return;
238
            }
239
        }
240
        throw new InvalidEntryException(null);
241
    }
242

    
243
    @Override
244
    public Geometry finish() throws FinishServiceException {
245
        Point startPointValue = (Point) values.get(startPoint);
246
        Point middlePointValue = (Point) values.get(middlePoint);
247
        Point endPointValue = (Point) values.get(endPoint);
248

    
249
        EditingProviderServices editingProviderServices =
250
            (EditingProviderServices) getProviderServices();
251

    
252
        try {
253

    
254
            int subtype =
255
                editingProviderServices.getSubType(featureStore);
256

    
257
            Curve arc =
258
                editingProviderServices.createArc(startPointValue,
259
                    middlePointValue, endPointValue, subtype);
260

    
261
            GeometryType geomType =
262
                editingProviderServices.getGeomType(featureStore);
263

    
264
            if (geomType.isTypeOf(MULTICURVE)) {
265

    
266
                MultiCurve multiCurve;
267
                multiCurve =
268
                    GeometryLocator.getGeometryManager().createMultiCurve(
269
                        geomType.getSubType());
270
                multiCurve.addCurve(arc);
271
                return multiCurve;
272
            }
273

    
274
            return arc;
275
        } catch (Exception e) {
276
            throw new FinishServiceException(e);
277
        }
278
    }
279

    
280
    @Override
281
    public void finishAndStore() throws FinishServiceException {
282
        Geometry geometry = finish();
283
        EditingProviderServices editingProviderServices =
284
            (EditingProviderServices) getProviderServices();
285
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
286
            featureStore);
287
    }
288

    
289
    @Override
290
    public void start() throws StartServiceException {
291
        values = new HashMap<>();
292
    }
293

    
294
    @Override
295
    public String getName() {
296
        return ArcEditingProviderFactory.PROVIDER_NAME;
297
    }
298

    
299
    @Override
300
    public Object getValue(EditingServiceParameter parameter) {
301
        return values!=null?values.get(parameter):null;
302
    }
303

    
304
}