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