Revision 2873

View differences:

org.gvsig.vectorediting.offset/trunk/org.gvsig.vectorediting.offset/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text.properties
12 12
_right=Derecho
13 13
_short_left=I
14 14
_short_right=D
15
_side=Lado
15
_side=Lado
16
side=Lado
17
_round=Redondeado
18
_mitre=Inglete
19
_bevel=Bisel
20
_short_round=R
21
_short_mitre=I
22
_short_bevel=B
23
_join_style=Estilo de uni\u00f3n
24
joinStyle=Estilo de uni\u00f3n
25
equidistant_offsets=Paralelas equidistantes
org.gvsig.vectorediting.offset/trunk/org.gvsig.vectorediting.offset/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties
12 12
_right=Right
13 13
_short_left=L
14 14
_short_right=R
15
_side=Side
15
_side=Side
16
side=Side
17
_round=Round
18
_mitre=Mitre
19
_bevel=Bevel
20
_short_round=R
21
_short_mitre=M
22
_short_bevel=B
23
_join_style=Join style
24
joinStyle=Join style
25
equidistant_offsets=Equidistantes offsets
org.gvsig.vectorediting.offset/trunk/org.gvsig.vectorediting.offset/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/pom.xml
21 21
      <groupId>org.gvsig</groupId>
22 22
      <artifactId>org.gvsig.vectorediting.lib.spi</artifactId>
23 23
    </dependency>
24
    <dependency>
25
      <groupId>org.gvsig</groupId>
26
      <artifactId>org.gvsig.symbology.lib.api</artifactId>
27
    </dependency>
24 28
  </dependencies>
25 29
</project>
org.gvsig.vectorediting.offset/trunk/org.gvsig.vectorediting.offset/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProvider.java
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
}

Also available in: Unified diff