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 @ 99

History | View | Annotate | Download (6.64 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 EditingServiceParameter center = new DefaultEditingServiceParameter(
52
      "Center", i18nManager.getTranslation("center"), TYPE.POSITION);
53

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

    
57
  protected Map<EditingServiceParameter, Object> values;
58

    
59
  protected FeatureStore featureStore;
60

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

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

    
82
      }
83
      catch (Exception e) {
84
        throw new DrawServiceException(e);
85
      }
86

    
87
      return geometries;
88
    }
89

    
90
    return null;
91

    
92
  }
93

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

    
104
  public void stop() {
105

    
106
  }
107

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

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

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

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

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

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

    
191
  public String getName() {
192
    return CircleCREditingProviderFactory.PROVIDER_NAME;
193
  }
194

    
195
}