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 |
}
|