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

History | View | Annotate | Download (7.24 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.MultiCurve;
19
import org.gvsig.fmap.geom.aggregate.MultiSurface;
20
import org.gvsig.fmap.geom.primitive.Arc;
21
import org.gvsig.fmap.geom.primitive.Circle;
22
import org.gvsig.fmap.geom.primitive.Curve;
23
import org.gvsig.fmap.geom.primitive.Point;
24
import org.gvsig.fmap.geom.type.GeometryType;
25
import org.gvsig.tools.dynobject.DynObject;
26
import org.gvsig.tools.service.spi.ProviderServices;
27
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
28
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
29
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
30
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
31
import org.gvsig.vectorediting.lib.api.exceptions.InvalidOptionException;
32
import org.gvsig.vectorediting.lib.api.exceptions.InvalidValueException;
33
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
34
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
35
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
36
import org.gvsig.vectorediting.lib.spi.EditingProvider;
37
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
38
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
39
import org.slf4j.Logger;
40
import org.slf4j.LoggerFactory;
41

    
42
public class CircleCREditingProvider extends AbstractEditingProvider implements
43
    EditingProvider {
44

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

    
48
  protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
49

    
50
  private EditingServiceParameter center = new DefaultEditingServiceParameter(
51
      "Center", "Center position of circle", TYPE.POSITION);
52

    
53
  private EditingServiceParameter radius = new DefaultEditingServiceParameter(
54
      "Radius", "Radius of circle", TYPE.POSITION, TYPE.VALUE);
55

    
56
  private Map<EditingServiceParameter, Object> values;
57

    
58
  private FeatureStore featureStore;
59

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

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

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

    
88
      return geometries;
89
    }
90

    
91
    return null;
92

    
93
  }
94

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

    
105
  public void stop() {
106

    
107
  }
108

    
109
  private void validateAndInsertValue(EditingServiceParameter param,
110
                                      Object value) throws InvalidValueException {
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 InvalidValueException(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 value(Object value) throws InvalidValueException, InvalidOptionException{
149
    EditingServiceParameter param = next();
150
    validateAndInsertValue(param, value);
151
  }
152

    
153
  public void finish() throws FinishServiceException{
154
    Point centerPoint = (Point) values.get(center);
155
    double radiusValue = (Double) values.get(radius);
156
    EditingProviderServices editingProviderServices = (EditingProviderServices) getProviderServices();
157
    try {
158
      GeometryType storeGeomType = editingProviderServices
159
          .getGeomType(featureStore);
160
      Geometry geometry = null;
161
      if (storeGeomType.isTypeOf(SURFACE)) {
162
        geometry = editingProviderServices.createCircle(centerPoint,
163
            radiusValue, featureStore);
164
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
165
            featureStore);
166
      }
167
      else if (storeGeomType.isTypeOf(CURVE)) {
168
        geometry = editingProviderServices.createArc(centerPoint, radiusValue,
169
            0, 2 * Math.PI, featureStore);
170
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
171
            featureStore);
172
      }
173
      else if (storeGeomType.isTypeOf(MULTISURFACE)) {
174
        geometry = editingProviderServices.createCircle(centerPoint,
175
            radiusValue, featureStore);
176
        MultiSurface multisurface;
177
        multisurface = geomManager.createMultiSurface(storeGeomType
178
            .getSubType());
179
        multisurface.addSurface((Circle) geometry);
180
        editingProviderServices.insertGeometryIntoFeatureStore(multisurface,
181
            featureStore);
182
      }
183
      else if (storeGeomType.isTypeOf(MULTICURVE)) {
184
        geometry = editingProviderServices.createArc(centerPoint, radiusValue,
185
            0, 2 * Math.PI, featureStore);
186
        MultiCurve multicurve;
187
        multicurve = geomManager.createMultiCurve(storeGeomType.getSubType());
188
        multicurve.addCurve((Arc) geometry);
189
        editingProviderServices.insertGeometryIntoFeatureStore(multicurve,
190
            featureStore);
191
      }
192
      else {
193
        editingProviderServices.insertGeometryIntoFeatureStore(geometry,
194
            featureStore);
195
      }
196
    }
197
    catch (Exception e) {
198
      throw new FinishServiceException(e);
199
    }
200
  }
201

    
202
  public void start() {
203
    this.values = new HashMap<EditingServiceParameter, Object>();
204
  }
205

    
206
  public String getName() {
207
    return CircleCREditingProviderFactory.PROVIDER_NAME;
208
  }
209

    
210
}