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.editvertex / src / main / java / org / gvsig / vectorediting / lib / prov / editvertex / operation / EditVertexOperationUtils.java @ 1574

History | View | Annotate | Download (4.23 KB)

1
package org.gvsig.vectorediting.lib.prov.editvertex.operation;
2

    
3

    
4
import java.util.HashMap;
5
import java.util.Map;
6

    
7
import org.slf4j.Logger;
8
import org.slf4j.LoggerFactory;
9

    
10
import org.gvsig.fmap.geom.Geometry;
11
import org.gvsig.fmap.geom.primitive.Arc;
12
import org.gvsig.fmap.geom.primitive.Circle;
13
import org.gvsig.fmap.geom.primitive.Circumference;
14
import org.gvsig.fmap.geom.primitive.Curve;
15
import org.gvsig.fmap.geom.primitive.Ellipse;
16
import org.gvsig.fmap.geom.primitive.EllipticArc;
17
import org.gvsig.fmap.geom.primitive.FilledSpline;
18
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
19
import org.gvsig.fmap.geom.primitive.PeriEllipse;
20
import org.gvsig.fmap.geom.primitive.Point;
21
import org.gvsig.fmap.geom.primitive.Primitive;
22
import org.gvsig.fmap.geom.primitive.Ring;
23
import org.gvsig.fmap.geom.primitive.Spline;
24
import org.gvsig.fmap.geom.primitive.Surface;
25

    
26

    
27
public class EditVertexOperationUtils {
28

    
29
    private static Logger logger = LoggerFactory.getLogger(EditVertexOperationUtils.class);
30

    
31
    private static Map<Integer, EditVertexOperation> operations = new HashMap<Integer, EditVertexOperation>();
32

    
33
    private EditVertexOperationUtils() {
34
    }
35

    
36
    public static void register(EditVertexOperation operation, int geometryType){
37
        operations.put(geometryType, operation);
38
    }
39

    
40
    public static EditVertexOperation getOperation(Primitive geom) {
41
        Integer type = geom.getGeometryType().getType();
42

    
43
        if(isPolygon(geom)){
44
            type = Geometry.TYPES.POLYGON;
45
        } else if(isLine(geom)){
46
            type = Geometry.TYPES.LINE;
47
        }
48
        EditVertexOperation operation = operations.get(type);
49

    
50
        return operation;
51
    }
52

    
53
    private static boolean isPolygon(Geometry geometry) {
54

    
55
        if(!(geometry instanceof Surface)){
56
            return false;
57
        }
58
        if(!isLineOrPolygon(geometry)){
59
            return false;
60
        };
61
        return true;
62
    }
63

    
64
    private static boolean isLine(Geometry geometry) {
65

    
66
        if(!(geometry instanceof Curve)){
67
            return false;
68
        }
69
        if(!isLineOrPolygon(geometry)){
70
            return false;
71
        };
72
        return true;
73
    }
74

    
75
    private static boolean isLineOrPolygon(Geometry geometry) {
76
        if (geometry instanceof Ellipse) {
77
            return false;
78
        }
79
        if (geometry instanceof EllipticArc) {
80
            return false;
81
        }
82
        if (geometry instanceof Circle) {
83
            return false;
84
        }
85
        if (geometry instanceof FilledSpline) {
86
            return false;
87
        }
88
        if (geometry instanceof Arc) {
89
            return false;
90
        }
91
        if (geometry instanceof Spline) {
92
            return false;
93
        }
94
        if (geometry instanceof Circumference) {
95
            return false;
96
        }
97
        if (geometry instanceof PeriEllipse) {
98
            return false;
99
        }
100
        return true;
101
    }
102

    
103
    public static void setVertex(OrientablePrimitive geom, int index, Point p) {
104
        if (index < geom.getNumVertices()) {
105
            Point point = geom.getVertex(index);
106
            int min = p.getDimension() < point.getDimension() ? p.getDimension() : point.getDimension();
107
            for (int i = 0; i < min; i++) {
108
                point.setCoordinateAt(i, p.getCoordinateAt(i));
109
            }
110
        } else {
111
            if (geom instanceof Surface) {
112
                Surface sgeom = (Surface) geom;
113
                int count = 0;
114
                int dif = index - geom.getNumVertices();
115
                for (int i = 0; i < sgeom.getNumInteriorRings(); i++) {
116
                    Ring ring = sgeom.getInteriorRing(i);
117
                    for (int ri = 0; ri < ring.getNumVertices(); ri++) {
118
                        if (count == dif) {
119
                            Point point = ring.getVertex(ri);
120
                            int min = p.getDimension() < point.getDimension() ? p.getDimension() : point.getDimension();
121
                            for (int vri = 0; vri < min; vri++) {
122
                                point.setCoordinateAt(vri, p.getCoordinateAt(vri));
123
                            }
124
                            return;
125
                        } else {
126
                            count = count + 1;
127
                        }
128

    
129
                    }
130

    
131
                }
132

    
133
            }
134
        }
135
    }
136

    
137
}