Revision 3067 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.prov/org.gvsig.vectorediting.lib.prov.trimline/src/main/java/org/gvsig/vectorediting/lib/prov/trimline/TrimLineEditingProvider.java
TrimLineEditingProvider.java | ||
---|---|---|
25 | 25 |
package org.gvsig.vectorediting.lib.prov.trimline; |
26 | 26 |
|
27 | 27 |
import java.util.ArrayList; |
28 |
import java.util.Collections; |
|
28 | 29 |
import java.util.HashMap; |
29 | 30 |
import java.util.List; |
30 | 31 |
import java.util.Map; |
... | ... | |
51 | 52 |
import org.gvsig.fmap.geom.type.GeometryType; |
52 | 53 |
import org.gvsig.fmap.mapcontext.MapContext; |
53 | 54 |
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol; |
54 |
import org.gvsig.tools.dispose.DisposableIterator; |
|
55 |
import org.gvsig.tools.dispose.DisposeUtils; |
|
56 | 55 |
import org.gvsig.tools.dynobject.DynObject; |
57 | 56 |
import org.gvsig.tools.exception.BaseException; |
58 | 57 |
import org.gvsig.tools.service.spi.ProviderServices; |
... | ... | |
96 | 95 |
|
97 | 96 |
private final MapContext mapContext; |
98 | 97 |
|
98 |
private List<Feature> selectedFeatures; |
|
99 |
|
|
99 | 100 |
/** |
100 | 101 |
* Default constructor. |
101 | 102 |
* |
... | ... | |
156 | 157 |
editingProviderManager.getSymbol("line-symbol-editing"); |
157 | 158 |
|
158 | 159 |
try { |
159 |
|
|
160 |
DisposableIterator selectionIterator = selection.fastIterator(); |
|
161 |
while (selectionIterator.hasNext()) { |
|
162 |
Feature feature = (Feature) selectionIterator.next(); |
|
160 |
for (Feature feature : selectedFeatures) { |
|
163 | 161 |
if (feature != null) { |
164 | 162 |
ISymbol previewSymbol = this.getPreviewSymbol(feature); |
165 |
|
|
166 | 163 |
Geometry geometry = feature.getDefaultGeometry(); |
167 |
|
|
168 | 164 |
if(geometry != null && geometry.intersects(shears)) { |
169 | 165 |
if (geometry instanceof MultiCurve) { |
170 | 166 |
MultiCurve multiCurve = (MultiCurve) geometry; |
171 |
|
|
172 |
for (int i = 0; i < multiCurve |
|
173 |
.getPrimitivesNumber(); i++) { |
|
174 |
|
|
167 |
for (int i = 0; i < multiCurve.getPrimitivesNumber(); i++) { |
|
175 | 168 |
Curve curve = multiCurve.getCurveAt(i); |
176 |
MultiCurve trimmedCurve |
|
177 |
= trimLine(mousePosition, curve, shears); |
|
178 |
for (int j = 0; j < trimmedCurve |
|
179 |
.getPrimitivesNumber(); j++) { |
|
169 |
MultiCurve trimmedCurve = trimLine(mousePosition, curve, shears); |
|
170 |
for (int j = 0; j < trimmedCurve.getPrimitivesNumber(); j++) { |
|
180 | 171 |
final Curve primitive = trimmedCurve.getCurveAt(j); |
181 | 172 |
drawingStatus.addStatus(primitive, lineSymbolEditing, ""); |
182 | 173 |
drawingStatus.addStatus(primitive, previewSymbol, ""); |
... | ... | |
221 | 212 |
@Override |
222 | 213 |
public void stop() throws StopServiceException { |
223 | 214 |
values.clear(); |
215 |
this.selectedFeatures = Collections.EMPTY_LIST; |
|
224 | 216 |
} |
225 | 217 |
|
226 | 218 |
@Override |
... | ... | |
341 | 333 |
|
342 | 334 |
@Override |
343 | 335 |
public void finishAndStore() throws FinishServiceException { |
344 |
|
|
336 |
|
|
345 | 337 |
FeatureSelection selection = (FeatureSelection) values.get(selectionParameter); |
346 | 338 |
Geometry shearsGeometry = (Geometry) values.get(geometryToTrimWithParameter); |
347 | 339 |
Point point = (Point) values.get(shearingPointParameter); |
348 | 340 |
|
349 | 341 |
if (selection != null && shearsGeometry != null && point != null) { |
350 |
DisposableIterator selectionIterator = null; |
|
351 | 342 |
try { |
352 |
selectionIterator = selection.fastIterator(); |
|
353 |
while (selectionIterator.hasNext()) { |
|
354 |
Feature feature = (Feature) selectionIterator.next(); |
|
355 |
|
|
343 |
for (Feature feature : selectedFeatures) { |
|
356 | 344 |
Geometry geometry = feature.getDefaultGeometry(); |
357 |
|
|
358 | 345 |
EditableFeature eFeature = feature.getEditable(); |
359 |
|
|
360 |
if(geometry.intersects(shearsGeometry)){ |
|
346 |
if (geometry.intersects(shearsGeometry)) { |
|
361 | 347 |
if (geometry instanceof Curve) { |
362 |
|
|
363 | 348 |
Curve curveToTrim = (Curve) geometry; |
364 |
MultiCurve result = |
|
365 |
trimLine(point, curveToTrim, shearsGeometry); |
|
349 |
MultiCurve result = trimLine(point, curveToTrim, shearsGeometry); |
|
366 | 350 |
eFeature.setDefaultGeometry(result); |
367 | 351 |
selection.update(eFeature); |
368 | 352 |
|
369 | 353 |
} else if (geometry instanceof MultiCurve) { |
370 |
|
|
371 |
int subType = |
|
372 |
geometry.getGeometryType().getSubType(); |
|
373 |
MultiCurve trimmedMultiCurve = |
|
374 |
createMultiCurve(subType); |
|
354 |
int subType = geometry.getGeometryType().getSubType(); |
|
355 |
MultiCurve trimmedMultiCurve = createMultiCurve(subType); |
|
375 | 356 |
MultiCurve multiCurveToTrim = (MultiCurve) geometry; |
376 | 357 |
|
377 | 358 |
double minDistance = Double.POSITIVE_INFINITY; |
378 | 359 |
int nearestCurveIndex = -1; |
379 | 360 |
|
380 |
for (int i = 0; i < multiCurveToTrim |
|
381 |
.getPrimitivesNumber(); i++) { |
|
382 |
|
|
383 |
Curve primitive = |
|
384 |
multiCurveToTrim.getCurveAt(i); |
|
385 |
|
|
386 |
double distance = |
|
387 |
primitive.distance(point); |
|
361 |
for (int i = 0; i < multiCurveToTrim .getPrimitivesNumber(); i++) { |
|
362 |
Curve primitive = multiCurveToTrim.getCurveAt(i); |
|
363 |
double distance = primitive.distance(point); |
|
388 | 364 |
if (distance < minDistance) { |
389 | 365 |
nearestCurveIndex = i; |
390 | 366 |
minDistance = distance; |
391 | 367 |
} |
392 | 368 |
} |
393 |
|
|
394 |
MultiCurve result =
|
|
395 |
trimLine(point, multiCurveToTrim
|
|
396 |
.getCurveAt(nearestCurveIndex), shearsGeometry);
|
|
397 |
|
|
369 |
MultiCurve result = trimLine( |
|
370 |
point,
|
|
371 |
multiCurveToTrim.getCurveAt(nearestCurveIndex),
|
|
372 |
shearsGeometry
|
|
373 |
); |
|
398 | 374 |
for (int i = 0; i < result.getPrimitivesNumber(); i++) { |
399 | 375 |
trimmedMultiCurve.addCurve(result.getCurveAt(i)); |
400 | 376 |
} |
401 |
|
|
402 |
for (int i = 0; i < multiCurveToTrim |
|
403 |
.getPrimitivesNumber(); i++) { |
|
377 |
for (int i = 0; i < multiCurveToTrim.getPrimitivesNumber(); i++) { |
|
404 | 378 |
if (i != nearestCurveIndex) { |
405 |
trimmedMultiCurve.addCurve(multiCurveToTrim |
|
406 |
.getCurveAt(i)); |
|
379 |
trimmedMultiCurve.addCurve( |
|
380 |
multiCurveToTrim.getCurveAt(i) |
|
381 |
); |
|
407 | 382 |
} |
408 | 383 |
} |
409 |
|
|
410 | 384 |
eFeature.setDefaultGeometry(trimmedMultiCurve); |
411 | 385 |
selection.update(eFeature); |
412 |
|
|
413 | 386 |
} |
414 | 387 |
} |
415 |
}
|
|
388 |
} |
|
416 | 389 |
} catch (BaseException ex) { |
417 | 390 |
throw new FinishServiceException(ex); |
418 |
} finally { |
|
419 |
DisposeUtils.disposeQuietly(selectionIterator); |
|
420 | 391 |
} |
421 | 392 |
} |
422 | 393 |
} |
... | ... | |
436 | 407 |
public void start() throws StartServiceException, InvalidEntryException { |
437 | 408 |
|
438 | 409 |
this.values = new HashMap<>(); |
439 |
FeatureSelection selected = null; |
|
440 |
if (featureStore != null && values.get(selectionParameter) == null) { |
|
410 |
this.selectedFeatures = Collections.EMPTY_LIST; |
|
411 |
if (featureStore != null) { |
|
412 |
FeatureSelection selected = null; |
|
441 | 413 |
try { |
442 |
selected = featureStore.getFeatureSelection();
|
|
414 |
selected = (FeatureSelection) featureStore.getFeatureSelection().clone();
|
|
443 | 415 |
} catch (DataException e) { |
444 | 416 |
throw new StartServiceException(e); |
417 |
} catch (CloneNotSupportedException ex) { |
|
418 |
LOGGER.debug("Can't init selection",ex); |
|
445 | 419 |
} |
446 |
if (selected.getSelectedCount() > 0) { |
|
447 |
try { |
|
448 |
setValue(selected); |
|
449 |
} catch (InvalidEntryException e) { |
|
450 |
throw new InvalidEntryException(e); |
|
451 |
} |
|
420 |
if ((selected != null) && (selected.getSelectedCount() > 0)) { |
|
421 |
values.put(selectionParameter, selected); |
|
422 |
this.selectedFeatures = this.getSelectedFeaturesCopy(selected); |
|
452 | 423 |
} |
453 | 424 |
} |
454 |
|
|
455 | 425 |
} |
456 | 426 |
|
457 | 427 |
@Override |
Also available in: Unified diff