Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.swing / org.gvsig.exportto.swing.prov / org.gvsig.exportto.swing.prov.shape / src / main / java / org / gvsig / export / shape / service / ExportShapeService.java @ 43925

History | View | Annotate | Download (24.8 KB)

1
package org.gvsig.export.shape.service;
2

    
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.List;
6
import org.apache.commons.io.FilenameUtils;
7
import org.cresques.cts.ICoordTrans;
8
import org.cresques.cts.IProjection;
9
import org.gvsig.export.ExportException;
10
import org.gvsig.export.ExportLocator;
11
import org.gvsig.export.spi.AbstractExportService;
12
import org.gvsig.export.spi.AttributeNamesTranslator;
13
import org.gvsig.export.spi.ExportService;
14
import org.gvsig.export.spi.ExportServiceFactory;
15
import org.gvsig.fmap.dal.DALLocator;
16
import org.gvsig.fmap.dal.DataManager;
17
import org.gvsig.fmap.dal.DataServerExplorer;
18
import org.gvsig.fmap.dal.NewDataStoreParameters;
19
import org.gvsig.fmap.dal.OpenDataStoreParameters;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.EditableFeature;
22
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.EditableFeatureType;
24
import org.gvsig.fmap.dal.feature.Feature;
25
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
26
import org.gvsig.fmap.dal.feature.FeatureSet;
27
import org.gvsig.fmap.dal.feature.FeatureStore;
28
import org.gvsig.fmap.dal.feature.FeatureType;
29
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
30
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
31
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
32
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
33
import org.gvsig.fmap.geom.DataTypes;
34
import org.gvsig.fmap.geom.Geometry;
35
import org.gvsig.fmap.geom.GeometryLocator;
36
import org.gvsig.fmap.geom.GeometryManager;
37
import org.gvsig.fmap.geom.aggregate.Aggregate;
38
import org.gvsig.fmap.geom.exception.CreateGeometryException;
39
import org.gvsig.fmap.geom.operation.GeometryOperationException;
40
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
41
import org.gvsig.fmap.geom.primitive.Curve;
42
import org.gvsig.fmap.geom.primitive.Line;
43
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
44
import org.gvsig.fmap.geom.primitive.Point;
45
import org.gvsig.fmap.geom.primitive.Polygon;
46
import org.gvsig.fmap.geom.primitive.Surface;
47
import org.gvsig.fmap.geom.type.GeometryType;
48
import org.gvsig.tools.ToolsLocator;
49
import org.gvsig.tools.dataTypes.CoercionException;
50
import org.gvsig.tools.dataTypes.DataTypesManager;
51
import org.gvsig.tools.dispose.DisposableIterator;
52
import org.gvsig.tools.dispose.DisposeUtils;
53
import org.gvsig.tools.util.HasAFile;
54

    
55
/**
56
 *
57
 * @author jjdelcerro
58
 */
59
public class ExportShapeService 
60
        extends AbstractExportService 
61
        implements ExportService 
