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.polarmatrix / src / main / java / org / gvsig / vectorediting / lib / prov / polarmatrix / PolarMatrixEditingProvider.java @ 2945

History | View | Annotate | Download (24.9 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2015 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.polarmatrix;
26

    
27
import java.awt.geom.AffineTransform;
28
import java.util.ArrayList;
29
import java.util.HashMap;
30
import java.util.LinkedHashMap;
31
import java.util.List;
32
import java.util.Map;
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.EditableFeature;
35
import org.gvsig.fmap.dal.feature.Feature;
36
import org.gvsig.fmap.dal.feature.FeatureSelection;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.geom.Geometry;
39
import org.gvsig.fmap.geom.GeometryLocator;
40
import org.gvsig.fmap.geom.GeometryManager;
41
import org.gvsig.fmap.geom.GeometryUtils;
42
import org.gvsig.fmap.geom.aggregate.Aggregate;
43
import org.gvsig.fmap.geom.aggregate.MultiCurve;
44
import org.gvsig.fmap.geom.aggregate.MultiPoint;
45
import org.gvsig.fmap.geom.aggregate.MultiSurface;
46
import org.gvsig.fmap.geom.exception.CreateGeometryException;
47
import org.gvsig.fmap.geom.operation.GeometryOperationException;
48
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
49
import org.gvsig.fmap.geom.primitive.Arc;
50
import org.gvsig.fmap.geom.primitive.Curve;
51
import org.gvsig.fmap.geom.primitive.Line;
52
import org.gvsig.fmap.geom.primitive.Point;
53
import org.gvsig.fmap.geom.primitive.Surface;
54
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
55
import org.gvsig.symbology.SymbologyLocator;
56
import org.gvsig.symbology.SymbologyManager;
57
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.dataTypes.DataTypes;
60
import org.gvsig.tools.dispose.DisposableIterator;
61
import org.gvsig.tools.dispose.DisposeUtils;
62
import org.gvsig.tools.dynobject.DynObject;
63
import org.gvsig.tools.exception.BaseException;
64
import org.gvsig.tools.i18n.I18nManager;
65
import org.gvsig.tools.service.spi.ProviderServices;
66
import org.gvsig.vectorediting.lib.api.DrawingStatus;
67
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
68
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
69
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
70
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
71
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
72
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
73
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
74
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
75
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
76
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
77
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions;
78
import org.gvsig.vectorediting.lib.spi.EditingProvider;
79
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
80
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
81
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
82
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
83
import org.slf4j.Logger;
84
import org.slf4j.LoggerFactory;
85

    
86
/**
87
 * @author llmarques
88
 *
89
 */
90
public class PolarMatrixEditingProvider extends AbstractEditingProvider
91
    implements EditingProvider {
92

    
93
    private static final Logger LOGGER = LoggerFactory.getLogger(PolarMatrixEditingProvider.class);
94

    
95
    private final FeatureStore featureStore;
96

    
97
    private Map<EditingServiceParameter, Object> values;
98

    
99
    private final EditingServiceParameter selection;
100

    
101
    private final EditingServiceParameter elementsNumber;
102

    
103
    private final EditingServiceParameter centerPoint;
104

    
105
    private final EditingServiceParameter elementAngle;
106

    
107
    private final EditingServiceParameter rotateElements;
108

    
109
    /**
110
     * Default constructor.
111
     *
112
     * @param services
113
     *            available services for this provider
114
     * @param parameters
115
     *            of this provider
116
     */
117
    public PolarMatrixEditingProvider(DynObject parameters,
118
        ProviderServices services) {
119
        super(services);
120

    
121
        this.featureStore =
122
            (FeatureStore) parameters
123
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
124

    
125
        this.selection =
126
            new DefaultEditingServiceParameter("selection", "selection",
127
                TYPE.SELECTION);
128

    
129
        this.elementsNumber =
130
            new DefaultEditingServiceParameter("number_of_total_elements",
131
                "number_of_total_elements", TYPE.VALUE);
132

    
133
        I18nManager i18nManager = ToolsLocator.getI18nManager();
134
        EditingProviderServices editingProviderServices =
135
            (EditingProviderServices) getProviderServices();
136

    
137
        DefaultEditingServiceParameterOptions options = new DefaultEditingServiceParameterOptions()
138
                .add(i18nManager.getTranslation("_yes"), true, i18nManager.getTranslation("_yes"))
139
                .add(i18nManager.getTranslation("_no"), false, i18nManager.getTranslation("_no"));
140
        
141
        String consoleMsg
142
                = editingProviderServices.makeConsoleMessage(
143
                        "rotate_elements", options);
144

    
145
        this.rotateElements =
146
            new DefaultEditingServiceParameter(
147
                    "rotate_elements",
148
                    consoleMsg,
149
                    options,
150
                    false,
151
                    TYPE.OPTION).setDataType(DataTypes.BOOLEAN);
152

    
153
        this.centerPoint =
154
            new DefaultEditingServiceParameter("center", "center",
155
                TYPE.POSITION);
156

    
157
        this.elementAngle =
158
            new DefaultEditingServiceParameter("angle_between_elements",
159
                "angle_between_elements", EditingServiceParameter.TYPE.VALUE,
160
                TYPE.POSITION);
161
    }
162

    
163
    @Override
164
    public EditingServiceParameter next() {
165
        if (values.get(selection) == null) {
166
            return selection;
167
        } else if (values.get(elementsNumber) == null) {
168
            return elementsNumber;
169
        } else if (values.get(rotateElements) == null) {
170
            return rotateElements;
171
        } else if (values.get(centerPoint) == null) {
172
            return centerPoint;
173
        } else if (values.get(elementAngle) == null) {
174
            return elementAngle;
175
        }
176
        return null;
177
    }
178

    
179
    @Override
180
    public DrawingStatus getDrawingStatus(Point mousePosition)
181
        throws DrawServiceException {
182

    
183
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
184
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
185
        EditingProviderServices editingProviderServices =
186
            (EditingProviderServices) getProviderServices();
187

    
188
        FeatureSelection featureSelection =
189
            (FeatureSelection) values.get(selection);
190
        Integer elementsNumberValue = (Integer) values.get(elementsNumber);
191
        Boolean rotateElementsValue = (Boolean) values.get(rotateElements);
192
        Point centerPointValue = (Point) values.get(centerPoint);
193

    
194
        if (featureSelection != null && elementsNumberValue != null
195
            && rotateElementsValue != null && centerPointValue != null) {
196

    
197
            Double angle = (Double) values.get(elementAngle);
198
            if (angle == null) {
199
                angle = GeometryUtils.calculateAngle(centerPointValue, mousePosition);
200
                
201
                Integer elements = (Integer) values.get(elementsNumber);
202
                if(elements != null){
203
                    if(angle > 2*Math.PI/(elements-1)){
204
                        angle = 2*Math.PI/(elements-1);
205
                    }
206
                }
207

    
208
                
209
//                try {
210
//                    angle =
211
//                        editingProviderServices.getAngle(centerPointValue,
212
//                            mousePosition);
213
//                } catch (BaseException e) {
214
//                    throw new DrawServiceException(e);
215
//                }
216
            }
217

    
218
            // Creation of symbology
219
            EditingProviderManager editingProviderManager =
220
                EditingProviderLocator.getProviderManager();
221
            ISymbol auxiliaryPointSymbolEditing =
222
                editingProviderManager
223
                    .getSymbol("auxiliary-point-symbol-editing");
224
            ISymbol ruleAxisSymbol =
225
                editingProviderManager.getSymbol("rule-axis-symbol");
226
            ISymbol auxiliaryLineSymbolEditing =
227
                editingProviderManager
228
                    .getSymbol("auxiliary-line-symbol-editing");
229

    
230
            try {
231

    
232
                LOGGER.info("centerPoint: "+centerPointValue.toString());
233
                drawingStatus.addStatus(centerPointValue,
234
                    auxiliaryPointSymbolEditing, "");
235

    
236
                // Grade indicator creation
237
                int subtype = centerPointValue.getGeometryType().getSubType();
238
                double textDistance =
239
                    3 * centerPointValue.distance(mousePosition) / 4;
240
                Geometry pointText =
241
                    geometryManager.createPoint(
242
                        centerPointValue.getX() + textDistance
243
                            * Math.cos(angle / 2),
244
                        centerPointValue.getY() + textDistance
245
                            * Math.sin(angle / 2), subtype);
246
                LOGGER.info("pointText: "+pointText.toString());
247
                drawingStatus.addStatus(pointText, getTextSymbol(),
248
                    degToDms(Math.toDegrees(angle)));
249

    
250
                // Horizontal line of angle indicator creation
251
                Line horizontalLine = geometryManager.createLine(subtype);
252
                horizontalLine.setPoints(centerPointValue, geometryManager
253
                    .createPoint(
254
                        centerPointValue.getX()
255
                            + centerPointValue.distance(mousePosition),
256
                        centerPointValue.getY(), subtype));
257
                LOGGER.info("horizontalLine: "+horizontalLine.toString());
258
                drawingStatus.addStatus(horizontalLine, ruleAxisSymbol, "");
259

    
260
                // Vertical line of angle indicator creation
261
                Line verticalLine = geometryManager.createLine(subtype);
262
                verticalLine.setPoints(centerPointValue, mousePosition);
263
                LOGGER.info("verticalLine: "+verticalLine.toString());
264
                drawingStatus.addStatus(verticalLine, ruleAxisSymbol, "");
265

    
266
                // Arc angle indicator creation
267
//                Double ext = (2 * Math.PI) - angle;
268
//                Arc arc =
269
//                    editingProviderServices.createArc(centerPointValue,
270
//                        centerPointValue.distance(mousePosition) / 2, 0, ext,
271
//                        subtype);
272
                Arc arc = GeometryUtils.createArc(
273
                        centerPointValue, 
274
                        centerPointValue.distance(mousePosition) / 2, 
275
                        0, 
276
                        angle, 
277
                        subtype
278
                );
279
                    
280
                LOGGER.info("arc: "+arc.toString());
281
                drawingStatus.addStatus(arc, auxiliaryLineSymbolEditing, "");
282

    
283
            } catch (BaseException e) {
284
                throw new DrawServiceException(e);
285
            }
286

    
287
            DisposableIterator it = null;
288
            try {
289
                it = featureSelection.fastIterator();
290
                while (it.hasNext()) {
291
                    Feature feature = (Feature) it.next();
292
                    ISymbol previewSymbol = this.getPreviewSymbol(feature);
293
                    
294
                    Geometry geometry = feature.getDefaultGeometry();
295
                    Geometry[] matrix =
296
                        createPolarMatrix(geometry, elementsNumberValue,
297
                            rotateElementsValue, centerPointValue, angle);
298

    
299
                    for (Geometry element : matrix) {
300
                        LOGGER.info("element: "+element.toString());
301
                        ISymbol symbol = getSymbol(element);
302
                        if (element instanceof Aggregate) {
303
                            int primitivesNumber = ((Aggregate) element).getPrimitivesNumber();
304
                            for (int j = 0; j < primitivesNumber; j++) {
305
                                LOGGER.info("primitive: "+j);
306
                                drawingStatus.addStatus(((Aggregate) element).getPrimitiveAt(j), symbol, "");
307
                                drawingStatus.addStatus(((Aggregate) element).getPrimitiveAt(j), previewSymbol, "");
308
                            }
309
                        } else {
310
                            drawingStatus.addStatus(element, symbol, "");
311
                            drawingStatus.addStatus(element, previewSymbol, "");
312
                        }
313
                    }
314
                }
315
            } catch (BaseException e) {
316
                throw new DrawServiceException(e);
317
            } finally {
318
                DisposeUtils.disposeQuietly(it);
319
            }
320
        }
321
        return drawingStatus;
322
    }
323

    
324
    private ISymbol getSymbol(Geometry geometry) {
325

    
326
        EditingProviderManager editingProviderManager =
327
            EditingProviderLocator.getProviderManager();
328
        ISymbol auxiliaryPointSymbolEditing =
329
            editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
330
        ISymbol lineSymbolEditing =
331
            editingProviderManager.getSymbol("line-symbol-editing");
332
        ISymbol polygonSymbolEditing =
333
            editingProviderManager.getSymbol("polygon-symbol-editing");
334

    
335
        if (geometry instanceof Curve || geometry instanceof MultiCurve) {
336
            return lineSymbolEditing;
337
        } else if (geometry instanceof Surface
338
            || geometry instanceof MultiSurface) {
339
            return polygonSymbolEditing;
340
        } else if (geometry instanceof Point || geometry instanceof MultiPoint) {
341
            return auxiliaryPointSymbolEditing;
342
        }
343
        return null;
344
    }
345

    
346
    private ISimpleTextSymbol getTextSymbol() {
347
        SymbologyManager symbologyManager =
348
            SymbologyLocator.getSymbologyManager();
349
        ISimpleTextSymbol textSymbol =
350
            symbologyManager.createSimpleTextSymbol();
351
        textSymbol.setFontSize(10);
352
        return textSymbol;
353
    }
354

    
355
    private String degToDms(double deg) {
356
        int d = (int) Math.floor(deg);
357
        double minfloat = (deg - d) * 60;
358
        int m = (int) Math.floor(minfloat);
359
        double secfloat = (minfloat - m) * 60;
360
        int s = (int) Math.round(secfloat);
361
        // After rounding, the seconds might become 60. These two
362
        // if-tests are not necessary if no rounding is done.
363
        if (s == 60) {
364
            m++;
365
            s = 0;
366
        }
367
        if (m == 60) {
368
            d++;
369
            m = 0;
370
        }
371
        return ("" + d + "\u00B0" + m + "\u2032" + s + "\u2033");
372
    }
373

    
374
    private Geometry[] createPolarMatrix(Geometry geometry,
375
        Integer elementsNumberValue, Boolean rotateElementsValue,
376
        Point centerPointValue, Double angle)
377
        throws GeometryOperationNotSupportedException,
378
        GeometryOperationException, CreateGeometryException {
379

    
380
        Geometry[] geometryMatrix = new Geometry[elementsNumberValue-1];
381

    
382
        for (int i = 0; i < elementsNumberValue-1; i++) {
383

    
384
            AffineTransform at = new AffineTransform();
385
            if (rotateElementsValue) {
386
                at = getRotateAffineTransform(centerPointValue, angle * (i+1));
387
            } else {
388
                at = getRotateAffineTransform(centerPointValue, angle * (i+1));
389
                
390
                double centerX = geometry.getEnvelope().getCenter(0);
391
                double centerY = geometry.getEnvelope().getCenter(1);
392
                GeometryManager geometryManager =
393
                    GeometryLocator.getGeometryManager();
394
                Point geometryCenter =
395
                    geometryManager.createPoint(centerX, centerY, GEOM2D);
396
                
397
                Point geometryCenterCloned = (Point) geometryCenter.cloneGeometry();
398
                geometryCenterCloned.transform(at);
399
                at = getMoveAffineTransform(geometryCenter, geometryCenterCloned);
400
            }
401

    
402
            Geometry clonedGeometry = geometry.cloneGeometry();
403
            clonedGeometry.transform(at);
404
            geometryMatrix[i] = clonedGeometry;
405
        }
406

    
407
        return geometryMatrix;
408
    }
409

    
410
    @Override
411
    public void stop() throws StopServiceException {
412
        values.clear();
413
    }
414

    
415
    @Override
416
    public List<EditingServiceParameter> getParameters() {
417
        List<EditingServiceParameter> parameters =
418
            new ArrayList<>();
419
        parameters.add(selection);
420
        parameters.add(elementsNumber);
421
        parameters.add(rotateElements);
422
        parameters.add(centerPoint);
423
        parameters.add(elementAngle);
424
        return parameters;
425
    }
426

    
427
    @Override
428
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
429
        validateAndInsertValue(parameter, value);
430
    }
431

    
432
    @Override
433
    public void setValue(Object value) throws InvalidEntryException {
434
        EditingServiceParameter parameter = next();
435
        validateAndInsertValue(parameter, value);
436
    }
437

    
438
    private void validateAndInsertValue(EditingServiceParameter parameter,
439
        Object value) throws InvalidEntryException {
440

    
441
        boolean insertedValue = false;
442

    
443
        if (parameter.equals(selection) && value instanceof FeatureSelection) {
444
            FeatureSelection featureSelection = (FeatureSelection) value;
445

    
446
            if (featureSelection.getSelectedCount() > 0) {
447
                values.put(parameter, featureSelection);
448
                insertedValue = true;
449
            }
450

    
451
        } else if (parameter.equals(elementsNumber) && value instanceof Number) {
452

    
453
                int number = ((Number) value).intValue();
454
                
455
                Number angle = ((Number) values.get(elementAngle));
456
                if(angle != null){
457
                    double radians = Math.toRadians(angle.doubleValue());
458
                    if(radians > 2*Math.PI/(number-1)){
459
                        throw new InvalidEntryException(null);
460
                    }
461
                }
462
                
463
                values.put(parameter, number);
464
                insertedValue = true;
465

    
466
        } else if (parameter.equals(rotateElements)) {
467

    
468
            values.put(parameter, parameter.getOptions2().getValue(value, parameter.getDefaultValue()));
469
            insertedValue = true;
470

    
471
        } else if (parameter.equals(centerPoint) && value instanceof Point) {
472

    
473
            values.put(centerPoint, value);
474
            insertedValue = true;
475

    
476
        } else if (parameter.equals(elementAngle)) {
477

    
478
            if (value instanceof Double) {
479
                LOGGER.info("value Double:"+value.toString());
480

    
481
                Integer elements = (Integer) values.get(elementsNumber);
482
                double radians = Math.toRadians((Double) value);
483
                if(elements != null){
484
                    if(radians > 2*Math.PI/(elements-1)){
485
                        throw new InvalidEntryException(null);
486
                    }
487
                }
488
                values.put(elementAngle, radians);
489
                insertedValue = true;
490

    
491
            } else if (value instanceof Point) {
492
                LOGGER.info("value Point:"+value.toString());
493
                Point centerPointValue = (Point) values.get(centerPoint);
494
                Point valuePoint = (Point) value;
495
                    double angle = GeometryUtils.calculateAngle(centerPointValue, valuePoint);
496
                    Integer elements = (Integer) values.get(elementsNumber);
497
                    if(elements != null){
498
                        if(angle > 2*Math.PI/(elements-1)){
499
                            throw new InvalidEntryException(null);
500
                        }
501
                    }
502
                    values.put(elementAngle, angle);
503
                    insertedValue = true;
504
//                try {
505
//                    double angle = 
506
//                        editingProviderServices.getAngle(centerPointValue,
507
//                            valuePoint);
508
//                } catch (BaseException e) {
509
//                    throw new InvalidEntryException(e);
510
//                }
511
            }
512
        }
513

    
514
        if (!insertedValue) {
515
            throw new InvalidEntryException(null);
516
        }
517
    }
518

    
519
    @Override
520
    public Geometry finish() throws FinishServiceException {
521
        return null;
522
    }
523

    
524
    @Override
525
    public void finishAndStore() throws FinishServiceException {
526

    
527
        final EditingProviderServices editingProviderServices =
528
            (EditingProviderServices) getProviderServices();
529

    
530
        FeatureSelection featureSelection =
531
            (FeatureSelection) values.get(selection);
532
        final Integer elementsNumberValue =
533
            (Integer) values.get(elementsNumber);
534
        final Boolean rotateElementsValue =
535
            (Boolean) values.get(rotateElements);
536
        final Point centerPointValue = (Point) values.get(centerPoint);
537
        final Double elementAngleValue = (Double) values.get(elementAngle);
538

    
539
        if (featureSelection != null && elementsNumberValue != null
540
            && rotateElementsValue != null && centerPointValue != null
541
            && elementAngleValue != null) {
542

    
543
            try {
544
                featureSelection.accept((Object obj) -> {
545
                    Feature feature = (Feature) obj;
546
                    Geometry geometry = feature.getDefaultGeometry();
547
                    LOGGER.info("elementAngleValue:"+elementAngleValue);
548
                    
549
                    Geometry[] matrix =
550
                            createPolarMatrix(geometry, elementsNumberValue,
551
                                    rotateElementsValue, centerPointValue,
552
                                    elementAngleValue);
553
                    
554
                    for (Geometry matrix1 : matrix) {
555
                        EditableFeature eFeature =
556
                                editingProviderServices
557
                                        .getFeatureCopyWithoutUniqueIndex(featureStore,
558
                                                feature);
559
                        eFeature.setDefaultGeometry(matrix1);
560
                        editingProviderServices
561
                                .insertFeatureIntoFeatureStore(eFeature,
562
                                        featureStore);
563
                    }
564
                });
565
            } catch (BaseException e) {
566
                throw new FinishServiceException(e);
567
            }
568
        }
569
    }
570

    
571
    @Override
572
    public void start() throws StartServiceException, InvalidEntryException {
573
        values = new HashMap<>();
574
        FeatureSelection selected = null;
575
        if (featureStore != null && values.get(selection) == null) {
576
            try {
577
                selected = featureStore.getFeatureSelection();
578
            } catch (DataException e) {
579
                throw new StartServiceException(e);
580
            }
581
            if (selected.getSelectedCount() > 0) {
582
                try {
583
                    setValue(selected);
584
                } catch (InvalidEntryException e) {
585
                    throw new InvalidEntryException(e);
586
                }
587
            }
588
        }
589
    }
590

    
591
    @Override
592
    public String getName() {
593
        return PolarMatrixEditingProviderFactory.PROVIDER_NAME;
594
    }
595

    
596
    private AffineTransform getMoveAffineTransform(Point p1, Point p2)
597
        throws GeometryOperationNotSupportedException,
598
        GeometryOperationException {
599

    
600
        AffineTransform translate =
601
            AffineTransform.getTranslateInstance(p2.getX() - p1.getX(),
602
                p2.getY() - p1.getY());
603

    
604
        return translate;
605
    }
606

    
607
    private AffineTransform getRotateAffineTransform(Point axisP1, Double angle)
608
        throws GeometryOperationNotSupportedException,
609
        GeometryOperationException {
610

    
611
        AffineTransform translate =
612
            AffineTransform
613
                .getTranslateInstance(-axisP1.getX(), -axisP1.getY());
614

    
615
        AffineTransform rotate = AffineTransform.getRotateInstance(angle);
616

    
617
        AffineTransform inverseTranslate =
618
            AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY());
619
        AffineTransform at = new AffineTransform(translate);
620

    
621
        at.preConcatenate(rotate);
622
        at.preConcatenate(inverseTranslate);
623
        return at;
624
    }
625
    @Override
626
    public Object getValue(EditingServiceParameter parameter) {
627
        return values!=null?values.get(parameter):null;
628
    }
629
}