Revision 2109 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.impl/src/main/java/org/gvsig/vectorediting/lib/impl/DefaultEditingProviderServices.java

View differences:

DefaultEditingProviderServices.java
23 23
 */
24 24
package org.gvsig.vectorediting.lib.impl;
25 25

  
26
import java.awt.geom.Point2D;
27 26
import java.util.Iterator;
28 27
import java.util.List;
29 28
import java.util.Map;
30
import java.util.Objects;
31 29
import org.gvsig.euclidean.EuclideanLine2D;
32
import org.gvsig.euclidean.EuclideanManager;
30
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
31
import org.gvsig.fmap.dal.DALLocator;
32
import org.gvsig.fmap.dal.DataManager;
33 33

  
34 34
import org.gvsig.fmap.dal.EditingNotification;
35 35
import org.gvsig.fmap.dal.EditingNotificationManager;
36 36
import org.gvsig.fmap.dal.exception.DataException;
37
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
37 38
import org.gvsig.fmap.dal.feature.EditableFeature;
38 39
import org.gvsig.fmap.dal.feature.Feature;
39 40
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
......
43 44
import org.gvsig.fmap.dal.swing.DALSwingLocator;
44 45
import org.gvsig.fmap.geom.Geometry;
45 46
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
46
import org.gvsig.fmap.geom.Geometry.TYPES;
47 47
import org.gvsig.fmap.geom.GeometryLocator;
48 48
import org.gvsig.fmap.geom.GeometryManager;
49
import org.gvsig.fmap.geom.GeometryUtils;
49 50
import org.gvsig.fmap.geom.exception.CreateGeometryException;
50 51
import org.gvsig.fmap.geom.operation.GeometryOperationException;
51 52
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
......
56 57
import org.gvsig.fmap.geom.primitive.Point;
57 58
import org.gvsig.fmap.geom.primitive.Spline;
58 59
import org.gvsig.fmap.geom.type.GeometryType;
60
import org.gvsig.fmap.mapcontext.MapContext;
59 61
import org.gvsig.fmap.mapcontext.layers.CancelationException;
62
import org.gvsig.fmap.mapcontext.layers.FLayer;
63
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
60 64
import org.gvsig.tools.ToolsLocator;
61 65
import org.gvsig.tools.exception.BaseException;
62 66
import org.gvsig.tools.i18n.I18nManager;
63 67
import org.gvsig.tools.service.spi.AbstractProviderServices;
64
import org.gvsig.tools.util.ToolsUtilLocator;
65 68
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
66 69
import org.slf4j.Logger;
67 70
import org.slf4j.LoggerFactory;
......
69 72
public class DefaultEditingProviderServices extends AbstractProviderServices
70 73
        implements EditingProviderServices {
71 74

  
72
    private static final Logger logger = LoggerFactory
75
    private static final Logger LOGGER = LoggerFactory
73 76
            .getLogger(DefaultEditingProviderServices.class);
74 77

  
75 78
    @Override
......
123 126
            String msg
124 127
                    = String.format("Can't insert %1$s into %2$s",
125 128
                            eFeature.toString(), featureStore.getName());
126
            logger.info(msg, e);
129
            LOGGER.info(msg, e);
127 130
        }
128 131
    }
129 132

  
......
177 180
            String msg
178 181
                    = String.format("Can't insert %1$s into %2$s",
179 182
                            eFeature.toString(), featureStore.getName());
180
            logger.info(msg, e);
183
            LOGGER.info(msg, e);
181 184
        }
182 185
    }
183 186

  
......
214 217
                    featureStore, feature);
215 218

  
216 219
        } catch (Exception e) {
217
            logger.warn(e.getMessage(), e);
220
            LOGGER.warn(e.getMessage(), e);
218 221
        }
219 222
    }
220 223

  
......
251 254
                    featureStore, feature);
252 255

  
253 256
        } catch (Exception e) {
254
            logger.warn(e.getMessage(), e);
257
            LOGGER.warn(e.getMessage(), e);
255 258
        }
256 259
    }
257 260

  
......
306 309
            String msg
307 310
                    = String.format("Can't update %1$s in %2$s", eFeature.toString(),
308 311
                            featureStore.getName());
309
            logger.info(msg, e);
312
            LOGGER.info(msg, e);
310 313
        }
311 314
    }
312 315

  
313 316
    @Override
314 317
    public Circle createCircle(Point center, double radius, int subtype)
315 318
            throws CreateGeometryException {
316
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
317
        Circle circle = (Circle) geomManager.create(TYPES.CIRCLE, subtype);
318
        circle.setPoints(center, radius);
319

  
320
        return circle;
319
        return GeometryUtils.createCircle(center, radius, subtype);
321 320
    }
322 321

  
323 322
    @Override
