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

History | View | Annotate | Download (7.08 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.exception.DataException;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.GeometryLocator;
18
import org.gvsig.fmap.geom.GeometryManager;
19
import org.gvsig.fmap.geom.aggregate.MultiCurve;
20
import org.gvsig.fmap.geom.aggregate.MultiSurface;
21
import org.gvsig.fmap.geom.exception.CreateGeometryException;
22
import org.gvsig.fmap.geom.operation.GeometryOperationException;
23
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
24
import org.gvsig.fmap.geom.primitive.Arc;
25
import org.gvsig.fmap.geom.primitive.Circle;
26
import org.gvsig.fmap.geom.primitive.Curve;
27
import org.gvsig.fmap.geom.primitive.Line;
28
import org.gvsig.fmap.geom.primitive.Point;
29
import org.gvsig.fmap.geom.type.GeometryType;
30
import org.gvsig.tools.dynobject.DynObject;
31
import org.gvsig.tools.exception.BaseException;
32
import org.gvsig.tools.service.spi.ProviderServices;
33
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
34
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
35
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
36
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
37
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
38
import org.gvsig.vectorediting.lib.spi.EditingProvider;
39
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
40
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
41
import org.slf4j.Logger;
42
import org.slf4j.LoggerFactory;
43

    
44
public class CircleCREditingProvider extends AbstractEditingProvider implements
45
    EditingProvider {
46

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

    
50
  protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
51
  
52
  private EditingServiceParameter center = new DefaultEditingServiceParameter(
53
      "Center", "Center position of circle", TYPE.POSITION);
54

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

    
58
  private Map<EditingServiceParameter, Object> values;
59

    
60
  private FeatureStore featureStore;
61

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

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

    
83
      return geometries;
84
    }
85

    
86
    return null;
87

    
88
  }
89

    
90
  public EditingServiceParameter next() {
91
    if (values.get(center) == null) {
92
      return this.center;
93
    }
94
    else if (values.get(radius) == null) {
95
      return this.radius;
96
    }
97
    return null;
98
  }
99

    
100
  public void stop() {
101

    
102
  }
103

    
104
  private void validateAndInsertValue(EditingServiceParameter param,
105
                                      Object value) {
106
    if (param == center) {
107
      if (value instanceof Point) {
108
        values.put(param, value);
109
        return;
110
      }
111
    }
112
    else if (param == radius) {
113
      if (value instanceof Point) {
114
        Double radiusValue = null;
115
        try {
116
          radiusValue = ((Point) value).distance((Point) values.get(center));
117
        }
118
        catch (GeometryOperationNotSupportedException e) {
119
          logger.warn("Can't calculate the radius", e);
120
        }
121
        catch (GeometryOperationException e) {
122
          logger.warn("Can't calculate the radius", e);
123
        }
124
        if (radiusValue != null) {
125
          values.put(param, radiusValue);
126
        }
127
      }
128
      else if (value instanceof Double) {
129
        values.put(param, value);
130
      }
131
      else if (value instanceof String) {
132
        // FIXME: el string podr?a ser tambi?n un punto
133
        Double.parseDouble((String) value);
134
        values.put(param, value);
135
      }
136
    }
137
  }
138

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

    
146
  public void value(Object value) {
147
    EditingServiceParameter param = next();
148
    validateAndInsertValue(param, value);
149
  }
150

    
151
  public void finish() throws CreateGeometryException, DataException {
152
    Point centerPoint = (Point) values.get(center);
153
    double radiusValue = (Double) values.get(radius);
154
    EditingProviderServices editingProviderServices = (EditingProviderServices)
155
        getProviderServices();
156
    GeometryType storeGeomType = editingProviderServices
157
        .getGeomType(featureStore);
158
    Geometry geometry = null;
159
    if (storeGeomType.isTypeOf(SURFACE)) {
160
      geometry = editingProviderServices.createCircle(centerPoint, radiusValue,
161
          featureStore);
162
      editingProviderServices.insertGeometryIntoFeatureStore(geometry,
163
          featureStore);
164
    }
165
    else if (storeGeomType.isTypeOf(CURVE)) {
166
      geometry = editingProviderServices.createArc(centerPoint, radiusValue, 0,
167
          2 * Math.PI, featureStore);
168
      editingProviderServices.insertGeometryIntoFeatureStore(geometry,
169
          featureStore);
170
    }
171
    else if (storeGeomType.isTypeOf(MULTISURFACE)) {
172
      geometry = editingProviderServices.createCircle(centerPoint, radiusValue,
173
          featureStore);
174
      MultiSurface multisurface;
175
      multisurface = geomManager.createMultiSurface(storeGeomType.getSubType());
176
      multisurface.addSurface((Circle) geometry);
177
      editingProviderServices.insertGeometryIntoFeatureStore(multisurface,
178
          featureStore);
179
    }
180
    else if (storeGeomType.isTypeOf(MULTICURVE)) {
181
      geometry = editingProviderServices.createArc(centerPoint, radiusValue, 0,
182
          2 * Math.PI, featureStore);
183
      MultiCurve multicurve;
184
      multicurve = geomManager.createMultiCurve(storeGeomType.getSubType());
185
      multicurve.addCurve((Arc) geometry);
186
      editingProviderServices.insertGeometryIntoFeatureStore(multicurve,
187
          featureStore);
188

    
189
    }
190
    else {
191
      editingProviderServices.insertGeometryIntoFeatureStore(geometry,
192
          featureStore);
193
    }
194
  }
195

    
196
  public void start() {
197
    this.values = new HashMap<EditingServiceParameter, Object>();
198
  }
199

    
200
  public String getName() {
201
    return CircleCREditingProviderFactory.PROVIDER_NAME;
202
  }
203

    
204
}