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