Revision 3015

View differences:

org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/resources-plugin/i18n/text.properties
234 234
_Horizontal_scale_factor_or_reference_point=Factor de escala horizontal o punto de referencia
235 235
_Second_scale_point = Segundo punto para la escala
236 236
_Vertical_scale_factor=Factor de escala vertical
237
_Pivot_center_envelope=Centro de la envolvente
237
_Pivot_center_envelope=Centro de la envoltura
238 238
_Key_pivot_center_envelope=C
239
_Pivot_centroid=Centroide (baricentro)
239
_Pivot_centroid=Baricentro (centroide)
240 240
_Key_pivot_centroid=B
241 241
_Rotate_mode=Modo
242 242
_Rotate_active_angle_mode=\u00c1ngulo
......
248 248
_Pivot_point=Punto de pivote
249 249
_Angle=\u00c1ngulo
250 250
_Start_of_rotation=Inicio de rotaci\u00f3n
251
_End_of_rotation=Fin de rotaci\u00f3n
251
_End_of_rotation=Fin de rotaci\u00f3n
252
_Separate_elements_question=\u00bfPivotar los elementos individualmente?
253
_Element_rotation=Rotaci\u00f3n de elementos
254
_Individually=Individualmente
255
_Together=Conjuntamente
org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties
234 234
_Vertical_scale_factor=Vertical scale factor
235 235
_Pivot_center_envelope=Envelope center
236 236
_Key_pivot_center_envelope=C
237
_Pivot_centroid=Centroid (baricenter)
237
_Pivot_centroid=Baricenter (centroid)
238 238
_Key_pivot_centroid=B
239 239
_Rotate_mode=Mode
240 240
_Rotate_active_angle_mode=Angle
......
246 246
_Pivot_point=Pivot point
247 247
_Angle=Angle
248 248
_Start_of_rotation=Start of rotation
249
_End_of_rotation=End of rotation
249
_End_of_rotation=End of rotation
250
_Separate_elements_question=The elements pivot individually?
251
_Element_rotation=Rotaci\u00f3n de elementos
252
_Individually=Individuallly
253
_Together=Together
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
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