Revision 575 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.prov/org.gvsig.vectorediting.lib.prov.internalpolygon/src/main/java/org/gvsig/vectorediting/lib/prov/internalpolygon/InternalPolygonEditingProvider.java

View differences:

InternalPolygonEditingProvider.java
35 35
import org.gvsig.fmap.dal.feature.FeatureSelection;
36 36
import org.gvsig.fmap.dal.feature.FeatureStore;
37 37
import org.gvsig.fmap.geom.Geometry;
38
import org.gvsig.fmap.geom.aggregate.MultiSurface;
38
import org.gvsig.fmap.geom.GeometryException;
39
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
39 40
import org.gvsig.fmap.geom.primitive.Point;
40
import org.gvsig.fmap.geom.primitive.Surface;
41
import org.gvsig.fmap.geom.primitive.Polygon;
41 42
import org.gvsig.fmap.geom.type.GeometryType;
42 43
import org.gvsig.tools.dispose.DisposableIterator;
43 44
import org.gvsig.tools.dynobject.DynObject;
......
140 141
                            if (!geometryType
141 142
                                .isTypeOf(Geometry.TYPES.MULTISURFACE)
142 143
                                && !geometryType
143
                                    .isTypeOf(Geometry.TYPES.SURFACE)) {
144
                                    .isTypeOf(Geometry.TYPES.SURFACE)
145
                                && !geometryType
146
                                    .isTypeOf(Geometry.TYPES.MULTIPOLYGON)
147
                                && !geometryType
148
                                    .isTypeOf(Geometry.TYPES.POLYGON)
149
                                ) {
144 150

  
145 151
                                throw new InvalidEntryException(null);
146 152
                            }
......
159 165

  
160 166
            }
161 167
        } else if (param == geometryParameter) {
162
            if (value instanceof Geometry) {
168
            if (value instanceof Geometry && !(value instanceof Point)) {
163 169

  
164 170
                // Before set value checks if some geometry contains the
165 171
                // geometry received as parameter.
......
208 214

  
209 215
                    if (geometryFeature.contains(geometry)) {
210 216

  
211
                        Geometry newGeom = geometryFeature.cloneGeometry();
212
                        // FIXME: Sustituir lo anterior por la creaci?n de
213
                        // anillos interiores Ring ring;
214
                        // GeometryLocator.getGeometryManager().
215
                        // Geometry newGeom =
216
                        // ((Polygon)geom).addInteriorRing(ring);
217
                        if (geometry instanceof MultiSurface) {
217
                        Geometry newGeom = null;
218
                        if(geometryFeature instanceof Polygon){
219
                            newGeom = geometryFeature.cloneGeometry();
220
                        } else {
221
                            newGeom = geometryFeature.toPolygons();
222
                        }
218 223

  
219
                            MultiSurface multiSurface =
220
                                ((MultiSurface) geometry);
221

  
222
                            for (int i = 0; i < multiSurface
223
                                .getPrimitivesNumber(); i++) {
224
                                Surface surface = multiSurface.getSurfaceAt(i);
225
                                newGeom = newGeom.difference(surface);
224
                        if(newGeom instanceof MultiPolygon){
225
                            MultiPolygon newMultiPolygon = (MultiPolygon)newGeom;
226
                            for (int i = 0; i < newMultiPolygon.getPrimitivesNumber(); i++) {
227
                                Polygon primitive = (Polygon) newMultiPolygon.getPrimitiveAt(i);
228
                                if(primitive.contains(geometry)){
229
                                    addInteriorRings(primitive, geometry);
230
                                }
226 231
                            }
227

  
228 232
                        } else {
229
                            newGeom = newGeom.difference(geometry);
233
                            if(newGeom.contains(geometry)){
234
                                addInteriorRings((Polygon)newGeom, geometry);
235
                            }
230 236
                        }
231 237

  
232 238
                        EditingProviderServices editingProviderServices =
......
247 253
        }
248 254
    }
249 255

  
256
    private void addInteriorRings(Polygon polygon, Geometry geometry) throws GeometryException {
257
        if (geometry instanceof Polygon) {
258
            polygon.addInteriorRing((Polygon) geometry);
259
        } else {
260
            MultiPolygon multiPolygon = geometry.toPolygons();
261
            for (int i = 0; i < multiPolygon.getPrimitivesNumber(); i++) {
262
                Polygon surface = (Polygon) multiPolygon.getPrimitiveAt(i);
263
                polygon.addInteriorRing(surface);
264
            }
265
        }
266
    }
267

  
250 268
    public Geometry finish() throws FinishServiceException {
251 269
        return null;
252 270
    }

Also available in: Unified diff