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

History | View | Annotate | Download (6.55 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.Ellipse;
12
import org.gvsig.fmap.geom.primitive.Line;
13
import org.gvsig.fmap.geom.primitive.Point;
14
import org.gvsig.fmap.geom.primitive.Primitive;
15
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
16
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
17
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
18
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
19

    
20
public class FilledEllipseEditVertexOperation implements EditVertexOperation {
21

    
22
    public FilledEllipseEditVertexOperation() {
23
        // TODO Auto-generated constructor stub
24
    }
25

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

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

    
38
    @Override
39
    public Geometry moveVertex(Primitive geom, int index, Point point) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
40
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
41
        Ellipse result = (Ellipse) geom.cloneGeometry();
42
        switch (index) {
43
            case 0:
44
                result.setPoints(point, ((Ellipse)geom).getAxis1End(), ((Ellipse)geom).getAxis2Dist());
45
                break;
46
            case 1:
47
                result.setPoints(((Ellipse)geom).getAxis1Start(), point, ((Ellipse)geom).getAxis2Dist());
48
                break;
49
            case 2:
50
                Point axis1Start = ((Ellipse)geom).getAxis1Start();
51
                Point axis1End = ((Ellipse)geom).getAxis1End();
52
                Point center = geometryManager.createPoint(
53
                        (axis1Start.getX()+axis1End.getX())/2,
54
                        (axis1Start.getY()+axis1End.getY())/2,
55
                        geom.getGeometryType().getSubType());
56
                result.setPoints(((Ellipse)geom).getAxis1Start(), ((Ellipse)geom).getAxis1End(), center.distance(point));
57
                break;
58
            default:
59
                break;
60
        }
61
        return result;
62
    }
63

    
64
    @Override
65
    public List<Point> getVertexesList(Primitive geom) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
66
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
67
        ArrayList<Point> vertexList = new ArrayList<>();
68
        Ellipse ellipse = (Ellipse) geom;
69
        Point axis1Start = ellipse.getAxis1Start();
70
        vertexList.add(axis1Start);
71
        Point axis1End = ellipse.getAxis1End();
72
        vertexList.add(axis1End);
73
        Point center = geometryManager.createPoint(
74
            (axis1Start.getX()+axis1End.getX())/2,
75
            (axis1Start.getY()+axis1End.getY())/2,
76
            geom.getGeometryType().getSubType());
77

    
78
        double angle = getAngle(axis1Start, axis1End);
79

    
80
        vertexList.add(geometryManager.createPoint(
81
            center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
82
            center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
83
            geom.getGeometryType().getSubType()));
84

    
85
        return vertexList;
86
    }
87

    
88
    @Override
89
    public int getNumVertex(Primitive geom) {
90
        return 3;
91
    }
92

    
93
    @Override
94
    public boolean canInsertVertex(Primitive geom, int index) {
95
        return false;
96
    }
97

    
98
    @Override
99
    public boolean canRemoveVertex(Primitive geom, int index) {
100
        return false;
101
    }
102

    
103
    @Override
104
    public boolean canMoveVertex(int index, Point point) {
105
        return true;
106
    }
107

    
108
    public double getAngle(Point start, Point end)
109
        throws GeometryOperationNotSupportedException,
110
        GeometryOperationException {
111
        double angle =
112
            Math.acos((end.getX() - start.getX()) / start.distance(end));
113

    
114
        if (start.getY() > end.getY()) {
115
            angle = -angle;
116
        }
117

    
118
        if (angle < 0) {
119
            angle += (2 * Math.PI);
120
        }
121

    
122
        return angle;
123
    }
124

    
125
    @Override
126
    public void addToDrawingStatus(DefaultDrawingStatus drawingStatus,
127
        Primitive primitive) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
128
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
129
        EditingProviderManager editingProviderManager =
130
            EditingProviderLocator.getProviderManager();
131
        ISymbol auxiliaryLineSymbolEditing =
132
            editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
133
        ISymbol polygonSymbolEditing =
134
            editingProviderManager.getSymbol("polygon-symbol-editing");
135
        Ellipse ellipse = (Ellipse)primitive;
136
        Point axis1Start = ellipse.getAxis1Start();
137
        Point axis1End = ellipse.getAxis1End();
138
        Line axis1Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
139
        axis1Line.setPoints(axis1Start,axis1End);
140
        drawingStatus.addStatus(axis1Line, auxiliaryLineSymbolEditing, "");
141

    
142
        Line axis2Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
143

    
144
        Point center = geometryManager.createPoint(
145
            (axis1Start.getX()+axis1End.getX())/2,
146
            (axis1Start.getY()+axis1End.getY())/2,
147
            primitive.getGeometryType().getSubType());
148

    
149
        double angle = getAngle(axis1Start, axis1End);
150

    
151
        Point axis2Point1 = geometryManager.createPoint(
152
        center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
153
        center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
154
        primitive.getGeometryType().getSubType());
155

    
156
        Point axis2Point2 = geometryManager.createPoint(
157
        center.getX() - ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
158
        center.getY() - ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
159
        primitive.getGeometryType().getSubType());
160

    
161
        axis2Line.setPoints(axis2Point1,
162
            axis2Point2);
163
        drawingStatus.addStatus(axis2Line, auxiliaryLineSymbolEditing, "");
164

    
165
        drawingStatus.addStatus(primitive, drawingStatus.getPreviewSymbol(), "");
166
        drawingStatus.addStatus(primitive, polygonSymbolEditing, "");
167
    }
168

    
169
}