Revision 3015 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.prov/org.gvsig.vectorediting.lib.prov.rotate/src/main/java/org/gvsig/vectorediting/lib/prov/rotate/RotateEditingProvider.java
RotateEditingProvider.java | ||
---|---|---|
41 | 41 |
import org.gvsig.fmap.geom.aggregate.MultiCurve; |
42 | 42 |
import org.gvsig.fmap.geom.aggregate.MultiPoint; |
43 | 43 |
import org.gvsig.fmap.geom.aggregate.MultiSurface; |
44 |
import org.gvsig.fmap.geom.exception.CreateEnvelopeException; |
|
45 |
import org.gvsig.fmap.geom.exception.CreateGeometryException; |
|
46 | 44 |
import org.gvsig.fmap.geom.operation.GeometryOperationException; |
47 | 45 |
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException; |
48 | 46 |
import org.gvsig.fmap.geom.primitive.Arc; |
... | ... | |
56 | 54 |
import org.gvsig.symbology.SymbologyManager; |
57 | 55 |
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol; |
58 | 56 |
import org.gvsig.tools.ToolsLocator; |
57 |
import org.gvsig.tools.dataTypes.DataTypes; |
|
59 | 58 |
import org.gvsig.tools.dispose.DisposableIterator; |
60 | 59 |
import org.gvsig.tools.dynobject.DynObject; |
61 | 60 |
import org.gvsig.tools.exception.BaseException; |
... | ... | |
103 | 102 |
public static final String KEY_ROTATE_TWO_POINTS_MODE = "_Key_rotate_two_points_mode"; |
104 | 103 |
|
105 | 104 |
public static final String KEY_ROTATE_THREE_POINTS_MODE = "_Key_rotate_three_points_mode"; |
105 |
|
|
106 |
private static final String SEPARATE_ELEMENTS_QUESTION = "_Separate_elements_question"; |
|
107 |
|
|
108 |
private static final String ELEMENT_ROTATION = "_Element_rotation"; |
|
106 | 109 |
|
110 |
private static final String INDIVIDUALLY = "_Individually"; |
|
111 |
private static final String TOGETHER = "_Together"; |
|
112 |
|
|
113 |
private static final String SHORT_YES = "_short_yes"; |
|
114 |
private static final String SHORT_NO = "_short_no"; |
|
115 |
|
|
116 |
|
|
107 | 117 |
//Variable est?tica para guardarnos el rotate_mode |
108 | 118 |
private static String savedRotateMode; |
119 |
private static Boolean savedSeparateElements; |
|
109 | 120 |
|
110 | 121 |
private final EditingServiceParameter selectionParameter; |
111 | 122 |
|
... | ... | |
114 | 125 |
private String center; |
115 | 126 |
|
116 | 127 |
private final EditingServiceParameter modeParameter; |
128 |
|
|
129 |
private final EditingServiceParameter separateElementsParameter; |
|
117 | 130 |
|
118 | 131 |
private final EditingServiceParameter angleParameter; |
119 | 132 |
|
... | ... | |
140 | 153 |
|
141 | 154 |
DefaultEditingServiceParameterOptions options = new DefaultEditingServiceParameterOptions() |
142 | 155 |
.add(i18nManager.getTranslation(PIVOT_CENTER_ENVELOPE), PIVOT_CENTER_ENVELOPE, i18nManager.getTranslation(KEY_PIVOT_CENTER_ENVELOPE)) |
143 |
// .add(i18nManager.getTranslation(PIVOT_CENTROID), PIVOT_CENTROID, i18nManager.getTranslation(KEY_PIVOT_CENTROID))
|
|
156 |
.add(i18nManager.getTranslation(PIVOT_CENTROID), PIVOT_CENTROID, i18nManager.getTranslation(KEY_PIVOT_CENTROID)) |
|
144 | 157 |
; |
145 | 158 |
|
146 | 159 |
String consoleMsg |
... | ... | |
174 | 187 |
true, //Optional |
175 | 188 |
TYPE.OPTION |
176 | 189 |
); |
190 |
|
|
191 |
DefaultEditingServiceParameterOptions separateElementsOptions= new DefaultEditingServiceParameterOptions() |
|
192 |
.add(INDIVIDUALLY, true, i18nManager.getTranslation(SHORT_YES)) |
|
193 |
.add(TOGETHER, false, i18nManager.getTranslation(SHORT_NO)); |
|
177 | 194 |
|
195 |
String separateElementsConsoleMsg |
|
196 |
= ((EditingProviderServices) providerServices).makeConsoleMessage( |
|
197 |
SEPARATE_ELEMENTS_QUESTION, separateElementsOptions); |
|
198 |
|
|
199 |
|
|
200 |
this.separateElementsParameter |
|
201 |
= new DefaultEditingServiceParameter( |
|
202 |
ELEMENT_ROTATION, |
|
203 |
separateElementsConsoleMsg, |
|
204 |
separateElementsOptions, |
|
205 |
i18nManager.getTranslation(SHORT_NO), |
|
206 |
true, |
|
207 |
TYPE.OPTION).setDataType(DataTypes.BOOLEAN); |
|
208 |
|
|
209 |
|
|
178 | 210 |
this.angleParameter |
179 | 211 |
= new DefaultEditingServiceParameter( |
180 | 212 |
"_Angle", |
... | ... | |
218 | 250 |
ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing"); |
219 | 251 |
ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing"); |
220 | 252 |
|
253 |
GeometryManager geometryManager = GeometryLocator.getGeometryManager(); |
|
254 |
|
|
221 | 255 |
EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices(); |
222 | 256 |
|
223 | 257 |
FeatureSelection selected |
... | ... | |
244 | 278 |
mousePosition); |
245 | 279 |
|
246 | 280 |
Line line; |
247 |
GeometryManager geometryManager |
|
248 |
= GeometryLocator.getGeometryManager(); |
|
249 | 281 |
line = geometryManager.createLine(subType); |
250 | 282 |
line.addVertex(p1); |
251 | 283 |
p3 = geometryManager.createPoint( |
... | ... | |
277 | 309 |
p3 = (Point) values.get(secondPointParameter); |
278 | 310 |
if (p2 == null) { |
279 | 311 |
Line line; |
280 |
GeometryManager geometryManager |
|
281 |
= GeometryLocator.getGeometryManager(); |
|
282 | 312 |
line = geometryManager.createLine(subType); |
283 | 313 |
line.addVertex(p1); |
284 | 314 |
line.addVertex(mousePosition); |
... | ... | |
295 | 325 |
p2); |
296 | 326 |
|
297 | 327 |
Line line; |
298 |
GeometryManager geometryManager |
|
299 |
= GeometryLocator.getGeometryManager(); |
|
300 | 328 |
line = geometryManager.createLine(subType); |
301 | 329 |
line.addVertex(p1); |
302 | 330 |
line.addVertex(p2); |
... | ... | |
307 | 335 |
line2.addVertex(mousePosition); |
308 | 336 |
drawingStatus.addStatus(line2, ruleAxisSymbol, ""); |
309 | 337 |
Double ext = (2 * Math.PI) - angle; |
338 |
double minDistance = Math.min(p1.distance(p2), p1.distance(mousePosition)); |
|
310 | 339 |
Arc arc = GeometryUtils.createArc( |
311 | 340 |
p1, |
312 |
p1.distance(mousePosition) / 2,
|
|
341 |
minDistance/2,
|
|
313 | 342 |
GeometryUtils.calculateAngle(p1, p2), |
314 | 343 |
GeometryUtils.calculateAngle(p1, p2, mousePosition), |
315 | 344 |
subType); |
316 | 345 |
drawingStatus.addStatus(arc, auxiliaryLineSymbolEditing, ""); |
317 |
double textDistance = 3 * p1.distance(mousePosition) / 4;
|
|
346 |
double textDistance = 3 * minDistance / 4;
|
|
318 | 347 |
Point pointText = geometryManager.createPoint(p1.getX() + textDistance * Math.cos(startAngle+(angle / 2)), p1.getY() + textDistance * Math.sin(startAngle+(angle / 2)), subType); |
319 | 348 |
ISimpleTextSymbol textSymbol = getTextSymbol(); |
320 | 349 |
drawingStatus.addStatus(pointText, textSymbol, degToDms(Math.toDegrees(angle))); |
... | ... | |
334 | 363 |
throw new DrawServiceException(e); |
335 | 364 |
} |
336 | 365 |
|
366 |
Boolean separateElements = (Boolean) getValue(separateElementsParameter); |
|
337 | 367 |
while (it.hasNext()) { |
338 | 368 |
Feature feat = (Feature) it.next(); |
339 | 369 |
|
340 | 370 |
ISymbol previewSymbol = this.getPreviewSymbol(feat); |
341 | 371 |
|
342 | 372 |
Geometry transformedGeometry = feat.getDefaultGeometry().cloneGeometry(); |
373 |
if(separateElements){ |
|
374 |
Point pivot = null; |
|
375 |
//Si es cualquier punto y separamos elementos tambi?n pivotamos sobre el centro de la envoltura |
|
376 |
if (center == null || PIVOT_CENTER_ENVELOPE.equalsIgnoreCase(center)) { |
|
377 |
Envelope featEnv = feat.getDefaultEnvelope(); |
|
378 |
if (!featEnv.isEmpty()) { |
|
379 |
pivot = geometryManager.createPoint(featEnv.getCenter(0), featEnv.getCenter(1), subType); |
|
380 |
} |
|
381 |
} else if (PIVOT_CENTROID.equalsIgnoreCase(center)) { |
|
382 |
pivot = feat.getDefaultGeometry().centroid(); |
|
383 |
} |
|
384 |
if(pivot != null){ |
|
385 |
try { |
|
386 |
at = getRotateAffineTransform(pivot, angle); |
|
387 |
} catch (Exception e) { |
|
388 |
throw new DrawServiceException(e); |
|
389 |
} |
|
390 |
} |
|
391 |
} |
|
343 | 392 |
transformedGeometry.transform(at); |
344 | 393 |
|
345 | 394 |
ISymbol symbol = null; |
... | ... | |
454 | 503 |
} else if (param == modeParameter) { |
455 | 504 |
savedRotateMode = (String) param.getOptions2().getValue(value, param.getDefaultValue()); |
456 | 505 |
values.put(param, savedRotateMode); |
457 |
|
|
506 |
} else if (param == separateElementsParameter) { |
|
507 |
savedSeparateElements = (Boolean) param.getOptions2().getValue(value, param.getDefaultValue()); |
|
508 |
values.put(param, savedSeparateElements); |
|
458 | 509 |
} else if (param == pivotPointParameter) { |
459 | 510 |
if (value == null) { |
460 | 511 |
center = null; |
... | ... | |
463 | 514 |
values.put(param, value); |
464 | 515 |
center = null; |
465 | 516 |
} else if (value instanceof String) { |
466 |
if (PIVOT_CENTER_ENVELOPE.equalsIgnoreCase((String) param.getOptions2().getValue(value, param.getDefaultValue()))) {
|
|
467 |
center = PIVOT_CENTER_ENVELOPE;
|
|
468 |
GeometryManager geomManager = GeometryLocator.getGeometryManager();
|
|
517 |
String pivotMode = (String) param.getOptions2().getValue(value, param.getDefaultValue());
|
|
518 |
if (PIVOT_CENTER_ENVELOPE.equalsIgnoreCase(pivotMode) || PIVOT_CENTROID.equalsIgnoreCase(pivotMode)) {
|
|
519 |
center = pivotMode;
|
|
469 | 520 |
FeatureSelection selected |
470 | 521 |
= (FeatureSelection) values.get(this.selectionParameter); |
471 |
if ((selected != null) && !selected.isEmpty()) { |
|
472 |
try { |
|
473 |
int subType = this.getProviderServices().getSubType(featureStore); |
|
474 |
Envelope envelope = geomManager.createEnvelope(subType); |
|
475 |
for (Feature feature : selected) { |
|
476 |
Envelope featEnv = feature.getDefaultEnvelope(); |
|
477 |
envelope.add(featEnv); |
|
478 |
} |
|
479 |
if (!envelope.isEmpty()) { |
|
480 |
Point center = geomManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), subType); |
|
481 |
values.put(param, center); |
|
482 |
} |
|
483 |
} catch (DataException | CreateGeometryException | CreateEnvelopeException ex) { |
|
484 |
throw new InvalidEntryException(ex); |
|
485 |
} |
|
486 |
} |
|
522 |
values.put(param, calculatePivot(selected, pivotMode)); |
|
487 | 523 |
} else { |
488 | 524 |
center = null; |
489 | 525 |
values.remove(param); |
... | ... | |
529 | 565 |
list.add(selectionParameter); |
530 | 566 |
list.add(modeParameter); |
531 | 567 |
list.add(pivotPointParameter); |
568 |
list.add(separateElementsParameter); |
|
532 | 569 |
list.add(angleParameter); |
533 | 570 |
list.add(firstPointParameter); |
534 | 571 |
list.add(secondPointParameter); |
... | ... | |
551 | 588 |
|
552 | 589 |
FeatureSelection selected |
553 | 590 |
= (FeatureSelection) values.get(selectionParameter); |
591 |
EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices(); |
|
592 |
|
|
554 | 593 |
try { |
594 |
int subType = editingProviderServices.getSubType(featureStore); |
|
555 | 595 |
if (!selected.isEmpty()) { |
556 | 596 |
Point p0 = (Point) values.get(pivotPointParameter); |
557 | 597 |
Point p1 = null; |
... | ... | |
575 | 615 |
} |
576 | 616 |
|
577 | 617 |
if(angle != null){ |
618 |
final Double finalAngle = angle; |
|
578 | 619 |
|
579 | 620 |
final AffineTransform at; |
580 | 621 |
try { |
581 |
at = getRotateAffineTransform(p0, angle);
|
|
622 |
at = getRotateAffineTransform(p0, finalAngle);
|
|
582 | 623 |
} catch (GeometryOperationNotSupportedException | GeometryOperationException e) { |
583 | 624 |
throw new FinishServiceException(e); |
584 | 625 |
} |
626 |
|
|
627 |
Boolean separateElements = (Boolean) getValue(separateElementsParameter); |
|
628 |
GeometryManager geometryManager = GeometryLocator.getGeometryManager(); |
|
629 |
|
|
585 | 630 |
try { |
586 | 631 |
selected.accept((Object obj) -> { |
632 |
AffineTransform individualAt = at; |
|
587 | 633 |
Feature feature = (Feature) obj; |
588 | 634 |
Geometry geom |
589 | 635 |
= feature.getDefaultGeometry() |
590 | 636 |
.cloneGeometry(); |
591 |
geom.transform(at); |
|
637 |
if(separateElements){ |
|
638 |
Point pivot = null; |
|
639 |
//Si es cualquier punto y separamos elementos tambi?n pivotamos sobre el centro de la envoltura |
|
640 |
if (center == null || PIVOT_CENTER_ENVELOPE.equalsIgnoreCase(center)) { |
|
641 |
Envelope featEnv = feature.getDefaultEnvelope(); |
|
642 |
if (!featEnv.isEmpty()) { |
|
643 |
pivot = geometryManager.createPoint(featEnv.getCenter(0), featEnv.getCenter(1), subType); |
|
644 |
} |
|
645 |
} else if (PIVOT_CENTROID.equalsIgnoreCase(center)) { |
|
646 |
pivot = feature.getDefaultGeometry().centroid(); |
|
647 |
} |
|
648 |
if(pivot != null){ |
|
649 |
try { |
|
650 |
individualAt = getRotateAffineTransform(pivot, finalAngle); |
|
651 |
} catch (Exception e) { |
|
652 |
throw new DrawServiceException(e); |
|
653 |
} |
|
654 |
} |
|
655 |
} |
|
656 |
|
|
657 |
|
|
658 |
geom.transform(individualAt); |
|
592 | 659 |
// Se sustituye la geometr?a original por la |
593 | 660 |
// calculada |
594 | 661 |
EditableFeature editableFeature |
... | ... | |
674 | 741 |
return true; |
675 | 742 |
} |
676 | 743 |
|
744 |
private Point calculatePivot(FeatureSelection selection, String mode) throws InvalidEntryException { |
|
745 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
746 |
Point pivot = null; |
|
747 |
FeatureSelection selected |
|
748 |
= (FeatureSelection) values.get(this.selectionParameter); |
|
749 |
try { |
|
750 |
int subType = this.getProviderServices().getSubType(featureStore); |
|
751 |
if ((selected != null) && !selected.isEmpty()) { |
|
752 |
if (PIVOT_CENTER_ENVELOPE.equalsIgnoreCase(mode)) { |
|
753 |
Envelope envelope = geomManager.createEnvelope(subType); |
|
754 |
for (Feature feature : selected) { |
|
755 |
Envelope featEnv = feature.getDefaultEnvelope(); |
|
756 |
envelope.add(featEnv); |
|
757 |
} |
|
758 |
if (!envelope.isEmpty()) { |
|
759 |
pivot = geomManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), subType); |
|
760 |
} |
|
761 |
} else if (PIVOT_CENTROID.equalsIgnoreCase(mode)) { |
|
762 |
Geometry geometry = null; |
|
763 |
for (Feature feature : selected) { |
|
764 |
if (geometry == null) { |
|
765 |
geometry = feature.getDefaultGeometry().clone(); |
|
766 |
} else { |
|
767 |
geometry = geometry.union(feature.getDefaultGeometry().clone()); |
|
768 |
} |
|
769 |
} |
|
770 |
if (geometry != null) { |
|
771 |
pivot = geometry.centroid(); |
|
772 |
} |
|
773 |
} |
|
774 |
} |
|
775 |
} catch (Exception ex) { |
|
776 |
throw new InvalidEntryException(ex); |
|
777 |
} |
|
677 | 778 |
|
779 |
return pivot; |
|
780 |
} |
|
781 |
|
|
678 | 782 |
} |
Also available in: Unified diff