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 / ArcEditVertexOperation.java @ 2616

History | View | Annotate | Download (7.06 KB)

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

    
3
import java.util.ArrayList;
4
import java.util.List;
5
import org.gvsig.fmap.geom.Geometry;
6
import org.gvsig.fmap.geom.GeometryLocator;
7
import org.gvsig.fmap.geom.GeometryManager;
8
import org.gvsig.fmap.geom.exception.CreateGeometryException;
9
import org.gvsig.fmap.geom.operation.GeometryOperationException;
10
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
11
import org.gvsig.fmap.geom.primitive.Arc;
12
import org.gvsig.fmap.geom.primitive.Envelope;
13
import org.gvsig.fmap.geom.primitive.Line;
14
import org.gvsig.fmap.geom.primitive.Point;
15
import org.gvsig.fmap.geom.primitive.Primitive;
16
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
17
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
18
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
19
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
20

    
21
public class ArcEditVertexOperation implements EditVertexOperation {
22

    
23
    public ArcEditVertexOperation() {
24
        // TODO Auto-generated constructor stub
25
    }
26

    
27
    @Override
28
    public Geometry insertVertex(Primitive geom, int index)
29
        throws CreateGeometryException {
30
        return null;
31
    }
32

    
33
    @Override
34
    public Geometry removeVertex(Primitive geom, int index)
35
        throws CreateGeometryException {
36
        return null;
37
    }
38

    
39
    @Override
40
    public Geometry moveVertex(Primitive geom, int index, Point point)
41
        throws GeometryOperationNotSupportedException,
42
        GeometryOperationException, CreateGeometryException {
43
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
44

    
45
        Arc arc = (Arc) geom;
46
        Arc result = (Arc) arc.cloneGeometry();
47

    
48
        Point center = result.getCenterPoint();
49
        if(center == null){
50
            Envelope envelope = arc.getEnvelope();
51
            center = geometryManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), geom.getGeometryType().getSubType());
52
        }
53

    
54
        Point initPoint = result.getInitPoint();
55
        Point middlePoint = result.getMiddlePoint();
56
        Point endPoint = result.getEndPoint();
57

    
58
        double radius = center.distance(initPoint);
59

    
60
        double angle = getAngle(center, point);
61

    
62
        switch (index) {
63
        case 0:
64
            double dx = point.getX()-center.getX();
65
            double dy = point.getY()-center.getY();
66
            initPoint.setX(initPoint.getX()+dx);
67
            initPoint.setY(initPoint.getY()+dy);
68
            middlePoint.setX(middlePoint.getX()+dx);
69
            middlePoint.setY(middlePoint.getY()+dy);
70
            endPoint.setX(endPoint.getX()+dx);
71
            endPoint.setY(endPoint.getY()+dy);
72
            result.setPoints(initPoint, middlePoint, endPoint);
73

    
74
            break;
75
        case 1:
76
            initPoint.setX(center.getX()+Math.cos(angle)*radius);
77
            initPoint.setY(center.getY()+Math.sin(angle)*radius);
78
            result.setPoints(initPoint, middlePoint, endPoint);
79

    
80
            break;
81
        case 2:
82
            endPoint.setX(center.getX()+Math.cos(angle)*radius);
83
            endPoint.setY(center.getY()+Math.sin(angle)*radius);
84
            result.setPoints(initPoint, middlePoint, endPoint);
85
            break;
86

    
87
        case 3:
88
            middlePoint.setX(center.getX()+Math.cos(angle)*radius);
89
            middlePoint.setY(center.getY()+Math.sin(angle)*radius);
90
            result.setPoints(initPoint, middlePoint, endPoint);
91
            break;
92
        default:
93
            break;
94
        }
95

    
96
        return result;
97
    }
98

    
99
    @Override
100
    public List<Point> getVertexesList(Primitive geom) throws CreateGeometryException {
101
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
102
        ArrayList<Point> vertexList = new ArrayList<>();
103
        Arc arc = (Arc) geom;
104

    
105
        Point center = arc.getCenterPoint();
106
        if(center == null){
107
            Envelope envelope = arc.getEnvelope();
108
            center = geometryManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), geom.getGeometryType().getSubType());
109
        }
110
        vertexList.add(center);
111

    
112
        vertexList.add(arc.getInitPoint());
113
        vertexList.add(arc.getEndPoint());
114
        vertexList.add(arc.getMiddlePoint());
115
        return vertexList;
116
    }
117

    
118
    @Override
119
    public int getNumVertex(Primitive geom) {
120
        return 4;
121
    }
122

    
123
    @Override
124
    public boolean canInsertVertex(Primitive geom, int index) {
125
        return false;
126
    }
127

    
128
    @Override
129
    public boolean canRemoveVertex(Primitive geom, int index) {
130
        return false;
131
    }
132

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

    
138
    public double getAngle(Point start, Point end)
139
        throws GeometryOperationNotSupportedException,
140
        GeometryOperationException {
141
        double angle =
142
            Math.acos((end.getX() - start.getX()) / start.distance(end));
143

    
144
        if (start.getY() > end.getY()) {
145
            angle = -angle;
146
        }
147

    
148
        if (angle < 0) {
149
            angle += (2 * Math.PI);
150
        }
151

    
152
        return angle;
153
    }
154

    
155
    @Override
156
    public void addToDrawingStatus(DefaultDrawingStatus drawingStatus,
157
        Primitive primitive) throws CreateGeometryException,
158
        GeometryOperationNotSupportedException, GeometryOperationException {
159
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
160
        EditingProviderManager editingProviderManager =
161
            EditingProviderLocator.getProviderManager();
162
        ISymbol auxiliaryLineSymbolEditing =
163
            editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
164
        ISymbol lineSymbolEditing =
165
            editingProviderManager.getSymbol("line-symbol-editing");
166
        ISymbol pointSymbolEditing =
167
            editingProviderManager.getSymbol("point-symbol-editing");
168
        Arc arc = (Arc)primitive;
169

    
170
        Point center = arc.getCenterPoint();
171
        if(center == null){
172
            Envelope envelope = arc.getEnvelope();
173
            center = geometryManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), primitive.getGeometryType().getSubType());
174
        }
175

    
176
        Line auxLine = geometryManager.createLine(primitive.getGeometryType().getSubType());
177
        auxLine.setPoints(center,arc.getInitPoint());
178
        drawingStatus.addStatus(auxLine, auxiliaryLineSymbolEditing, "");
179

    
180
        Line auxLine2 = geometryManager.createLine(primitive.getGeometryType().getSubType());
181
        auxLine2.setPoints(center,arc.getEndPoint());
182
        drawingStatus.addStatus(auxLine2, auxiliaryLineSymbolEditing, "");
183
        Line auxLine3 = geometryManager.createLine(primitive.getGeometryType().getSubType());
184
        auxLine3.setPoints(center,arc.getMiddlePoint());
185
        drawingStatus.addStatus(auxLine3, auxiliaryLineSymbolEditing, "");
186
        drawingStatus.addStatus(arc.getInitPoint(), pointSymbolEditing, "");
187
        drawingStatus.addStatus(arc.getEndPoint(), pointSymbolEditing, "");
188
        drawingStatus.addStatus(arc.getMiddlePoint(), pointSymbolEditing, "");
189

    
190
        drawingStatus.addStatus(primitive, drawingStatus.getPreviewSymbol(), "");
191
        drawingStatus.addStatus(primitive, lineSymbolEditing, "");
192
    }
193

    
194
}