324 323
    public Circle createCircle(Point firstPoint, Point secondPoint,
325 324
            Point thridPoint, int subtype) throws CreateGeometryException {
326
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
327
        Circle circle = (Circle) geomManager.create(TYPES.CIRCLE, subtype);
328
        circle.setPoints(firstPoint, secondPoint, thridPoint);
329

  
330
        return circle;
325
        return GeometryUtils.createCircle(firstPoint, secondPoint, thridPoint, subtype);
331 326
    }
332 327

  
333 328
    @Override
334 329
    public Arc createArc(Point center, double radius, double startAngle,
335 330
            double angleExt, int subtype) throws CreateGeometryException {
336
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
337
        Arc arc = (Arc) geomManager.create(TYPES.ARC, subtype);
338
        arc.setPoints(center, radius, startAngle, angleExt);
339
        return arc;
331
        return GeometryUtils.createArc(center, radius, startAngle, angleExt, subtype);
340 332
    }
341 333

  
342 334
    @Override
343 335
    public Ellipse createFilledEllipse(Point firstPointAxisA,
344 336
            Point secondPointAxisA, double halfLengthAxisB, int subtype)
345 337
            throws CreateGeometryException {
346
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
347
        Ellipse ellipse = (Ellipse) geomManager.create(TYPES.ELLIPSE, subtype);
348
        ellipse.setPoints(firstPointAxisA, secondPointAxisA, halfLengthAxisB);
349
        return ellipse;
338
        return GeometryUtils.createFilledEllipse(firstPointAxisA, secondPointAxisA, halfLengthAxisB, subtype);
350 339
    }
351 340

  
352 341
    @Override
353 342
    public Arc createArc(Point start, Point middle, Point end, int subtype)
354 343
            throws BaseException {
355

  
356
        Arc arc = (Arc) GeometryLocator.getGeometryManager().create(Geometry.TYPES.ARC, subtype);
357
        arc.setPoints(start, middle, end);
358
        return arc;
359

  
344
        return GeometryUtils.createArc(start, middle, end, subtype);
360 345
    }
361 346

  
362 347
    @Override
363 348
    public Point createPoint(double x, double y, int subtype)
364 349
            throws CreateGeometryException {
365 350
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
366
        Point point = (Point) geomManager.create(TYPES.POINT, subtype);
367
        point.setX(x);
368
        point.setY(y);
369
        return point;
351
        return geomManager.createPoint(x, y, subtype);
370 352
    }
371 353

  
372 354
    @Override
373 355
    public Line createLine(double x1, double y1, double x2, double y2,
374 356
            int subtype) throws CreateGeometryException {
375
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
376
        Line line = (Line) geomManager.create(TYPES.CURVE, subtype);
377
        line.addVertex(x1, y1);
378
        line.addVertex(x2, y2);
379
        return line;
357
        return GeometryUtils.createLine(x1, y1, x2, y2, subtype);
380 358
    }
381 359

  
382 360
    @Override
......
426 404
    @Override
427 405
    public Point getCenter(Point a, Point b, Point c, int subtype)
428 406
            throws CreateGeometryException {
429

  
430
        Point midPointAC = getMidPoint(a, c, subtype);
431
        Double[] lineParamsAC = getLineParams(a, c);
432
        Point[] bisectorAC
433
                = getPerpendicular(lineParamsAC[0], lineParamsAC[1], midPointAC,
434
                        subtype);
435

  
436
        Point midPointBC = getMidPoint(b, c, subtype);
437
        Double[] lineParamsBC = getLineParams(c, b);
438
        Point[] bisectorBC
439
                = getPerpendicular(lineParamsBC[0], lineParamsBC[1], midPointBC,
440
                        subtype);
441

  
442
        return getIntersection(bisectorAC, bisectorBC, subtype);
407
        return GeometryUtils.getCenter(a, b, c, subtype);
443 408
    }
444 409

  
445 410
    @Override
446 411
    public Point getMidPoint(Point a, Point b, int subtype)
447 412
            throws CreateGeometryException {
448
        double x = (a.getX() + b.getX()) / 2;
449
        double y = (a.getY() + b.getY()) / 2;
450
        return createPoint(x, y, subtype);
413
        return GeometryUtils.getMidPoint(a, b, subtype);
451 414
    }
452 415

  
453 416
    @Override
......
589 552
    @Override
590 553
    public Line createLine(Point p1, Point p2, int subtype)
591 554
            throws CreateGeometryException {
592
        return this.createLine(p1.getX(), p1.getY(), p2.getX(), p2.getY(),
593
                subtype);
555
        return GeometryUtils.createLine(p1, p2, subtype);
594 556
    }
595 557

  
596 558
    @Override
597 559
    public Spline createSpline(List<Point> points, int subtype)
