Revision 2995

View differences:

org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/resources-plugin/i18n/text.properties
129 129
center_of_rotation = Centro de rotaci\u00f3n
130 130
angle_of_rotation = \u00c1ngulo de rotaci\u00f3n (grados)
131 131
origin_point = Origen
132
scale_factor_or_reference_point = Factor de escala o punto de referencia
133
second_scale_point = Segundo punto para la escala
134 132
tolerance = Tolerancia
135 133
line_to_extend = Seleccione l\u00ednea para alargar
136 134
line_to_trim = Seleccione l\u00ednea para partir
......
226 224
_Direction=Direcci\u00f3n
227 225
equidistant_copies=Copias equidistantes
228 226
_save=Guardar
229
_export=Exportar
227
_export=Exportar
228
_Origin_point = Origen
229
_Key_origin_center=C
230
_Origin_center=Centro
231
_Proportional_scale_question=\u00bfEscala proporcional?
232
_Proportional_scale=Escala proporcional
233
_Scale_factor_or_reference_point = Factor de escala o punto de referencia
234
_Horizontal_scale_factor_or_reference_point=Factor de escala horizontal o punto de referencia
235
_Second_scale_point = Segundo punto para la escala
236
_Vertical_scale_factor=Factor de escala vertical
org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties
127 127
center_of_rotation=Center of rotation
128 128
angle_of_rotation=Angle of rotation (degree)
129 129
origin_point = Origin
130
scale_factor_or_reference_point = Scale factor or reference point
131
second_scale_point = Second scale point
132 130
tolerance = Tolerance
133 131
line_to_extend = Select line to extend
134 132
line_to_trim = Select line to trim
......
224 222
_Direction=Direction
225 223
equidistant_copies=Equidistant copies
226 224
_save=Save
227
_export=Export
225
_export=Export
226
_Origin_point = Origin
227
_Key_origin_center=C
228
_Origin_center=Center
229
_Proportional_scale_question=Proportional scale?
230
_Proportional_scale=Proportional scale
231
_Scale_factor_or_reference_point = Scale factor or reference point
232
_Horizontal_scale_factor_or_reference_point=Horizontal scale factor or reference point
233
_Second_scale_point = Second scale point
234
_Vertical_scale_factor=Vertical scale factor
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
26 26

  
27 27

  
28 28
import java.awt.geom.AffineTransform;
29
import java.text.DecimalFormat;
29 30
import java.util.ArrayList;
30 31
import java.util.HashMap;
31 32
import java.util.List;
......
42 43
import org.gvsig.fmap.geom.aggregate.MultiCurve;
43 44
import org.gvsig.fmap.geom.aggregate.MultiPoint;
44 45
import org.gvsig.fmap.geom.aggregate.MultiSurface;
46
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
45 47
import org.gvsig.fmap.geom.exception.CreateGeometryException;
46 48
import org.gvsig.fmap.geom.operation.GeometryOperationException;
47 49
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
48 50
import org.gvsig.fmap.geom.primitive.Curve;
51
import org.gvsig.fmap.geom.primitive.Envelope;
49 52
import org.gvsig.fmap.geom.primitive.Line;
50 53
import org.gvsig.fmap.geom.primitive.Point;
51 54
import org.gvsig.fmap.geom.primitive.Surface;
......
54 57
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
55 58
import org.gvsig.symbology.SymbologyLocator;
56 59
import org.gvsig.symbology.SymbologyManager;
60
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
57 61
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol;
58 62
import org.gvsig.tools.ToolsLocator;
63
import org.gvsig.tools.dataTypes.DataTypes;
59 64
import org.gvsig.tools.dynobject.DynObject;
60 65
import org.gvsig.tools.exception.BaseException;
61 66
import org.gvsig.tools.i18n.I18nManager;
......
67 72
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
68 73
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
69 74
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
75
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
70 76
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
71 77
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
72 78
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
79
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions;
73 80
import org.gvsig.vectorediting.lib.spi.EditingProvider;
74 81
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
75 82
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
......
78 85

  
79 86
public class ScaleEditingProvider extends AbstractEditingProvider implements
80 87
    EditingProvider {
88
    
89
    public static final String KEY_ORIGIN_CENTER = "_Key_origin_center";
81 90

  
91
    public static final String ORIGIN_CENTER = "_Origin_center";
92

  
93
    private static final String PROPORTIONAL_SCALE_QUESTION = "_Proportional_scale_question";
94
    private static final String PROPORTIONAL_SCALE = "_Proportional_scale";
95

  
96
    private static final String YES = "_yes";
97
    private static final String NO = "_no";
98
    private static final String SHORT_YES = "_short_yes";
99
    private static final String SHORT_NO = "_short_no";
100

  
101

  
82 102
    private final EditingServiceParameter selectionParameter;
83 103

  
104
    private final EditingServiceParameter proportionalModeParameter;
105
    
84 106
    private final EditingServiceParameter originPointParameter;
107
    
108
    private String center;
85 109

  
86 110
    private final EditingServiceParameter scaleFactorOrReferencePointParameter;
87

  
111
    
88 112
    private final EditingServiceParameter secondScalePointParameter;
89 113

  
114
    private final EditingServiceParameter verticalScaleFactorParameter;
115

  
90 116
    private Map<EditingServiceParameter, Object> values;
91 117

  
92 118
    private final FeatureStore featureStore;
......
96 122
    public ScaleEditingProvider(ProviderServices providerServices,
97 123
        DynObject parameters) {
98 124
        super(providerServices);
125
        
126

  
99 127
        this.mapContext =
100 128
            (MapContext) parameters
101 129
                .getDynValue(EditingProviderFactory.MAPCONTEXT_FIELD);
......
106 134

  
107 135
        I18nManager i18nManager = ToolsLocator.getI18nManager();
108 136

  
109
        this.selectionParameter =
110
            new DefaultEditingServiceParameter("selection",
111
                i18nManager.getTranslation("selection"), TYPE.SELECTION);
137
        this.selectionParameter 
138
                = new DefaultEditingServiceParameter("selection",
139
                        i18nManager.getTranslation("selection"), TYPE.SELECTION);
112 140

  
113
        this.originPointParameter =
114
            new DefaultEditingServiceParameter("origin_point",
115
                i18nManager.getTranslation("origin_point"), TYPE.VALUE, TYPE.POSITION);
141
        DefaultEditingServiceParameterOptions options = new DefaultEditingServiceParameterOptions()
142
                .add(i18nManager.getTranslation(ORIGIN_CENTER), ORIGIN_CENTER, i18nManager.getTranslation(KEY_ORIGIN_CENTER));
116 143

  
144

  
145
        String consoleMsg
146
                = ((EditingProviderServices) providerServices).makeConsoleMessage(
147
                        "_Origin_point", options);
148

  
149
        this.originPointParameter
150
                = new DefaultEditingServiceParameter(
151
                        "_Origin_point",
152
                        consoleMsg,
153
                        options,
154
                        null,
155
                        TYPE.POSITION, TYPE.OPTION);
156

  
117 157
        this.scaleFactorOrReferencePointParameter =
118
            new DefaultEditingServiceParameter("scale_factor_or_reference_point",
119
                i18nManager.getTranslation("scale_factor_or_reference_point"), TYPE.VALUE, TYPE.POSITION);
158
            new DefaultEditingServiceParameter("_Scale_factor_or_reference_point",
159
                i18nManager.getTranslation("_Horizontal_scale_factor_or_reference_point"), TYPE.VALUE, TYPE.POSITION);
120 160

  
161
        this.verticalScaleFactorParameter =
162
            new DefaultEditingServiceParameter("_Vertical_scale_factor",
163
                i18nManager.getTranslation("_Vertical_scale_factor"), TYPE.VALUE);
164

  
121 165
        this.secondScalePointParameter =
122
            new DefaultEditingServiceParameter("second_scale_point",
123
                i18nManager.getTranslation("second_scale_point"), TYPE.POSITION);
166
            new DefaultEditingServiceParameter("_Second_scale_point",
167
                i18nManager.getTranslation("_Second_scale_point"), TYPE.POSITION);
168
        
169
        DefaultEditingServiceParameterOptions proportionalModeOptions=  new DefaultEditingServiceParameterOptions()
170
                .add(YES, true, i18nManager.getTranslation(SHORT_YES))
171
                .add(NO, false, i18nManager.getTranslation(SHORT_NO));
172

  
173
        String proportionalModeConsoleMsg
174
                = ((EditingProviderServices) providerServices).makeConsoleMessage(
175
                        PROPORTIONAL_SCALE_QUESTION, proportionalModeOptions);
176

  
177
        this.proportionalModeParameter
178
                = new DefaultEditingServiceParameter(
179
                        PROPORTIONAL_SCALE,
180
                        proportionalModeConsoleMsg, 
181
                        proportionalModeOptions, 
182
                        true, 
183
                        true, 
184
                        TYPE.OPTION).setDataType(DataTypes.BOOLEAN);
185

  
124 186
    }
125 187

  
126 188
    @Override
127 189
    public List<EditingServiceParameter> getParameters() {
128
        List<EditingServiceParameter> list =
129
            new ArrayList<>();
190
        //FIXME:
191
        List<EditingServiceParameter> list = new ArrayList<>();
130 192
        list.add(selectionParameter);
131 193
        list.add(originPointParameter);
132 194
        list.add(secondScalePointParameter);
195
        list.add(proportionalModeParameter);
196
        list.add(scaleFactorOrReferencePointParameter);
197
        list.add(verticalScaleFactorParameter);
133 198
        return list;
134 199
    }
135 200

  
136 201
    private void validateAndInsertValue(EditingServiceParameter param,
137 202
        Object value) throws InvalidEntryException {
203

  
138 204
        if (param == selectionParameter) {
139 205
            if (value instanceof FeatureSelection) {
140 206
                values.put(param, value);
141 207
            }
142 208
        } else if (param == originPointParameter) {
143
            if (value instanceof Point) {
209
            if (value == null){
210
                center = null;
211
                values.remove(param);
212
            } else if (value instanceof Point) {
144 213
                values.put(param, value);
214
                center = null;
215
            } else if (value instanceof String) {
216
                if(ORIGIN_CENTER.equalsIgnoreCase((String) param.getOptions2().getValue(value, param.getDefaultValue()))){
217
                    center = ORIGIN_CENTER;
218
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
219
                    FeatureSelection selected
220
                            = (FeatureSelection) values.get(this.selectionParameter);
221
                    if ((selected != null) && !selected.isEmpty()) {
222
                        try {
223
                            int subType = this.getProviderServices().getSubType(featureStore);
224
                            Envelope envelope = geomManager.createEnvelope(subType);
225
                            for (Feature feature : selected) {
226
                                Envelope featEnv = feature.getDefaultEnvelope();
227
                                envelope.add(featEnv);
228
                            }
229
                            if(!envelope.isEmpty()){
230
                                Point center = geomManager.createPoint(envelope.getCenter(0), envelope.getCenter(1), subType);
231
                                values.put(param, center);
232
                            }
233
                        } catch (DataException | CreateGeometryException | CreateEnvelopeException ex) {
234
                            throw new InvalidEntryException(ex);
235
                        }
236
                    }
237
                } else {
238
                    center = null;
239
                    values.remove(param);
240
                }
145 241
            }
146 242
        } else if (param == scaleFactorOrReferencePointParameter) {
147 243
            if (value instanceof Point) {
148
                if (((Point) value).getX() == ((Point)values.get(originPointParameter)).getX()){
244
                if (((Point) value).equals((Point)values.get(originPointParameter))){
149 245
                    throw new InvalidEntryException(null);
150 246
                }
151 247
                values.put(param, value);
......
159 255
            if (value instanceof Point) {
160 256
                values.put(param, value);
161 257
            }
258
        } else if (param == proportionalModeParameter) {
259
            boolean proportionalMode = (boolean) param.getOptions2().getValue(value, param.getDefaultValue());
260
             values.put(param, proportionalMode);
261
        } else if (param == verticalScaleFactorParameter) {
262
             if (value instanceof Double) {
263
                if ((Double)value == 0.0){
264
                    throw new InvalidEntryException(null);
265
                }
266
                values.put(param, value);
267
            } else {
268
                throw new InvalidEntryException(null);
269
            }
162 270
        }
163 271
    }
164 272

  
165 273
    @Override
166 274
    public EditingServiceParameter next() {
275
        boolean proportionalModeValue = (boolean) values.get(proportionalModeParameter);
167 276
        if (values.get(selectionParameter) == null) {
168 277
            return this.selectionParameter;
169 278
        } else if (values.get(originPointParameter) == null) {
170 279
            return this.originPointParameter;
171 280
        } else if (values.get(scaleFactorOrReferencePointParameter) == null) {
281
            I18nManager i18nManager = ToolsLocator.getI18nManager();
282
            if(proportionalModeValue){
283
                this.scaleFactorOrReferencePointParameter.setDescription(i18nManager.getTranslation("_Scale_factor_or_reference_point"));
284
            } else {
285
                this.scaleFactorOrReferencePointParameter.setDescription(i18nManager.getTranslation("_Horizontal_scale_factor_or_reference_point"));
286
            }
172 287
            return this.scaleFactorOrReferencePointParameter;
173 288
        } else {
174 289
            if (values.get(scaleFactorOrReferencePointParameter) instanceof Point ) {
175 290
                if (values.get(secondScalePointParameter) == null) {
176 291
                    return this.secondScalePointParameter;
177 292
                }
293
            } else {
294
                if (!proportionalModeValue && values.get(verticalScaleFactorParameter) == null) {
295
                    return this.verticalScaleFactorParameter;
296
                }
178 297
            }
179 298
        }
180 299
        return null;
......
189 308

  
190 309
        EditingProviderManager editingProviderManager =
191 310
            EditingProviderLocator.getProviderManager();
192
        ISymbol ruleMarkerSymbol = editingProviderManager.getSymbol("rule-marker-symbol");
311
        IMarkerSymbol ruleMarkerSymbol = (IMarkerSymbol) editingProviderManager.getSymbol("rule-marker-symbol");
312
        IMarkerSymbol verticalRuleMarkerSymbol = (IMarkerSymbol) editingProviderManager.getSymbol("vertical-rule-marker-symbol");
313
        
193 314
        ViewPort vp = this.mapContext.getViewPort();
315
        
316
        DecimalFormat format = new DecimalFormat("0.00");
194 317

  
195

  
318
        
196 319
        EditingProviderServices editingProviderServices =
197 320
            (EditingProviderServices) getProviderServices();
198 321

  
199 322
        FeatureSelection selected =
200 323
            (FeatureSelection) values.get(this.selectionParameter);
201 324
        try {
325
//            IMarkerSymbol verticalRuleMarkerSymbol = (IMarkerSymbol) ruleMarkerSymbol.clone();
326
//            verticalRuleMarkerSymbol.setRotation(Math.PI/2);
202 327
            int subType =
203 328
                editingProviderServices
204 329
                .getSubType(featureStore);
330
            boolean proportional = (boolean) values.get(this.proportionalModeParameter);
205 331
            if ((selected != null) && !selected.isEmpty()) {
206 332
                Point origin = (Point) values.get(this.originPointParameter);
207 333
                if (origin != null) {
208 334
                    Object scaleFactorOrReferencePointValue =
209 335
                        values.get(this.scaleFactorOrReferencePointParameter);
210
                    Double scale = 1.0;
336
                    Double horizontalScale = 1.0;
337
                    Double verticalScale = 1.0;
211 338

  
212 339
                    if (scaleFactorOrReferencePointValue != null) {
213 340
                        if (scaleFactorOrReferencePointValue instanceof Double) {
214
                            scale = (Double) scaleFactorOrReferencePointValue;
341
                            horizontalScale = (Double) scaleFactorOrReferencePointValue;
342
                            if(proportional){
343
                                verticalScale = horizontalScale;
344
                            }
215 345
                        } else if (scaleFactorOrReferencePointValue instanceof Point) {
216
                            double unity = ((Point) scaleFactorOrReferencePointValue).getX()-origin.getX();
217
                            // Unidad de referencia
218
                            createRule(drawingStatus, origin, unity, unity, subType); //+(Math.signum(unity)*0.01), subType);
346
                            // Unidades de referencia
347
                            double horizontalUnity = ((Point) scaleFactorOrReferencePointValue).getX()-origin.getX();
348
                            double verticalUnity = ((Point) scaleFactorOrReferencePointValue).getY()-origin.getY();
349
                            createRule(drawingStatus, origin, horizontalUnity, horizontalUnity, false, subType); //+(Math.signum(unity)*0.01), subType);
350
                            if(!proportional){
351
                                createRule(drawingStatus, origin, verticalUnity, verticalUnity, true, subType); //+(Math.signum(unity)*0.01), subType);
352
                            }
219 353

  
220
                            Object secondScalePointParameter =
354
                            Object secondScalePointValue =
221 355
                                values.get(this.secondScalePointParameter);
222
                            if (secondScalePointParameter != null
223
                                && secondScalePointParameter instanceof Point) {
224
                                double rawScale = ((Point) secondScalePointParameter).getX()-origin.getX();
225
                                scale = rawScale / unity;
226
                                createRule(drawingStatus, origin, unity, rawScale, subType);
356
                            if (secondScalePointValue != null && secondScalePointValue instanceof Point) {
357
                                double horizontalRawScale = ((Point) secondScalePointValue).getX()-origin.getX();
358
                                horizontalScale = horizontalRawScale / horizontalUnity;
359
                                createRule(drawingStatus, origin, horizontalUnity, horizontalRawScale, false, subType);
227 360

  
228
                                Point marker = null;
229
                                marker = geometryManager.createPoint(origin.getX()+rawScale,origin.getY(), subType);
230
                                drawingStatus.addStatus(marker, ruleMarkerSymbol, "");
361
                                Point horizontalMarker = geometryManager.createPoint(origin.getX()+horizontalRawScale,origin.getY(), subType);
362
                                drawingStatus.addStatus(horizontalMarker, ruleMarkerSymbol, "");
231 363
                                ISimpleTextSymbol textSymbol = getTextSymbol();
232
                                Point textPoint = geometryManager.createPoint(marker.getX()-vp.toMapDistance(10), marker.getY()-vp.toMapDistance(20), subType);
233
                                drawingStatus.addStatus(textPoint, textSymbol, String.valueOf(Math.round(scale*100.0)/100.0));
364
                                Point horizontalTextPoint = geometryManager.createPoint(
365
                                        horizontalMarker.getX()-vp.toMapDistance(10), 
366
                                        horizontalMarker.getY()-vp.toMapDistance(20), 
367
                                        subType);
368
                                drawingStatus.addStatus(horizontalTextPoint, textSymbol, format.format(Math.round(horizontalScale*100.0)/100.0));
369
                                
370
                                double verticalRawScale;
371
                                if(proportional){
372
                                    verticalScale = horizontalScale;
373
                                    verticalRawScale = horizontalRawScale;
374
                                } else {
375
                                    verticalRawScale = ((Point) secondScalePointValue).getY()-origin.getY();
376
                                    verticalScale = verticalRawScale / verticalUnity;
377
                                    createRule(drawingStatus, origin, verticalUnity, verticalRawScale, true, subType);
234 378

  
379
                                    Point verticalMarker = geometryManager.createPoint(origin.getX(), origin.getY() + verticalRawScale, subType);
380
                                    drawingStatus.addStatus(verticalMarker, verticalRuleMarkerSymbol, "");
381
                                    Point verticalTextPoint = geometryManager.createPoint(
382
                                            verticalMarker.getX() - vp.toMapDistance(verticalScale<0?40:35),
383
                                            verticalMarker.getY() - vp.toMapDistance(4),
384
                                            subType);
385
                                    drawingStatus.addStatus(verticalTextPoint, textSymbol, format.format(Math.round(verticalScale * 100.0) / 100.0));
386
                                }
387

  
235 388
                            } else {
236
                                double rawScale = mousePosition.getX()-origin.getX();
237
                                scale = rawScale / unity;
238
                                createRule(drawingStatus, origin, unity, rawScale, subType);
239 389

  
240
                                Point marker = null;
241
                                marker = geometryManager.createPoint(origin.getX()+rawScale,origin.getY(), subType);
242
                                drawingStatus.addStatus(marker, ruleMarkerSymbol, "");
390
                                double horizontalRawScale = mousePosition.getX()-origin.getX();
391
                                horizontalScale = horizontalRawScale / horizontalUnity;
392
                                createRule(drawingStatus, origin, horizontalUnity, horizontalRawScale, false, subType);
393

  
394
                                Point horizontalMarker = geometryManager.createPoint(origin.getX()+horizontalRawScale,origin.getY(), subType);
395
                                drawingStatus.addStatus(horizontalMarker, ruleMarkerSymbol, "");
243 396
                                ISimpleTextSymbol textSymbol = getTextSymbol();
244
                                Point textPoint = geometryManager.createPoint(marker.getX()-vp.toMapDistance(10), marker.getY()-vp.toMapDistance(20), subType);
245
                                drawingStatus.addStatus(textPoint, textSymbol, String.valueOf(Math.round(scale*100.0)/100.0));
397
                                Point horizontalTextPoint = geometryManager.createPoint(
398
                                        horizontalMarker.getX() - vp.toMapDistance(10), 
399
                                        horizontalMarker.getY() - vp.toMapDistance(20), 
400
                                        subType);
401
                                drawingStatus.addStatus(horizontalTextPoint, textSymbol, format.format(Math.round(horizontalScale*100.0)/100.0));
402
                                
403
                                double verticalRawScale;
404
                                if(proportional){
405
                                    verticalScale = horizontalScale;
406
                                    verticalRawScale = horizontalRawScale;
407
                                } else {
408
                                    verticalRawScale = ((Point) mousePosition).getY()-origin.getY();
409
                                    verticalScale = verticalRawScale / verticalUnity;
410
                                    createRule(drawingStatus, origin, verticalUnity, verticalRawScale, true, subType);
246 411

  
412
                                    Point verticalMarker = geometryManager.createPoint(origin.getX(),origin.getY()+verticalRawScale, subType);
413
                                    drawingStatus.addStatus(verticalMarker, verticalRuleMarkerSymbol, "");
414
                                    Point verticalTextPoint = geometryManager.createPoint(
415
                                            verticalMarker.getX() - vp.toMapDistance(verticalScale<0?40:35), 
416
                                            verticalMarker.getY() - vp.toMapDistance(4), 
417
                                            subType);
418
                                    drawingStatus.addStatus(verticalTextPoint, textSymbol, format.format(Math.round(verticalScale*100.0)/100.0));
419
                                }
420

  
421

  
422

  
247 423
                                AffineTransform at;
248 424
                                try {
249
                                    at = getScaleAffineTransform(origin, scale);
425
                                    at = getScaleAffineTransform(origin, horizontalScale, verticalScale);
250 426
                                } catch (Exception e) {
251 427
                                    throw new DrawServiceException(e);
252 428
                                }
......
254 430
                            }
255 431
                        }
256 432
                    } else {
257
                        double unity = mousePosition.getX()-origin.getX();
258
                        createRule(drawingStatus, origin, unity, unity, subType); //+(Math.signum(unity)*0.01), subType);
259

  
433
                        if(proportional){
434
                            double unity = mousePosition.getX()-origin.getX();
435
                            createRule(drawingStatus, origin, unity, unity, false, subType); //+(Math.signum(unity)*0.01), subType);
436
                        } else {
437
                            double horizontalUnity = mousePosition.getX()-origin.getX();
438
                            createRule(drawingStatus, origin, horizontalUnity, horizontalUnity, false, subType); //+(Math.signum(unity)*0.01), subType);
439
                            double verticalUnity = mousePosition.getY()-origin.getY();
440
                            createRule(drawingStatus, origin, verticalUnity, verticalUnity, true, subType); //+(Math.signum(unity)*0.01), subType);
441
                            
442
                        }
260 443
                    }
261 444

  
262 445
                }
......
268 451
        return null;
269 452
    }
270 453

  
271
    private Line createHorizontalLineFromAPointWithLenght(Point origin,
272
        double length, int subType) throws CreateGeometryException {
454
    private Line createLineFromAPointWithLenght(Point origin,
455
        double length, int subType, boolean vertical) throws CreateGeometryException {
273 456
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
274 457

  
275 458
        Line line = geometryManager.createLine(subType);
276 459
        line.addVertex(origin);
277
        Point p3 =
278
            geometryManager.createPoint(origin.getX() + length,
279
                origin.getY(), subType);
460
        Point p3;
461
        if (vertical) {
462
            p3 = geometryManager.createPoint(origin.getX(),
463
                            origin.getY() + length, subType);
464

  
465
        } else {
466
            p3 = geometryManager.createPoint(origin.getX() + length,
467
                            origin.getY(), subType);
468
        }
280 469
        line.addVertex(p3);
281 470
        return line;
282 471
    }
......
288 477
        return textSymbol;
289 478
    }
290 479

  
291
    private void createRule(DefaultDrawingStatus drawingStatus, Point point, double unity, double length, int subType) throws CreateGeometryException {
480
    private void createRule(DefaultDrawingStatus drawingStatus, Point point, double unity, double length, boolean vertical, int subType) throws CreateGeometryException {
292 481
        if(unity==0.0 || length==0.0){
293 482
            return;
294 483
        }
295
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
296
        EditingProviderManager editingProviderManager =
297
            EditingProviderLocator.getProviderManager();
298
        ISymbol ruleUnitySymbol = editingProviderManager.getSymbol("rule-unity-symbol");
299
        ISymbol ruleDecimalSymbol = editingProviderManager.getSymbol("rule-decimal-symbol");
484
        
485
        EditingProviderManager editingProviderManager = EditingProviderLocator.getProviderManager();
486

  
487
        ISymbol ruleUnitySymbol;
488
        ISymbol ruleDecimalSymbol;
489

  
490
        if (vertical) {
491
            ruleUnitySymbol = (IMarkerSymbol) editingProviderManager.getSymbol("vertical-rule-unity-symbol");
492
            ruleDecimalSymbol = (IMarkerSymbol) editingProviderManager.getSymbol("vertical-rule-decimal-symbol");
493

  
494
        } else {
495
            ruleUnitySymbol = (IMarkerSymbol) editingProviderManager.getSymbol("rule-unity-symbol");
496
            ruleDecimalSymbol = (IMarkerSymbol) editingProviderManager.getSymbol("rule-decimal-symbol");
497
        }
498

  
300 499
        ISymbol ruleAxisSymbol = editingProviderManager.getSymbol("rule-axis-symbol");
301 500

  
501
        
502
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
503

  
302 504
        ViewPort vp = this.mapContext.getViewPort();
303 505

  
304 506
        Line line =
305
            createHorizontalLineFromAPointWithLenght(point, length, subType);
507
            createLineFromAPointWithLenght(point, length, subType, vertical);
306 508
        drawingStatus.addStatus(line, ruleAxisSymbol, "");
307 509

  
308 510
        double pos = 0.0;
......
311 513
        // que por problemas de precisi?n de los n?meros en punto flotante
312 514
        // no se termine de dibujar la regla
313 515
        while (Math.abs(pos)<=Math.abs(length)*1.01) {
314
            Point mark = geometryManager.createPoint(point.getX()+pos,point.getY(), subType);
516
            Point mark;
517
            if(vertical){
518
                mark = geometryManager.createPoint(point.getX(),point.getY()+pos, subType);
519
            } else {
520
                mark = geometryManager.createPoint(point.getX()+pos,point.getY(), subType);
521
            }
315 522
            if (i%10==0){
316 523
                drawingStatus.addStatus(mark, ruleUnitySymbol, "");
317 524
                ISimpleTextSymbol textSymbol = getTextSymbol();
318
                Point textPoint = geometryManager.createPoint(mark.getX()-vp.toMapDistance(3), mark.getY()-vp.toMapDistance(10), subType);
525
                Point textPoint;
526
                if(vertical) {
527
                    textPoint = geometryManager.createPoint(
528
                            mark.getX()-vp.toMapDistance(pos<0?15:10), 
529
                            mark.getY()-vp.toMapDistance(3), 
530
                            subType);
531
                } else {
532
                    textPoint = geometryManager.createPoint(
533
                            mark.getX()-vp.toMapDistance(3), 
534
                            mark.getY()-vp.toMapDistance(10), 
535
                            subType);
536
                }
319 537
                drawingStatus.addStatus(textPoint, textSymbol, String.valueOf(((int)Math.signum(length*unity))*i/10));
320 538

  
321 539
            } else {
......
326 544
        }
327 545
    }
328 546

  
329

  
330

  
331 547
    private void applyTransformToDrawingStatus(
332 548
        final DefaultDrawingStatus drawingStatus, FeatureSelection selected,
333 549
        final AffineTransform at) throws BaseException {
......
368 584
        });
369 585
    }
370 586

  
371
    private AffineTransform getScaleAffineTransform(Point axisP1, Double scale)
587
    private AffineTransform getScaleAffineTransform(Point axisP1, Double horizontalScale, Double verticalScale)
372 588
        throws GeometryOperationNotSupportedException,
373 589
        GeometryOperationException {
374 590

  
......
376 592
            AffineTransform
377 593
                .getTranslateInstance(-axisP1.getX(), -axisP1.getY());
378 594

  
379
        AffineTransform scaleTransform = AffineTransform.getScaleInstance(scale,scale);
595
        AffineTransform scaleTransform = AffineTransform.getScaleInstance(horizontalScale,verticalScale);
380 596

  
381 597
        AffineTransform inverseTranslate =
382 598
            AffineTransform.getTranslateInstance(axisP1.getX(), axisP1.getY());
......
414 630
        try {
415 631
            if (!selected.isEmpty()) {
416 632
                Point origin = (Point) values.get(this.originPointParameter);
417
                Double scale = null;
633
                Double horizontalScale = null;
634
                Double verticalScale = null;
635
                boolean proportionalMode = (boolean) values.get(proportionalModeParameter);
418 636
                if (origin != null) {
419
                    Object scaleFactorOrReferencePointValue =
637
                    Object horizontalScaleFactorOrReferencePointValue =
420 638
                        values.get(this.scaleFactorOrReferencePointParameter);
421 639

  
422
                    if (scaleFactorOrReferencePointValue != null) {
423
                        if (scaleFactorOrReferencePointValue instanceof Double) {
424
                            scale = (Double) scaleFactorOrReferencePointValue;
425
                        } else if (scaleFactorOrReferencePointValue instanceof Point) {
426
                            Object secondScalePointParameter =
427
                                values.get(this.secondScalePointParameter);
428
                            if (secondScalePointParameter != null
429
                                && secondScalePointParameter instanceof Point) {
430
                                double unity = ((Point) scaleFactorOrReferencePointValue).getX()-origin.getX();
431
                                double rawScale = ((Point) secondScalePointParameter).getX()-origin.getX();
432
                                scale = rawScale / unity;
640
                    if (horizontalScaleFactorOrReferencePointValue != null) {
641
                        if (horizontalScaleFactorOrReferencePointValue instanceof Double) {
642
                            horizontalScale = (Double) horizontalScaleFactorOrReferencePointValue;
643
                            if(proportionalMode){
644
                                verticalScale = horizontalScale;
645
                            } else {
646
                                Object verticalScaleFactorValue =
647
                                    values.get(this.verticalScaleFactorParameter);
648
                                if(verticalScaleFactorValue != null && verticalScaleFactorValue instanceof Double){
649
                                    verticalScale = (Double) verticalScaleFactorValue;
650
                                }
433 651
                            }
652
                        } else if (horizontalScaleFactorOrReferencePointValue instanceof Point) {
653
                            Object secondScalePointValue = values.get(this.secondScalePointParameter);
654
                            if (secondScalePointValue != null && secondScalePointValue instanceof Point) {
655
                                double horizontalUnity = ((Point) horizontalScaleFactorOrReferencePointValue).getX() - origin.getX();
656
                                double horizontalRawScale = ((Point) secondScalePointValue).getX() - origin.getX();
657
                                horizontalScale = horizontalRawScale / horizontalUnity;
658
                                if(proportionalMode) {
659
                                    verticalScale = horizontalScale;
660
                                } else {
661
                                    double verticalUnity = ((Point) horizontalScaleFactorOrReferencePointValue).getY() - origin.getY();
662
                                    double verticalRawScale = ((Point) secondScalePointValue).getY() - origin.getY();
663
                                    verticalScale = verticalRawScale / verticalUnity;
664
                                }
665
                            }
434 666
                        }
435 667
                    }
436 668
                }
437 669

  
438
                if ((origin != null) && (scale != null)) {
670
                if ((origin != null) && (horizontalScale != null) && (verticalScale != null)) {
439 671

  
440 672
                    final AffineTransform at;
441 673
                    try {
442
                        at = getScaleAffineTransform(origin, scale);
674
                        at = getScaleAffineTransform(origin, horizontalScale, verticalScale);
443 675
                    } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
444 676
                        throw new FinishServiceException(e);
445 677
                    }
......
505 737
    public Object getValue(EditingServiceParameter parameter) {
506 738
        return values!=null?values.get(parameter):null;
507 739
    }
740
    
741
    public Object getValue(EditingServiceParameter parameter, EditingServiceParameter.TYPE type) {
742
        if(values == null){
743
            return null;
744
        }
745
        if(parameter == scaleFactorOrReferencePointParameter){
746
            Object value = values.get(parameter);
747
            if (type == TYPE.VALUE) {
748
                if (value instanceof Double) {
749
                    return value;
750
                } else {
751
                    return null;
752
                }
753
            }
754
        } else if(parameter == originPointParameter){
755
            if (type == TYPE.OPTION) {
756
                return center;
757
            }
758
        }
759
        return values!=null?values.get(parameter):null;
760
    }
761

  
762
    
763
    @Override
764
    public boolean isEnabled(EditingServiceParameter parameter) {
765

  
766
        if (parameter == this.proportionalModeParameter) {
767
            return true;
768
        }
769
        return true;
770
    }
771

  
772
    @Override
773
    public void restart() throws StartServiceException, InvalidEntryException, StopServiceException {
774
        values.put(selectionParameter, null);
775
        values.put(originPointParameter, null);
776
        values.put(scaleFactorOrReferencePointParameter, null);
777
        values.put(secondScalePointParameter, null);
778
        values.put(verticalScaleFactorParameter, null);
779
    }
780
    
781
    
782

  
508 783
}
org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.api/src/main/java/org/gvsig/vectorediting/lib/api/EditingServiceParameter.java
91 91
     * @return Description parameter.
92 92
     */
93 93
    public String getDescription();
94
    
95
    /**
96
     * Sets the description. Description is used to show a message on console.
97
     * 
98
     * @param newDescription 
99
     */
100
    public void setDescription(String newDescription);
94 101

  
102

  
95 103
    /**
96 104
     * Gets the default value of this parameter. If this parameter doesn't have
97 105
     * default value, it will return null.

Also available in: Unified diff