Revision 2173 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 | ||
---|---|---|
21 | 21 |
* For any additional information, do not hesitate to contact us |
22 | 22 |
* at info AT gvsig.com, or visit our website www.gvsig.com. |
23 | 23 |
*/ |
24 |
|
|
25 | 24 |
package org.gvsig.vectorediting.offset.lib.prov.offset; |
26 | 25 |
|
27 |
import java.awt.Color; |
|
28 | 26 |
import java.util.ArrayList; |
29 | 27 |
import java.util.HashMap; |
30 | 28 |
import java.util.LinkedHashMap; |
31 | 29 |
import java.util.List; |
32 | 30 |
import java.util.Map; |
33 |
|
|
31 |
import org.apache.commons.lang3.StringUtils; |
|
34 | 32 |
import org.gvsig.fmap.dal.exception.DataException; |
35 | 33 |
import org.gvsig.fmap.dal.feature.EditableFeature; |
36 | 34 |
import org.gvsig.fmap.dal.feature.Feature; |
... | ... | |
58 | 56 |
import org.gvsig.fmap.geom.primitive.Polygon; |
59 | 57 |
import org.gvsig.fmap.geom.primitive.Spline; |
60 | 58 |
import org.gvsig.fmap.geom.primitive.Surface; |
61 |
import org.gvsig.fmap.mapcontext.MapContextLocator; |
|
62 | 59 |
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol; |
63 |
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager; |
|
64 | 60 |
import org.gvsig.tools.ToolsLocator; |
65 | 61 |
import org.gvsig.tools.dispose.DisposableIterator; |
66 | 62 |
import org.gvsig.tools.dynobject.DynObject; |
... | ... | |
83 | 79 |
import org.gvsig.vectorediting.lib.spi.EditingProviderServices; |
84 | 80 |
|
85 | 81 |
public class OffsetEditingProvider extends AbstractEditingProvider implements |
86 |
EditingProvider { |
|
82 |
EditingProvider {
|
|
87 | 83 |
|
88 |
private final Double PRECISION = new Double(1.0e-5);
|
|
84 |
private static final Double PRECISION = 1.0e-5;
|
|
89 | 85 |
|
90 |
private I18nManager i18nManager = ToolsLocator.getI18nManager();
|
|
86 |
private static final String LEFT = "_left";
|
|
91 | 87 |
|
92 |
private EditingServiceParameter selectionParameter;
|
|
88 |
private static final String RIGHT = "_right";
|
|
93 | 89 |
|
94 |
private EditingServiceParameter offsetParameter;
|
|
90 |
private final EditingServiceParameter selectionParameter;
|
|
95 | 91 |
|
96 |
private EditingServiceParameter deleteOriginalGeometriesParameter;
|
|
92 |
private final EditingServiceParameter offsetParameter;
|
|
97 | 93 |
|
94 |
private final EditingServiceParameter sideParameter; |
|
95 |
|
|
96 |
private final EditingServiceParameter deleteOriginalGeometriesParameter; |
|
97 |
|
|
98 | 98 |
private boolean deleteOriginalGeometries = false; |
99 | 99 |
|
100 | 100 |
private Map<EditingServiceParameter, Object> values; |
101 | 101 |
|
102 |
private Map<String, String> options; |
|
102 |
private final Map<String, String> options;
|
|
103 | 103 |
|
104 |
private FeatureStore featureStore; |
|
104 |
private final FeatureStore featureStore;
|
|
105 | 105 |
|
106 | 106 |
public OffsetEditingProvider(ProviderServices providerServices, DynObject parameters) { |
107 | 107 |
super(providerServices); |
108 | 108 |
this.featureStore = (FeatureStore) parameters.getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD); |
109 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
|
109 | 110 |
|
110 |
this.selectionParameter =
|
|
111 |
new DefaultEditingServiceParameter("selection", |
|
112 |
i18nManager.getTranslation("selection"), TYPE.SELECTION); |
|
111 |
this.selectionParameter |
|
112 |
= new DefaultEditingServiceParameter("selection",
|
|
113 |
i18nManager.getTranslation("selection"), TYPE.SELECTION);
|
|
113 | 114 |
|
114 |
this.offsetParameter =
|
|
115 |
new DefaultEditingServiceParameter("offset_distance", |
|
116 |
i18nManager.getTranslation("offset_distance"), |
|
117 |
TYPE.POSITION, TYPE.VALUE);
|
|
115 |
this.offsetParameter |
|
116 |
= new DefaultEditingServiceParameter("offset_distance",
|
|
117 |
i18nManager.getTranslation("offset_distance"),
|
|
118 |
TYPE.POSITION, TYPE.VALUE, TYPE.DISTANCE);
|
|
118 | 119 |
|
119 |
this.options = new LinkedHashMap<String, String>(); |
|
120 |
Map<String, String> sideOptions = new HashMap<>(); |
|
121 |
sideOptions.put(LEFT, i18nManager.getTranslation(LEFT)); |
|
122 |
sideOptions.put(RIGHT, i18nManager.getTranslation(RIGHT)); |
|
123 |
|
|
124 |
this.sideParameter |
|
125 |
= new DefaultEditingServiceParameter("side", |
|
126 |
i18nManager.getTranslation("_side"), |
|
127 |
sideOptions, |
|
128 |
TYPE.OPTION, TYPE.POSITION); |
|
129 |
|
|
130 |
this.options = new LinkedHashMap<>(); |
|
120 | 131 |
options.put(i18nManager.getTranslation("short_yes"), |
121 |
"delete_original_geometries"); |
|
132 |
"delete_original_geometries");
|
|
122 | 133 |
options.put(i18nManager.getTranslation("short_no"), |
123 |
"keep_original_geometries"); |
|
134 |
"keep_original_geometries");
|
|
124 | 135 |
|
125 |
EditingProviderServices editingProviderServices =
|
|
126 |
(EditingProviderServices) getProviderServices();
|
|
136 |
// EditingProviderServices editingProviderServices
|
|
137 |
// = (EditingProviderServices) getProviderServices();
|
|
127 | 138 |
|
128 |
String consoleMsg =
|
|
129 |
editingProviderServices.makeConsoleMessage(
|
|
130 |
"delete_original_geometries_question", options); |
|
139 |
String consoleMsg |
|
140 |
= ((EditingProviderServices)providerServices).makeConsoleMessage(
|
|
141 |
"delete_original_geometries_question", options);
|
|
131 | 142 |
|
132 |
this.deleteOriginalGeometriesParameter =
|
|
133 |
new DefaultEditingServiceParameter("Delete original geometries", |
|
134 |
consoleMsg, options, TYPE.OPTION); |
|
143 |
this.deleteOriginalGeometriesParameter |
|
144 |
= new DefaultEditingServiceParameter("Delete original geometries",
|
|
145 |
consoleMsg, options, TYPE.OPTION);
|
|
135 | 146 |
|
136 | 147 |
} |
137 | 148 |
|
149 |
@Override |
|
138 | 150 |
public EditingServiceParameter next() { |
139 | 151 |
|
140 | 152 |
if (values.get(selectionParameter) == null) { |
141 | 153 |
return selectionParameter; |
142 | 154 |
} else if (values.get(offsetParameter) == null) { |
143 | 155 |
return offsetParameter; |
144 |
} else if (values.get(deleteOriginalGeometriesParameter) == null) { |
|
156 |
} else if (values.get(sideParameter) == null) { |
|
157 |
Object offsetValue = values.get(offsetParameter); |
|
158 |
if (!(offsetValue instanceof Point)) { |
|
159 |
Double distance = (Double) offsetValue; |
|
160 |
if (distance >= 0) { |
|
161 |
return sideParameter; |
|
162 |
} |
|
163 |
} |
|
164 |
} |
|
165 |
|
|
166 |
if (values.get(deleteOriginalGeometriesParameter) == null) { |
|
145 | 167 |
return this.deleteOriginalGeometriesParameter; |
146 | 168 |
} |
147 | 169 |
|
148 | 170 |
return null; |
149 | 171 |
} |
150 | 172 |
|
173 |
@Override |
|
151 | 174 |
public DrawingStatus getDrawingStatus(Point mousePosition) throws DrawServiceException { |
152 | 175 |
DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus(); |
153 |
EditingProviderManager editingProviderManager =
|
|
154 |
EditingProviderLocator.getProviderManager(); |
|
176 |
EditingProviderManager editingProviderManager |
|
177 |
= EditingProviderLocator.getProviderManager();
|
|
155 | 178 |
// ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing"); |
156 | 179 |
ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing"); |
157 | 180 |
ISymbol auxiliaryLineSymbolEditingDirection = editingProviderManager.getSymbol("auxiliary-line-symbol-editing-direction"); |
158 | 181 |
ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing"); |
159 | 182 |
ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing"); |
160 |
|
|
161 |
|
|
162 |
|
|
163 |
FeatureSelection selected = |
|
164 |
(FeatureSelection) values.get(selectionParameter); |
|
183 |
|
|
184 |
FeatureSelection selected |
|
185 |
= (FeatureSelection) values.get(selectionParameter); |
|
165 | 186 |
try { |
166 | 187 |
if ((selected != null) && !selected.isEmpty()) { |
167 |
Point point = null; |
|
188 |
Point point; // = null;
|
|
168 | 189 |
double distance = 0.0; |
190 |
double side = 1.0; |
|
169 | 191 |
Object offsetValue = values.get(offsetParameter); |
170 |
if (offsetValue != null){ |
|
192 |
|
|
193 |
if (offsetValue != null) { |
|
171 | 194 |
if (offsetValue instanceof Point) { |
172 |
point = (Point) offsetValue;
|
|
195 |
distance = Math.abs(getMinDistance(selected, (Point) offsetValue));
|
|
173 | 196 |
} else { |
174 | 197 |
distance = (Double) offsetValue; |
175 | 198 |
} |
199 |
|
|
200 |
Object sideValue = values.get(sideParameter); |
|
201 |
if (sideValue == null) { |
|
202 |
point = mousePosition; |
|
203 |
side = Math.signum(getMinDistance(selected, point)); |
|
204 |
} else { |
|
205 |
Double signum = getSideSignum((String) sideValue); |
|
206 |
if (signum != null) { |
|
207 |
side = signum; |
|
208 |
} |
|
209 |
} |
|
176 | 210 |
} else { |
177 | 211 |
point = mousePosition; |
178 | 212 |
distance = getMinDistance(selected, point); |
179 | 213 |
} |
180 | 214 |
|
181 |
|
|
182 | 215 |
DisposableIterator it; |
183 | 216 |
it = selected.fastIterator(); |
184 | 217 |
|
185 | 218 |
while (it.hasNext()) { |
186 | 219 |
Feature feat = (Feature) it.next(); |
187 |
Geometry transformedGeometry = feat.getDefaultGeometry().offset(distance); |
|
220 |
Geometry transformedGeometry = feat.getDefaultGeometry().offset(distance * side);
|
|
188 | 221 |
|
189 | 222 |
ISymbol symbol = null; |
190 | 223 |
if (transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve) { |
... | ... | |
222 | 255 |
* @throws GeometryException |
223 | 256 |
*/ |
224 | 257 |
private double getMinDistance(FeatureSelection selected, Point point) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException, GeometryException { |
225 |
double minorDistance=Double.POSITIVE_INFINITY;
|
|
258 |
double minorDistance = Double.POSITIVE_INFINITY;
|
|
226 | 259 |
DisposableIterator it; |
227 | 260 |
it = selected.fastIterator(); |
228 | 261 |
while (it.hasNext()) { |
229 | 262 |
Feature feat = (Feature) it.next(); |
230 | 263 |
Geometry geometry = feat.getDefaultGeometry(); |
231 | 264 |
double distance = getDistance(geometry, point); |
232 |
if(distance < minorDistance){
|
|
265 |
if (distance < minorDistance) {
|
|
233 | 266 |
minorDistance = distance; |
234 | 267 |
} |
235 | 268 |
} |
... | ... | |
248 | 281 |
*/ |
249 | 282 |
private double getDistance(Geometry geometry, Point point) throws GeometryOperationNotSupportedException, GeometryOperationException, GeometryException { |
250 | 283 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
251 |
if(geometry instanceof Arc){
|
|
252 |
Arc arc = (Arc)geometry; |
|
284 |
if (geometry instanceof Arc) {
|
|
285 |
Arc arc = (Arc) geometry;
|
|
253 | 286 |
Point center = arc.getCenterPoint(); |
254 | 287 |
double radius = center.distance(arc.getInitPoint()); |
255 |
double distance = center.distance(point)-radius;
|
|
288 |
double distance = center.distance(point) - radius;
|
|
256 | 289 |
return distance; |
257 | 290 |
} |
258 | 291 |
|
259 |
if(geometry instanceof Circle){
|
|
260 |
Circle circle = (Circle)geometry; |
|
261 |
return circle.getCenter().distance(point)-circle.getRadious();
|
|
292 |
if (geometry instanceof Circle) {
|
|
293 |
Circle circle = (Circle) geometry;
|
|
294 |
return circle.getCenter().distance(point) - circle.getRadious();
|
|
262 | 295 |
} |
263 |
if(geometry instanceof Circumference){
|
|
264 |
Circumference circumference = (Circumference)geometry; |
|
265 |
return circumference.getCenter().distance(point)-circumference.getRadious();
|
|
296 |
if (geometry instanceof Circumference) {
|
|
297 |
Circumference circumference = (Circumference) geometry;
|
|
298 |
return circumference.getCenter().distance(point) - circumference.getRadious();
|
|
266 | 299 |
} |
267 |
if(geometry instanceof PeriEllipse){
|
|
300 |
if (geometry instanceof PeriEllipse) {
|
|
268 | 301 |
double minDistance = Double.POSITIVE_INFINITY; |
269 |
PeriEllipse ellipse = (PeriEllipse)geometry; |
|
302 |
PeriEllipse ellipse = (PeriEllipse) geometry;
|
|
270 | 303 |
Geometry[] closestPoints = point.closestPoints(ellipse); |
271 |
if (closestPoints!=null){
|
|
304 |
if (closestPoints != null) {
|
|
272 | 305 |
for (int i = 0; i < closestPoints.length; i++) { |
273 | 306 |
Geometry closestPoint = closestPoints[i]; |
274 | 307 |
if (!point.equals(closestPoint)) { |
... | ... | |
279 | 312 |
} |
280 | 313 |
} |
281 | 314 |
} |
282 |
Ellipse auxEllipse = (Ellipse)geomManager.create(Geometry.TYPES.ELLIPSE, geometry.getGeometryType().getSubType()); |
|
315 |
Ellipse auxEllipse = (Ellipse) geomManager.create(Geometry.TYPES.ELLIPSE, geometry.getGeometryType().getSubType());
|
|
283 | 316 |
auxEllipse.setPoints(ellipse.getAxis1Start(), ellipse.getAxis1End(), ellipse.getAxis2Dist()); |
284 |
if(auxEllipse.contains(point)){
|
|
317 |
if (auxEllipse.contains(point)) {
|
|
285 | 318 |
return -minDistance; |
286 | 319 |
} |
287 | 320 |
return minDistance; |
288 | 321 |
} |
289 |
if(geometry instanceof Ellipse){
|
|
290 |
Ellipse ellipse = (Ellipse)geometry; |
|
291 |
PeriEllipse auxPeriEllipse = (PeriEllipse)geomManager.create(Geometry.TYPES.PERIELLIPSE, geometry.getGeometryType().getSubType()); |
|
322 |
if (geometry instanceof Ellipse) {
|
|
323 |
Ellipse ellipse = (Ellipse) geometry;
|
|
324 |
PeriEllipse auxPeriEllipse = (PeriEllipse) geomManager.create(Geometry.TYPES.PERIELLIPSE, geometry.getGeometryType().getSubType());
|
|
292 | 325 |
auxPeriEllipse.setPoints(ellipse.getAxis1Start(), ellipse.getAxis1End(), ellipse.getAxis2Dist()); |
293 | 326 |
double distance = getDistance(auxPeriEllipse, point); |
294 |
// if(ellipse.contains(point)){ |
|
295 |
// return -distance; |
|
296 |
// } |
|
297 | 327 |
|
298 | 328 |
return distance; |
299 | 329 |
} |
300 | 330 |
|
301 |
if(geometry instanceof Spline || geometry instanceof FilledSpline ){
|
|
331 |
if (geometry instanceof Spline || geometry instanceof FilledSpline) {
|
|
302 | 332 |
return getDistance(geometry.toLines().getPrimitiveAt(0), point); |
303 | 333 |
} |
304 | 334 |
|
305 |
if(geometry instanceof Line){
|
|
306 |
Line line = (Line)geometry; |
|
335 |
if (geometry instanceof Line) {
|
|
336 |
Line line = (Line) geometry;
|
|
307 | 337 |
double minDistance = Double.POSITIVE_INFINITY; |
308 | 338 |
Geometry[] closestPoints = point.closestPoints(line); |
309 | 339 |
Point closestPoint = null; |
310 |
if (closestPoints!=null){
|
|
311 |
for (int i=0;i<closestPoints.length;i++){
|
|
312 |
Point p=(Point)closestPoints[i];
|
|
340 |
if (closestPoints != null) {
|
|
341 |
for (Geometry closestPoint1 : closestPoints) {
|
|
342 |
Point p = (Point) closestPoint1;
|
|
313 | 343 |
if (!point.equals(p)) { |
314 | 344 |
double distance = p.distance(point); |
315 | 345 |
if (distance < minDistance) { |
... | ... | |
319 | 349 |
} |
320 | 350 |
} |
321 | 351 |
} |
322 |
if(closestPoint != null){
|
|
323 |
for(int i=0; i<line.getNumVertices()-1; i++){
|
|
352 |
if (closestPoint != null) {
|
|
353 |
for (int i = 0; i < line.getNumVertices() - 1; i++) {
|
|
324 | 354 |
Line segment = (Line) geomManager.create(Geometry.TYPES.LINE, geometry.getGeometryType().getSubType()); |
325 | 355 |
segment.addVertex(line.getVertex(i)); |
326 |
segment.addVertex(line.getVertex(i+1));
|
|
327 |
if(segment.isWithinDistance(closestPoint, PRECISION)){
|
|
328 |
if(line.getVertex(0).equals(line.getVertex(line.getNumVertices()-1))){ //isClosed
|
|
329 |
if(line.toPolygons().contains(point)){
|
|
356 |
segment.addVertex(line.getVertex(i + 1));
|
|
357 |
if (segment.isWithinDistance(closestPoint, PRECISION)) {
|
|
358 |
if (line.getVertex(0).equals(line.getVertex(line.getNumVertices() - 1))) { //isClosed
|
|
359 |
if (line.toPolygons().contains(point)) {
|
|
330 | 360 |
return -minDistance; |
331 |
};
|
|
361 |
} |
|
332 | 362 |
return minDistance; |
333 | 363 |
} else { |
334 | 364 |
return getDirectedDistance(closestPoint, point, segment); |
... | ... | |
338 | 368 |
} |
339 | 369 |
} |
340 | 370 |
|
341 |
if(geometry instanceof Polygon){
|
|
342 |
Polygon polygon = (Polygon)geometry; |
|
343 |
if(!polygon.contains(point)){
|
|
371 |
if (geometry instanceof Polygon) {
|
|
372 |
Polygon polygon = (Polygon) geometry;
|
|
373 |
if (!polygon.contains(point)) {
|
|
344 | 374 |
double minDistance = Double.POSITIVE_INFINITY; |
345 | 375 |
Geometry[] closestPoints = point.closestPoints(polygon); |
346 | 376 |
Point closestPoint = null; |
347 |
if (closestPoints!=null){
|
|
348 |
for (int i=0;i<closestPoints.length;i++){
|
|
349 |
Point p=(Point)closestPoints[i];
|
|
377 |
if (closestPoints != null) {
|
|
378 |
for (Geometry closestPoint1 : closestPoints) {
|
|
379 |
Point p = (Point) closestPoint1;
|
|
350 | 380 |
if (!point.equals(p)) { |
351 | 381 |
double distance = p.distance(point); |
352 | 382 |
if (distance < minDistance) { |
... | ... | |
356 | 386 |
} |
357 | 387 |
} |
358 | 388 |
} |
359 |
if(closestPoint != null){
|
|
389 |
if (closestPoint != null) {
|
|
360 | 390 |
return closestPoint.distance(point); |
361 | 391 |
} |
362 | 392 |
} else { |
363 | 393 |
Line auxLine = (Line) polygon.toLines().getPrimitiveAt(0); |
364 |
if(auxLine!=null){
|
|
394 |
if (auxLine != null) {
|
|
365 | 395 |
return getDistance(auxLine, point); |
366 | 396 |
} |
367 | 397 |
} |
368 | 398 |
} |
369 | 399 |
|
370 |
if(geometry instanceof Aggregate){
|
|
400 |
if (geometry instanceof Aggregate) {
|
|
371 | 401 |
double minDistance = Double.POSITIVE_INFINITY; |
372 |
Aggregate aggregate2 = (Aggregate)geometry; |
|
373 |
for(int i=0; i<aggregate2.getPrimitivesNumber(); i++){
|
|
374 |
double distance = getDistance(aggregate2.getPrimitiveAt(i),point); |
|
375 |
if(distance<minDistance){
|
|
402 |
Aggregate aggregate2 = (Aggregate) geometry;
|
|
403 |
for (int i = 0; i < aggregate2.getPrimitivesNumber(); i++) {
|
|
404 |
double distance = getDistance(aggregate2.getPrimitiveAt(i), point);
|
|
405 |
if (distance < minDistance) {
|
|
376 | 406 |
minDistance = distance; |
377 | 407 |
} |
378 | 408 |
} |
... | ... | |
381 | 411 |
return 0.0; |
382 | 412 |
} |
383 | 413 |
|
414 |
@Override |
|
384 | 415 |
public void stop() { |
385 | 416 |
values.clear(); |
386 | 417 |
} |
387 | 418 |
|
388 | 419 |
private void validateAndInsertValue(EditingServiceParameter param, |
389 |
Object value) throws InvalidEntryException { |
|
420 |
Object value) throws InvalidEntryException { |
|
421 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
|
422 |
|
|
390 | 423 |
if (param == selectionParameter) { |
391 | 424 |
if (value instanceof FeatureSelection) { |
392 | 425 |
values.put(param, value); |
393 |
return; |
|
394 | 426 |
} |
395 | 427 |
} else if (param == offsetParameter) { |
396 | 428 |
if (value instanceof Point) { |
397 | 429 |
try { |
398 |
values.put(param, getMinDistance((FeatureSelection) values.get(selectionParameter), (Point) value)); |
|
430 |
Double distance = getMinDistance((FeatureSelection) values.get(selectionParameter), (Point) value); |
|
431 |
values.put(param, Math.abs(distance)); |
|
432 |
values.put(sideParameter, coerceSide(distance)); |
|
399 | 433 |
} catch (Exception e) { |
400 | 434 |
throw new InvalidEntryException(e); |
401 | 435 |
} |
402 | 436 |
return; |
403 | 437 |
} |
404 | 438 |
if (value instanceof Double) { |
405 |
values.put(param, value); |
|
439 |
Double distance = (Double) value; |
|
440 |
if (distance >= 0) { |
|
441 |
values.put(param, value); |
|
442 |
} else { |
|
443 |
values.put(param, Math.abs(distance)); |
|
444 |
values.put(sideParameter, coerceSide(distance)); |
|
445 |
} |
|
406 | 446 |
} |
447 |
} else if (param == sideParameter) { |
|
448 |
if (value instanceof Point) { |
|
449 |
try { |
|
450 |
values.put(param, coerceSide(getMinDistance((FeatureSelection) values.get(selectionParameter), (Point) value))); |
|
451 |
} catch (Exception e) { |
|
452 |
throw new InvalidEntryException(e); |
|
453 |
} |
|
454 |
return; |
|
455 |
} |
|
456 |
if (value instanceof String) { |
|
457 |
values.put(param, coerceSide(value)); |
|
458 |
} |
|
407 | 459 |
} else if (param == deleteOriginalGeometriesParameter) { |
408 | 460 |
if (value instanceof String) { |
409 | 461 |
if (((String) value).trim().equalsIgnoreCase( |
410 |
i18nManager.getTranslation("short_yes"))) { |
|
462 |
i18nManager.getTranslation("short_yes"))) {
|
|
411 | 463 |
deleteOriginalGeometries = true; |
412 | 464 |
} else if (((String) value).trim().equalsIgnoreCase( |
413 |
i18nManager.getTranslation("short_no"))) { |
|
465 |
i18nManager.getTranslation("short_no"))) {
|
|
414 | 466 |
deleteOriginalGeometries = false; |
415 | 467 |
} else { |
416 | 468 |
throw new InvalidEntryException(null); |
... | ... | |
421 | 473 |
|
422 | 474 |
} |
423 | 475 |
|
476 |
private String coerceSide(Object value) throws InvalidEntryException { |
|
477 |
|
|
478 |
if (value instanceof Double) { |
|
479 |
return (Double) value >= 0 ? LEFT : RIGHT; |
|
480 |
} |
|
481 |
if (value instanceof String) { |
|
482 |
Double signum = getSideSignum((String) value); |
|
483 |
if (signum != null) { |
|
484 |
return signum >= 0 ? LEFT : RIGHT; |
|
485 |
} |
|
486 |
} |
|
487 |
throw new InvalidEntryException(null); |
|
488 |
} |
|
489 |
|
|
490 |
private Double getSideSignum(String side) { |
|
491 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
|
492 |
String sideTrim = side.trim(); |
|
493 |
if (StringUtils.equalsIgnoreCase(sideTrim, LEFT) |
|
494 |
|| StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(LEFT), sideTrim)) { |
|
495 |
return 1.0; |
|
496 |
} else if (StringUtils.equalsIgnoreCase(sideTrim, RIGHT) |
|
497 |
|| StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(RIGHT), sideTrim)) { |
|
498 |
return -1.0; |
|
499 |
} |
|
500 |
return null; |
|
501 |
} |
|
502 |
|
|
503 |
@Override |
|
424 | 504 |
public List<EditingServiceParameter> getParameters() { |
425 |
List<EditingServiceParameter> list =
|
|
426 |
new ArrayList<EditingServiceParameter>();
|
|
505 |
List<EditingServiceParameter> list |
|
506 |
= new ArrayList<>();
|
|
427 | 507 |
list.add(selectionParameter); |
428 | 508 |
list.add(offsetParameter); |
509 |
list.add(sideParameter); |
|
429 | 510 |
return list; |
430 | 511 |
} |
431 | 512 |
|
513 |
@Override |
|
432 | 514 |
public void setValue(Object value) throws InvalidEntryException { |
433 | 515 |
EditingServiceParameter param = next(); |
434 | 516 |
validateAndInsertValue(param, value); |
435 | 517 |
} |
436 | 518 |
|
519 |
@Override |
|
437 | 520 |
public void finishAndStore() throws FinishServiceException { |
438 | 521 |
|
439 |
FeatureSelection selected =
|
|
440 |
(FeatureSelection) values.get(selectionParameter); |
|
522 |
FeatureSelection selected |
|
523 |
= (FeatureSelection) values.get(selectionParameter);
|
|
441 | 524 |
try { |
442 | 525 |
if (!selected.isEmpty()) { |
443 |
double distance = (Double) values.get(offsetParameter); |
|
444 |
DisposableIterator it; |
|
445 |
it = selected.fastIterator(); |
|
526 |
double side = 1.0; |
|
527 |
Object sideValue = values.get(sideParameter); |
|
528 |
if (sideValue != null) { |
|
529 |
if (sideValue instanceof String) { |
|
530 |
Double signum = getSideSignum((String) sideValue); |
|
531 |
side = signum != null ? signum : null; |
|
532 |
} |
|
533 |
} |
|
534 |
double distance = ((Double) values.get(offsetParameter)) * side; |
|
535 |
DisposableIterator it; |
|
536 |
it = selected.fastIterator(); |
|
446 | 537 |
|
447 |
while (it.hasNext()) { |
|
448 |
Feature feature = (Feature) it.next(); |
|
449 |
Geometry geom; |
|
450 |
try { |
|
451 |
geom = feature.getDefaultGeometry().offset(distance); |
|
452 |
} catch (GeometryOperationNotSupportedException e) { |
|
453 |
throw new FinishServiceException(e); |
|
454 |
} catch (GeometryOperationException e) { |
|
455 |
throw new FinishServiceException(e); |
|
456 |
} |
|
538 |
while (it.hasNext()) { |
|
539 |
Feature feature = (Feature) it.next(); |
|
540 |
Geometry geom; |
|
541 |
try { |
|
542 |
geom = feature.getDefaultGeometry().offset(distance); |
|
543 |
} catch (GeometryOperationNotSupportedException | GeometryOperationException e) { |
|
544 |
throw new FinishServiceException(e); |
|
545 |
} |
|
457 | 546 |
|
458 |
if (this.deleteOriginalGeometries) {
|
|
459 |
// Se sustituye la geometr?a original por la
|
|
460 |
// calculada
|
|
461 |
EditableFeature editableFeature =
|
|
462 |
feature.getEditable(); |
|
463 |
editableFeature.setDefaultGeometry(geom);
|
|
464 |
((EditingProviderServices) getProviderServices())
|
|
547 |
if (this.deleteOriginalGeometries) { |
|
548 |
// Se sustituye la geometr?a original por la |
|
549 |
// calculada |
|
550 |
EditableFeature editableFeature
|
|
551 |
= feature.getEditable();
|
|
552 |
editableFeature.setDefaultGeometry(geom); |
|
553 |
((EditingProviderServices) getProviderServices()) |
|
465 | 554 |
.updateFeatureInFeatureStore(editableFeature, |
466 |
featureStore); |
|
467 |
} else {
|
|
468 |
// Se crea una feature nueva copiando los valores de
|
|
469 |
// la feature original excepto aquellos que sean PK
|
|
470 |
EditingProviderServices editingProviderServices =
|
|
471 |
(EditingProviderServices) getProviderServices(); |
|
472 |
EditableFeature editableFeature =
|
|
473 |
editingProviderServices |
|
474 |
.getFeatureCopyWithoutPK(featureStore, |
|
475 |
feature); |
|
476 |
editableFeature.setDefaultGeometry(geom);
|
|
477 |
editingProviderServices
|
|
555 |
featureStore);
|
|
556 |
} else { |
|
557 |
// Se crea una feature nueva copiando los valores de |
|
558 |
// la feature original excepto aquellos que sean PK |
|
559 |
EditingProviderServices editingProviderServices
|
|
560 |
= (EditingProviderServices) getProviderServices();
|
|
561 |
EditableFeature editableFeature
|
|
562 |
= editingProviderServices
|
|
563 |
.getFeatureCopyWithoutPK(featureStore,
|
|
564 |
feature);
|
|
565 |
editableFeature.setDefaultGeometry(geom); |
|
566 |
editingProviderServices |
|
478 | 567 |
.insertFeatureIntoFeatureStore(editableFeature, |
479 |
featureStore); |
|
480 |
}
|
|
568 |
featureStore);
|
|
569 |
} |
|
481 | 570 |
|
482 |
} |
|
483 |
it.dispose(); |
|
484 |
featureStore.getFeatureSelection().deselectAll(); |
|
485 | 571 |
} |
572 |
it.dispose(); |
|
573 |
featureStore.getFeatureSelection().deselectAll(); |
|
574 |
} |
|
486 | 575 |
} catch (DataException e) { |
487 | 576 |
throw new FinishServiceException(e); |
488 | 577 |
} |
489 | 578 |
} |
490 | 579 |
|
491 | 580 |
private Double getDirectedDistance(Point pointInLine, Point distancePoint, Line line) |
492 |
throws GeometryOperationNotSupportedException, GeometryOperationException{
|
|
493 |
Double distance=distancePoint.distance(pointInLine);
|
|
494 |
EditingProviderServices editingProviderServices =
|
|
495 |
(EditingProviderServices) getProviderServices(); |
|
581 |
throws GeometryOperationNotSupportedException, GeometryOperationException {
|
|
582 |
Double distance = distancePoint.distance(pointInLine);
|
|
583 |
EditingProviderServices editingProviderServices |
|
584 |
= (EditingProviderServices) getProviderServices();
|
|
496 | 585 |
Double angle = editingProviderServices.getAngle(pointInLine, distancePoint); |
497 | 586 |
double angleLine = editingProviderServices.getAngle(line.getVertex(0), line.getVertex(1)); |
498 | 587 |
|
499 |
Double angleDifference=angle - angleLine;
|
|
500 |
if ( angleDifference<0 ){
|
|
501 |
angleDifference+=2*Math.PI;
|
|
588 |
Double angleDifference = angle - angleLine;
|
|
589 |
if (angleDifference < 0) {
|
|
590 |
angleDifference += 2 * Math.PI;
|
|
502 | 591 |
} |
503 |
if (angleDifference > Math.PI ) {
|
|
592 |
if (angleDifference > Math.PI) { |
|
504 | 593 |
distance = -distance; |
505 | 594 |
} |
506 | 595 |
return distance; |
507 | 596 |
} |
508 | 597 |
|
598 |
@Override |
|
509 | 599 |
public Geometry finish() throws FinishServiceException { |
510 | 600 |
return null; |
511 | 601 |
} |
512 | 602 |
|
603 |
@Override |
|
513 | 604 |
public void start() throws StartServiceException { |
514 |
this.values = new HashMap<EditingServiceParameter, Object>();
|
|
605 |
this.values = new HashMap<>(); |
|
515 | 606 |
FeatureSelection selected = null; |
516 | 607 |
if (featureStore != null) { |
517 | 608 |
try { |
518 |
selected =
|
|
519 |
(FeatureSelection) featureStore.getFeatureSelection() |
|
520 |
.clone(); |
|
609 |
selected |
|
610 |
= (FeatureSelection) featureStore.getFeatureSelection()
|
|
611 |
.clone();
|
|
521 | 612 |
} catch (DataException e) { |
522 | 613 |
throw new StartServiceException(e); |
523 | 614 |
} catch (CloneNotSupportedException e) { |
... | ... | |
529 | 620 |
} |
530 | 621 |
} |
531 | 622 |
|
623 |
@Override |
|
532 | 624 |
public String getName() { |
533 | 625 |
return OffsetEditingProviderFactory.PROVIDER_NAME; |
534 | 626 |
} |
535 |
} |
|
627 |
} |
Also available in: Unified diff