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

History | View | Annotate | Download (6.55 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

    
41
public class CircleCREditingProvider extends AbstractEditingProvider implements
42
    EditingProvider {
43

    
44
  private I18nManager i18nManager = ToolsLocator.getI18nManager();
45

    
46
  protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
47

    
48
  protected EditingServiceParameter center = new DefaultEditingServiceParameter(
49
      "Center", i18nManager.getTranslation("center"), TYPE.POSITION);
50

    
51
  protected EditingServiceParameter radius = new DefaultEditingServiceParameter(
52
      "Radius", i18nManager.getTranslation("radius"), TYPE.POSITION, TYPE.VALUE);
53

    
54
  protected Map<EditingServiceParameter, Object> values;
55

    
56
  protected FeatureStore featureStore;
57

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

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

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

    
86
      return geometries;
87
    }
88

    
89
    return null;
90

    
91
  }
92

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

    
103
  public void stop() {
104

    
105
  }
106

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

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

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

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

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

    
185
  public void start() throws StartServiceException {
186
    this.values = new HashMap<EditingServiceParameter, Object>();
187
  }
188

    
189
  public String getName() {
190
    return CircleCREditingProviderFactory.PROVIDER_NAME;
191
  }
192

    
193
}