gvsig-vectorediting / org.gvsig.vectorediting.symmetry / trunk / org.gvsig.vectorediting.symmetry / org.gvsig.vectorediting.symmetry.lib / org.gvsig.vectorediting.symmetry.lib.prov / org.gvsig.vectorediting.symmetry.lib.prov.symmetry / src / main / java / org / gvsig / vectorediting / symmetry / lib / prov / symmetry / SymmetryEditingProvider.java @ 2874
History | View | Annotate | Download (17.1 KB)
1 | 159 | llmarques | /**
|
---|---|---|---|
2 | * gvSIG. Desktop Geographic Information System.
|
||
3 | 122 | llmarques | *
|
4 | 159 | llmarques | * 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 | 122 | llmarques | */
|
24 | 159 | llmarques | |
25 | 122 | llmarques | package org.gvsig.vectorediting.symmetry.lib.prov.symmetry; |
26 | |||
27 | import java.awt.geom.AffineTransform; |
||
28 | import java.util.ArrayList; |
||
29 | import java.util.HashMap; |
||
30 | 195 | llmarques | import java.util.LinkedHashMap; |
31 | 122 | llmarques | import java.util.List; |
32 | import java.util.Map; |
||
33 | import org.gvsig.fmap.dal.exception.DataException; |
||
34 | import org.gvsig.fmap.dal.feature.EditableFeature; |
||
35 | import org.gvsig.fmap.dal.feature.Feature; |
||
36 | import org.gvsig.fmap.dal.feature.FeatureSelection; |
||
37 | import org.gvsig.fmap.dal.feature.FeatureStore; |
||
38 | import org.gvsig.fmap.geom.Geometry; |
||
39 | import org.gvsig.fmap.geom.GeometryLocator; |
||
40 | 336 | fdiaz | import org.gvsig.fmap.geom.aggregate.Aggregate; |
41 | import org.gvsig.fmap.geom.aggregate.MultiCurve; |
||
42 | import org.gvsig.fmap.geom.aggregate.MultiPoint; |
||
43 | import org.gvsig.fmap.geom.aggregate.MultiSurface; |
||
44 | 122 | llmarques | import org.gvsig.fmap.geom.operation.GeometryOperationException; |
45 | import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException; |
||
46 | 336 | fdiaz | import org.gvsig.fmap.geom.primitive.Curve; |
47 | 122 | llmarques | import org.gvsig.fmap.geom.primitive.Line; |
48 | import org.gvsig.fmap.geom.primitive.Point; |
||
49 | 2618 | fdiaz | import org.gvsig.fmap.geom.primitive.Primitive; |
50 | 336 | fdiaz | import org.gvsig.fmap.geom.primitive.Surface; |
51 | import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol; |
||
52 | 122 | llmarques | import org.gvsig.tools.ToolsLocator; |
53 | 2725 | fdiaz | import org.gvsig.tools.dataTypes.DataTypes; |
54 | 122 | llmarques | import org.gvsig.tools.dispose.DisposableIterator; |
55 | import org.gvsig.tools.dynobject.DynObject; |
||
56 | import org.gvsig.tools.i18n.I18nManager; |
||
57 | import org.gvsig.tools.service.spi.ProviderServices; |
||
58 | import org.gvsig.vectorediting.lib.api.DrawingStatus; |
||
59 | import org.gvsig.vectorediting.lib.api.EditingServiceParameter; |
||
60 | import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE; |
||
61 | import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException; |
||
62 | import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException; |
||
63 | import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException; |
||
64 | import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException; |
||
65 | import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider; |
||
66 | import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus; |
||
67 | import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter; |
||
68 | 2725 | fdiaz | import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions; |
69 | 122 | llmarques | import org.gvsig.vectorediting.lib.spi.EditingProvider; |
70 | import org.gvsig.vectorediting.lib.spi.EditingProviderFactory; |
||
71 | 336 | fdiaz | import org.gvsig.vectorediting.lib.spi.EditingProviderLocator; |
72 | import org.gvsig.vectorediting.lib.spi.EditingProviderManager; |
||
73 | 122 | llmarques | import org.gvsig.vectorediting.lib.spi.EditingProviderServices; |
74 | |||
75 | 159 | llmarques | public class SymmetryEditingProvider extends AbstractEditingProvider implements |
76 | 241 | llmarques | EditingProvider { |
77 | 122 | llmarques | |
78 | 2618 | fdiaz | private final EditingServiceParameter selectionParameter; |
79 | 122 | llmarques | |
80 | 2618 | fdiaz | private final EditingServiceParameter firstPointParameter; |
81 | 122 | llmarques | |
82 | 2618 | fdiaz | private final EditingServiceParameter secondPointParameter; |
83 | 122 | llmarques | |
84 | 2618 | fdiaz | private final EditingServiceParameter deleteOriginalGeometriesParameter; |
85 | 122 | llmarques | |
86 | 159 | llmarques | private Map<EditingServiceParameter, Object> values; |
87 | 122 | llmarques | |
88 | 2618 | fdiaz | private final Map<String, String> options; |
89 | 195 | llmarques | |
90 | 2618 | fdiaz | private final FeatureStore featureStore; |
91 | 122 | llmarques | |
92 | 159 | llmarques | public SymmetryEditingProvider(ProviderServices providerServices,
|
93 | DynObject parameters) { |
||
94 | super(providerServices);
|
||
95 | 2618 | fdiaz | |
96 | I18nManager i18nManager = ToolsLocator.getI18nManager(); |
||
97 | |||
98 | 159 | llmarques | this.featureStore =
|
99 | (FeatureStore) parameters |
||
100 | 241 | llmarques | .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD); |
101 | 195 | llmarques | |
102 | this.selectionParameter =
|
||
103 | 241 | llmarques | new DefaultEditingServiceParameter("selection", |
104 | 195 | llmarques | i18nManager.getTranslation("selection"), TYPE.SELECTION);
|
105 | |||
106 | this.firstPointParameter =
|
||
107 | 228 | llmarques | new DefaultEditingServiceParameter("first_point_of_symmetry_axis", |
108 | 195 | llmarques | i18nManager.getTranslation("first_point_of_symmetry_axis"),
|
109 | TYPE.POSITION); |
||
110 | |||
111 | this.secondPointParameter =
|
||
112 | 228 | llmarques | new DefaultEditingServiceParameter("second_point_of_symmetry_axis", |
113 | 195 | llmarques | i18nManager.getTranslation("second_point_of_symmetry_axis"),
|
114 | TYPE.POSITION); |
||
115 | |||
116 | 2618 | fdiaz | this.options = new LinkedHashMap<>(); |
117 | 195 | llmarques | options.put(i18nManager.getTranslation("short_yes"),
|
118 | "delete_original_geometries");
|
||
119 | options.put(i18nManager.getTranslation("short_no"),
|
||
120 | "keep_original_geometries");
|
||
121 | |||
122 | 241 | llmarques | EditingProviderServices editingProviderServices = |
123 | (EditingProviderServices) getProviderServices(); |
||
124 | |||
125 | 2725 | fdiaz | DefaultEditingServiceParameterOptions deleteOriginalGeometriesOptions2 = new DefaultEditingServiceParameterOptions()
|
126 | .add("delete_original_geometries", true, i18nManager.getTranslation("_yes")) |
||
127 | .add("keep_original_geometries", false, i18nManager.getTranslation("_no")); |
||
128 | 241 | llmarques | |
129 | 2725 | fdiaz | String consoleMsg
|
130 | = editingProviderServices.makeConsoleMessage( |
||
131 | "delete_original_geometries_question", deleteOriginalGeometriesOptions2);
|
||
132 | |||
133 | this.deleteOriginalGeometriesParameter
|
||
134 | = new DefaultEditingServiceParameter(
|
||
135 | i18nManager.getTranslation("delete_original_geometries"),
|
||
136 | consoleMsg, |
||
137 | deleteOriginalGeometriesOptions2, |
||
138 | 2874 | fdiaz | false,
|
139 | 2725 | fdiaz | TYPE.OPTION).setDataType(DataTypes.BOOLEAN);; |
140 | 159 | llmarques | } |
141 | 122 | llmarques | |
142 | 2618 | fdiaz | @Override
|
143 | 159 | llmarques | public DrawingStatus getDrawingStatus(Point mousePosition) |
144 | throws DrawServiceException {
|
||
145 | 336 | fdiaz | DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
|
146 | EditingProviderManager editingProviderManager = |
||
147 | EditingProviderLocator.getProviderManager(); |
||
148 | ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
|
||
149 | ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
|
||
150 | ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
|
||
151 | ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
|
||
152 | 122 | llmarques | |
153 | 336 | fdiaz | |
154 | 159 | llmarques | FeatureSelection selected = |
155 | (FeatureSelection) values.get(selectionParameter); |
||
156 | try {
|
||
157 | 227 | llmarques | if ((selected != null) && !selected.isEmpty()) { |
158 | 159 | llmarques | Point p1 = (Point) values.get(firstPointParameter); |
159 | if (p1 != null) { |
||
160 | Object p2Value = values.get(secondPointParameter);
|
||
161 | 2618 | fdiaz | Point p2;
|
162 | 227 | llmarques | if ((p2Value != null) && (p2Value instanceof Point)) { |
163 | 159 | llmarques | p2 = (Point) p2Value;
|
164 | } else {
|
||
165 | p2 = mousePosition; |
||
166 | } |
||
167 | Line line;
|
||
168 | line = |
||
169 | GeometryLocator.getGeometryManager().createLine( |
||
170 | featureStore.getDefaultFeatureType() |
||
171 | 241 | llmarques | .getDefaultGeometryAttribute().getGeomType() |
172 | .getSubType()); |
||
173 | 159 | llmarques | line.addVertex(p1); |
174 | line.addVertex(p2); |
||
175 | 122 | llmarques | |
176 | 336 | fdiaz | drawingStatus.addStatus(line, auxiliaryLineSymbolEditing, "");
|
177 | 122 | llmarques | |
178 | 159 | llmarques | DisposableIterator it; |
179 | it = selected.fastIterator(); |
||
180 | 1975 | omartinez | |
181 | 159 | llmarques | AffineTransform at;
|
182 | try {
|
||
183 | at = getSymmetryAffineTransform(p1, p2); |
||
184 | } catch (Exception e) { |
||
185 | throw new DrawServiceException(e); |
||
186 | } |
||
187 | 122 | llmarques | |
188 | 159 | llmarques | while (it.hasNext()) {
|
189 | Feature feat = (Feature) it.next(); |
||
190 | 2618 | fdiaz | |
191 | ISymbol previewSymbol = this.getPreviewSymbol(feat);
|
||
192 | |||
193 | 336 | fdiaz | Geometry transformedGeometry = feat.getDefaultGeometry().cloneGeometry(); |
194 | transformedGeometry.transform(at); |
||
195 | |||
196 | ISymbol symbol=null;
|
||
197 | if(transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve){ |
||
198 | symbol = lineSymbolEditing; |
||
199 | } else if(transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface){ |
||
200 | symbol = polygonSymbolEditing; |
||
201 | } else if(transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint){ |
||
202 | symbol = auxiliaryPointSymbolEditing; |
||
203 | } |
||
204 | if(transformedGeometry instanceof Aggregate){ |
||
205 | int primitivesNumber = ((Aggregate)transformedGeometry).getPrimitivesNumber();
|
||
206 | for (int i = 0; i < primitivesNumber; i++) { |
||
207 | 2618 | fdiaz | final Primitive primitive = ((Aggregate)transformedGeometry).getPrimitiveAt(i);
|
208 | drawingStatus.addStatus(primitive, symbol, "");
|
||
209 | drawingStatus.addStatus(primitive, previewSymbol, "");
|
||
210 | 336 | fdiaz | } |
211 | } else {
|
||
212 | drawingStatus.addStatus(transformedGeometry, symbol, "");
|
||
213 | 2618 | fdiaz | drawingStatus.addStatus(transformedGeometry, previewSymbol, "");
|
214 | 336 | fdiaz | } |
215 | 159 | llmarques | } |
216 | it.dispose(); |
||
217 | } |
||
218 | 336 | fdiaz | return drawingStatus;
|
219 | 159 | llmarques | } |
220 | } catch (Exception e) { |
||
221 | throw new DrawServiceException(e); |
||
222 | } |
||
223 | return null; |
||
224 | } |
||
225 | 122 | llmarques | |
226 | 159 | llmarques | private AffineTransform getSymmetryAffineTransform(Point axisP1, |
227 | Point axisP2) throws GeometryOperationNotSupportedException, |
||
228 | GeometryOperationException { |
||
229 | 122 | llmarques | |
230 | 159 | llmarques | AffineTransform translate =
|
231 | AffineTransform
|
||
232 | 241 | llmarques | .getTranslateInstance(-axisP1.getX(), -axisP1.getY()); |
233 | 122 | llmarques | |
234 | 183 | llmarques | EditingProviderServices editingProviderServices = |
235 | (EditingProviderServices) getProviderServices(); |
||
236 | Double angle = -editingProviderServices.getAngle(axisP1, axisP2);
|
||
237 | 159 | llmarques | AffineTransform rotate = AffineTransform.getRotateInstance(angle); |
238 | 122 | llmarques | |
239 | 159 | llmarques | AffineTransform symmetry = new AffineTransform(1, 0, 0, -1, 0, 0); |
240 | AffineTransform inverseRotate =
|
||
241 | AffineTransform.getRotateInstance(-angle);
|
||
242 | AffineTransform inverseTranslate =
|
||
243 | AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY());
|
||
244 | AffineTransform at = new AffineTransform(translate); |
||
245 | 122 | llmarques | |
246 | 159 | llmarques | at.preConcatenate(rotate); |
247 | at.preConcatenate(symmetry); |
||
248 | at.preConcatenate(inverseRotate); |
||
249 | at.preConcatenate(inverseTranslate); |
||
250 | return at;
|
||
251 | } |
||
252 | 122 | llmarques | |
253 | 2618 | fdiaz | @Override
|
254 | 159 | llmarques | public EditingServiceParameter next() {
|
255 | if (values.get(selectionParameter) == null) { |
||
256 | return this.selectionParameter; |
||
257 | } else if (values.get(firstPointParameter) == null) { |
||
258 | return this.firstPointParameter; |
||
259 | } else if (values.get(secondPointParameter) == null) { |
||
260 | return this.secondPointParameter; |
||
261 | } else if (values.get(deleteOriginalGeometriesParameter) == null) { |
||
262 | return this.deleteOriginalGeometriesParameter; |
||
263 | } |
||
264 | return null; |
||
265 | } |
||
266 | 122 | llmarques | |
267 | 2618 | fdiaz | @Override
|
268 | 159 | llmarques | public void stop() { |
269 | 231 | llmarques | values.clear(); |
270 | 159 | llmarques | } |
271 | 122 | llmarques | |
272 | 159 | llmarques | private void validateAndInsertValue(EditingServiceParameter param, |
273 | Object value) throws InvalidEntryException { |
||
274 | 2618 | fdiaz | |
275 | I18nManager i18nManager = ToolsLocator.getI18nManager(); |
||
276 | |||
277 | |||
278 | 159 | llmarques | if (param == selectionParameter) {
|
279 | if (value instanceof FeatureSelection) { |
||
280 | values.put(param, value); |
||
281 | } |
||
282 | } else if (param == firstPointParameter) { |
||
283 | if (value instanceof Point) { |
||
284 | values.put(param, value); |
||
285 | } |
||
286 | } else if (param == secondPointParameter) { |
||
287 | if (value instanceof Point) { |
||
288 | values.put(param, value); |
||
289 | } |
||
290 | } else if (param == deleteOriginalGeometriesParameter) { |
||
291 | 2725 | fdiaz | values.put(param, param.getOptions2().getValue(value, param.getDefaultValue())); |
292 | 159 | llmarques | } |
293 | 122 | llmarques | |
294 | 159 | llmarques | } |
295 | 122 | llmarques | |
296 | 2618 | fdiaz | @Override
|
297 | 159 | llmarques | public List<EditingServiceParameter> getParameters() { |
298 | List<EditingServiceParameter> list =
|
||
299 | 2618 | fdiaz | new ArrayList<>(); |
300 | 159 | llmarques | list.add(selectionParameter); |
301 | list.add(firstPointParameter); |
||
302 | list.add(secondPointParameter); |
||
303 | 2725 | fdiaz | list.add(deleteOriginalGeometriesParameter); |
304 | 159 | llmarques | return list;
|
305 | } |
||
306 | 122 | llmarques | |
307 | 2205 | fdiaz | @Override
|
308 | public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException { |
||
309 | validateAndInsertValue(parameter, value); |
||
310 | } |
||
311 | |||
312 | 2618 | fdiaz | @Override
|
313 | 159 | llmarques | public void setValue(Object value) throws InvalidEntryException { |
314 | EditingServiceParameter param = next(); |
||
315 | validateAndInsertValue(param, value); |
||
316 | } |
||
317 | 122 | llmarques | |
318 | 2618 | fdiaz | @Override
|
319 | 159 | llmarques | public void finishAndStore() throws FinishServiceException { |
320 | 122 | llmarques | |
321 | 159 | llmarques | FeatureSelection selected = |
322 | (FeatureSelection) values.get(selectionParameter); |
||
323 | 2725 | fdiaz | final Boolean deleteOriginalGeometriesValue = (Boolean) values.get(deleteOriginalGeometriesParameter); |
324 | |||
325 | 159 | llmarques | try {
|
326 | if (!selected.isEmpty()) {
|
||
327 | Point p1 = (Point) values.get(firstPointParameter); |
||
328 | Point p2 = (Point) values.get(secondPointParameter); |
||
329 | 227 | llmarques | if ((p1 != null) && (p2 != null)) { |
330 | 122 | llmarques | |
331 | 159 | llmarques | AffineTransform at;
|
332 | try {
|
||
333 | at = getSymmetryAffineTransform(p1, p2); |
||
334 | 2618 | fdiaz | } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
|
335 | 159 | llmarques | throw new FinishServiceException(e); |
336 | } |
||
337 | 122 | llmarques | |
338 | 159 | llmarques | DisposableIterator it; |
339 | it = selected.fastIterator(); |
||
340 | 122 | llmarques | |
341 | 159 | llmarques | while (it.hasNext()) {
|
342 | Feature feature = (Feature) it.next(); |
||
343 | Geometry geom = |
||
344 | 227 | llmarques | feature.getDefaultGeometry().cloneGeometry(); |
345 | 159 | llmarques | geom.transform(at); |
346 | 2725 | fdiaz | if (deleteOriginalGeometriesValue) {
|
347 | 159 | llmarques | // Se sustituye la geometr?a original por la
|
348 | // calculada
|
||
349 | EditableFeature editableFeature = |
||
350 | feature.getEditable(); |
||
351 | editableFeature.setDefaultGeometry(geom); |
||
352 | ((EditingProviderServices) getProviderServices()) |
||
353 | 241 | llmarques | .updateFeatureInFeatureStore(editableFeature, |
354 | featureStore); |
||
355 | 159 | llmarques | } else {
|
356 | // Se crea una feature nueva copiando los valores de
|
||
357 | // la feature original excepto aquellos que sean PK
|
||
358 | 183 | llmarques | EditingProviderServices editingProviderServices = |
359 | (EditingProviderServices) getProviderServices(); |
||
360 | 159 | llmarques | EditableFeature editableFeature = |
361 | editingProviderServices |
||
362 | 2614 | fdiaz | .getFeatureCopyWithoutUniqueIndex(featureStore, |
363 | 241 | llmarques | feature); |
364 | 159 | llmarques | editableFeature.setDefaultGeometry(geom); |
365 | 255 | llmarques | editingProviderServices |
366 | 241 | llmarques | .insertFeatureIntoFeatureStore(editableFeature, |
367 | featureStore); |
||
368 | 159 | llmarques | } |
369 | } |
||
370 | it.dispose(); |
||
371 | featureStore.getFeatureSelection().deselectAll(); |
||
372 | } |
||
373 | } |
||
374 | } catch (DataException e) {
|
||
375 | throw new FinishServiceException(e); |
||
376 | } |
||
377 | } |
||
378 | 122 | llmarques | |
379 | 2618 | fdiaz | @Override
|
380 | 159 | llmarques | public Geometry finish() throws FinishServiceException { |
381 | return null; |
||
382 | } |
||
383 | 122 | llmarques | |
384 | 2618 | fdiaz | @Override
|
385 | 159 | llmarques | public void start() throws StartServiceException { |
386 | 2618 | fdiaz | this.values = new HashMap<>(); |
387 | 159 | llmarques | FeatureSelection selected = null;
|
388 | if (featureStore != null) { |
||
389 | try {
|
||
390 | selected = |
||
391 | (FeatureSelection) featureStore.getFeatureSelection() |
||
392 | 241 | llmarques | .clone(); |
393 | 159 | llmarques | } catch (DataException e) {
|
394 | throw new StartServiceException(e); |
||
395 | } catch (CloneNotSupportedException e) { |
||
396 | // Do nothing
|
||
397 | } |
||
398 | 227 | llmarques | if ((selected != null) && (selected.getSelectedCount() > 0)) { |
399 | 159 | llmarques | values.put(selectionParameter, selected); |
400 | } |
||
401 | } |
||
402 | } |
||
403 | 122 | llmarques | |
404 | 2618 | fdiaz | @Override
|
405 | 159 | llmarques | public String getName() { |
406 | return SymmetryEditingProviderFactory.PROVIDER_NAME;
|
||
407 | } |
||
408 | 122 | llmarques | |
409 | } |