Revision 333 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.prov/org.gvsig.vectorediting.lib.prov.scale/src/main/java/org/gvsig/vectorediting/lib/prov/scale/ScaleEditingProvider.java
ScaleEditingProvider.java | ||
---|---|---|
25 | 25 |
|
26 | 26 |
|
27 | 27 |
|
28 |
import java.awt.Font; |
|
28 | 29 |
import java.awt.geom.AffineTransform; |
29 | 30 |
import java.util.ArrayList; |
30 | 31 |
import java.util.HashMap; |
31 | 32 |
import java.util.List; |
32 | 33 |
import java.util.Map; |
33 | 34 |
|
35 |
import net.sf.antcontrib.net.httpclient.GetMethodTask; |
|
36 |
|
|
34 | 37 |
import org.gvsig.fmap.dal.exception.DataException; |
35 | 38 |
import org.gvsig.fmap.dal.feature.EditableFeature; |
36 | 39 |
import org.gvsig.fmap.dal.feature.Feature; |
... | ... | |
42 | 45 |
import org.gvsig.fmap.geom.exception.CreateGeometryException; |
43 | 46 |
import org.gvsig.fmap.geom.operation.GeometryOperationException; |
44 | 47 |
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException; |
45 |
import org.gvsig.fmap.geom.primitive.Arc; |
|
46 | 48 |
import org.gvsig.fmap.geom.primitive.Line; |
47 | 49 |
import org.gvsig.fmap.geom.primitive.Point; |
50 |
import org.gvsig.fmap.mapcontext.MapContext; |
|
51 |
import org.gvsig.fmap.mapcontext.ViewPort; |
|
52 |
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol; |
|
53 |
import org.gvsig.symbology.SymbologyLocator; |
|
54 |
import org.gvsig.symbology.SymbologyManager; |
|
55 |
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol; |
|
48 | 56 |
import org.gvsig.tools.ToolsLocator; |
49 |
import org.gvsig.tools.dispose.DisposableIterator; |
|
50 | 57 |
import org.gvsig.tools.dynobject.DynObject; |
51 | 58 |
import org.gvsig.tools.exception.BaseException; |
52 | 59 |
import org.gvsig.tools.i18n.I18nManager; |
... | ... | |
65 | 72 |
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter; |
66 | 73 |
import org.gvsig.vectorediting.lib.spi.EditingProvider; |
67 | 74 |
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory; |
75 |
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator; |
|
76 |
import org.gvsig.vectorediting.lib.spi.EditingProviderManager; |
|
68 | 77 |
import org.gvsig.vectorediting.lib.spi.EditingProviderServices; |
69 | 78 |
|
70 | 79 |
public class ScaleEditingProvider extends AbstractEditingProvider implements |
... | ... | |
84 | 93 |
|
85 | 94 |
private FeatureStore featureStore; |
86 | 95 |
|
96 |
private MapContext mapContext; |
|
97 |
|
|
87 | 98 |
public ScaleEditingProvider(ProviderServices providerServices, |
88 | 99 |
DynObject parameters) { |
89 | 100 |
super(providerServices); |
101 |
this.mapContext = |
|
102 |
(MapContext) parameters |
|
103 |
.getDynValue(EditingProviderFactory.MAPCONTEXT_FIELD); |
|
104 |
|
|
90 | 105 |
this.featureStore = |
91 | 106 |
(FeatureStore) parameters |
92 | 107 |
.getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD); |
... | ... | |
131 | 146 |
} |
132 | 147 |
} else if (param == scaleFactorOrReferencePointParameter) { |
133 | 148 |
if (value instanceof Point) { |
149 |
if (((Point) value).getX() == ((Point)values.get(originPointParameter)).getX()){ |
|
150 |
throw new InvalidEntryException(null); |
|
151 |
} |
|
134 | 152 |
values.put(param, value); |
135 | 153 |
return; |
136 | 154 |
} else if (value instanceof Double) { |
... | ... | |
168 | 186 |
|
169 | 187 |
public DrawingStatus getDrawingStatus(Point mousePosition) |
170 | 188 |
throws DrawServiceException { |
171 |
DefaultDrawingStatus geometries = new DefaultDrawingStatus(); |
|
189 |
DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus(); |
|
190 |
GeometryManager geometryManager = GeometryLocator.getGeometryManager(); |
|
191 |
|
|
192 |
EditingProviderManager editingProviderManager = |
|
193 |
EditingProviderLocator.getProviderManager(); |
|
194 |
ISymbol ruleMarkerSymbol = editingProviderManager.getSymbol("rule-marker-symbol"); |
|
195 |
ViewPort vp = this.mapContext.getViewPort(); |
|
196 |
|
|
197 |
|
|
172 | 198 |
EditingProviderServices editingProviderServices = |
173 | 199 |
(EditingProviderServices) getProviderServices(); |
174 | 200 |
|
... | ... | |
191 | 217 |
} else if (scaleFactorOrReferencePointValue instanceof Point) { |
192 | 218 |
double unity = ((Point) scaleFactorOrReferencePointValue).getX()-origin.getX(); |
193 | 219 |
// Unidad de referencia |
194 |
Line line = |
|
195 |
createHorizontalLineFromAPointWithLenght(origin, unity, subType); |
|
196 |
geometries.addGeometry(line); |
|
197 |
createRule(geometries, origin, unity, unity, unity/10, subType); |
|
220 |
createRule(drawingStatus, origin, unity, unity, subType); //+(Math.signum(unity)*0.01), subType); |
|
198 | 221 |
|
199 | 222 |
Object secondScalePointParameter = |
200 | 223 |
values.get(this.secondScalePointParameter); |
... | ... | |
202 | 225 |
&& secondScalePointParameter instanceof Point) { |
203 | 226 |
double rawScale = ((Point) secondScalePointParameter).getX()-origin.getX(); |
204 | 227 |
scale = rawScale / unity; |
228 |
createRule(drawingStatus, origin, unity, rawScale, subType); |
|
205 | 229 |
|
206 |
Line line2 = |
|
207 |
createHorizontalLineFromAPointWithLenght(origin, rawScale, subType); |
|
208 |
geometries.addGeometry(line2); |
|
209 |
createRule(geometries, origin, unity, rawScale, unity/10, subType); |
|
230 |
Point marker = null; |
|
231 |
marker = geometryManager.createPoint(origin.getX()+rawScale,origin.getY(), subType); |
|
232 |
drawingStatus.addStatus(marker, ruleMarkerSymbol, ""); |
|
233 |
ISimpleTextSymbol textSymbol = getTextSymbol(); |
|
234 |
Point textPoint = geometryManager.createPoint(marker.getX()-vp.toMapDistance(10), marker.getY()-vp.toMapDistance(20), subType); |
|
235 |
drawingStatus.addStatus(textPoint, textSymbol, String.valueOf(Math.round(scale*100.0)/100.0)); |
|
236 |
|
|
210 | 237 |
} else { |
211 | 238 |
double rawScale = mousePosition.getX()-origin.getX(); |
212 | 239 |
scale = rawScale / unity; |
213 |
Line line2 = |
|
214 |
createHorizontalLineFromAPointWithLenght(origin, rawScale, subType); |
|
215 |
geometries.addGeometry(line2); |
|
216 |
createRule(geometries, origin, unity, rawScale, unity/10, subType); |
|
240 |
createRule(drawingStatus, origin, unity, rawScale, subType); |
|
217 | 241 |
|
242 |
Point marker = null; |
|
243 |
marker = geometryManager.createPoint(origin.getX()+rawScale,origin.getY(), subType); |
|
244 |
drawingStatus.addStatus(marker, ruleMarkerSymbol, ""); |
|
245 |
ISimpleTextSymbol textSymbol = getTextSymbol(); |
|
246 |
Point textPoint = geometryManager.createPoint(marker.getX()-vp.toMapDistance(10), marker.getY()-vp.toMapDistance(20), subType); |
|
247 |
drawingStatus.addStatus(textPoint, textSymbol, String.valueOf(Math.round(scale*100.0)/100.0)); |
|
248 |
|
|
218 | 249 |
AffineTransform at; |
219 | 250 |
try { |
220 | 251 |
at = getScaleAffineTransform(origin, scale); |
221 | 252 |
} catch (Exception e) { |
222 | 253 |
throw new DrawServiceException(e); |
223 | 254 |
} |
224 |
applyTransformToDrawingStatus(geometries, selected, at);
|
|
255 |
applyTransformToDrawingStatus(drawingStatus, selected, at);
|
|
225 | 256 |
} |
226 | 257 |
} |
227 | 258 |
} else { |
228 | 259 |
double unity = mousePosition.getX()-origin.getX(); |
229 |
Line line = |
|
230 |
createHorizontalLineFromAPointWithLenght(origin, unity, subType); |
|
231 |
geometries.addGeometry(line); |
|
260 |
createRule(drawingStatus, origin, unity, unity, subType); //+(Math.signum(unity)*0.01), subType); |
|
261 |
|
|
232 | 262 |
} |
233 | 263 |
|
234 | 264 |
} |
235 |
return geometries;
|
|
265 |
return drawingStatus;
|
|
236 | 266 |
} |
237 | 267 |
} catch (Exception e) { |
238 | 268 |
throw new DrawServiceException(e); |
... | ... | |
241 | 271 |
} |
242 | 272 |
|
243 | 273 |
private Line createHorizontalLineFromAPointWithLenght(Point origin, |
244 |
double rawScale, int subType) throws CreateGeometryException {
|
|
274 |
double length, int subType) throws CreateGeometryException {
|
|
245 | 275 |
GeometryManager geometryManager = GeometryLocator.getGeometryManager(); |
246 | 276 |
|
247 | 277 |
Line line = geometryManager.createLine(subType); |
248 | 278 |
line.addVertex(origin); |
249 | 279 |
Point p3 = |
250 |
geometryManager.createPoint(origin.getX() + rawScale,
|
|
280 |
geometryManager.createPoint(origin.getX() + length,
|
|
251 | 281 |
origin.getY(), subType); |
252 | 282 |
line.addVertex(p3); |
253 | 283 |
return line; |
254 | 284 |
} |
255 | 285 |
|
256 |
private Line createMark(Point point,double distance, double height, int subType) throws CreateGeometryException { |
|
286 |
private ISimpleTextSymbol getTextSymbol(){ |
|
287 |
SymbologyManager symbologyManager = SymbologyLocator.getSymbologyManager(); |
|
288 |
ISimpleTextSymbol textSymbol = symbologyManager.createSimpleTextSymbol(); |
|
289 |
textSymbol.setFontSize(10); |
|
290 |
return textSymbol; |
|
291 |
} |
|
292 |
|
|
293 |
private void createRule(DefaultDrawingStatus drawingStatus, Point point, double unity, double length, int subType) throws CreateGeometryException { |
|
294 |
if(unity==0.0 || length==0.0){ |
|
295 |
return; |
|
296 |
} |
|
257 | 297 |
GeometryManager geometryManager = GeometryLocator.getGeometryManager(); |
298 |
EditingProviderManager editingProviderManager = |
|
299 |
EditingProviderLocator.getProviderManager(); |
|
300 |
ISymbol ruleUnitySymbol = editingProviderManager.getSymbol("rule-unity-symbol"); |
|
301 |
ISymbol ruleDecimalSymbol = editingProviderManager.getSymbol("rule-decimal-symbol"); |
|
302 |
ISymbol ruleAxisSymbol = editingProviderManager.getSymbol("rule-axis-symbol"); |
|
258 | 303 |
|
259 |
Line line = geometryManager.createLine(subType); |
|
260 |
line.addVertex(point.getX()+distance, point.getY()-height/2); |
|
261 |
line.addVertex(point.getX()+distance, point.getY()+height/2); |
|
262 |
return line; |
|
263 |
} |
|
304 |
ViewPort vp = this.mapContext.getViewPort(); |
|
264 | 305 |
|
265 |
private void createRule(DefaultDrawingStatus geometries, Point point, double unity, double length, double height, int subType) throws CreateGeometryException { |
|
266 |
double pos = 0; |
|
306 |
Line line = |
|
307 |
createHorizontalLineFromAPointWithLenght(point, length, subType); |
|
308 |
drawingStatus.addStatus(line, ruleAxisSymbol, ""); |
|
309 |
|
|
310 |
double pos = 0.0; |
|
267 | 311 |
int i = 0; |
268 |
while (Math.abs(pos)<Math.abs(length)) { |
|
269 |
Line mark = null; |
|
312 |
// Se le a?ade 0.01 del length a la condici?n de parada del bucle para evitar |
|
313 |
// que por problemas de precisi?n de los n?meros en punto flotante |
|
314 |
// no se termine de dibujar la regla |
|
315 |
while (Math.abs(pos)<=Math.abs(length)*1.01) { |
|
316 |
Point mark = null; |
|
317 |
mark = geometryManager.createPoint(point.getX()+pos,point.getY(), subType); |
|
270 | 318 |
if (i%10==0){ |
271 |
mark = createMark(point, pos, height, subType); |
|
319 |
drawingStatus.addStatus(mark, ruleUnitySymbol, ""); |
|
320 |
ISimpleTextSymbol textSymbol = getTextSymbol(); |
|
321 |
Point textPoint = geometryManager.createPoint(mark.getX()-vp.toMapDistance(3), mark.getY()-vp.toMapDistance(10), subType); |
|
322 |
drawingStatus.addStatus(textPoint, textSymbol, String.valueOf(((int)Math.signum(length*unity))*i/10)); |
|
323 |
|
|
272 | 324 |
} else { |
273 |
mark = createMark(point, pos, height/2, subType);
|
|
325 |
drawingStatus.addStatus(mark, ruleDecimalSymbol, "");
|
|
274 | 326 |
} |
275 |
geometries.addGeometry(mark); |
|
276 | 327 |
pos += Math.signum(length)*Math.signum(unity)*unity/10; |
277 | 328 |
i++; |
278 | 329 |
} |
279 |
Line finalMark = createMark(point, length, height, subType); |
|
280 |
geometries.addGeometry(finalMark); |
|
281 | 330 |
} |
282 | 331 |
|
283 | 332 |
|
... | ... | |
306 | 355 |
AffineTransform |
307 | 356 |
.getTranslateInstance(-axisP1.getX(), -axisP1.getY()); |
308 | 357 |
|
309 |
AffineTransform rotate = AffineTransform.getScaleInstance(scale,scale);
|
|
358 |
AffineTransform scaleTransform = AffineTransform.getScaleInstance(scale,scale);
|
|
310 | 359 |
|
311 | 360 |
AffineTransform inverseTranslate = |
312 | 361 |
AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY()); |
313 | 362 |
AffineTransform at = new AffineTransform(translate); |
314 | 363 |
|
315 |
at.preConcatenate(rotate);
|
|
364 |
at.preConcatenate(scaleTransform);
|
|
316 | 365 |
at.preConcatenate(inverseTranslate); |
317 | 366 |
return at; |
318 | 367 |
} |
Also available in: Unified diff