Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.polyline / src / main / java / org / gvsig / vectorediting / lib / prov / polyline / PolylineEditingProvider.java @ 159

History | View | Annotate | Download (24.8 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2014 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24

    
25
package org.gvsig.vectorediting.lib.prov.polyline;
26

    
27
import java.util.ArrayList;
28
import java.util.List;
29

    
30
import org.gvsig.fmap.dal.exception.DataException;
31
import org.gvsig.fmap.dal.feature.FeatureStore;
32
import org.gvsig.fmap.geom.Geometry;
33
import org.gvsig.fmap.geom.Geometry.TYPES;
34
import org.gvsig.fmap.geom.GeometryLocator;
35
import org.gvsig.fmap.geom.GeometryManager;
36
import org.gvsig.fmap.geom.aggregate.MultiCurve;
37
import org.gvsig.fmap.geom.exception.CreateGeometryException;
38
import org.gvsig.fmap.geom.operation.GeometryOperationException;
39
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
40
import org.gvsig.fmap.geom.primitive.Curve;
41
import org.gvsig.fmap.geom.primitive.Line;
42
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
43
import org.gvsig.fmap.geom.primitive.Point;
44
import org.gvsig.fmap.geom.primitive.Surface;
45
import org.gvsig.fmap.geom.type.GeometryType;
46
import org.gvsig.tools.ToolsLocator;
47
import org.gvsig.tools.dynobject.DynObject;
48
import org.gvsig.tools.exception.BaseException;
49
import org.gvsig.tools.i18n.I18nManager;
50
import org.gvsig.tools.service.spi.ProviderServices;
51
import org.gvsig.vectorediting.lib.api.DrawingStatus;
52
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
53
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
54
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
55
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
56
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
57
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
58
import org.gvsig.vectorediting.lib.api.exceptions.VectorEditingException;
59
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
60
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
61
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
62
import org.gvsig.vectorediting.lib.spi.EditingProvider;
63
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
64
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
65

    
66
public class PolylineEditingProvider extends AbstractEditingProvider implements
67
    EditingProvider {
68

    
69
    protected EditingProviderServices editingProviderServices =
70
        (EditingProviderServices) getProviderServices();
71

    
72
    protected I18nManager i18nManager = ToolsLocator.getI18nManager();
73

    
74
    private EditingServiceParameter points =
75
        new DefaultEditingServiceParameter("Points",
76
            i18nManager.getTranslation("indicate_new_point"),
77
            TYPE.LIST_POSITIONS, TYPE.OPTION);
78

    
79
    private boolean arcMode = false;
80

    
81
    private List<MyPolyLinePoint> values;
82

    
83
    protected FeatureStore featureStore;
84

    
85
    public PolylineEditingProvider(ProviderServices providerServices,
86
        DynObject parameters) {
87
        super(providerServices);
88
        this.featureStore =
89
            (FeatureStore) parameters
90
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
91
    }
92

    
93
    /**
94
     * @param angle1
95
     * @param angle2
96
     * @return
97
     */
98
    private static double angleDistance(double angle1, double angle2) {
99
        if (angle1 < angle2) {
100
            return angle2 - angle1;
101
        } else {
102
            return ((Math.PI * 2) - angle1) + angle2;
103
        }
104
    }
105

    
106
    /**
107
     *
108
     *
109
     * @param lastPosition
110
     * @return
111
     * @throws VectorEditingException
112
     */
113
    private DrawingStatus calculatePolyline(Point lastPosition)
114
        throws VectorEditingException {
115
        DrawingStatus geometries = new DefaultDrawingStatus();
116
        Double antm = null;
117
        Double antb = null;
118
        Double m = null;
119
        Double b = null;
120
        Point center = null;
121
        double radius = 0.0;
122
        double startAngle = 0.0;
123
        double endAngle = 0.0;
124
        double angleExt = 0.0;
125
        boolean right = false;
126
        boolean addGeom = false;
127

    
128
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
129

    
130
        Curve lineAntPointToPoint = null;
131

    
132
        if (values.size() >= 1) {
133
            for (int i = 0; i < values.size(); i++) {
134

    
135
                MyPolyLinePoint polyLinePoint = values.get(i);
136
                MyPolyLinePoint polyLineNextPoint = getNextPoint(i);
137

    
138
                Point point = polyLinePoint.getPoint();
139
                Point nextPoint;
140

    
141
                if (polyLineNextPoint == null) {
142
                    nextPoint = lastPosition;
143
                    addGeom = true;
144
                } else {
145
                    nextPoint = polyLineNextPoint.getPoint();
146
                }
147

    
148
                if (nextPoint == null) {
149
                    return geometries;
150
                }
151
                if (polyLinePoint.isArcMode()) {
152
                    try {
153

    
154
                        lineAntPointToPoint =
155
                            editingProviderServices.createLine(point.getX(),
156
                                point.getY(), nextPoint.getX(),
157
                                nextPoint.getY(), featureStore);
158

    
159
                        Double[] lineParams = getLineParams(point, nextPoint);
160
                        m = lineParams[0];
161
                        b = lineParams[1];
162

    
163
                        Point[] pointPerpendicular =
164
                            getPerpendicular(antm, antb, point, featureStore);
165
                        Line linePointPerpendicular =
166
                            geomManager.createLine(editingProviderServices
167
                                .getSubType(featureStore));
168
                        linePointPerpendicular.setPoints(pointPerpendicular[0],
169
                            pointPerpendicular[1]);
170

    
171
                        Point[] bisector =
172
                            getPerpendicular(m, b,
173
                                getMidPoint(point, nextPoint, featureStore),
174
                                featureStore);
175
                        Line lineBisector =
176
                            geomManager.createLine(editingProviderServices
177
                                .getSubType(featureStore));
178
                        lineBisector.setPoints(bisector[0], bisector[1]);
179

    
180
                        center =
181
                            getIntersection(bisector, pointPerpendicular,
182
                                featureStore);
183

    
184
                        if (center != null) {
185
                            startAngle = getAngle(center, point);
186
                            endAngle = getAngle(center, nextPoint);
187

    
188
                            radius = center.distance(point);
189
                        } else {
190
                            String msg =
191
                                String.format(
192
                                    "Can't get intersection between bisector"
193
                                        + " [(%1$s,%2$s),(%3$s,%4$s)]"
194
                                        + " and perperdicular"
195
                                        + " [(%5$s,%6$s),(%7$s,%8$s)]",
196
                                    bisector[0].getX(), bisector[0].getY(),
197
                                    bisector[1].getX(), bisector[1].getY(),
198
                                    pointPerpendicular[0].getX(),
199
                                    pointPerpendicular[0].getY(),
200
                                    pointPerpendicular[1].getX(),
201
                                    pointPerpendicular[1].getY());
202

    
203
                            throw new DrawServiceException(msg, null);
204
                        }
205

    
206
                    } catch (Exception e) {
207
                        throw new DrawServiceException(e);
208
                    }
209

    
210
                    if (right) {
211
                        if (nextPoint.getX() >= point.getX()) {
212
                            if (m >= antm) {
213
                                angleExt = angleDistance(endAngle, startAngle);
214
                                right = !(nextPoint.getY() >= center.getY());
215
                            } else {
216
                                angleExt = -angleDistance(startAngle, endAngle);
217
                                right = (nextPoint.getY() >= center.getY());
218
                            }
219
                        } else {
220
                            if (m >= antm) {
221
                                angleExt = -angleDistance(startAngle, endAngle);
222
                                right = (nextPoint.getY() >= center.getY());
223
                            } else {
224
                                angleExt = angleDistance(endAngle, startAngle);
225
                                right = !(nextPoint.getY() >= center.getY());
226
                            }
227
                        }
228
                    } else {
229
                        if (nextPoint.getX() < point.getX()) {
230
                            if (m >= antm) {
231
                                angleExt = angleDistance(endAngle, startAngle);
232
                                right = !(nextPoint.getY() >= center.getY());
233
                            } else {
234
                                angleExt = -angleDistance(startAngle, endAngle);
235
                                right = (nextPoint.getY() >= center.getY());
236
                            }
237
                        } else {
238
                            if (m >= antm) {
239
                                angleExt = -angleDistance(startAngle, endAngle);
240
                                right = (nextPoint.getY() >= center.getY());
241
                            } else {
242
                                angleExt = angleDistance(endAngle, startAngle);
243
                                right = !(nextPoint.getY() >= center.getY());
244
                            }
245
                        }
246
                    }
247

    
248
                    Curve arco = null;
249
                    try {
250
                        arco =
251
                            editingProviderServices.createArc(center, radius,
252
                                startAngle, angleExt, featureStore);
253
                        Curve inverseArc =
254
                            (Curve) GeometryLocator.getGeometryManager()
255
                                .create(
256
                                    TYPES.CURVE,
257
                                    editingProviderServices
258
                                        .getSubType(featureStore));
259
                        if (!point.equals(arco.getVertex(0))) {
260
                            for (int j = arco.getNumVertices() - 1; j >= 0; j--) {
261
                                inverseArc.addVertex(arco.getVertex(j));
262
                            }
263
                            arco = inverseArc;
264
                        }
265
                    } catch (Exception e) {
266
                        throw new DrawServiceException(e);
267
                    }
268

    
269
                    antm =
270
                        -(nextPoint.getX() - center.getX())
271
                            / (nextPoint.getY() - center.getY());
272
                    if (antm == Double.POSITIVE_INFINITY) {
273
                        antb = Double.NEGATIVE_INFINITY;
274
                        if (nextPoint.getX() == 0) {
275
                            antb = 0.0;
276
                        }
277
                    } else if (antm == Double.NEGATIVE_INFINITY) {
278
                        antb = Double.POSITIVE_INFINITY;
279
                        if (nextPoint.getX() == 0) {
280
                            antb = 0.0;
281
                        }
282
                    } else {
283
                        antb = nextPoint.getY() - (antm * nextPoint.getX());
284
                    }
285

    
286
                    // Draw geometries.
287
                    if (addGeom) {
288
                        geometries.addGeometry(lineAntPointToPoint);
289
                        geometries.addGeometry(center);
290
                    }
291
                    geometries.addGeometry(arco);
292

    
293
                } else {
294
                    try {
295
                        Curve geometry =
296
                            editingProviderServices.createLine(point.getX(),
297
                                point.getY(), nextPoint.getX(),
298
                                nextPoint.getY(), featureStore);
299
                        geometries.addGeometry(geometry);
300
                    } catch (Exception e) {
301
                        throw new DrawServiceException(e);
302
                    }
303
                    Double[] antLineParams = getLineParams(point, nextPoint);
304
                    antm = antLineParams[0];
305
                    antb = antLineParams[1];
306
                    right = (nextPoint.getX() >= point.getX());
307
                }
308
            }
309
            return geometries;
310
        }
311
        return null;
312
    }
313

    
314
    /**
315
     * @param surface
316
     * @return
317
     */
318
    protected Surface closeSurfaceIfNecessary(Surface surface) {
319
        if (!isClose(surface) && surface != null) {
320
            Point firstp = surface.getVertex(0);
321
            firstp = (Point) firstp.cloneGeometry();
322
            surface.addVertex(firstp);
323
        }
324
        return surface;
325
    }
326

    
327
    public DrawingStatus getDrawingStatus(Point mousePosition)
328
        throws DrawServiceException {
329
        try {
330
            return calculatePolyline(mousePosition);
331
        } catch (Exception e) {
332
            throw new DrawServiceException(e);
333
        }
334
    }
335

    
336
    public void finishAndStore() throws FinishServiceException {
337
        try {
338
            Geometry geometry = finish();
339
            if (geometry != null) {
340
                editingProviderServices.insertGeometryIntoFeatureStore(
341
                    geometry, featureStore);
342
            }
343
        } catch (Exception e) {
344
            throw new FinishServiceException(e);
345
        }
346
    }
347

    
348
    public Geometry finish() throws FinishServiceException {
349
        try {
350
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
351
            GeometryType storeGeomType =
352
                editingProviderServices.getGeomType(featureStore);
353
            Line line = geomManager.createLine(storeGeomType.getSubType());
354
            calculateFinalGeometry(storeGeomType, line);
355

    
356
            if (storeGeomType.isTypeOf(MULTICURVE)) {
357
                MultiCurve multiCurve =
358
                    geomManager.createMultiCurve(storeGeomType.getSubType());
359
                multiCurve.addCurve((Curve) line);
360
                return multiCurve;
361
            } else {
362
                return line;
363
            }
364
        } catch (BaseException e) {
365
            throw new FinishServiceException(e);
366
        }
367
    }
368

    
369
    /**
370
     * Calculate the final geometry reversing the geometries of the
371
     * drawingStatus if needed.
372
     *
373
     * @param geometryType
374
     * @param orientablePrimitive
375
     * @throws DataException
376
     * @throws CreateGeometryException
377
     * @throws VectorEditingException
378
     */
379
    protected void calculateFinalGeometry(GeometryType geometryType,
380
        OrientablePrimitive orientablePrimitive) throws DataException,
381
        CreateGeometryException, VectorEditingException {
382
        DrawingStatus drawingStatus = calculatePolyline(null);
383
        Point vertexAnt = null;
384
        for (Geometry geometry : drawingStatus.getGeometries()) {
385
            if (geometry instanceof Curve) {
386
                Curve curve = (Curve) geometry;
387
                for (int i = 0; i < curve.getNumVertices(); i++) {
388
                    if (vertexAnt == null
389
                        || !vertexAnt.equals(curve.getVertex(i))) {
390
                        orientablePrimitive.addVertex((Point) curve
391
                            .getVertex(i));
392
                        vertexAnt = curve.getVertex(i);
393
                    }
394
                }
395
            }
396
        }
397
    }
398

    
399
    /**
400
     * @param start
401
     * @param end
402
     * @return
403
     * @throws GeometryOperationNotSupportedException
404
     * @throws GeometryOperationException
405
     */
406
    private static double getAngle(Point start, Point end)
407
        throws GeometryOperationNotSupportedException,
408
        GeometryOperationException {
409
        double angle =
410
            Math.acos((end.getX() - start.getX()) / start.distance(end));
411

    
412
        if (start.getY() > end.getY()) {
413
            angle = -angle;
414
        }
415

    
416
        if (angle < 0) {
417
            angle += (2 * Math.PI);
418
        }
419

    
420
        return angle;
421
    }
422

    
423
    /**
424
     * @param bisector
425
     * @param perpendicular
426
     * @param featureStore
427
     * @return
428
     * @throws CreateGeometryException
429
     * @throws DataException
430
     */
431
    private Point getIntersection(Point[] bisector, Point[] perpendicular,
432
        FeatureStore featureStore) throws CreateGeometryException,
433
        DataException {
434
        Point p1 = bisector[0];
435
        Point p2 = bisector[1];
436
        Point p3 = perpendicular[0];
437
        Point p4 = perpendicular[1];
438

    
439
        double m1 = Double.POSITIVE_INFINITY;
440

    
441
        if ((p2.getX() - p1.getX()) != 0) {
442
            m1 = (p2.getY() - p1.getY()) / (p2.getX() - p1.getX());
443
        }
444

    
445
        double m2 = Double.POSITIVE_INFINITY;
446

    
447
        if ((p4.getX() - p3.getX()) != 0) {
448
            m2 = (p4.getY() - p3.getY()) / (p4.getX() - p3.getX());
449
        }
450

    
451
        if ((m1 == Double.POSITIVE_INFINITY)
452
            && (m2 == Double.POSITIVE_INFINITY)) {
453
            return null;
454
        }
455

    
456
        double b1 = p2.getY() - (m1 * p2.getX());
457

    
458
        double b2 = p4.getY() - (m2 * p4.getX());
459

    
460
        if ((m1 != Double.POSITIVE_INFINITY)
461
            && (m2 != Double.POSITIVE_INFINITY)) {
462
            if (m1 == m2) {
463
                return null;
464
            }
465

    
466
            double x = (b2 - b1) / (m1 - m2);
467

    
468
            return editingProviderServices.createPoint(x, (m1 * x) + b1,
469
                featureStore);
470
        } else if (m1 == Double.POSITIVE_INFINITY) {
471
            double x = p1.getX();
472

    
473
            return editingProviderServices.createPoint(x, (m2 * x) + b2,
474
                featureStore);
475
        } else if (m2 == Double.POSITIVE_INFINITY) {
476
            double x = p3.getX();
477

    
478
            return editingProviderServices.createPoint(x, (m1 * x) + b1,
479
                featureStore);
480
        }
481

    
482
        return null;
483
    }
484

    
485
    /**
486
     * @param point
487
     * @param nextPoint
488
     * @return
489
     */
490
    private Double[] getLineParams(Point point, Point nextPoint) {
491
        Double[] lineParams = new Double[2];
492
        double denom = nextPoint.getX() - point.getX();
493
        if (denom != 0) {
494
            lineParams[0] = (nextPoint.getY() - point.getY()) / denom;
495
            lineParams[1] = point.getY() - (lineParams[0] * point.getX());
496
        } else {
497
            if (nextPoint.getY() >= point.getY()) {
498
                lineParams[0] = Double.POSITIVE_INFINITY;
499
                lineParams[1] = Double.NEGATIVE_INFINITY;
500
                if (point.getX() == 0) {
501
                    lineParams[1] = 0.0;
502
                }
503
            } else {
504
                lineParams[0] = Double.NEGATIVE_INFINITY;
505
                lineParams[1] = Double.POSITIVE_INFINITY;
506
                if (point.getX() == 0) {
507
                    lineParams[1] = 0.0;
508
                }
509
            }
510
        }
511
        return lineParams;
512
    }
513

    
514
    /**
515
     * @param p1
516
     * @param p2
517
     * @param featureStore
518
     * @return
519
     * @throws CreateGeometryException
520
     * @throws DataException
521
     */
522
    private Point getMidPoint(Point p1, Point p2, FeatureStore featureStore)
523
        throws CreateGeometryException, DataException {
524
        double x = (p1.getX() + p2.getX()) / 2;
525
        double y = (p1.getY() + p2.getY()) / 2;
526
        return editingProviderServices.createPoint(x, y, featureStore);
527
    }
528

    
529
    public String getName() {
530
        return PolylineEditingProviderFactory.PROVIDER_NAME;
531
    }
532

    
533
    /**
534
     * @param i
535
     * @return
536
     */
537
    private MyPolyLinePoint getNextPoint(int i) {
538
        if (!values.isEmpty() && i < values.size() - 1) {
539
            return values.get(i + 1);
540
        }
541
        return null;
542
    }
543

    
544
    public List<EditingServiceParameter> getParameters() {
545
        List<EditingServiceParameter> list =
546
            new ArrayList<EditingServiceParameter>();
547
        list.add(points);
548
        return list;
549
    }
550

    
551
    /**
552
     * @param m
553
     * @param b
554
     * @param perp
555
     * @param featureStore
556
     * @return
557
     * @throws CreateGeometryException
558
     * @throws DataException
559
     */
560
    private Point[] getPerpendicular(Double m, Double b, Point perp,
561
        FeatureStore featureStore) throws CreateGeometryException,
562
        DataException {
563
        if (m == Double.POSITIVE_INFINITY) {
564
            Point[] res = new Point[2];
565
            res[0] =
566
                editingProviderServices.createPoint(0, perp.getY(),
567
                    featureStore);
568
            res[1] =
569
                editingProviderServices.createPoint(1, perp.getY(),
570
                    featureStore);
571
            return res;
572
        } else if (m == Double.NEGATIVE_INFINITY) {
573
            Point[] res = new Point[2];
574
            res[0] =
575
                editingProviderServices.createPoint(1, perp.getY(),
576
                    featureStore);
577
            res[1] =
578
                editingProviderServices.createPoint(0, perp.getY(),
579
                    featureStore);
580
            return res;
581
        } else {
582
            // Pendiente de la recta perpendicular
583
            Double m1 = -1 / m;
584

    
585
            // b de la funcion de la recta perpendicular
586
            Double b1 = perp.getY() - (m1 * perp.getX());
587

    
588
            // Obtenemos un par de puntos
589
            Point[] res = new Point[2];
590

    
591
            if (Double.isInfinite(m1)) {
592
                res[0] =
593
                    editingProviderServices.createPoint(perp.getX(), 0.0,
594
                        featureStore);
595
                res[1] =
596
                    editingProviderServices.createPoint(perp.getX(),
597
                        perp.getY(), featureStore);
598
            } else {
599
                res[0] =
600
                    editingProviderServices.createPoint(0, 0.0 + b1,
601
                        featureStore);
602
                res[1] =
603
                    editingProviderServices.createPoint(perp.getX(),
604
                        (m1 * perp.getX()) + b1, featureStore);
605
            }
606

    
607
            return res;
608
        }
609
    }
610

    
611
    /**
612
     * @param surface
613
     * @return
614
     */
615
    private boolean isClose(Surface surface) {
616

    
617
        if (surface != null) {
618
            Point firstPoint = surface.getVertex(0);
619
            Point lastPoint = surface.getVertex(surface.getNumVertices() - 1);
620
            if (firstPoint.equals(lastPoint)) {
621
                return true;
622
            }
623
        }
624
        return false;
625
    }
626

    
627
    public EditingServiceParameter next() {
628
        if (values.size() >= 2) {
629
            if (arcMode) {
630
                points
631
                    .setDescription(i18nManager
632
                        .getTranslation("inserts_L_to_change_to_line_mode_double_click_to_finish_indate_new_point"));
633

    
634
            } else {
635
                points
636
                    .setDescription(i18nManager
637
                        .getTranslation("inserts_A_to_change_to_arc_mode_double_click_to_finish_indate_new_point"));
638
            }
639
        }
640
        return points;
641
    }
642

    
643
    public void start() throws StartServiceException {
644
        stop();
645
        values = new ArrayList<MyPolyLinePoint>();
646

    
647
    }
648

    
649
    public void stop() {
650
        if (values != null) {
651
            values.clear();
652
        }
653
        points.setDescription(i18nManager.getTranslation("indicate_new_point"));
654
        arcMode = false;
655
    }
656

    
657
    /**
658
     * @param param
659
     * @param value
660
     */
661
    private void validateAndInsertValue(EditingServiceParameter param,
662
        Object value) throws InvalidEntryException {
663
        if (value instanceof String) {
664
            if (values.size() >= 2) {
665
                if (((String) value).equalsIgnoreCase("A")
666
                    || ((String) value).equalsIgnoreCase("L")) {
667
                    if (((String) value).equalsIgnoreCase("A")) {
668
                        arcMode = true;
669
                    } else if (((String) value).equalsIgnoreCase("L")) {
670
                        arcMode = false;
671
                    }
672
                    if (values.size() > 0) {
673
                        values.get(values.size() - 1).setArcMode(arcMode);
674
                        return;
675
                    }
676
                } else {
677
                    throw new InvalidEntryException(null);
678
                }
679

    
680
            } else {
681
                throw new InvalidEntryException(null);
682
            }
683
        } else if (param == points && value instanceof Point) {
684
            values.add(new MyPolyLinePoint((Point) value, arcMode));
685
        }
686
    }
687

    
688
    public void setValue(Object value) throws InvalidEntryException {
689
        EditingServiceParameter param = next();
690
        validateAndInsertValue(param, value);
691
    }
692

    
693
}