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.circlecr / src / main / java / org / gvsig / vectorediting / lib / prov / circlecr / CircleCDEditingProvider.java @ 2866

History | View | Annotate | Download (9.14 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.circlecr;
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.GeometryUtils;
35
import org.gvsig.fmap.geom.aggregate.MultiSurface;
36
import org.gvsig.fmap.geom.primitive.Circle;
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.EditingServiceParameter;
44
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
45
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
46
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
47
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
48
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
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
public class CircleCDEditingProvider extends AbstractEditingProvider implements
59
EditingProvider {
60

    
61
    protected EditingServiceParameter center;
62

    
63
    protected EditingServiceParameter diameter;
64

    
65
    protected Map<EditingServiceParameter, Object> values;
66

    
67
    protected FeatureStore featureStore;
68

    
69
    public CircleCDEditingProvider(ProviderServices providerServices,
70
        DynObject parameters) {
71
        super(providerServices);
72

    
73
        this.featureStore =
74
            (FeatureStore) parameters
75
            .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
76

    
77
        this.center =
78
            new DefaultEditingServiceParameter("center", "center",
79
                TYPE.POSITION);
80

    
81
        this.diameter =
82
            new DefaultEditingServiceParameter("diameter", "diameter",
83
                TYPE.POSITION, TYPE.VALUE);
84
    }
85

    
86
    public DefaultDrawingStatus getDrawingStatus(Point mousePosition)
87
        throws DrawServiceException {
88
        DefaultDrawingStatus geometries = new DefaultDrawingStatus();
89
        EditingProviderManager editingProviderManager =
90
            EditingProviderLocator.getProviderManager();
91
        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
92
        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
93
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
94

    
95
        ISymbol previewSymbol = this.getPreviewSymbol();
96
        
97
        if ((values != null) && (values.get(center) != null)
98
            && (values.get(diameter) == null)) {
99
            Point centerPoint = (Point) values.get(center);
100
            EditingProviderServices editingProviderServices =
101
                (EditingProviderServices) getProviderServices();
102

    
103
            try {
104
                int subtype = editingProviderServices.getSubType(featureStore);
105
                Point oppositePosition = GeometryUtils.createPoint(
106
                        centerPoint.getX() - (mousePosition.getX() - centerPoint.getX()),
107
                        centerPoint.getY() - (mousePosition.getY() - centerPoint.getY())
108
                );
109
                Curve line
110
                        = editingProviderServices.createLine(oppositePosition, mousePosition, subtype);
111
                Circle circle = editingProviderServices.createCircle(centerPoint, mousePosition.distance(centerPoint), subtype);
112
                geometries.addStatus(centerPoint, auxiliaryPointSymbolEditing, "");
113
                geometries.addStatus(line, auxiliaryLineSymbolEditing, "");
114
                geometries.addStatus(circle, polygonSymbolEditing, "");
115
                geometries.addStatus(circle, previewSymbol, "");
116

    
117
            } catch (Exception e) {
118
                throw new DrawServiceException(e);
119
            }
120

    
121
            return geometries;
122
        }
123

    
124
        return null;
125

    
126
    }
127

    
128
    @Override
129
    public EditingServiceParameter next() {
130
        if (values.get(center) == null) {
131
            return this.center;
132
        } else if (values.get(diameter) == null) {
133
            return this.diameter;
134
        }
135
        return null;
136
    }
137

    
138
    @Override
139
    public void stop() {
140
        values.clear();
141
    }
142

    
143
    private void validateAndInsertValue(EditingServiceParameter param,
144
        Object value) throws InvalidEntryException {
145
        if (param == center) {
146
            if (value instanceof Point) {
147
                values.put(param, value);
148
                return;
149
            }
150
        } else if (param == diameter) {
151

    
152
            if (value instanceof Point) {
153
                Double radiusValue = null;
154

    
155
                try {
156
                    radiusValue =
157
                        ((Point) value).distance((Point) values.get(center));
158
                } catch (Exception e) {
159
                    throw new InvalidEntryException(e);
160
                }
161

    
162
                if (radiusValue != null) {
163
                    values.put(param, radiusValue * 2.0);
164
                    return;
165
                }
166

    
167
            } else if (value instanceof Double) {
168

    
169
                if ((((Double) value) - 0.01) > 0) {
170
                    values.put(param, value);
171
                    return;
172
                }
173

    
174
            }
175
        }
176
        throw new InvalidEntryException(null);
177
    }
178

    
179
    @Override
180
    public List<EditingServiceParameter> getParameters() {
181
        List<EditingServiceParameter> list =
182
            new ArrayList<>();
183
        list.add(center);
184
        list.add(diameter);
185
        return list;
186
    }
187

    
188
    @Override
189
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
190
        validateAndInsertValue(parameter, value);
191
    }
192

    
193
    @Override
194
    public void setValue(Object value) throws InvalidEntryException {
195
        EditingServiceParameter param = next();
196
        validateAndInsertValue(param, value);
197
    }
198

    
199
    @Override
200
    public void finishAndStore() throws FinishServiceException {
201
        EditingProviderServices editingProviderServices =
202
            (EditingProviderServices) getProviderServices();
203
        Geometry geometry = finish();
204
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
205
            featureStore);
206
    }
207

    
208
    @Override
209
    public Geometry finish() throws FinishServiceException {
210
        Point centerPoint = (Point) values.get(center);
211
        double diameterValue = (Double) values.get(diameter);
212
        EditingProviderServices editingProviderServices =
213
            (EditingProviderServices) getProviderServices();
214

    
215
        try {
216
            int subtype = editingProviderServices.getSubType(featureStore);
217
            GeometryType storeGeomType =
218
                editingProviderServices.getGeomType(featureStore);
219
            Geometry geometry =
220
                editingProviderServices.createCircle(centerPoint, diameterValue/2.0,
221
                    subtype);
222

    
223
            if (storeGeomType.isTypeOf(MULTISURFACE)) {
224
                MultiSurface multisurface;
225
                multisurface =
226
                    GeometryLocator.getGeometryManager().createMultiSurface(
227
                        storeGeomType.getSubType());
228
                multisurface.addSurface((Circle) geometry);
229
                return multisurface;
230
            }
231

    
232
            return geometry;
233
        } catch (Exception e) {
234
            throw new FinishServiceException(e);
235
        }
236
    }
237

    
238
    @Override
239
    public void start() throws StartServiceException {
240
        this.values = new HashMap<>();
241
    }
242

    
243
    public String getName() {
244
        return CircleCDEditingProviderFactory.PROVIDER_NAME;
245
    }
246

    
247
    @Override
248
    public Object getValue(EditingServiceParameter parameter) {
249
        return values!=null?values.get(parameter):null;
250
    }
251

    
252
}