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