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 | } |