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

History | View | Annotate | Download (24.9 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
            
134
            // FIXME: check if ft has one and only one geometry.
135
            
136
            newStoreParameters.setDefaultFeatureType(ft.getEditable());
137
            return newStoreParameters;
138
        } catch (DataException ex) {
139
            throw new ExportException(ex);
140
        }
141
    }
142

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

    
162
    @Override
163
    public void export(FeatureSet featureSet) throws ExportException {
164

    
165
        File parametersFile = this.getParameters().getFile();
166
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
167

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

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

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

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

    
201
    }
202

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

    
216
        DisposableIterator it = null;
217
        try {
218
            EditableFeatureType type = this.getParameters().getSourceFeatureType().getCopy().getEditable();
219

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

    
251
            geomFieldDescTarget.setGeometryType(gty);
252
            geomFieldDescTarget.setName(this.getAttributeNamesTranslator().getTargetName("GEOMETRY"));
253
            type.setDefaultGeometryAttributeName(geomFieldDescTarget.getName());
254

    
255
            // ==========================
256
            fixNames(type);
257
            // ==========================
258

    
259
            params.setDefaultFeatureType(type.getNotEditableCopy());
260

    
261
            params.setDynValue("geometryType", null);
262

    
263
            DataManager manager = DALLocator.getDataManager();
264

    
265
            manager.newStore(explorerName, providerName, params, true);
266
            
267
            FeatureStore target = (FeatureStore) manager.openStore(providerName, params);
268
            FeatureType targetType = target.getDefaultFeatureType();
269

    
270
            getTaskStatus().setRangeOfValues(0, featureSet.getSize());
271

    
272
            target.edit(FeatureStore.MODE_APPEND);
273
            it = featureSet.fastIterator();
274
            int featureCount = 0;
275

    
276
            // ================================================
277
            // Reprojection stuff
278
            Geometry reproj_geom;
279
            EditableFeature edit_feat;
280
            IProjection sourceProjection
281
                    = getParameters().getSourceFeatureType().getDefaultGeometryAttribute().getSRS();
282

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

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

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

    
354
                    for (int i = 0; i < extracted.size(); i++) {
355
                        gitem = extracted.get(i);
356

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

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

    
405
        if (there_was_error) {
406
            Exception cause = new Exception(
407
                    "_Issues_with_attributes_or_geometries");
408
            throw new ExportException(cause);
409
        }
410
    }
411

    
412
    private void fixNames(EditableFeatureType eft) {
413

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

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

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

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

    
521

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

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

    
559
    private Geometry union(List<Geometry> geoms)
560
            throws GeometryOperationNotSupportedException, GeometryOperationException {
561

    
562
        if ( geoms == null || geoms.isEmpty()) {
563
            return null;
564
        }
565

    
566
        if (geoms.size() == 1) {
567
            return geoms.get(0);
568
        }
569

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

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

    
584
        List<Geometry> resp = new ArrayList<>();
585
        Aggregate agg;
586

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

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