62
    {
63

    
64
    public static final int MAX_FIELD_NAME_LENGTH = 10;
65
    
66
    private final List<OpenDataStoreParameters>targetOpenStoreParameters;
67
    
68
    protected ExportShapeService(ExportServiceFactory factory, ExportShapeParameters parameters) {
69
        super(factory, parameters);
70
        this.targetOpenStoreParameters = new ArrayList<>();
71
    }
72

    
73
    @Override
74
    public ExportShapeParameters getParameters() {
75
        return (ExportShapeParameters) super.getParameters(); 
76
    }
77

    
78
    @Override
79
    protected DataServerExplorer createServerExplorer() throws ExportException{
80
        
81
        DataManager dataManager = DALLocator.getDataManager();
82

    
83
        FilesystemServerExplorerParameters explorerParams;
84
        try {
85
            explorerParams =
86
                (FilesystemServerExplorerParameters) dataManager
87
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
88
        } catch (Exception e) {
89
            throw new ExportException(e);
90
        }
91
        explorerParams.setRoot(this.getParameters().getFile().getParent());
92

    
93
        FilesystemServerExplorer explorer;
94
        try {
95
            explorer = (FilesystemServerExplorer) dataManager.openServerExplorer(
96
                    "FilesystemExplorer", explorerParams
97
            );
98
            return explorer;
99
        } catch (Exception e) {
100
            throw new ExportException(e);
101
        }
102
    }
103

    
104
    @Override
105
    protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException {
106
        try {
107
            FilesystemServerExplorer explorer = (FilesystemServerExplorer) this.createServerExplorer();
108
            NewFeatureStoreParameters newStoreParameters = (NewFeatureStoreParameters) explorer.getAddParameters(
109
                    this.getParameters().getFile()
110
            );
111
            newStoreParameters.setDynValue("Encoding", this.getParameters().getEncoding());
112
            newStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection());
113
            
114
            FeatureType ft = this.getParameters().getSourceFeatureType();
115
            AttributeNamesTranslator nameTranslator = ExportLocator.getServiceManager().createAttributeNamesTranslator(
116
                    ft,
117
                    MAX_FIELD_NAME_LENGTH
118
            );
119
            if( nameTranslator.hasTranslations() ) {
120
                // Obtenemos una copia del ft desbinculada del store.
121
                ft = ft.getCopy();
122
                EditableFeatureType eft = ft.getEditable();
123
                for( int i=0; i<eft.size(); i++) {
124
                    EditableFeatureAttributeDescriptor attr = eft.getEditableAttributeDescriptor(i);
125
                    String name = attr.getName();
126
                    if( nameTranslator.hasTranslation(name) ) {
127
                        attr.setName(nameTranslator.getTargetName(name));
128
                    }
129
                }
130
                // Volvemos a obtener una copia "limpia" con los cambios consolidados
131
                ft = eft.getNotEditableCopy();
132
            }
133
            newStoreParameters.setDefaultFeatureType(ft.getEditable());
134
            return newStoreParameters;
135
        } catch (DataException ex) {
136
            throw new ExportException(ex);
137
        }
138
    }
139

    
140
    @Override
141
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
142
        return this.targetOpenStoreParameters;
143
    }
144
    
145
    @Override
146
    public OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException {
147
        try {
148
            DataManager dataManager = DALLocator.getDataManager();
149
            OpenFeatureStoreParameters openStoreParameters = (OpenFeatureStoreParameters) dataManager.createStoreParameters("DBF");
150
            ((HasAFile)openStoreParameters).setFile(getParameters().getFile());
151
            openStoreParameters.setDynValue("Encoding", getParameters().getEncoding());
152
            openStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection());
153
            return openStoreParameters;
154
        } catch (DataException ex) {
155
            throw new ExportException(ex);
156
        }
157
    }
158

    
159
    @Override
160
    public void export(FeatureSet featureSet) throws ExportException {
161

    
162
        File parametersFile = this.getParameters().getFile();
163
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
164

    
165
        int geometryType = this.getParameters().getGeometryTypeAsInt();
166
        
167
        if (geometryType == Geometry.TYPES.GEOMETRY) {
168
            try {
169
                // SURFACE
170
                String fullPathName = pathName + "_surface" + ".shp";
171
                this.getParameters().setFile(new File(fullPathName));
172
                this.getTaskStatus().setTitle("Exporting surfaces");
173
                export(featureSet, Geometry.TYPES.SURFACE, true);
174

    
175
                // CURVE
176
                fullPathName = pathName + "_curve" + ".shp";
177
                this.getParameters().setFile(new File(fullPathName));
178
                this.getTaskStatus().setTitle("Exporting curves");
179
                export(featureSet, Geometry.TYPES.CURVE, true);
180

    
181
                // POINT
182
                fullPathName = pathName + "_point" + ".shp";
183
                this.getParameters().setFile(new File(fullPathName));
184
                this.getTaskStatus().setTitle("Exporting points");
185
                export(featureSet, Geometry.TYPES.POINT, true);
186

    
187
            } finally {
188
                this.getParameters().setFile(parametersFile);
189
            }
190
            
191
        } else {
192
            export(featureSet, geometryType, false);
193
        }
194
        
195
        this.getTaskStatus().terminate();
196
        this.getTaskStatus().remove();
197

    
198
    }
