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 / circle2P / Circle2PEditingProvider.java @ 46

History | View | Annotate | Download (5.79 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.circle2P;
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.operation.GeometryOperationException;
20
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
21
import org.gvsig.fmap.geom.primitive.Arc;
22
import org.gvsig.fmap.geom.primitive.Circle;
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.spi.AbstractEditingProvider;
30
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
31
import org.gvsig.vectorediting.lib.spi.EditingProvider;
32
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
33
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

    
37
public class Circle2PEditingProvider extends AbstractEditingProvider implements
38
    EditingProvider {
39

    
40
  private static final Logger logger = LoggerFactory.getLogger(Circle2PEditingProvider.class);
41

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

    
45
  private EditingServiceParameter radius = new DefaultEditingServiceParameter(
46
      "Radius", "Radius position of circle", TYPE.POSITION);
47

    
48
  private Map<EditingServiceParameter, Object> values;
49

    
50
  private FeatureStore featureStore;
51

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

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

    
65
    return null;
66

    
67
  }
68

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

    
79
  public void stop(){
80

    
81
  }
82

    
83
  public boolean isValidValue(EditingServiceParameter param, Object value) {
84
    return true;
85
  }
86

    
87
  public List<EditingServiceParameter> getParameters() {
88
    List<EditingServiceParameter> list = new ArrayList<EditingServiceParameter>();
89
    list.add(center);
90
    list.add(radius);
91
    return list;
92
  }
93

    
94
  public void value(Object value) {
95
    EditingServiceParameter param = next();
96
    if (isValidValue(param, value)) {
97
      values.put(param, value);
98
    }
99
  }
100

    
101
  public void finish() {
102
    Point centerPoint = (Point) values.get(center);
103
    Point radiusPoint = (Point) values.get(radius);
104
    GeometryType storeGeomType = getGeomType(featureStore);
105
    Geometry geometry = null;
106
    if(storeGeomType.isTypeOf(SURFACE)){
107
                geometry = createCircle(centerPoint, radiusPoint, featureStore);
108
                ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
109
    } else if(storeGeomType.isTypeOf(CURVE)){
110
                try {
111
                        geometry = createArc(centerPoint, centerPoint.distance(radiusPoint), 0, 2*Math.PI, featureStore);
112
                } catch (GeometryOperationNotSupportedException e) {
113
                        // TODO Auto-generated catch block
114
                        e.printStackTrace();
115
                } catch (GeometryOperationException e) {
116
                        // TODO Auto-generated catch block
117
                        e.printStackTrace();
118
                }
119
                ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
120
    } else if(storeGeomType.isTypeOf(MULTISURFACE)){
121
                geometry = createCircle(centerPoint, radiusPoint, featureStore);
122
                MultiSurface multisurface;
123
                try {
124
                        multisurface = geomManager.createMultiSurface(storeGeomType.getSubType());
125
                        multisurface.addSurface((Circle)geometry);
126
                    ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(multisurface, featureStore);
127
                } catch (CreateGeometryException e) {
128
                        logger.error("Can't create multisurface", e);
129
                        ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
130
                }
131
        } else if(storeGeomType.isTypeOf(MULTICURVE)){
132
                try {
133
                        geometry = createArc(centerPoint, centerPoint.distance(radiusPoint), 0, 2*Math.PI, featureStore);
134
                } catch (GeometryOperationNotSupportedException e1) {
135
                        // TODO Auto-generated catch block
136
                        e1.printStackTrace();
137
                } catch (GeometryOperationException e1) {
138
                        // TODO Auto-generated catch block
139
                        e1.printStackTrace();
140
                }
141
                MultiCurve multicurve;
142
                try {
143
                        multicurve = geomManager.createMultiCurve(storeGeomType.getSubType());
144
                        multicurve.addCurve((Arc)geometry);
145
                    ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(multicurve, featureStore);
146
                } catch (CreateGeometryException e) {
147
                        logger.error("Can't create multisurface", e);
148
                        ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
149
                }
150

    
151
    } else {
152
                ((EditingProviderServices) getProviderServices()).insertGeometryIntoFeatureStore(geometry, featureStore);
153
        }
154
  }
155

    
156
  public void start() {
157
    this.values = new HashMap<EditingServiceParameter, Object>();
158
  }
159

    
160
  public String getName() {
161
    return Circle2PEditingProviderFactory.PROVIDER_NAME;
162
  }
163

    
164
}