598 560
            throws CreateGeometryException {
599
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
600
        Spline spline = (Spline) geomManager.create(TYPES.SPLINE, subtype);
601

  
602
        points.forEach((point) -> {
603
            spline.addVertex(point);
604
        });
605

  
606
        return spline;
561
        return GeometryUtils.createSpline(points, subtype);
607 562
    }
608 563

  
609 564
    @Override
......
632 587
    @Override
633 588
    public Arc createEllipse(Point firstPointAxisA, Point secondPointAxisA,
634 589
            double halfLengthAxisB, int subtype) throws CreateGeometryException {
635
        try {
636
            double lengthAxisA = secondPointAxisA.distance(firstPointAxisA);
637

  
638
            Point origen = this.createPoint(0, 0, subtype);
639
            Arc ellipse = this.createArc(
640
                    origen,
641
                    lengthAxisA / 2,
642
                    0,
643
                    2 * Math.PI,
644
                    subtype);
645

  
646
            ellipse.scale(origen, 1, halfLengthAxisB * 2 / lengthAxisA);
647
            ellipse.rotate(this.getAngle(firstPointAxisA, secondPointAxisA), 0, 0);
648
            Point centerOfEllipse = this.getMidPoint(firstPointAxisA, secondPointAxisA, subtype);
649
            ellipse.move(centerOfEllipse.getX(), centerOfEllipse.getY());
650
            return ellipse;
651
        } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
652
            throw new CreateGeometryException(Geometry.TYPES.ARC, subtype, e);
653
        }
590
        return GeometryUtils.createEllipse(firstPointAxisA, secondPointAxisA, halfLengthAxisB, subtype);
654 591
    }
655 592

  
656 593
    @Override
657 594
    public Circle createCircle(Point firstPoint, Point secondPoint, Point thirdPoint, Point fourthPoint, Point fifthPoint, int subtype) throws CreateGeometryException {
658
        EuclideanManager euclideanManager = ToolsUtilLocator.getEuclideanManager();
659
        EuclideanLine2D line1 = euclideanManager.createLine2D(firstPoint.getX(), firstPoint.getY(), secondPoint.getX(), secondPoint.getY());
660
        EuclideanLine2D line2 = euclideanManager.createLine2D(thirdPoint.getX(), thirdPoint.getY(), fourthPoint.getX(), fourthPoint.getY());
661
        return createCircle(line1, line2, fifthPoint, subtype);
595
        return GeometryUtils.createCircle(firstPoint, secondPoint, thirdPoint, fourthPoint, fifthPoint, subtype);
662 596
    }
663 597

  
664 598
    @Override
665 599
    public Circle createCircle(EuclideanLine2D line1, EuclideanLine2D line2, Point point, int subtype) throws CreateGeometryException {
600
        return GeometryUtils.createCircle(line1, line2, point, subtype);
601
    }
666 602

  
667
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
668
        EuclideanManager euclideanManager = ToolsUtilLocator.getEuclideanManager();
669
        
603
    @Override
604
    public Circle createCircle(Geometry geometry1, Geometry geometry2, double radius, Point firstPoint, Point secondPoint, int subtype) throws CreateGeometryException {
605
        return GeometryUtils.createCircle(geometry1, geometry2, radius, firstPoint, secondPoint, subtype);
606
    }
607

  
608
    @Override
