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

View differences:

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