199

    
200
    private void export(
201
            FeatureSet featureSet,
202
            int geometryType, 
203
            boolean checkType
204
        ) throws ExportException {
205
        
206
        DataServerExplorer explorer = this.createServerExplorer();
207
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) this.createTargetNewStoreParameters();
208
        
209
        String providerName = params.getDataStoreName();
210
        String explorerName = explorer.getProviderName();
211
        boolean there_was_error = false;
212

    
213
        DisposableIterator it = null;
214
        try {
215
            EditableFeatureType type = this.getParameters().getSourceFeatureType().getCopy().getEditable();
216

    
217
            String geomFieldName = this.getParameters().getGeometryFieldName();
218
            
219
            FeatureAttributeDescriptor geomFieldDescSource = (FeatureAttributeDescriptor) type.getDefaultGeometryAttribute();
220
            if( geomFieldDescSource!=null ) { 
221
                type.remove(geomFieldDescSource.getName());
222
            }
223
            EditableFeatureAttributeDescriptor geomFieldDescTarget = type.add(
224
                    "GEOMETRY",
225
                    this.getParameters().getGeometryTypeAsInt()
226
            );
227
            geomFieldDescTarget.setDefaultValue(null);
228
            int gsubtype = this.getParameters().getGeometrySubtype();
229
            // El shp solo soporta los subtipos 2D y 3D
230
            switch (gsubtype) {
231
                case Geometry.SUBTYPES.GEOM2D:
232
                    break;
233
                case Geometry.SUBTYPES.GEOM3D:
234
                    break;
235
                default:
236
                    // Forzaremos las geometrias a 3D
237
                    gsubtype = Geometry.SUBTYPES.GEOM3D;
238
                    break;
239
            }
240
            GeometryType gty = null;
241
            try {
242
                GeometryManager geoManager = GeometryLocator.getGeometryManager();
243
                gty = geoManager.getGeometryType(geometryType, gsubtype);
244
            } catch (Exception e) {
245
                throw new ExportException(e);
246
            }
247

    
248
            geomFieldDescTarget.setGeometryType(gty);
249
            geomFieldDescTarget.setName(this.getAttributeNamesTranslator().getTargetName("GEOMETRY"));
250
            type.setDefaultGeometryAttributeName(geomFieldDescTarget.getName());
251

    
252
            // ==========================
253
            fixNames(type);
254
            // ==========================
255

    
256
            params.setDefaultFeatureType(type.getNotEditableCopy());
257

    
258
            params.setDynValue("geometryType", null);
259

    
260
            DataManager manager = DALLocator.getDataManager();
261

    
262
            manager.newStore(explorerName, providerName, params, true);
263
            
264
            FeatureStore target = (FeatureStore) manager.openStore(providerName, params);
265
            FeatureType targetType = target.getDefaultFeatureType();
266

    
267
            getTaskStatus().setRangeOfValues(0, featureSet.getSize());
268

    
269
            target.edit(FeatureStore.MODE_APPEND);
270
            it = featureSet.fastIterator();
271
            int featureCount = 0;
272

    
273
            // ================================================
274
            // Reprojection stuff
275
            Geometry reproj_geom;
276
            EditableFeature edit_feat;
277
            IProjection sourceProjection
278
                    = getParameters().getSourceFeatureType().getDefaultGeometryAttribute().getSRS();
279

    
280
            ICoordTrans coord_trans = null;
281
            // this comparison is perhaps too preventive
282
            // we could  have two instances of same projection
283
            // so we would do more computations than needed
284
            if (sourceProjection != null && sourceProjection != this.getParameters().getTargetProjection()) {
285
                if( this.getParameters().getTargetTransformation()==null ) {
286
                    coord_trans = this.getParameters().getTargetTransformation();
287
                } else {
288
                    coord_trans = sourceProjection.getCT(this.getParameters().getTargetProjection());
289
                }
290
            }
291
            // ================================================
292

    
293
            List<Geometry> extracted;
294
            Geometry gitem ;
295
            DataTypesManager.Coercion toGeometry = ToolsLocator.getDataTypesManager()
296
                    .get(DataTypes.GEOMETRY).getCoercion();
297
            
298
            while (it.hasNext()) {
299

    
300
                Feature feature = (Feature) it.next();
301
                if( geomFieldName==null ) {
302
                    edit_feat = target.createNewFeature(true);
303
                    //
304
                    // Accumulate error in boolean.
305
                    // This also fixes field names (using origNameToDbfName)
306
                    // 
307
                    there_was_error = there_was_error |
308
                        setNonNulls(
309
                                getParameters().getSourceFeatureType(),
310
                                targetType, 
311
                                feature, 
312
                                edit_feat
313
                        );
314
                    edit_feat.setDefaultGeometry(null);                    
315
                    target.insert(edit_feat);
316
                } else {
317
                    Object x = feature.getGeometry(geomFieldName);
318
                    try {
319
                        gitem = (Geometry) toGeometry.coerce(x);
320
                    } catch (CoercionException ex) {
321
                        gitem = null;
322
                    }
323
                    
324
                    if (checkType) {
325
                        extracted = getGeometriesFrom(gitem, geometryType);
326
                        if (extracted.isEmpty()) {
327
                            // found no geometries of correct type
328
                            continue;
329
                        } else {
330
                            if (geometryType != Geometry.TYPES.POINT) {
331
                                // If not points, merge geometries
332
                                // (curves or surfaces)
333
                                try {
334
                                    gitem = union(extracted);
335
                                    extracted = new ArrayList<>();
336
                                    extracted.add(gitem);
337
                                } catch (Exception ex) {
338
                                    there_was_error = true;
339
                                    LOG.info("Error in union.", ex);
340
                                }
341
                            } else {
342
                                // only in the case of points, we can have several
343
                                // geometries if source is multipoint
344
                            }
345
                        }
346
                    } else {
347
                        extracted = new ArrayList<>();
348
                        extracted.add(gitem);
349
                    }
350

    
351
                    for (int i = 0; i < extracted.size(); i++) {
352
                        gitem = extracted.get(i);
353

    
354
                        if (gsubtype == Geometry.SUBTYPES.GEOM2D) {
355
                            gitem = force2D(gitem, geometryType);
356
                        } else {
357
                            gitem = force3D(gitem, geometryType);
358
                        }
359
                        edit_feat = target.createNewFeature(true);
360
                        //
361
                        // Accumulate error in boolean.
362
                        // This also fixes field names (using origNameToDbfName)
363
                        // 
364
                        there_was_error = there_was_error |
365
                            setNonNulls(
366
                                    getParameters().getSourceFeatureType(),
367
                                    targetType, 
368
                                    feature, 
369
                                    edit_feat
370
                            );
371
                        edit_feat.setDefaultGeometry(gitem);
372
                        // ================================================
373
                        // Reprojection stuff
374
                        if (coord_trans != null && gitem != null) {
375
                            reproj_geom = edit_feat.getDefaultGeometry();
376
                            reproj_geom = reproj_geom.cloneGeometry();
377
                            reproj_geom.reProject(coord_trans);
378
                            edit_feat.setDefaultGeometry(reproj_geom);
379
                        }
380
                        // ================================================
381
                        target.insert(edit_feat);
382
                    }
383
                }
384
                featureCount++;
385
                this.getTaskStatus().setCurValue(featureCount);
386

    
387
                if (this.getTaskStatus().isCancellationRequested()) {
388
                    return;
389
                }
390
            }
391
            target.finishEditing();
392
            target.dispose();
393
            
394
            this.targetOpenStoreParameters.add(this.createTargetOpenStoreParameters());
395
            
396
        } catch (Exception e) {
397
            throw new ExportException(e);
398
        } finally {
399
            DisposeUtils.dispose(it);
400
        }