609
    public Geometry getGeometry(Point point, FeatureStore store, MapContext mapContext) {
610
        Geometry geometry = null;
670 611
        try {
671
            EuclideanLine2D perpendicular;
672
            EuclideanLine2D bisector;
673
            if (line1.isParallel(line2)) {
612
            double tolerance = mapContext.getViewPort().toMapDistance(mapContext.getLayers().getDefaultTolerance());
613
            Geometry buffer = point.buffer(tolerance);
614
            
615
            DataManager dataManager = DALLocator.getDataManager();
616
            DALExpressionBuilder dalBuilder = dataManager.createDALExpressionBuilder();
617
            GeometryExpressionBuilder builder = dalBuilder.expression();
618
            String filter = builder.ST_Intersects(builder.geometry(buffer, mapContext.getProjection()), dalBuilder.geometry()).toString();
619
            String sortBy = builder.ST_Distance(builder.geometry(buffer), dalBuilder.geometry()).toString();
674 620

  
675
                if (Objects.equals(line1.getYIntercept(), line2.getYIntercept())
676
                        || (Objects.equals(Math.abs(line1.getYIntercept()), 0.0)
677
                        && Objects.equals(Math.abs(line2.getYIntercept()), 0.0))) { //Same lines
678
                    perpendicular = line1.getPerpendicular(point.getX(), point.getY());
679
                    Point2D intersection = line1.getIntersection(perpendicular);
680
                    return createCircle(point, point.distance(geomManager.createPoint(intersection.getX(), intersection.getY(), subtype)), subtype);
681
                } else if (Double.isInfinite(line1.getSlope())) { //Parallel and vertical lines
682
                    Point center = createPoint(-(line2.getC() + line1.getC()) / 2.0, point.getY(), subtype);
683
                    double radius = line1.getDistance(center.getX(), center.getY());
684
                    return createCircle(center, radius, subtype);
685
                } else { //Parallel lines
686
                    bisector = euclideanManager.createLine2D(line1.getA(), line1.getB(), (line2.getC()+line1.getC())/2);
687
                }
621
            Feature f;
622
                f = store.findFirst(filter, sortBy, true);
623
            if(f!=null){
624
                geometry = f.getDefaultGeometry();
625
            }
626
         
627
        } catch (Exception ex) {
628
            LOGGER.warn("Can't get geometry on point ("+point.getX()+","+point.getY(), ex);
629
        }
630
        
631
        return geometry;
632
    }
688 633

  
689
            } else {
690

  
691
                EuclideanLine2D[] bisectors = line1.getBisectors(line2);
692

  
693
                double distance1 = bisectors[0].getDistance(point.getX(), point.getY());
694
                double distance2 = bisectors[1].getDistance(point.getX(), point.getY());
695

  
696
                bisector = bisectors[0];
697
                if (distance1 > distance2) {
698
                    bisector = bisectors[1];
634
    @Override
635
    public Geometry getGeometryOfVisibleLayers(Point point, FeatureStore store, MapContext mapContext) {
636
        
637
        // Search in the store itself
638
        Geometry geometry = this.getGeometry(point, store, mapContext);
639
        // Search in the store for the layers that are in edit
640
        if(geometry == null){
641
            for( Iterator<FLayer> iterator = mapContext.getLayers().deepiterator(); iterator.hasNext(); ) {
642
                FLayer layer = iterator.next();
643
                if(layer instanceof FLyrVect){
644
                    FLyrVect vectLayer = (FLyrVect) layer;
645
                    if(vectLayer.getFeatureStore()!=store && vectLayer.isEditing()){
646
                        geometry  = this.getGeometry(point, vectLayer.getFeatureStore(), mapContext);
647
                        if(geometry != null){
648
                            break;
649
                        }
650
                    }
699 651
                }
700 652
            }
701

  
702
            if (Double.isInfinite(bisector.getSlope())) {
703
                Point2D intersection = line1.getIntersection(line2);
704
                Point center = createPoint(intersection.getX(), point.getY(), subtype);
705
                Double radius = line1.getDistance(center.getX(), center.getY());
706
                return createCircle(center, radius, subtype);
707
            } else if (bisector.getSlope() == 0.0) {
708
                if (line1.isParallel(line2)) { //Objects.equals(m0, m1)) { //Same slope
709
                    Point center = createPoint(point.getX(), bisector.getYIntercept(), subtype);
710
                    Double radius = line1.getDistance(center.getX(), center.getY());
711
                    return createCircle(center, radius, subtype);
712
                } else {
713
                    Point2D intersection = line1.getIntersection(line2);
714
                    Point center = createPoint(point.getX(), intersection.getY(), subtype);
715
                    Double radius = line1.getDistance(center.getX(), center.getY());
716
                    return createCircle(center, radius, subtype);
653
        }
654
        // Search in the store for the active layers
655
        if(geometry == null){
656
            FLayer[] activeLayers = mapContext.getLayers().getActives();
657
            for (FLayer activeLayer : activeLayers) {
658
                if(activeLayer instanceof FLyrVect){
659
                    FLyrVect activeVectLayer = (FLyrVect) activeLayer;
660
                    if(activeVectLayer.getFeatureStore()!=store && !activeVectLayer.isEditing()){
661
                        geometry  = this.getGeometry(point, activeVectLayer.getFeatureStore(), mapContext);
662
                        if(geometry != null){
663
                            break;
664
                        }
665
                    }
717 666
                }
718 667
            }
719

  
720
            perpendicular = bisector.getPerpendicular(point.getX(), point.getY());
721
            Point2D intersection = bisector.getIntersection(perpendicular);
722
            Double radius = line1.getDistance(intersection.getX(), intersection.getY());
723
            return createCircle(
724
                    geomManager.createPoint(intersection.getX(), intersection.getY(), subtype), 
725
                    radius, 
726
                    subtype);
727

  
728
        } catch (GeometryOperationNotSupportedException | GeometryOperationException ex) {
729
            throw new CreateGeometryException(Geometry.TYPES.CIRCLE, subtype, ex);
730 668
        }
669
        return geometry;
731 670
    }
671
    
672
    
732 673
}

Also available in: Unified diff