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.circle2P / src / main / java / org / gvsig / vectorediting / lib / prov / circlecr / CircleCREditingProvider.java @ 47

History | View | Annotate | Download (5.38 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.aggregate.MultiCurve;
17
import org.gvsig.fmap.geom.aggregate.MultiSurface;
18
import org.gvsig.fmap.geom.exception.CreateGeometryException;
19
import org.gvsig.fmap.geom.primitive.Arc;
20
import org.gvsig.fmap.geom.primitive.Circle;
21
import org.gvsig.fmap.geom.primitive.Point;
22
import org.gvsig.fmap.geom.type.GeometryType;
23
import org.gvsig.tools.dynobject.DynObject;
24
import org.gvsig.tools.service.spi.ProviderServices;
25
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
26
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
27
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
28
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
29
import org.gvsig.vectorediting.lib.spi.EditingProvider;
30
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
31
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

    
35
public class CircleCREditingProvider extends AbstractEditingProvider implements
36
    EditingProvider {
37

    
38
  private static final Logger logger = LoggerFactory.getLogger(CircleCREditingProvider.class);
39

    
40
  private EditingServiceParameter center = new DefaultEditingServiceParameter(
41
      "Center", "Center position of circle", TYPE.POSITION);
42

    
43
  private EditingServiceParameter radius = new DefaultEditingServiceParameter(
44
      "Radius", "Radius of circle", TYPE.VALUE);
45

    
46
  private Map<EditingServiceParameter, Object> values;
47

    
48
  private FeatureStore featureStore;
49

    
50
  public CircleCREditingProvider(ProviderServices providerServices,
51
      DynObject parameters) {
52
    super(providerServices);
53
    this.featureStore = (FeatureStore) parameters
54
        .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
55
  }
56

    
57
  public Geometry draw(Point mousePosition) {
58
    if (values.get(center) != null) {
59
      Point centerPoint = (Point) values.get(center);
60
      return createCircle(centerPoint, mousePosition, featureStore);
61
    }
62

    
63
    return null;
64

    
65
  }
66

    
67
  public EditingServiceParameter next() {
68
    if (values.get(center) == null) {
69
      return this.center;
70
    }
71
    else if (values.get(radius) == null) {
72
      return this.radius;
73
    }
74
    return null;
75
  }
76

    
77
  public void stop(){
78

    
79
  }
80

    
81
  public boolean isValidValue(EditingServiceParameter param, Object value) {
82
          if (param ==center){
83
                  if (value instanceof Point) {
84
                          return true;
85
                  }
86
          } else if (param == radius) {
87
                  if (value instanceof Point) {
88
                          return true;
89
                  } else if (value instanceof String) {
90
                          //TODO:
91

    
92
                  }
93
          }
94
    return false;
95
  }
96

    
97
  public List<EditingServiceParameter> getParameters() {
98
    List<EditingServiceParameter> list = new ArrayList<EditingServiceParameter>();
99
    list.add(center);
100
    list.add(radius);
101
    return list;
102
  }
103

    
104
  public void value(Object value) {
105
    EditingServiceParameter param = next();
106
    if (isValidValue(param, value)) {
107
      values.put(param, value);
108
    }
109
  }
110

    
111
  public void finish() {
112
    Point centerPoint = (Point) values.get(center);
113
    double radiusValue = ((Double)values.get(radius)).doubleValue();
114
    GeometryType storeGeomType = getGeomType(featureStore);
115
    Geometry geometry = null;
116
    if(storeGeomType.isTypeOf(SURFACE)){
117
                geometry = createCircle(centerPoint, radiusValue, featureStore);
118
                ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
119
    } else if(storeGeomType.isTypeOf(CURVE)){
120
                geometry = createArc(centerPoint, radiusValue, 0, 2*Math.PI, featureStore);
121
                ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
122
    } else if(storeGeomType.isTypeOf(MULTISURFACE)){
123
                geometry = createCircle(centerPoint, radiusValue, featureStore);
124
                MultiSurface multisurface;
125
                try {
126
                        multisurface = geomManager.createMultiSurface(storeGeomType.getSubType());
127
                        multisurface.addSurface((Circle)geometry);
128
                    ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(multisurface, featureStore);
129
                } catch (CreateGeometryException e) {
130
                        logger.error("Can't create multisurface", e);
131
                        ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
132
                }
133
        } else if(storeGeomType.isTypeOf(MULTICURVE)){
134
                geometry = createArc(centerPoint, radiusValue, 0, 2*Math.PI, featureStore);
135
                MultiCurve multicurve;
136
                try {
137
                        multicurve = geomManager.createMultiCurve(storeGeomType.getSubType());
138
                        multicurve.addCurve((Arc)geometry);
139
                    ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(multicurve, featureStore);
140
                } catch (CreateGeometryException e) {
141
                        logger.error("Can't create multisurface", e);
142
                        ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
143
                }
144

    
145
    } else {
146
                ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
147
        }
148
  }
149

    
150
  public void start() {
151
    this.values = new HashMap<EditingServiceParameter, Object>();
152
  }
153

    
154
  public String getName() {
155
    return CircleCREditingProviderFactory.PROVIDER_NAME;
156
  }
157

    
158
}