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

History | View | Annotate | Download (10.3 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

    
32
import org.gvsig.fmap.dal.feature.FeatureStore;
33
import org.gvsig.fmap.geom.Geometry;
34
import org.gvsig.fmap.geom.GeometryLocator;
35
import org.gvsig.fmap.geom.aggregate.MultiCurve;
36
import org.gvsig.fmap.geom.primitive.Arc;
37
import org.gvsig.fmap.geom.primitive.Curve;
38
import org.gvsig.fmap.geom.primitive.Point;
39
import org.gvsig.fmap.geom.type.GeometryType;
40
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
41
import org.gvsig.tools.dynobject.DynObject;
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.api.exceptions.StopServiceException;
51
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
52
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
53
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
54
import org.gvsig.vectorediting.lib.spi.EditingProvider;
55
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
56
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
57
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
58
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
59

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

    
67
    private EditingServiceParameter startPoint;
68

    
69
    private EditingServiceParameter endPoint;
70

    
71
    private EditingServiceParameter middlePoint;
72

    
73
    private Map<EditingServiceParameter, Object> values;
74

    
75
    private FeatureStore featureStore;
76

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

    
89
        this.featureStore =
90
            (FeatureStore) parameters
91
            .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
92

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

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

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

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

    
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
        EditingProviderServices editingProviderServices =
128
            (EditingProviderServices) getProviderServices();
129

    
130
        if ((values != null) && (values.get(startPoint) != null)) {
131

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

    
135
            if (values.get(endPoint) == null) {
136

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

    
145

    
146
                } catch (Exception e) {
147
                    throw new DrawServiceException(e);
148
                }
149

    
150
                return geometries;
151

    
152
            } else {
153

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

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

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

    
172
                    Curve arc =
173
                        editingProviderServices.createArc(startPointValue,
174
                            mousePosition, endPointValue, subtype);
175
                    geometries.addStatus(arc, lineSymbolEditing, "");
176

    
177
                } catch (Exception e) {
178
                    throw new DrawServiceException(e);
179
                }
180

    
181
                return geometries;
182
            }
183
        }
184
        return null;
185
    }
186

    
187
    public void stop() throws StopServiceException {
188
        values.clear();
189
    }
190

    
191
    public List<EditingServiceParameter> getParameters() {
192
        List<EditingServiceParameter> parameters =
193
            new ArrayList<EditingServiceParameter>();
194
        parameters.add(startPoint);
195
        parameters.add(endPoint);
196
        parameters.add(middlePoint);
197
        return parameters;
198
    }
199

    
200
    public void setValue(Object value) throws InvalidEntryException {
201
        EditingServiceParameter param = next();
202
        validateAndInsertValue(param, value);
203
    }
204

    
205
    private void validateAndInsertValue(EditingServiceParameter param,
206
        Object value) throws InvalidEntryException {
207
        if (param == startPoint) {
208
            if (value instanceof Point) {
209
                values.put(param, value);
210
                return;
211
            }
212
        } else if (param == endPoint) {
213
            if (value instanceof Point) {
214
                if(((Point)value).equals((Point)values.get(startPoint))){
215
                    throw new InvalidEntryException(null);
216
                }
217
                values.put(param, value);
218
                return;
219
            }
220
        } else if (param == middlePoint) {
221
            if (value instanceof Point) {
222
                if(((Point)value).equals((Point)values.get(startPoint)) || ((Point)value).equals((Point)values.get(endPoint))){
223
                    throw new InvalidEntryException(null);
224
                }
225
                values.put(param, value);
226
                return;
227
            }
228
        }
229
        throw new InvalidEntryException(null);
230
    }
231

    
232
    public Geometry finish() throws FinishServiceException {
233
        Point startPointValue = (Point) values.get(startPoint);
234
        Point middlePointValue = (Point) values.get(middlePoint);
235
        Point endPointValue = (Point) values.get(endPoint);
236

    
237
        EditingProviderServices editingProviderServices =
238
            (EditingProviderServices) getProviderServices();
239

    
240
        try {
241

    
242
            int subtype =
243
                editingProviderServices.getSubType(featureStore);
244

    
245
            Curve arc =
246
                editingProviderServices.createArc(startPointValue,
247
                    middlePointValue, endPointValue, subtype);
248

    
249
            GeometryType geomType =
250
                editingProviderServices.getGeomType(featureStore);
251

    
252
            if (geomType.isTypeOf(MULTICURVE)) {
253

    
254
                MultiCurve multiCurve;
255
                multiCurve =
256
                    GeometryLocator.getGeometryManager().createMultiCurve(
257
                        geomType.getSubType());
258
                multiCurve.addCurve(arc);
259
                return multiCurve;
260
            }
261

    
262
            return arc;
263
        } catch (Exception e) {
264
            throw new FinishServiceException(e);
265
        }
266
    }
267

    
268
    public void finishAndStore() throws FinishServiceException {
269
        Geometry geometry = finish();
270
        EditingProviderServices editingProviderServices =
271
            (EditingProviderServices) getProviderServices();
272
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
273
            featureStore);
274
    }
275

    
276
    public void start() throws StartServiceException {
277
        values = new HashMap<EditingServiceParameter, Object>();
278
    }
279

    
280
    public String getName() {
281
        return ArcEditingProviderFactory.PROVIDER_NAME;
282
    }
283

    
284
}