401

    
402
        if (there_was_error) {
403
            Exception cause = new Exception(
404
                    "_Issues_with_attributes_or_geometries");
405
            throw new ExportException(cause);
406
        }
407
    }
408

    
409
    private void fixNames(EditableFeatureType eft) {
410

    
411
        FeatureAttributeDescriptor[] atts = eft.getAttributeDescriptors();
412
        EditableFeatureAttributeDescriptor efad;
413
        for (FeatureAttributeDescriptor att : atts) {
414
            String new_name = this.getAttributeNamesTranslator().getTargetName(att.getName());
415
            if (new_name != null) {
416
                eft.remove(att.getName());
417
                efad = eft.add(new_name, att.getType(), att.getSize());
418
                efad.setPrecision(att.getPrecision());
419
                if (att.getDataType().getType() == DataTypes.GEOMETRY) {
420
                    efad.setGeometryType(att.getGeomType());
421
                }
422
            }
423
        }
424
    }
425

    
426
    /**
427
     * @param gitem
428
     * @param geometryType2
429
     * @return
430
     */
431
    private Geometry force2D(Geometry ge, int gt) throws CreateGeometryException {
432
        if (ge == null) {
433
            return null;
434
        }
435
        if (ge.getGeometryType().getSubType() == Geometry.SUBTYPES.GEOM2D) {
436
            return ge;
437
        } else {
438
            GeometryManager geoManager = GeometryLocator.getGeometryManager();
439
            switch (gt) {
440
                case Geometry.TYPES.POINT:
441
                    Point p = (Point) ge;
442
                    Point point = geoManager.createPoint(
443
                            p.getX(), p.getY(),
444
                            Geometry.SUBTYPES.GEOM2D);
445
                    return point;
446
                case Geometry.TYPES.CURVE:
447
                    return geoManager.createCurve(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
448
                case Geometry.TYPES.SURFACE:
449
                    return geoManager.createSurface(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
450
                default:
451
                    return ge;
452
            }
453
        }
454
    }
455

    
456
    /**
457
     * @param gitem
458
     * @param geometryType2
459
     * @return
460
     */
461
    private Geometry force3D(Geometry ge, int gt) throws CreateGeometryException {
462
        if (ge == null) {
463
            return null;
464
        }
465
        // Los try catch que hay abajo, son para asegurarse de que la geometr?a original
466
        // tiene las 3 dimensiones necesarias. A veces nos llegan geometr?as que aunque son de subtipo GEOM3D
467
        // los puntos del generalPath que contienen no son 3D y no tienen la coordenada Z
468
        GeometryManager geoManager = GeometryLocator.getGeometryManager();
469
        Point point;
470
        switch (gt) {
471
            case Geometry.TYPES.POINT:
472
                Point p = (Point) ge;
473
                point = geoManager.createPoint(
474
                        p.getX(), p.getY(),
475
                        Geometry.SUBTYPES.GEOM3D);
476
                try {
477
                    point.setCoordinateAt(2, p.getCoordinateAt(2));
478
                } catch (Exception e) {
479
                    point.setCoordinateAt(2, 0);
480
                }
481
                return point;
482
            case Geometry.TYPES.CURVE:
483
            case Geometry.TYPES.LINE:
484
                Line line = geoManager.createLine(Geometry.SUBTYPES.GEOM3D);
485
                for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) {
486
                    Point vertex = ((OrientablePrimitive) ge).getVertex(i);
487
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
488
                    try {
489
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
490
                    } catch (Exception e) {
491
                        point.setCoordinateAt(2, 0);
492
                    }
493
                    line.addVertex(point);
494
                }
495
                ;
496
                return line;
497

    
498
            case Geometry.TYPES.SURFACE:
499
            case Geometry.TYPES.POLYGON:
500
                Polygon polygon = geoManager.createPolygon(Geometry.SUBTYPES.GEOM3D);
501
                for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) {
502
                    Point vertex = ((OrientablePrimitive) ge).getVertex(i);
503
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
504
                    try {
505
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
506
                    } catch (Exception e) {
507
                        point.setCoordinateAt(2, 0);
508
                    }
509
                    polygon.addVertex(point);
510
                }
511
                ;
512
                return polygon;
513
            default:
514
                return ge;
515
        }
516
    }
