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 / PolygonEditVertexOperation.java @ 575

History | View | Annotate | Download (5.06 KB)

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

    
3
import java.util.ArrayList;
4
import java.util.List;
5

    
6
import org.gvsig.fmap.geom.Geometry;
7
import org.gvsig.fmap.geom.GeometryLocator;
8
import org.gvsig.fmap.geom.GeometryManager;
9
import org.gvsig.fmap.geom.exception.CreateGeometryException;
10
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
11
import org.gvsig.fmap.geom.primitive.Point;
12
import org.gvsig.fmap.geom.primitive.Polygon;
13
import org.gvsig.fmap.geom.primitive.Primitive;
14
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
15
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
16
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
17
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
18

    
19
public class PolygonEditVertexOperation implements EditVertexOperation {
20

    
21
    public PolygonEditVertexOperation() {
22
        // TODO Auto-generated constructor stub
23
    }
24

    
25
    public Geometry insertVertex(Primitive geom, int index) throws CreateGeometryException {
26
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
27

    
28
        Polygon polygon = (Polygon) geom.cloneGeometry();
29
        int numVertices = polygon.getNumVertices();
30
        if (index < 0 || index >= numVertices) {
31
            return polygon;
32
        }
33
        int indexToInsert = index;
34
        Point antVertex = polygon.getVertex(numVertices - 1);
35
        if (index == 0 && polygon.getVertex(0).equals(antVertex)) {
36
            indexToInsert = numVertices - 1;
37
        }
38

    
39
        if (indexToInsert!=0){
40
            antVertex = polygon.getVertex(indexToInsert - 1);
41
        }
42
        Point point = polygon.getVertex(indexToInsert);
43
        Point newPoint = geometryManager.createPoint((point.getX() + antVertex.getX()) / 2,
44
            (point.getY() + antVertex.getY()) / 2, geom.getGeometryType().getSubType());
45
        polygon.insertVertex(indexToInsert, newPoint);
46
        return polygon;
47
    }
48

    
49
    public Geometry removeVertex(Primitive geom, int index)
50
        throws CreateGeometryException {
51
        Polygon polygon = (Polygon) geom.cloneGeometry();
52
        int numVertices = polygon.getNumVertices();
53
        if (index < 0 || index >= numVertices) {
54
            return polygon;
55
        }
56

    
57
        if (polygon.getVertex(0).equals(polygon.getVertex(numVertices - 1))) {
58
            if (numVertices <= 4) {
59
                return polygon;
60
            }
61
            numVertices--;
62
        } else {
63
            if (numVertices <= 3) {
64
                return polygon;
65
            }
66
        }
67
        polygon.removeVertex(index);
68

    
69
        return polygon;
70
    }
71

    
72
    public Geometry moveVertex(Primitive geom, int index, Point point) {
73
        Polygon result = (Polygon) geom.cloneGeometry();
74
        int numVertices = result.getNumVertices();
75

    
76
        if (result.getVertex(0).equals(result.getVertex(numVertices - 1))) {
77
            if (index == 0 || index == (result.getNumVertices() - 1)) {
78
                EditVertexOperationUtils.setVertex(result, 0, point);
79
                EditVertexOperationUtils.setVertex(result,
80
                    result.getNumVertices() - 1, (Point)point.cloneGeometry());
81
                return result;
82
            }
83
        }
84
        EditVertexOperationUtils.setVertex(result, index, point);
85
        return result;
86
    }
87

    
88
    public List<Point> getVertexesList(Primitive geom) {
89
        ArrayList<Point> vertexList = new ArrayList<Point>();
90
        if (geom instanceof OrientablePrimitive) {
91
            OrientablePrimitive orientable = (OrientablePrimitive) geom;
92
            orientable.getNumVertices();
93
            for (int i = 0; i < orientable.getNumVertices(); i++) {
94
                vertexList.add(orientable.getVertex(i));
95
            }
96
        }
97
        return vertexList;
98
    }
99

    
100
    public int getNumVertex(Primitive geom) {
101
        if (geom instanceof OrientablePrimitive) {
102
            OrientablePrimitive orientable = (OrientablePrimitive) geom;
103
            return orientable.getNumVertices();
104
        }
105
        return 0;
106
    }
107

    
108
    public boolean canInsertVertex(Primitive geom, int index) {
109
        return true;
110
    }
111

    
112
    public boolean canRemoveVertex(Primitive geom, int index) {
113

    
114
        Polygon polygon = (Polygon) geom;
115
        int numVertices = polygon.getNumVertices();
116
        if (index < 0) {
117
            return false;
118
        } else if (index >= numVertices) {
119
            return false;
120
        }
121
        if (polygon.getVertex(0).equals(polygon.getVertex(numVertices - 1))) {
122
            if (numVertices <= 4) {
123
                return false;
124
            }
125
        } else {
126
            if (numVertices <= 3) {
127
                return false;
128
            }
129
        }
130
        return true;
131
    }
132

    
133
    public boolean canMoveVertex(int index, Point point) {
134
        return true;
135
    }
136

    
137
    public void addToDrawingStatus(DefaultDrawingStatus drawingStatus,
138
        Primitive primitive) {
139
        EditingProviderManager editingProviderManager =
140
            EditingProviderLocator.getProviderManager();
141
        ISymbol polygonSymbolEditing =
142
            editingProviderManager.getSymbol("polygon-symbol-editing");
143
        drawingStatus.addStatus(primitive, polygonSymbolEditing, "");
144
    }
145

    
146
}