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.circlecr / src / main / java / org / gvsig / vectorediting / lib / prov / circlecr / Circumference2Tg1PEditingProvider.java @ 2109

History | View | Annotate | Download (17 KB)

1 159 llmarques
/**
2
 * gvSIG. Desktop Geographic Information System.
3 88 fdiaz
 *
4 159 llmarques
 * Copyright ? 2007-2014 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23 88 fdiaz
 */
24 159 llmarques
25 88 fdiaz
package org.gvsig.vectorediting.lib.prov.circlecr;
26
27 2102 fdiaz
import java.awt.geom.Point2D;
28
import java.util.Objects;
29
import org.gvsig.euclidean.EuclideanLine2D;
30
import org.gvsig.euclidean.EuclideanManager;
31 88 fdiaz
import org.gvsig.fmap.geom.Geometry;
32 99 fdiaz
import org.gvsig.fmap.geom.GeometryLocator;
33 575 fdiaz
import org.gvsig.fmap.geom.GeometryManager;
34 88 fdiaz
import org.gvsig.fmap.geom.aggregate.MultiCurve;
35 2102 fdiaz
import org.gvsig.fmap.geom.primitive.Circle;
36 575 fdiaz
import org.gvsig.fmap.geom.primitive.Circumference;
37
import org.gvsig.fmap.geom.primitive.Curve;
38 88 fdiaz
import org.gvsig.fmap.geom.primitive.Point;
39
import org.gvsig.fmap.geom.type.GeometryType;
40 575 fdiaz
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
41 88 fdiaz
import org.gvsig.tools.dynobject.DynObject;
42
import org.gvsig.tools.service.spi.ProviderServices;
43 2102 fdiaz
import org.gvsig.tools.util.ToolsUtilLocator;
44 575 fdiaz
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
45 88 fdiaz
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
46 575 fdiaz
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
47 88 fdiaz
import org.gvsig.vectorediting.lib.spi.EditingProvider;
48 575 fdiaz
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
49
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
50 88 fdiaz
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
51
52 2102 fdiaz
public class Circumference2Tg1PEditingProvider extends Circle2Tg1PEditingProvider
53 227 llmarques
implements EditingProvider {
54 88 fdiaz
55 2102 fdiaz
    public Circumference2Tg1PEditingProvider(ProviderServices providerServices,
56 138 llmarques
        DynObject parameters) {
57
        super(providerServices, parameters);
58
    }
59 88 fdiaz
60 2102 fdiaz
    public DefaultDrawingStatus getDrawingStatus(Point mousePosition)
61
        throws DrawServiceException {
62
        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
63
        EditingProviderManager editingProviderManager =
64
            EditingProviderLocator.getProviderManager();
65
//        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
66 575 fdiaz
        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
67
        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
68
69 2102 fdiaz
        EuclideanManager euclideanManager = ToolsUtilLocator.getEuclideanManager();
70
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
71
72
        EditingProviderServices editingProviderServices
73
                = (EditingProviderServices) getProviderServices();
74
75
        if (values != null) {
76 575 fdiaz
77 2102 fdiaz
            Point firstPointValue = (Point) values.get(firstPoint);
78
            Point secondPointValue = (Point) values.get(secondPoint);
79
            Point thirdPointValue = (Point) values.get(thirdPoint);
80
            Point fourthPointValue = (Point) values.get(fourthPoint);
81
            Point fifthPointValue = (Point) values.get(fifthPoint);
82
83 575 fdiaz
84 2102 fdiaz
            if (firstPointValue != null && secondPointValue == null) {
85 575 fdiaz
86 2102 fdiaz
                try {
87 575 fdiaz
88 2102 fdiaz
                    int subtype = editingProviderServices.getSubType(featureStore);
89 575 fdiaz
90 2102 fdiaz
                    drawingStatus.addStatus(firstPointValue, auxiliaryPointSymbolEditing, "");
91
                    drawingStatus.addStatus(mousePosition, auxiliaryPointSymbolEditing, "");
92 575 fdiaz
93 2102 fdiaz
                    Curve line =
94
                        editingProviderServices.createLine(firstPointValue,
95
                            mousePosition, subtype);
96
                    drawingStatus.addStatus(line, auxiliaryLineSymbolEditing, "");
97
98
                } catch (Exception e) {
99
                    throw new DrawServiceException(e);
100
                }
101
102
            } else if (firstPointValue != null && secondPointValue != null && thirdPointValue == null) {
103
104
                try {
105
106
                    int subtype = editingProviderServices.getSubType(featureStore);
107
108
                    Curve line1 =
109
                        editingProviderServices.createLine(firstPointValue,
110
                            secondPointValue, subtype);
111
                    drawingStatus.addStatus(line1, auxiliaryLineSymbolEditing, "");
112
113
                    drawingStatus.addStatus(mousePosition, auxiliaryPointSymbolEditing, "");
114
115
                    drawingStatus.addStatus(firstPointValue, auxiliaryPointSymbolEditing, "");
116
                    drawingStatus.addStatus(secondPointValue, auxiliaryPointSymbolEditing, "");
117
                    drawingStatus.addStatus(mousePosition, auxiliaryPointSymbolEditing, "");
118
119
                } catch (Exception e) {
120
                    throw new DrawServiceException(e);
121
                }
122
            } else if (firstPointValue != null && secondPointValue != null && thirdPointValue != null  && fourthPointValue == null) {
123
124
                try {
125
126
                    int subtype = editingProviderServices.getSubType(featureStore);
127
128
                    Curve line1 =
129
                        editingProviderServices.createLine(firstPointValue,
130
                            secondPointValue, subtype);
131
                    drawingStatus.addStatus(line1, auxiliaryLineSymbolEditing, "");
132
133
                    Curve line =
134
                        editingProviderServices.createLine(thirdPointValue,
135
                            mousePosition, subtype);
136
                    drawingStatus.addStatus(line, auxiliaryLineSymbolEditing, "");
137
138
                    drawingStatus.addStatus(firstPointValue, auxiliaryPointSymbolEditing, "");
139
                    drawingStatus.addStatus(secondPointValue, auxiliaryPointSymbolEditing, "");
140
                    drawingStatus.addStatus(thirdPointValue, auxiliaryPointSymbolEditing, "");
141
                    drawingStatus.addStatus(mousePosition, auxiliaryPointSymbolEditing, "");
142
143
                } catch (Exception e) {
144
                    throw new DrawServiceException(e);
145
                }
146
            } else if (firstPointValue != null && secondPointValue != null && thirdPointValue != null && fourthPointValue != null && fifthPointValue == null) {
147
148
                try {
149
150
                    int subtype = editingProviderServices.getSubType(featureStore);
151
152
                    //Draw tangents
153
                    Curve line1
154
                            = editingProviderServices.createLine(firstPointValue,
155
                            secondPointValue, subtype);
156
                    drawingStatus.addStatus(line1, auxiliaryLineSymbolEditing, "");
157
158
                    Curve line2 =
159
                        editingProviderServices.createLine(thirdPointValue,
160
                            fourthPointValue, subtype);
161
                    drawingStatus.addStatus(line2, auxiliaryLineSymbolEditing, "");
162
163
                    //Draw circle
164
                    Circle circle
165
                            = editingProviderServices.createCircle(
166
                                firstPointValue,
167
                                secondPointValue,
168
                                thirdPointValue,
169
                                fourthPointValue,
170
                                mousePosition,
171
                                subtype);
172
173
                    Circumference circumference = (Circumference) geomManager.create(CIRCUMFERENCE, subtype);
174
                    circumference.setPoints(circle.getCenter(), circle.getRadious());
175
176
                    drawingStatus.addStatus(circle, auxiliaryLineSymbolEditing, "");
177
                    Point center = circle.getCenter();
178
179
                    //Draw the first four points
180
                    drawingStatus.addStatus(firstPointValue, auxiliaryPointSymbolEditing, "");
181
                    drawingStatus.addStatus(secondPointValue, auxiliaryPointSymbolEditing, "");
182
                    drawingStatus.addStatus(thirdPointValue, auxiliaryPointSymbolEditing, "");
183
                    drawingStatus.addStatus(fourthPointValue, auxiliaryPointSymbolEditing, "");
184
185
                    EuclideanLine2D tangent1 = euclideanManager.createLine2D(firstPointValue.getX(), firstPointValue.getY(), secondPointValue.getX(), secondPointValue.getY());
186
                    EuclideanLine2D tangent2 = euclideanManager.createLine2D(thirdPointValue.getX(), thirdPointValue.getY(), fourthPointValue.getX(), fourthPointValue.getY());
187
188
                    if (tangent1.isParallel(tangent2)) {
189
                        if (Objects.equals(tangent1.getYIntercept(), tangent2.getYIntercept())) { //Same lines
190
                            //Draw line between mouse position and tangent1
191
                            EuclideanLine2D perp = tangent1.getPerpendicular(mousePosition.getX(), mousePosition.getY());
192
                            Point2D intersection = tangent1.getIntersection(perp);
193
                            drawingStatus.addStatus(
194
                                    editingProviderServices.createLine(
195
                                        mousePosition.getX(),
196
                                        mousePosition.getY(),
197
                                        intersection.getX(),
198
                                        intersection.getY(),
199
                                        subtype
200
                                    ), auxiliaryLineSymbolEditing, "");
201
                        }
202
                    } else {
203
                        //Draw line between center and intersection tangents (bisector passing through the center)
204
205
                        Point2D intersectionTangents = tangent1.getIntersection(tangent2);
206
207
                        drawingStatus.addStatus(
208
                                editingProviderServices.createLine(
209
                                        intersectionTangents.getX(),
210
                                        intersectionTangents.getY(),
211
                                        center.getX(),
212
                                        center.getY(),
213
                                        subtype
214
                                ),
215
                                auxiliaryLineSymbolEditing,
216
                                "");
217
218
                        drawingStatus.addStatus(
219
                                geomManager.createPoint(
220
                                        intersectionTangents.getX(),
221
                                        intersectionTangents.getY(),
222
                                        subtype
223
                                ),
224
                                auxiliaryPointSymbolEditing, "");
225
226
                        //Draw perpendicular bisectors passing through the center
227
228
                        EuclideanLine2D[] bisectors = tangent1.getBisectors(tangent2);
229
230
                        double distance0 = bisectors[0].getDistance(mousePosition.getX(), mousePosition.getY());
231
                        double distance1 = bisectors[1].getDistance(mousePosition.getX(), mousePosition.getY());
232
233
                        EuclideanLine2D bisector = bisectors[0];
234
                        if (distance0 > distance1) {
235
                            bisector = bisectors[1];
236
                        }
237
238
                        EuclideanLine2D perp = bisector.getPerpendicular(mousePosition.getX(), mousePosition.getY());
239
                        Point2D intersection;
240
                        if(Double.isInfinite(perp.getSlope())){
241
                            intersection = new Point2D.Double(
242
                                    mousePosition.getX(),
243
                                    center.getY());
244
                        } else {
245
                            intersection = bisector.getIntersection(perp);
246
                        }
247
248
                        drawingStatus.addStatus(
249
                                editingProviderServices.createLine(
250
                                        intersection.getX(),
251
                                        intersection.getY(),
252
                                        center.getX(),
253
                                        center.getY(),
254
                                        subtype
255
                                ),
256
                                auxiliaryLineSymbolEditing,
257
                                "");
258
                    }
259
260
                    //Draw line between mouse position and center
261
                    drawingStatus.addStatus(
262
                            editingProviderServices.createLine(
263
                                    mousePosition,
264
                                    center,
265
                                    subtype),
266
                            auxiliaryLineSymbolEditing, "");
267
268
                    //Draw normal lines (perpendicular to the tangents passing through the center)
269
                    EuclideanLine2D perpA = tangent1.getPerpendicular(center.getX(), center.getY());
270
271
                    Point intersectionA;
272
                    if (tangent1.getSlope() == 0.0) {
273
                        intersectionA = editingProviderServices.createPoint(center.getX(), tangent1.getYIntercept(), subtype);
274
                    } else {
275
                        Point2D intersection = tangent1.getIntersection(perpA);
276
                        intersectionA = editingProviderServices.createPoint(intersection.getX(), intersection.getY(), subtype);
277
                    }
278
                    drawingStatus.addStatus(intersectionA, auxiliaryPointSymbolEditing, "");
279
                    drawingStatus.addStatus(editingProviderServices.createLine(center, intersectionA, subtype), auxiliaryLineSymbolEditing, "");
280
281
282
                    EuclideanLine2D perpB = tangent2.getPerpendicular(center.getX(), center.getY());
283
284
                    Point intersectionB;
285
                    if (tangent2.getSlope() == 0.0) {
286
                        intersectionB = editingProviderServices.createPoint(center.getX(), tangent2.getYIntercept(), subtype);
287
                    } else {
288
                        Point2D intersection = tangent2.getIntersection(perpB);
289
                        intersectionB = editingProviderServices.createPoint(intersection.getX(), intersection.getY(), subtype);
290
                    }
291
                    drawingStatus.addStatus(intersectionB, auxiliaryPointSymbolEditing, "");
292
                    drawingStatus.addStatus(editingProviderServices.createLine(center, intersectionB, subtype), auxiliaryLineSymbolEditing, "");
293
294
                    //Draw point in mouse position
295
                    drawingStatus.addStatus(mousePosition, auxiliaryPointSymbolEditing, "");
296
297
                } catch (Exception e) {
298
                    throw new DrawServiceException(e);
299
                }
300
            }
301
        }
302
        return drawingStatus;
303 575 fdiaz
    }
304
305 2102 fdiaz
    public Geometry finish() throws FinishServiceException {
306 575 fdiaz
307 2102 fdiaz
        final GeometryManager geomManager = GeometryLocator.getGeometryManager();
308
309
        Point firstPointValue = (Point) values.get(firstPoint);
310
        Point secondPointValue = (Point) values.get(secondPoint);
311
        Point thirdPointValue = (Point) values.get(thirdPoint);
312
        Point fourthPointValue = (Point) values.get(fourthPoint);
313
        Point fifthPointValue = (Point) values.get(fifthPoint);
314
315 138 llmarques
        EditingProviderServices editingProviderServices =
316
            (EditingProviderServices) getProviderServices();
317 2102 fdiaz
318 138 llmarques
        try {
319 178 llmarques
            int subtype = editingProviderServices.getSubType(featureStore);
320 138 llmarques
            GeometryType storeGeomType =
321
                editingProviderServices.getGeomType(featureStore);
322 2102 fdiaz
            Circle circle =
323
                editingProviderServices.createCircle(firstPointValue, secondPointValue, thirdPointValue, fourthPointValue, fifthPointValue, subtype);
324 575 fdiaz
            Circumference circumference = (Circumference) geomManager.create(CIRCUMFERENCE, subtype);
325 2102 fdiaz
            circumference.setPoints(circle.getCenter(), circle.getRadious());
326 88 fdiaz
327 138 llmarques
            if (storeGeomType.isTypeOf(MULTICURVE)) {
328
                MultiCurve multicurve;
329
                multicurve =
330 2102 fdiaz
                    geomManager.createMultiCurve(
331 138 llmarques
                        storeGeomType.getSubType());
332 575 fdiaz
                multicurve.addCurve((Circumference) circumference);
333 138 llmarques
                return multicurve;
334
            }
335 174 llmarques
336 575 fdiaz
            return circumference;
337 138 llmarques
        } catch (Exception e) {
338
            throw new FinishServiceException(e);
339
        }
340
    }
341 88 fdiaz
342 227 llmarques
    @Override
343 138 llmarques
    public String getName() {
344 2102 fdiaz
        return Circumference2Tg1PEditingProviderFactory.PROVIDER_NAME;
345 88 fdiaz
    }
346
347
}