517

    
518

    
519
    /**
520
     * @param feature
521
     * @param edit_feat
522
     */
523
    private boolean setNonNulls(
524
            FeatureType src_ft, 
525
            FeatureType target_ft,
526
            Feature feat, 
527
            EditableFeature edit_f
528
        ) {
529

    
530
        boolean error = false;
531
        FeatureAttributeDescriptor[] atts = src_ft.getAttributeDescriptors();
532
        String orig_name;
533
        String dbf_name;
534
        for (FeatureAttributeDescriptor att : atts) {
535
            if (att.getType() != org.gvsig.fmap.geom.DataTypes.GEOMETRY) {
536
                Object val;
537
                try {
538
                    orig_name = att.getName();
539
                    dbf_name = this.getAttributeNamesTranslator().getTargetName(orig_name);
540
                    if (dbf_name == null) {
541
                        dbf_name = orig_name;
542
                    }
543
                    val = feat.get(orig_name);
544
                    if (val != null) {
545
                        edit_f.set(dbf_name, val);
546
                    }
547
                }catch (Exception ex) {
548
                    LOG.info("Error while getting/setting value", ex);
549
                    error = true;
550
                }
551
            }
552
        }
553
        return error;
554
    }
555

    
556
    private Geometry union(List<Geometry> geoms)
