Revision 2873 org.gvsig.vectorediting.offset/trunk/org.gvsig.vectorediting.offset/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProvider.java
OffsetEditingProvider.java | ||
---|---|---|
23 | 23 |
*/ |
24 | 24 |
package org.gvsig.vectorediting.offset.lib.prov.offset; |
25 | 25 |
|
26 |
import java.text.DecimalFormat; |
|
26 | 27 |
import java.util.ArrayList; |
27 | 28 |
import java.util.HashMap; |
28 |
import java.util.LinkedHashMap; |
|
29 | 29 |
import java.util.List; |
30 | 30 |
import java.util.Map; |
31 | 31 |
import org.apache.commons.lang3.StringUtils; |
... | ... | |
35 | 35 |
import org.gvsig.fmap.dal.feature.FeatureSelection; |
36 | 36 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
37 | 37 |
import org.gvsig.fmap.geom.Geometry; |
38 |
import static org.gvsig.fmap.geom.Geometry.JOIN_STYLE_ROUND; |
|
38 | 39 |
import org.gvsig.fmap.geom.GeometryException; |
39 | 40 |
import org.gvsig.fmap.geom.GeometryLocator; |
40 | 41 |
import org.gvsig.fmap.geom.GeometryManager; |
42 |
import org.gvsig.fmap.geom.GeometryUtils; |
|
41 | 43 |
import org.gvsig.fmap.geom.aggregate.Aggregate; |
42 | 44 |
import org.gvsig.fmap.geom.aggregate.MultiCurve; |
43 | 45 |
import org.gvsig.fmap.geom.aggregate.MultiPoint; |
... | ... | |
58 | 60 |
import org.gvsig.fmap.geom.primitive.Spline; |
59 | 61 |
import org.gvsig.fmap.geom.primitive.Surface; |
60 | 62 |
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol; |
63 |
import org.gvsig.symbology.SymbologyLocator; |
|
64 |
import org.gvsig.symbology.SymbologyManager; |
|
65 |
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol; |
|
61 | 66 |
import org.gvsig.tools.ToolsLocator; |
62 | 67 |
import org.gvsig.tools.dataTypes.DataTypes; |
63 | 68 |
import org.gvsig.tools.dispose.DisposableIterator; |
... | ... | |
72 | 77 |
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException; |
73 | 78 |
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException; |
74 | 79 |
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException; |
80 |
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException; |
|
75 | 81 |
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider; |
76 | 82 |
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus; |
77 | 83 |
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter; |
... | ... | |
97 | 103 |
|
98 | 104 |
private static final String SHORT_RIGHT = "_short_right"; |
99 | 105 |
|
106 |
private static final String JOIN_STYLE = "_join_style"; |
|
100 | 107 |
|
108 |
private static final String ROUND = "_round"; |
|
109 |
|
|
110 |
private static final String MITRE = "_mitre"; |
|
111 |
|
|
112 |
private static final String BEVEL = "_bevel"; |
|
113 |
|
|
114 |
private static final String SHORT_ROUND = "_short_round"; |
|
115 |
|
|
116 |
private static final String SHORT_MITRE = "_short_mitre"; |
|
117 |
|
|
118 |
private static final String SHORT_BEVEL = "_short_bevel"; |
|
119 |
|
|
101 | 120 |
private final EditingServiceParameter selectionParameter; |
102 | 121 |
|
103 | 122 |
private final EditingServiceParameter offsetParameter; |
104 | 123 |
|
105 | 124 |
private final EditingServiceParameter sideParameter; |
106 | 125 |
|
126 |
private final DefaultEditingServiceParameter joinStyleParameter; |
|
127 |
|
|
128 |
private final EditingServiceParameter equidistantOffsets; |
|
129 |
|
|
107 | 130 |
private final EditingServiceParameter deleteOriginalGeometriesParameter; |
108 | 131 |
|
109 | 132 |
// private boolean deleteOriginalGeometries = false; |
... | ... | |
113 | 136 |
// private final Map<String, String> options; |
114 | 137 |
|
115 | 138 |
private final FeatureStore featureStore; |
116 |
|
|
139 |
|
|
117 | 140 |
public OffsetEditingProvider(ProviderServices providerServices, DynObject parameters) { |
118 | 141 |
super(providerServices); |
119 | 142 |
this.featureStore = (FeatureStore) parameters.getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD); |
... | ... | |
146 | 169 |
sideOptions, |
147 | 170 |
TYPE.OPTION, TYPE.POSITION).setDataType(DataTypes.STRING); |
148 | 171 |
|
172 |
DefaultEditingServiceParameterOptions joinStyleOptions = new DefaultEditingServiceParameterOptions() |
|
173 |
.add(i18nManager.getTranslation(ROUND), ROUND, i18nManager.getTranslation(SHORT_ROUND)) |
|
174 |
.add(i18nManager.getTranslation(MITRE), MITRE, i18nManager.getTranslation(SHORT_MITRE)) |
|
175 |
.add(i18nManager.getTranslation(BEVEL), BEVEL, i18nManager.getTranslation(SHORT_BEVEL)); |
|
176 |
|
|
177 |
|
|
178 |
String joinStyleConsoleMsg = ((EditingProviderServices)providerServices).makeConsoleMessage( |
|
179 |
i18nManager.getTranslation(JOIN_STYLE), joinStyleOptions); |
|
180 |
|
|
181 |
this.joinStyleParameter |
|
182 |
= new DefaultEditingServiceParameter( |
|
183 |
"joinStyle", |
|
184 |
joinStyleConsoleMsg, |
|
185 |
joinStyleOptions, |
|
186 |
i18nManager.getTranslation(SHORT_ROUND), |
|
187 |
true, |
|
188 |
TYPE.OPTION); //.setDataType(DataTypes.STRING); |
|
189 |
this.joinStyleParameter.setDefaultValue(ROUND); |
|
190 |
|
|
191 |
|
|
192 |
this.equidistantOffsets = new DefaultEditingServiceParameter("equidistant_offsets", "equidistant_offsets", true, TYPE.VALUE); |
|
193 |
this.equidistantOffsets.setDefaultValue(1); |
|
194 |
|
|
149 | 195 |
DefaultEditingServiceParameterOptions deleteOriginalGeometriesOptions2 = new DefaultEditingServiceParameterOptions() |
150 | 196 |
.add("delete_original_geometries", true, i18nManager.getTranslation("_yes")) |
151 | 197 |
.add("keep_original_geometries", false, i18nManager.getTranslation("_no")); |
... | ... | |
159 | 205 |
i18nManager.getTranslation("delete_original_geometries"), |
160 | 206 |
consoleMsg, |
161 | 207 |
deleteOriginalGeometriesOptions2, |
162 |
i18nManager.getTranslation("_no"),
|
|
208 |
false,
|
|
163 | 209 |
TYPE.OPTION).setDataType(DataTypes.BOOLEAN); |
164 | 210 |
|
165 | 211 |
} |
... | ... | |
169 | 215 |
|
170 | 216 |
if (values.get(selectionParameter) == null) { |
171 | 217 |
return selectionParameter; |
172 |
} else if (values.get(offsetParameter) == null) { |
|
218 |
} |
|
219 |
if (values.get(offsetParameter) == null) { |
|
173 | 220 |
return offsetParameter; |
174 |
} else if (values.get(sideParameter) == null) { |
|
221 |
} |
|
222 |
if (values.get(sideParameter) == null) { |
|
175 | 223 |
Object offsetValue = values.get(offsetParameter); |
176 | 224 |
if (!(offsetValue instanceof Point)) { |
177 | 225 |
Double distance = (Double) offsetValue; |
... | ... | |
193 | 241 |
DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus(); |
194 | 242 |
EditingProviderManager editingProviderManager |
195 | 243 |
= EditingProviderLocator.getProviderManager(); |
196 |
// ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing"); |
|
244 |
EditingProviderServices editingProviderServices = |
|
245 |
(EditingProviderServices) getProviderServices(); |
|
246 |
int subtype; |
|
247 |
try { |
|
248 |
subtype = editingProviderServices.getSubType(featureStore); |
|
249 |
} catch (DataException e2) { |
|
250 |
throw new DrawServiceException(e2); |
|
251 |
} |
|
252 |
ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing"); |
|
197 | 253 |
ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing"); |
198 | 254 |
ISymbol auxiliaryLineSymbolEditingDirection = editingProviderManager.getSymbol("auxiliary-line-symbol-editing-direction"); |
199 | 255 |
ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing"); |
200 | 256 |
ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing"); |
201 | 257 |
|
202 |
FeatureSelection selected |
|
203 |
= (FeatureSelection) values.get(selectionParameter); |
|
204 |
try { |
|
205 |
if ((selected != null) && !selected.isEmpty()) { |
|
206 |
Point point; // = null; |
|
207 |
double distance = 0.0; |
|
208 |
double side = 1.0; |
|
209 |
Object offsetValue = values.get(offsetParameter); |
|
258 |
if (values != null) { |
|
259 |
Number equidistantOffsetsNumberValue = ((Number) values.get(this.equidistantOffsets)); |
|
260 |
int equidistantOffsetsValue = equidistantOffsetsNumberValue != null ? equidistantOffsetsNumberValue.intValue() : ((Number) this.equidistantOffsets.getDefaultValue()).intValue(); |
|
210 | 261 |
|
211 |
if (offsetValue != null) { |
|
212 |
if (offsetValue instanceof Point) { |
|
213 |
distance = Math.abs(getMinDistance(selected, (Point) offsetValue)); |
|
262 |
FeatureSelection selected |
|
263 |
= (FeatureSelection) values.get(selectionParameter); |
|
264 |
try { |
|
265 |
if ((selected != null) && !selected.isEmpty()) { |
|
266 |
Point point; // = null; |
|
267 |
double distance = 0.0; |
|
268 |
double side = 1.0; |
|
269 |
Object offsetValue = values.get(offsetParameter); |
|
270 |
|
|
271 |
if (offsetValue != null) { |
|
272 |
if (offsetValue instanceof Point) { |
|
273 |
distance = Math.abs(getMinDistance(selected, (Point) offsetValue)); |
|
274 |
} else { |
|
275 |
distance = (Double) offsetValue; |
|
276 |
} |
|
277 |
|
|
278 |
Object sideValue = values.get(sideParameter); |
|
279 |
if (sideValue == null) { |
|
280 |
point = mousePosition; |
|
281 |
side = Math.signum(getMinDistance(selected, point)); |
|
282 |
} else { |
|
283 |
Double signum = getSideSignum((String) sideValue); |
|
284 |
if (signum != null) { |
|
285 |
side = signum; |
|
286 |
} |
|
287 |
} |
|
214 | 288 |
} else { |
215 |
distance = (Double) offsetValue; |
|
216 |
} |
|
289 |
point = mousePosition; |
|
290 |
Geometry closestGeometry = getClosestGeometry(selected, point); |
|
291 |
Point closestPoint = getClosestPoint(closestGeometry, point); |
|
292 |
distance = getMinDistance(selected, point); //closestPoint.distance(point); //getMinDistance(selected, point); |
|
293 |
ISymbol symbol = lineSymbolEditing; |
|
294 |
Line auxLine = GeometryUtils.createLine(closestPoint, point, subtype); |
|
295 |
drawingStatus.addStatus( |
|
296 |
auxLine, |
|
297 |
auxiliaryLineSymbolEditing, |
|
298 |
"" |
|
299 |
); |
|
217 | 300 |
|
218 |
Object sideValue = values.get(sideParameter); |
|
219 |
if (sideValue == null) { |
|
220 |
point = mousePosition; |
|
221 |
side = Math.signum(getMinDistance(selected, point)); |
|
222 |
} else { |
|
223 |
Double signum = getSideSignum((String) sideValue); |
|
224 |
if (signum != null) { |
|
225 |
side = signum; |
|
226 |
} |
|
301 |
Point pointText = GeometryUtils.createPoint( |
|
302 |
0.5 * (closestPoint.getX() + point.getX()), |
|
303 |
0.5 * (closestPoint.getY() + point.getY()) |
|
304 |
); |
|
305 |
|
|
306 |
ISimpleTextSymbol textSymbol = getTextSymbol(); |
|
307 |
drawingStatus.addStatus( |
|
308 |
pointText, |
|
309 |
textSymbol, |
|
310 |
new DecimalFormat("#.0#").format(distance) |
|
311 |
); |
|
312 |
|
|
227 | 313 |
} |
228 |
} else { |
|
229 |
point = mousePosition; |
|
230 |
distance = getMinDistance(selected, point); |
|
231 |
} |
|
232 | 314 |
|
233 |
DisposableIterator it; |
|
234 |
it = selected.fastIterator(); |
|
315 |
int joinStyleValue = coerceJoinStyle(values.get(joinStyleParameter)); |
|
235 | 316 |
|
236 |
while (it.hasNext()) { |
|
237 |
Feature feat = (Feature) it.next(); |
|
238 |
|
|
239 |
ISymbol previewSymbol = this.getPreviewSymbol(feat); |
|
240 |
|
|
241 |
Geometry transformedGeometry = feat.getDefaultGeometry().offset(distance * side); |
|
317 |
DisposableIterator it; |
|
318 |
it = selected.fastIterator(); |
|
242 | 319 |
|
243 |
ISymbol symbol = null; |
|
244 |
if (transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve) { |
|
245 |
symbol = lineSymbolEditing; |
|
246 |
drawingStatus.addStatus(feat.getDefaultGeometry(), auxiliaryLineSymbolEditingDirection, "Direction"); |
|
247 |
} else if (transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface) { |
|
248 |
symbol = polygonSymbolEditing; |
|
249 |
} else if (transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint) { |
|
250 |
symbol = auxiliaryPointSymbolEditing; |
|
251 |
} |
|
252 |
if (transformedGeometry instanceof Aggregate) { |
|
253 |
int primitivesNumber = ((Aggregate) transformedGeometry).getPrimitivesNumber(); |
|
254 |
for (int i = 0; i < primitivesNumber; i++) { |
|
255 |
final Primitive primitive = ((Aggregate) transformedGeometry).getPrimitiveAt(i); |
|
256 |
drawingStatus.addStatus(primitive, symbol, ""); |
|
257 |
drawingStatus.addStatus(primitive, previewSymbol, ""); |
|
320 |
while (it.hasNext()) { |
|
321 |
Feature feat = (Feature) it.next(); |
|
322 |
|
|
323 |
ISymbol previewSymbol = this.getPreviewSymbol(feat); |
|
324 |
|
|
325 |
for (int c = 1; c <= equidistantOffsetsValue; c++) { |
|
326 |
|
|
327 |
Geometry transformedGeometry = feat.getDefaultGeometry().offset(joinStyleValue, c * distance * side); |
|
328 |
|
|
329 |
ISymbol symbol = null; |
|
330 |
if (transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve) { |
|
331 |
symbol = lineSymbolEditing; |
|
332 |
drawingStatus.addStatus(feat.getDefaultGeometry(), auxiliaryLineSymbolEditingDirection, "Direction"); |
|
333 |
} else if (transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface) { |
|
334 |
symbol = polygonSymbolEditing; |
|
335 |
} else if (transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint) { |
|
336 |
symbol = auxiliaryPointSymbolEditing; |
|
337 |
} |
|
338 |
if (transformedGeometry instanceof Aggregate) { |
|
339 |
int primitivesNumber = ((Aggregate) transformedGeometry).getPrimitivesNumber(); |
|
340 |
for (int i = 0; i < primitivesNumber; i++) { |
|
341 |
final Primitive primitive = ((Aggregate) transformedGeometry).getPrimitiveAt(i); |
|
342 |
drawingStatus.addStatus(primitive, symbol, ""); |
|
343 |
drawingStatus.addStatus(primitive, previewSymbol, ""); |
|
344 |
} |
|
345 |
} else { |
|
346 |
drawingStatus.addStatus(transformedGeometry, symbol, ""); |
|
347 |
drawingStatus.addStatus(transformedGeometry, previewSymbol, ""); |
|
348 |
} |
|
258 | 349 |
} |
259 |
} else { |
|
260 |
drawingStatus.addStatus(transformedGeometry, symbol, ""); |
|
261 |
drawingStatus.addStatus(transformedGeometry, previewSymbol, ""); |
|
262 | 350 |
} |
351 |
DisposeUtils.disposeQuietly(it); |
|
263 | 352 |
} |
264 |
DisposeUtils.disposeQuietly(it); |
|
353 |
} catch (Exception e) { |
|
354 |
throw new DrawServiceException(e); |
|
265 | 355 |
} |
266 |
return drawingStatus; |
|
267 |
} catch (Exception e) { |
|
268 |
throw new DrawServiceException(e); |
|
269 | 356 |
} |
357 |
return drawingStatus; |
|
270 | 358 |
} |
271 | 359 |
|
272 | 360 |
/** |
... | ... | |
279 | 367 |
* @throws GeometryException |
280 | 368 |
*/ |
281 | 369 |
private double getMinDistance(FeatureSelection selected, Point point) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException, GeometryException { |
370 |
// Geometry closestGeometry = getClosestGeometry(selected, point); |
|
371 |
// if(closestGeometry != null){ |
|
372 |
// return closestGeometry.distance(point); |
|
373 |
// } |
|
374 |
// //No deber?a pasar por aqu? |
|
282 | 375 |
double minorDistance = Double.POSITIVE_INFINITY; |
283 | 376 |
DisposableIterator it; |
284 | 377 |
it = selected.fastIterator(); |
... | ... | |
294 | 387 |
return minorDistance; |
295 | 388 |
|
296 | 389 |
} |
390 |
|
|
391 |
private Geometry getClosestGeometry(FeatureSelection selected, Point point) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException, GeometryException { |
|
392 |
double minorDistance = Double.POSITIVE_INFINITY; |
|
393 |
DisposableIterator it; |
|
394 |
it = selected.fastIterator(); |
|
395 |
Geometry closestGeometry = null; |
|
396 |
while (it.hasNext()) { |
|
397 |
Feature feat = (Feature) it.next(); |
|
398 |
Geometry geometry = feat.getDefaultGeometry(); |
|
399 |
double distance = getDistance(geometry, point); |
|
400 |
if (distance < minorDistance) { |
|
401 |
closestGeometry = geometry; |
|
402 |
minorDistance = distance; |
|
403 |
} |
|
404 |
} |
|
405 |
it.dispose(); |
|
406 |
return closestGeometry; |
|
297 | 407 |
|
408 |
} |
|
409 |
|
|
298 | 410 |
/** |
299 | 411 |
* @param geometry |
300 | 412 |
* @param point |
... | ... | |
304 | 416 |
* @throws GeometryException |
305 | 417 |
*/ |
306 | 418 |
private double getDistance(Geometry geometry, Point point) throws GeometryOperationNotSupportedException, GeometryOperationException, GeometryException { |
419 |
// Point closest = getClosestPoint(geometry, point); |
|
420 |
// if(closest != null) { |
|
421 |
// return closest.distance(point); |
|
422 |
// } |
|
423 |
//No deber?a pasar por aqu? |
|
307 | 424 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
308 | 425 |
if (geometry instanceof Arc) { |
309 | 426 |
Arc arc = (Arc) geometry; |
... | ... | |
434 | 551 |
return 0.0; |
435 | 552 |
} |
436 | 553 |
|
554 |
|
|
555 |
private Point getClosestPoint(Geometry geometry, Point point) throws GeometryOperationNotSupportedException, GeometryOperationException, GeometryException { |
|
556 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
557 |
if (geometry instanceof Line) { |
|
558 |
Line line = (Line) geometry; |
|
559 |
return (Point)line.closestPoints(point)[0]; |
|
560 |
} else { |
|
561 |
return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
562 |
} |
|
563 |
// if (geometry instanceof Arc) { |
|
564 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
565 |
// } |
|
566 |
// |
|
567 |
// if (geometry instanceof Circle) { |
|
568 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
569 |
// } |
|
570 |
// if (geometry instanceof Circumference) { |
|
571 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
572 |
// } |
|
573 |
// if (geometry instanceof PeriEllipse) { |
|
574 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
575 |
// } |
|
576 |
// if (geometry instanceof Ellipse) { |
|
577 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
578 |
// } |
|
579 |
// |
|
580 |
// if (geometry instanceof Spline || geometry instanceof FilledSpline) { |
|
581 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
582 |
// } |
|
583 |
// |
|
584 |
// |
|
585 |
// if (geometry instanceof Polygon) { |
|
586 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
587 |
// } |
|
588 |
// |
|
589 |
// if (geometry instanceof Aggregate) { |
|
590 |
// return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0]; |
|
591 |
// } |
|
592 |
// return null; |
|
593 |
} |
|
594 |
|
|
595 |
// |
|
437 | 596 |
@Override |
438 | 597 |
public void stop() { |
439 | 598 |
values.clear(); |
440 | 599 |
} |
441 | 600 |
|
601 |
@Override |
|
602 |
public void restart() throws StartServiceException, InvalidEntryException, StopServiceException { |
|
603 |
// values.put(selectionParameter, null); |
|
604 |
values.put(offsetParameter, null); |
|
605 |
values.put(sideParameter, null); |
|
606 |
values.put(deleteOriginalGeometriesParameter, null); |
|
607 |
} |
|
608 |
|
|
609 |
|
|
442 | 610 |
private void validateAndInsertValue(EditingServiceParameter param, |
443 | 611 |
Object value) throws InvalidEntryException { |
444 | 612 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
445 | 613 |
|
446 |
if (param == selectionParameter) { |
|
447 |
if (value instanceof FeatureSelection) { |
|
448 |
values.put(param, value); |
|
449 |
} |
|
450 |
} else if (param == offsetParameter) { |
|
451 |
if (value instanceof Point) { |
|
452 |
try { |
|
614 |
try { |
|
615 |
if (param == selectionParameter) { |
|
616 |
if (value instanceof FeatureSelection) { |
|
617 |
values.put(param, value); |
|
618 |
} |
|
619 |
} else if (param == joinStyleParameter) { |
|
620 |
if (value instanceof String) { |
|
621 |
values.put(param, fixJoinStyle(value)); |
|
622 |
} |
|
623 |
} else if (param == offsetParameter) { |
|
624 |
if (value instanceof Point) { |
|
453 | 625 |
Double distance = getMinDistance((FeatureSelection) values.get(selectionParameter), (Point) value); |
626 |
if (distance == 0.0) { |
|
627 |
throw new IllegalArgumentException("distance can't be 0"); |
|
628 |
} |
|
454 | 629 |
values.put(param, Math.abs(distance)); |
455 | 630 |
values.put(sideParameter, coerceSide(distance)); |
456 |
} catch (Exception e) { |
|
457 |
throw new InvalidEntryException(e); |
|
631 |
return; |
|
458 | 632 |
} |
459 |
return; |
|
460 |
} |
|
461 |
if (value instanceof Double) { |
|
462 |
Double distance = (Double) value; |
|
463 |
if (distance >= 0) { |
|
464 |
values.put(param, value); |
|
465 |
} else { |
|
466 |
values.put(param, Math.abs(distance)); |
|
467 |
values.put(sideParameter, coerceSide(distance)); |
|
633 |
if (value instanceof Double) { |
|
634 |
Double distance = (Double) value; |
|
635 |
if (distance > 0) { |
|
636 |
values.put(param, value); |
|
637 |
} else if (distance == 0.0) { |
|
638 |
throw new IllegalArgumentException("distance can't be 0"); |
|
639 |
} else { |
|
640 |
values.put(param, Math.abs(distance)); |
|
641 |
values.put(sideParameter, coerceSide(distance)); |
|
642 |
} |
|
468 | 643 |
} |
469 |
} |
|
470 |
} else if (param == sideParameter) { |
|
471 |
if (value instanceof Point) { |
|
472 |
try { |
|
644 |
} else if (param == sideParameter) { |
|
645 |
if (value instanceof Point) { |
|
473 | 646 |
values.put(param, coerceSide(getMinDistance((FeatureSelection) values.get(selectionParameter), (Point) value))); |
474 |
} catch (Exception e) { |
|
475 |
throw new InvalidEntryException(e); |
|
647 |
return; |
|
476 | 648 |
} |
477 |
return; |
|
649 |
if (value instanceof String) { |
|
650 |
values.put(param, coerceSide(value)); |
|
651 |
} |
|
652 |
} else if (param == equidistantOffsets) { |
|
653 |
if (value instanceof Number) { |
|
654 |
int intValue = ((Number) value).intValue(); |
|
655 |
if(intValue >= 1) { |
|
656 |
values.put(param, ((Number) value).intValue()); |
|
657 |
} |
|
658 |
} |
|
659 |
} else if (param == deleteOriginalGeometriesParameter) { |
|
660 |
values.put(param, param.getOptions2().getValue(value, param.getDefaultValue())); |
|
478 | 661 |
} |
479 |
if (value instanceof String) { |
|
480 |
values.put(param, coerceSide(value)); |
|
481 |
} |
|
482 |
} else if (param == deleteOriginalGeometriesParameter) { |
|
483 |
values.put(param, param.getOptions2().getValue(value, param.getDefaultValue())); |
|
662 |
} catch (Exception e) { |
|
663 |
throw new InvalidEntryException(e); |
|
484 | 664 |
} |
485 | 665 |
|
486 | 666 |
} |
... | ... | |
499 | 679 |
throw new InvalidEntryException(null); |
500 | 680 |
} |
501 | 681 |
|
682 |
private String fixJoinStyle(Object value) throws InvalidEntryException { |
|
683 |
|
|
684 |
if (value instanceof String) { |
|
685 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
|
686 |
String joinStyleTrim = ((String)value).trim(); |
|
687 |
if (StringUtils.equalsIgnoreCase(joinStyleTrim, ROUND) |
|
688 |
|| StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(ROUND), joinStyleTrim)) { |
|
689 |
return ROUND; |
|
690 |
} else if (StringUtils.equalsIgnoreCase(joinStyleTrim, BEVEL) |
|
691 |
|| StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(BEVEL), joinStyleTrim)) { |
|
692 |
return BEVEL; |
|
693 |
} else if (StringUtils.equalsIgnoreCase(joinStyleTrim, MITRE) |
|
694 |
|| StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(MITRE), joinStyleTrim)) { |
|
695 |
return MITRE; |
|
696 |
} |
|
697 |
} |
|
698 |
throw new InvalidEntryException(null); |
|
699 |
} |
|
700 |
|
|
502 | 701 |
private Double getSideSignum(String side) { |
503 | 702 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
504 | 703 |
String sideTrim = side.trim(); |
... | ... | |
517 | 716 |
List<EditingServiceParameter> list |
518 | 717 |
= new ArrayList<>(); |
519 | 718 |
list.add(selectionParameter); |
719 |
list.add(joinStyleParameter); |
|
520 | 720 |
list.add(offsetParameter); |
521 | 721 |
list.add(sideParameter); |
722 |
list.add(equidistantOffsets); |
|
522 | 723 |
list.add(deleteOriginalGeometriesParameter); |
523 | 724 |
return list; |
524 | 725 |
} |
... | ... | |
552 | 753 |
double distance = ((Double) values.get(offsetParameter)) * side; |
553 | 754 |
DisposableIterator it; |
554 | 755 |
it = selected.fastIterator(); |
756 |
int joinStyleValue = coerceJoinStyle(values.get(joinStyleParameter)); |
|
757 |
Number equidistantOffsetsNumberValue = ((Number) values.get(this.equidistantOffsets)); |
|
758 |
int equidistantOffsetsValue = equidistantOffsetsNumberValue != null ? equidistantOffsetsNumberValue.intValue() : ((Number)this.equidistantOffsets.getDefaultValue()).intValue(); |
|
555 | 759 |
|
556 | 760 |
while (it.hasNext()) { |
557 | 761 |
Feature feature = (Feature) it.next(); |
558 |
Geometry geom; |
|
559 |
try { |
|
560 |
geom = feature.getDefaultGeometry().offset(distance); |
|
561 |
} catch (GeometryOperationNotSupportedException | GeometryOperationException e) { |
|
562 |
throw new FinishServiceException(e); |
|
563 |
} |
|
762 |
for (int c = 1; c <= equidistantOffsetsValue; c++) { |
|
564 | 763 |
|
565 |
// if (this.deleteOriginalGeometries) { |
|
566 |
if ((boolean)values.get(deleteOriginalGeometriesParameter)) { //this.deleteOriginalGeometries) { |
|
567 |
// Se sustituye la geometr?a original por la |
|
568 |
// calculada |
|
569 |
EditableFeature editableFeature |
|
570 |
= feature.getEditable(); |
|
571 |
editableFeature.setDefaultGeometry(geom); |
|
572 |
((EditingProviderServices) getProviderServices()) |
|
573 |
.updateFeatureInFeatureStore(editableFeature, |
|
574 |
featureStore); |
|
575 |
} else { |
|
576 |
// Se crea una feature nueva copiando los valores de |
|
577 |
// la feature original excepto aquellos que sean PK |
|
578 |
EditingProviderServices editingProviderServices |
|
579 |
= (EditingProviderServices) getProviderServices(); |
|
580 |
EditableFeature editableFeature |
|
581 |
= editingProviderServices |
|
582 |
.getFeatureCopyWithoutUniqueIndex(featureStore, |
|
583 |
feature); |
|
584 |
editableFeature.setDefaultGeometry(geom); |
|
585 |
editingProviderServices |
|
586 |
.insertFeatureIntoFeatureStore(editableFeature, |
|
587 |
featureStore); |
|
764 |
Geometry geom; |
|
765 |
try { |
|
766 |
geom = feature.getDefaultGeometry().offset(joinStyleValue, c * distance); |
|
767 |
} catch (GeometryOperationNotSupportedException | GeometryOperationException e) { |
|
768 |
throw new FinishServiceException(e); |
|
769 |
} |
|
770 |
|
|
771 |
if ((boolean) values.get(deleteOriginalGeometriesParameter) && c == 1) { |
|
772 |
// Se sustituye la geometr?a original por la primera calculada |
|
773 |
EditableFeature editableFeature |
|
774 |
= feature.getEditable(); |
|
775 |
editableFeature.setDefaultGeometry(geom); |
|
776 |
((EditingProviderServices) getProviderServices()) |
|
777 |
.updateFeatureInFeatureStore(editableFeature, |
|
778 |
featureStore); |
|
779 |
} else { |
|
780 |
// Se crea una feature nueva copiando los valores de |
|
781 |
// la feature original excepto aquellos que sean PK |
|
782 |
EditingProviderServices editingProviderServices |
|
783 |
= (EditingProviderServices) getProviderServices(); |
|
784 |
EditableFeature editableFeature |
|
785 |
= editingProviderServices |
|
786 |
.getFeatureCopyWithoutUniqueIndex(featureStore, |
|
787 |
feature); |
|
788 |
editableFeature.setDefaultGeometry(geom); |
|
789 |
editingProviderServices |
|
790 |
.insertFeatureIntoFeatureStore(editableFeature, |
|
791 |
featureStore); |
|
792 |
} |
|
588 | 793 |
} |
589 | 794 |
|
590 | 795 |
} |
591 | 796 |
it.dispose(); |
592 |
featureStore.getFeatureSelection().deselectAll(); |
|
797 |
// featureStore.getFeatureSelection().deselectAll();
|
|
593 | 798 |
} |
594 | 799 |
} catch (DataException e) { |
595 | 800 |
throw new FinishServiceException(e); |
... | ... | |
638 | 843 |
} |
639 | 844 |
} |
640 | 845 |
} |
641 |
|
|
846 |
|
|
642 | 847 |
@Override |
643 | 848 |
public String getName() { |
644 | 849 |
return OffsetEditingProviderFactory.PROVIDER_NAME; |
645 | 850 |
} |
851 |
|
|
852 |
private int coerceJoinStyle(Object joinStyle) { |
|
853 |
if(joinStyle instanceof String) { |
|
854 |
switch ((String)joinStyle) { |
|
855 |
default: |
|
856 |
case ROUND: |
|
857 |
return JOIN_STYLE_ROUND; |
|
858 |
case MITRE: |
|
859 |
return Geometry.JOIN_STYLE_MITRE; |
|
860 |
case BEVEL: |
|
861 |
return Geometry.JOIN_STYLE_BEVEL; |
|
862 |
} |
|
863 |
} |
|
864 |
return JOIN_STYLE_ROUND; |
|
865 |
} |
|
866 |
|
|
867 |
@Override |
|
868 |
public boolean isEnabled(EditingServiceParameter parameter) { |
|
869 |
if (parameter == joinStyleParameter) { |
|
870 |
return true; |
|
871 |
} |
|
872 |
if (parameter == equidistantOffsets) { |
|
873 |
return true; |
|
874 |
} |
|
875 |
return true; |
|
876 |
} |
|
877 |
|
|
878 |
private ISimpleTextSymbol getTextSymbol(){ |
|
879 |
SymbologyManager symbologyManager = SymbologyLocator.getSymbologyManager(); |
|
880 |
ISimpleTextSymbol textSymbol = symbologyManager.createSimpleTextSymbol(); |
|
881 |
textSymbol.setFontSize(10); |
|
882 |
return textSymbol; |
|
883 |
} |
|
884 |
|
|
885 |
@Override |
|
886 |
public Object getValue(EditingServiceParameter parameter) { |
|
887 |
return values!=null?values.get(parameter):null; |
|
888 |
} |
|
889 |
|
|
890 |
|
|
646 | 891 |
} |
Also available in: Unified diff