Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.circlecr / src / main / java / org / gvsig / vectorediting / lib / prov / circlecr / CircleCREditingProvider.java @ 97

History | View | Annotate | Download (6.7 KB)

1
/*
2
 * Copyright 2014 DiSiD Technologies S.L.L. All rights reserved.
3
 *
4
 * Project  : DiSiD org.gvsig.vectorediting.lib.prov.circle2P
5
 * SVN Id   : $Id$
6
 */
7
package org.gvsig.vectorediting.lib.prov.circlecr;
8

    
9
import java.util.ArrayList;
10
import java.util.HashMap;
11
import java.util.List;
12
import java.util.Map;
13

    
14
import org.gvsig.fmap.dal.feature.FeatureStore;
15
import org.gvsig.fmap.geom.Geometry;
16
import org.gvsig.fmap.geom.GeometryLocator;
17
import org.gvsig.fmap.geom.GeometryManager;
18
import org.gvsig.fmap.geom.aggregate.MultiSurface;
19
import org.gvsig.fmap.geom.primitive.Arc;
20
import org.gvsig.fmap.geom.primitive.Circle;
21
import org.gvsig.fmap.geom.primitive.Curve;
22
import org.gvsig.fmap.geom.primitive.Point;
23
import org.gvsig.fmap.geom.type.GeometryType;
24
import org.gvsig.tools.ToolsLocator;
25
import org.gvsig.tools.dynobject.DynObject;
26
import org.gvsig.tools.i18n.I18nManager;
27
import org.gvsig.tools.service.spi.ProviderServices;
28
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
29
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
30
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
31
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
32
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
33
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
34
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
35
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
36
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
37
import org.gvsig.vectorediting.lib.spi.EditingProvider;
38
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
39
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
42

    
43
public class CircleCREditingProvider extends AbstractEditingProvider implements
44
    EditingProvider {
45

    
46
  private static final Logger logger = LoggerFactory
47
                      .getLogger(CircleCREditingProvider.class);
48

    
49
  private I18nManager i18nManager = ToolsLocator.getI18nManager();
50

    
51
  protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
52

    
53
  protected EditingServiceParameter center = new DefaultEditingServiceParameter(
54
      "Center", i18nManager.getTranslation("center"), TYPE.POSITION);
55

    
56
  protected EditingServiceParameter radius = new DefaultEditingServiceParameter(
57
      "Radius", i18nManager.getTranslation("radius"), TYPE.POSITION, TYPE.VALUE);
58

    
59
  protected Map<EditingServiceParameter, Object> values;
60

    
61
  protected FeatureStore featureStore;
62

    
63
  public CircleCREditingProvider(ProviderServices providerServices,
64
      DynObject parameters) {
65
    super(providerServices);
66
    this.featureStore = (FeatureStore) parameters
67
        .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
68
  }
69

    
70
  public DefaultDrawingStatus getDrawingStatus(Point mousePosition)
71
      throws DrawServiceException {
72
    DefaultDrawingStatus geometries = new DefaultDrawingStatus();
73
    if (values.get(center) != null) {
74
      Point centerPoint = (Point) values.get(center);
75
      try {
76
        Curve line = ((EditingProviderServices) getProviderServices())
77
            .createLine(centerPoint.getX(), centerPoint.getY(),
78
                mousePosition.getX(), mousePosition.getY(), featureStore);
79
        Arc circle = ((EditingProviderServices) getProviderServices()).createArc(centerPoint, mousePosition.distance(centerPoint), 0, 2 * Math.PI, featureStore);
80
        geometries.addGeometry(circle);
81
        geometries.addGeometry(centerPoint);
82
        geometries.addGeometry(line);
83

    
84
      }
85
      catch (Exception e) {
86
        throw new DrawServiceException(e);
87
      }
88

    
89
      return geometries;
90
    }
91

    
92
    return null;
93

    
94
  }
95

    
96
  public EditingServiceParameter next() {
97
    if (values.get(center) == null) {
98
      return this.center;
99
    }
100
    else if (values.get(radius) == null) {
101
      return this.radius;
102
    }
103
    return null;
104
  }
105

    
106
  public void stop() {
107

    
108
  }
109

    
110
  private void validateAndInsertValue(EditingServiceParameter param,
111
                                      Object value)
112
      throws InvalidEntryException {
113
    if (param == center) {
114
      if (value instanceof Point) {
115
        values.put(param, value);
116
        return;
117
      }
118
    }
119
    else if (param == radius) {
120
      if (value instanceof Point) {
121
        Double radiusValue = null;
122
        try {
123
          radiusValue = ((Point) value).distance((Point) values.get(center));
124
        }
125
        catch (Exception e) {
126
          throw new InvalidEntryException(e);
127
        }
128
        if (radiusValue != null) {
129
          values.put(param, radiusValue);
130
        }
131
      }
132
      else if (value instanceof Double) {
133
        values.put(param, value);
134
      }
135
      else if (value instanceof String) {
136
        // FIXME: el string podr?a ser tambi?n un punto
137
        Double.parseDouble((String) value);
138
        values.put(param, value);
139
      }
140
    }
141
  }
142

    
143
  public List<EditingServiceParameter> getParameters() {
144
    List<EditingServiceParameter> list = new ArrayList<EditingServiceParameter>();
145
    list.add(center);
146
    list.add(radius);
147
    return list;
148
  }
149

    
150
  public void setValue(Object value) throws InvalidEntryException {
151
    EditingServiceParameter param = next();
152
    validateAndInsertValue(param, value);
153
  }
154

    
155
  public void finishAndStore() throws FinishServiceException {
156
    EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices();
157
    Geometry geometry = finish();
158
    editingProviderServices.insertGeometryIntoFeatureStore(geometry, featureStore);
159
  }
160

    
161
  public Geometry finish() throws FinishServiceException {
162
    Point centerPoint = (Point) values.get(center);
163
    double radiusValue = (Double) values.get(radius);
164
    EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices();
165
    try {
166
      GeometryType storeGeomType = editingProviderServices
167
          .getGeomType(featureStore);
168
      Geometry geometry = null;
169
      if (storeGeomType.isTypeOf(MULTISURFACE)) {
170
              geometry = editingProviderServices.createCircle(centerPoint,
171
                              radiusValue, featureStore);
172
              MultiSurface multisurface;
173
              multisurface = geomManager.createMultiSurface(storeGeomType
174
                              .getSubType());
175
              multisurface.addSurface((Circle) geometry);
176
              return multisurface;
177
      } else {
178
        geometry = editingProviderServices.createCircle(centerPoint,
179
            radiusValue, featureStore);
180
      }
181
      return geometry;
182
    }
183
    catch (Exception e) {
184
      throw new FinishServiceException(e);
185
    }
186
  }
187

    
188
  public void start() throws StartServiceException {
189
          //TODO: A?adir comprobaci?n de si se puede realizar la operaci?n
190
    this.values = new HashMap<EditingServiceParameter, Object>();
191
  }
192

    
193
  public String getName() {
194
    return CircleCREditingProviderFactory.PROVIDER_NAME;
195
  }
196

    
197
}