557
            throws GeometryOperationNotSupportedException, GeometryOperationException {
558

    
559
        if ( geoms == null || geoms.isEmpty()) {
560
            return null;
561
        }
562

    
563
        if (geoms.size() == 1) {
564
            return geoms.get(0);
565
        }
566

    
567
        Geometry resp = geoms.get(0);
568
        for (int i = 1; i < geoms.size(); i++) {
569
            resp = resp.union(geoms.get(i));
570
        }
571
        return resp;
572
    }
573

    
574
    /**
575
     * @param feat_geom_type
576
     * @param type must be POINT, LINE or POLYGON (Geometry.TYPES)
577
     * @return
578
     */
579
    private List<Geometry> getGeometriesFrom(Geometry in_geom, int type) {
580

    
581
        List<Geometry> resp = new ArrayList<>();
582
        Aggregate agg;
583

    
584
        /*
585
         * If input geometry is aggregate, search its
586
         * primitives
587
         */
588
        if (in_geom instanceof Aggregate) {
589
            agg = (Aggregate) in_geom;
590
            Geometry item;
591
            List<Geometry> add_parts;
592
            for (int i = 0; i < agg.getPrimitivesNumber(); i++) {
593
                item = agg.getPrimitiveAt(i);
594
                add_parts = getGeometriesFrom(item, type);
595
                resp.addAll(add_parts);
596
            }
597
            return resp;
598
        }
599

    
600
        // ============================================
601
        switch (type) {
602
            case Geometry.TYPES.POINT:
603
                if (in_geom instanceof Point) {
604
                    resp.add(in_geom);
605
                }
606
                // =======================================================
607
                break;
608
            case Geometry.TYPES.CURVE:
609
                if (in_geom instanceof Curve) {
610
                    resp.add(in_geom);
611
                }
612
                // =======================================================
613
                break;
614
            case Geometry.TYPES.SURFACE:
615
                if (in_geom instanceof Surface) {
616
                    resp.add(in_geom);
617
                }
618
                // =======================================================
619
                break;
620
        }
621
        return resp;
622
    }
623
        
624
}