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 @ 575

History | View | Annotate | Download (6.19 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.operation.GeometryOperationException;
11
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
12
import org.gvsig.fmap.geom.primitive.Ellipse;
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 FilledEllipseEditVertexOperation implements EditVertexOperation {
22

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

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

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

    
37
    public Geometry moveVertex(Primitive geom, int index, Point point) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
38
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
39
        Ellipse result = (Ellipse) geom.cloneGeometry();
40
        if(index == 0){
41
            result.setPoints(point, ((Ellipse)geom).getAxis1End(), ((Ellipse)geom).getAxis2Dist());
42
        } else if (index == 1){
43
            result.setPoints(((Ellipse)geom).getAxis1Start(), point, ((Ellipse)geom).getAxis2Dist());
44
        } else if (index == 2){
45
            Point axis1Start = ((Ellipse)geom).getAxis1Start();
46
            Point axis1End = ((Ellipse)geom).getAxis1End();
47
            Point center = geometryManager.createPoint(
48
                (axis1Start.getX()+axis1End.getX())/2,
49
                (axis1Start.getY()+axis1End.getY())/2,
50
                geom.getGeometryType().getSubType());
51
            result.setPoints(((Ellipse)geom).getAxis1Start(), ((Ellipse)geom).getAxis1End(), center.distance(point));
52
        }
53
        return result;
54
    }
55

    
56
    public List<Point> getVertexesList(Primitive geom) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
57
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
58
        ArrayList<Point> vertexList = new ArrayList<Point>();
59
        Ellipse ellipse = (Ellipse) geom;
60
        Point axis1Start = ellipse.getAxis1Start();
61
        vertexList.add(axis1Start);
62
        Point axis1End = ellipse.getAxis1End();
63
        vertexList.add(axis1End);
64
        Point center = geometryManager.createPoint(
65
            (axis1Start.getX()+axis1End.getX())/2,
66
            (axis1Start.getY()+axis1End.getY())/2,
67
            geom.getGeometryType().getSubType());
68

    
69
        double angle = getAngle(axis1Start, axis1End);
70

    
71
        vertexList.add(geometryManager.createPoint(
72
            center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
73
            center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
74
            geom.getGeometryType().getSubType()));
75

    
76
        return vertexList;
77
    }
78

    
79
    public int getNumVertex(Primitive geom) {
80
        return 3;
81
    }
82

    
83
    public boolean canInsertVertex(Primitive geom, int index) {
84
        return false;
85
    }
86

    
87
    public boolean canRemoveVertex(Primitive geom, int index) {
88
        return false;
89
    }
90

    
91
    public boolean canMoveVertex(int index, Point point) {
92
        return true;
93
    }
94

    
95
    public double getAngle(Point start, Point end)
96
        throws GeometryOperationNotSupportedException,
97
        GeometryOperationException {
98
        double angle =
99
            Math.acos((end.getX() - start.getX()) / start.distance(end));
100

    
101
        if (start.getY() > end.getY()) {
102
            angle = -angle;
103
        }
104

    
105
        if (angle < 0) {
106
            angle += (2 * Math.PI);
107
        }
108

    
109
        return angle;
110
    }
111

    
112
    public void addToDrawingStatus(DefaultDrawingStatus drawingStatus,
113
        Primitive primitive) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
114
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
115
        EditingProviderManager editingProviderManager =
116
            EditingProviderLocator.getProviderManager();
117
        ISymbol auxiliaryLineSymbolEditing =
118
            editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
119
        ISymbol polygonSymbolEditing =
120
            editingProviderManager.getSymbol("polygon-symbol-editing");
121
        Ellipse ellipse = (Ellipse)primitive;
122
        Point axis1Start = ellipse.getAxis1Start();
123
        Point axis1End = ellipse.getAxis1End();
124
        Line axis1Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
125
        axis1Line.setPoints(axis1Start,axis1End);
126
        drawingStatus.addStatus(axis1Line, auxiliaryLineSymbolEditing, "");
127

    
128
        Line axis2Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
129

    
130
        Point center = geometryManager.createPoint(
131
            (axis1Start.getX()+axis1End.getX())/2,
132
            (axis1Start.getY()+axis1End.getY())/2,
133
            primitive.getGeometryType().getSubType());
134

    
135
        double angle = getAngle(axis1Start, axis1End);
136

    
137
        Point axis2Point1 = geometryManager.createPoint(
138
        center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
139
        center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
140
        primitive.getGeometryType().getSubType());
141

    
142
        Point axis2Point2 = geometryManager.createPoint(
143
        center.getX() - ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
144
        center.getY() - ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
145
        primitive.getGeometryType().getSubType());
146

    
147
        axis2Line.setPoints(axis2Point1,
148
            axis2Point2);
149
        drawingStatus.addStatus(axis2Line, auxiliaryLineSymbolEditing, "");
150

    
151
        drawingStatus.addStatus(primitive, polygonSymbolEditing, "");
152
    }
153

    
154
}