Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dataFile / src / org / gvsig / fmap / data / store / dxf / DXFStoreProvider.java @ 24248

History | View | Annotate | Download (39.8 KB)

1
package org.gvsig.fmap.data.store.dxf;
2

    
3
import java.awt.geom.PathIterator;
4
import java.awt.geom.Point2D;
5
import java.io.File;
6
import java.io.IOException;
7
import java.text.MessageFormat;
8
import java.util.ArrayList;
9
import java.util.Iterator;
10
import java.util.List;
11
import java.util.Vector;
12

    
13
import org.cresques.cts.IProjection;
14
import org.cresques.geo.Point3D;
15
import org.cresques.io.DxfFile;
16
import org.cresques.io.DxfGroup;
17
import org.cresques.io.DxfGroupVector;
18
import org.cresques.px.IObjList;
19
import org.cresques.px.dxf.DxfEntityMaker;
20
import org.cresques.px.dxf.DxfFeatureMaker;
21
import org.cresques.px.dxf.DxfHeaderManager;
22
import org.cresques.px.gml.Feature;
23
import org.cresques.px.gml.LineString;
24
import org.cresques.px.gml.LineString3D;
25
import org.cresques.px.gml.Point;
26
import org.cresques.px.gml.Polygon;
27
import org.cresques.px.gml.Polygon3D;
28
import org.gvsig.fmap.data.DataExplorer;
29
import org.gvsig.fmap.data.DataStoreParameters;
30
import org.gvsig.fmap.data.DataTypes;
31
import org.gvsig.fmap.data.exceptions.CreateException;
32
import org.gvsig.fmap.data.exceptions.DataException;
33
import org.gvsig.fmap.data.exceptions.InitializeException;
34
import org.gvsig.fmap.data.exceptions.LoadException;
35
import org.gvsig.fmap.data.exceptions.OpenException;
36
import org.gvsig.fmap.data.exceptions.ReadException;
37
import org.gvsig.fmap.data.exceptions.WriteException;
38
import org.gvsig.fmap.data.feature.EditableFeatureType;
39
import org.gvsig.fmap.data.feature.FeatureSet;
40
import org.gvsig.fmap.data.feature.FeatureType;
41
import org.gvsig.fmap.data.feature.exceptions.PerformEditingException;
42
import org.gvsig.fmap.data.feature.spi.FeatureData;
43
import org.gvsig.fmap.data.feature.spi.FeatureStoreProvider;
44
import org.gvsig.fmap.data.feature.spi.FeatureStoreProviderServices;
45
import org.gvsig.fmap.data.feature.spi.LegendBuilder;
46
import org.gvsig.fmap.data.feature.spi.memory.AbstractMemoryStoreProvider;
47
import org.gvsig.fmap.data.resource.exception.AccessResourceException;
48
import org.gvsig.fmap.data.resource.file.FileResource;
49
import org.gvsig.fmap.data.resource.spi.ResourceConsumer;
50
import org.gvsig.fmap.data.resource.spi.ResourceProvider;
51
import org.gvsig.fmap.geom.Geometry;
52
import org.gvsig.fmap.geom.GeometryFactory;
53
import org.gvsig.fmap.geom.GeometryManager;
54
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
55
import org.gvsig.fmap.geom.primitive.Arc2D;
56
import org.gvsig.fmap.geom.primitive.Circle2D;
57
import org.gvsig.fmap.geom.primitive.Curve2D;
58
import org.gvsig.fmap.geom.primitive.Curve2DZ;
59
import org.gvsig.fmap.geom.primitive.Ellipse2D;
60
import org.gvsig.fmap.geom.primitive.GeneralPathX;
61
import org.gvsig.fmap.geom.primitive.Point2DZ;
62
import org.gvsig.fmap.geom.primitive.Surface2D;
63
import org.gvsig.fmap.geom.primitive.Surface2DZ;
64
import org.gvsig.fmap.geom.util.Converter;
65
import org.gvsig.fmap.geom.util.UtilFunctions;
66
import org.gvsig.tools.exception.NotYetImplemented;
67
import org.gvsig.tools.operations.OperationNotSupportedException;
68
import org.gvsig.tools.persistence.AbstractPersistenceManager;
69
import org.gvsig.tools.persistence.PersistenceException;
70
import org.gvsig.tools.persistence.PersistentState;
71

    
72
public class DXFStoreProvider extends AbstractMemoryStoreProvider implements
73
                ResourceConsumer {
74

    
75
        final public static String NAME = "DXF";
76
        final public static String DESCRIPTION = "DXF file";
77

    
78
        private int ID_FIELD_ID = 0;
79
        private int ID_FIELD_GEOMETRY = 1;
80
        private int ID_FIELD_ENTITY = 2;
81
        private int ID_FIELD_LAYER = 3;
82
        private int ID_FIELD_COLOR = 4;
83
        private int ID_FIELD_ELEVATION = 5;
84
        private int ID_FIELD_THICKNESS = 6;
85
        private int ID_FIELD_TEXT = 7;
86
        private int ID_FIELD_HEIGHTTEXT = 8;
87
        private int ID_FIELD_ROTATIONTEXT = 9;
88

    
89
        private IProjection projection;
90
        private ResourceProvider resource;
91
        private LegendBuilder leyendBuilder;
92

    
93
        private int counterNewsOIDs;
94

    
95
        private DXFStoreParameters getParameters() {
96
                return (DXFStoreParameters) this.store.getParameters();
97
        }
98

    
99
        public FeatureStoreProvider initialize(FeatureStoreProviderServices store)
100
                        throws InitializeException {
101
                super.initialize(store);
102

    
103
                counterNewsOIDs = 0;
104
                //                projection = CRSFactory.getCRS(getParameters().getSRSID());
105

    
106
                resource = this.createResource(
107
                                FileResource.NAME,
108
                                new Object[] { getParameters().getFileName() }
109
                        );
110
                resource.addConsumer(this);
111

    
112
                try {
113
                        leyendBuilder = (LegendBuilder) store.invokeOperation(
114
                                        LegendBuilder.OPERATION_NAME, null);
115
                } catch (OperationNotSupportedException e) {
116
                        leyendBuilder = null;
117
                } catch (Exception e) {
118
                        throw new InitializeException(e);
119
                }
120
                return this;
121
        }
122

    
123
        public String getName() {
124
                return NAME;
125
        }
126

    
127
        public boolean allowWrite() {
128
                return true;
129
        }
130

    
131
        public boolean canCreate() {
132
                return true;
133
        }
134

    
135
        public Object getLeyend() throws OpenException {
136
                this.open();
137
                if (leyendBuilder == null) {
138
                        return null;
139
                }
140
                return leyendBuilder.getLegend();
141
        }
142

    
143
        public void open() throws OpenException {
144
                if (this.data != null) {
145
                        return;
146
                }
147
                try {
148
                        this.resource.begin();
149

    
150
                        if (this.resource.getData() != null) {
151
                                this.data = (ArrayList) this.resource.getData();
152
                        } else {
153
                                Reader reader = new Reader().initialice(
154
                                                this,
155
                                                (File) this.resource.get(),
156
                                                projection,
157
                                                this.leyendBuilder
158
                                        );
159
                                reader.begin(this.store);
160
                                this.store.setFeatureTypes(reader.getTypes(), reader
161
                                                .getDefaultType());
162
                                resource.notifyOpen();
163
                                this.data = (ArrayList) reader.get();
164
                                reader.end();
165
                                resource.notifyClose();
166
                                this.resource.setData(this.data);
167
                        }
168
                } catch (Exception e) {
169
                        try {
170
                                throw new OpenException(resource.getName(), e);
171
                        } catch (AccessResourceException e1) {
172
                                throw new OpenException(this.getName(), e);
173
                        }
174
                } finally {
175
                        this.resource.end();
176
                }
177
        }
178

    
179

    
180
        public DataExplorer getExplorer() throws ReadException {
181
                // FIXME: falta implementar
182
                return null;
183
        }
184

    
185
        public void create(DataStoreParameters parameters, FeatureType featureType,
186
                        boolean overwrite) throws CreateException {
187

    
188
                // FIXME: falta gestionar 'overwrite'
189

    
190
                IProjection projection = null;
191
                DXFStoreParameters params = (DXFStoreParameters) parameters;
192

    
193
                //                projection = CRSFactory.getCRS(params.getSRSID());
194

    
195
                FileResource resource;
196
                try {
197
                        resource = (FileResource) this.createResource(
198
                                        FileResource.NAME,
199
                                        new Object[] { params
200
                                                        .getFileName() });
201
                } catch (InitializeException e1) {
202
                        throw new CreateException(params.getFileName(), e1);
203
                }
204
                resource.addConsumer(this);
205

    
206

    
207
                try {
208
                        resource.begin();
209
                        Builder builder = new Builder().initialice(
210
                                        resource.getFileName(),
211
                                        projection);
212
                        resource.notifyOpen();
213
                        builder.begin();
214
                        builder.create();
215
                        builder.end();
216
                        resource.notifyClose();
217

    
218
                        resource.setData(null); // FIXME: Seguro que hay que ponerlo a null
219
                                                                        // ??
220
                        resource.notifyChanges();
221
                } catch (Exception e) {
222
                        throw new CreateException(params.getFileName(), e);
223
                } finally {
224
                        resource.end();
225
                }
226
        }
227

    
228
        private FeatureData getFeatureDataFormFeature(Object feature) {
229
                org.gvsig.fmap.data.feature.impl.DefaultFeature f = (org.gvsig.fmap.data.feature.impl.DefaultFeature) feature;
230
                return f.getData();
231
        }
232

    
233
        public void performEditing(Iterator deleteds, Iterator inserteds, Iterator updateds) throws PerformEditingException {
234

    
235
                String fileName = "";
236
                try {
237
                        resource.begin();
238

    
239
                        File file = (File) resource.get();
240
                        fileName = file.getAbsolutePath();
241
                        Writer writer = new Writer().initialice(file, projection);
242
                        FeatureSet features = this.getStoreServices().getFeatureSet();
243

    
244
                        writer.begin();
245
                        Iterator it = features.fastIterator();
246
                        while (it.hasNext()) {
247
                                writer.add(getFeatureDataFormFeature(it.next()));
248
                        }
249
                        resource.notifyOpen();
250
                        writer.end();
251
                        resource.notifyClose();
252
                        features.dispose();
253
                        counterNewsOIDs = 0;
254

    
255
                } catch (Exception e) {
256
                        throw new PerformEditingException(fileName, e);
257
                } finally {
258
                        resource.end();
259
                }
260
        }
261

    
262
        public class Builder {
263
                private String fileName;
264
                private IProjection projection;
265

    
266
                public Builder initialice(String fileName, IProjection projection) {
267
                        this.fileName = fileName;
268
                        this.projection = projection;
269
                        return this;
270
                }
271

    
272
                public void begin() {
273

    
274
                }
275

    
276
                public void end() {
277

    
278
                }
279

    
280
                public void create() throws IOException {
281
                        DxfEntityMaker entityMaker = new DxfEntityMaker(projection);
282
                        DxfFile dxfFile = new DxfFile(null, fileName, entityMaker);
283
                        dxfFile.setCadFlag(true);
284
                        dxfFile.setDxf3DFlag(false);
285
                        dxfFile.save(fileName);
286
                }
287
        }
288

    
289

    
290
        public class Reader {
291
                private File file;
292
                private String fileName;
293
                private IProjection projection;
294
                private List types;
295
                private LegendBuilder leyendBuilder;
296
                private AbstractMemoryStoreProvider store;
297

    
298
                public Reader initialice(AbstractMemoryStoreProvider store, File file,
299
                                IProjection projection,
300
                                LegendBuilder leyendBuilder) {
301
                        this.store = store;
302
                        this.file = file;
303
                        this.fileName = file.getAbsolutePath();
304
                        this.projection = projection;
305
                        this.leyendBuilder = leyendBuilder;
306
                        return this;
307
                }
308

    
309
                public void begin(FeatureStoreProviderServices store) {
310

    
311
                        EditableFeatureType featureType = store.createFeatureType();
312

    
313
                        ID_FIELD_ID = featureType.add("ID", DataTypes.INT)
314
                                        .setDefaultValue(Integer.valueOf(0))
315
                                .getIndex();
316

    
317
                        ID_FIELD_GEOMETRY = featureType.add("Geometry",
318
                                        DataTypes.GEOMETRY)
319
                                .getIndex();
320

    
321
                        // FIXME: Cual es el size y el valor por defecto para Entity ?
322
                        ID_FIELD_ENTITY = featureType.add("Entity",
323
                                        DataTypes.STRING, 100)
324
                                        .setDefaultValue("")
325
                                        .getIndex();
326

    
327
                        // FIXME: Cual es el size de Layer ?
328
                        ID_FIELD_LAYER = featureType.add("Layer",
329
                                        DataTypes.STRING, 100)
330
                                        .setDefaultValue(
331
                                        "default").getIndex();
332

    
333
                        ID_FIELD_COLOR = featureType.add("Color",
334
                                        DataTypes.INT)
335
                                        .setDefaultValue(
336
                                        Integer.valueOf(0)).getIndex();
337

    
338
                        ID_FIELD_ELEVATION = featureType.add("Elevation",
339
                                        DataTypes.DOUBLE)
340
                                        .setDefaultValue(
341
                                        Double.valueOf(0)).getIndex();
342

    
343
                        ID_FIELD_THICKNESS = featureType.add("Thickness",
344
                                        DataTypes.DOUBLE)
345
                                        .setDefaultValue(
346
                                        Double.valueOf(0)).getIndex();
347

    
348
                        // FIXME: Cual es el size de Text ?
349
                        ID_FIELD_TEXT = featureType.add("Text",
350
                                        DataTypes.STRING, 100)
351
                                        .setDefaultValue("")
352
                                        .getIndex();
353

    
354
                        ID_FIELD_HEIGHTTEXT = featureType.add("HeightText",
355
                                        DataTypes.DOUBLE).setDefaultValue(
356
                                        Double.valueOf(10)).getIndex();
357

    
358
                        ID_FIELD_ROTATIONTEXT = featureType.add("Rotation",
359
                                        DataTypes.DOUBLE).setDefaultValue(
360
                                        Double.valueOf(0)).getIndex();
361

    
362

    
363
                        // FIXME: Parece que el DXF puede tener mas atributos opcionales.
364
                        // Habria que ver de pillarlos ?
365

    
366
                        types = new ArrayList();
367
                        types.add(featureType.getNotEditableCopy());
368

    
369
                        if (leyendBuilder != null) {
370
                                leyendBuilder.begin();
371
                        }
372

    
373
                }
374

    
375
                public void end() {
376
                        if (leyendBuilder != null) {
377
                                leyendBuilder.end();
378
                        }
379
                }
380

    
381
                public List getTypes() {
382
                        return types;
383
                }
384

    
385
                public EditableFeatureType getDefaultType() {
386
                        return (EditableFeatureType) types.get(0);
387
                }
388

    
389
                public List get() throws DataException {
390

    
391
                        ArrayList featureDatas = new ArrayList();
392

    
393
                        DxfFile.EntityFactory featureMaker = new DxfFeatureMaker(projection);
394
                        DxfFile.VarSettings headerManager = new DxfHeaderManager();
395
                        DxfFile dxfFeatureFile = new DxfFile(projection, file
396
                                        .getAbsolutePath(), featureMaker, headerManager);
397

    
398
                        try {
399
                                dxfFeatureFile.load();
400
                        } catch (Exception e1) {
401
                                throw new LoadException(e1, fileName);
402
                        }
403

    
404
                        IObjList.vector features = (IObjList.vector) ((DxfFeatureMaker) featureMaker)
405
                                        .getObjects();
406
                        String acadVersion = ((DxfHeaderManager) headerManager)
407
                                        .getAcadVersion();
408

    
409

    
410
                        getLogger().info("load: acadVersion = '" + acadVersion + "'");
411

    
412
                        GeometryFactory gFactory = GeometryManager.getInstance()
413
                                        .getGeometryFactory();
414

    
415
                        if (!featureMaker.isDxf3DFile() && !headerManager.isWritedDxf3D()) {
416
                                // y no est?n todos a 9999
417
                                Feature[] features2D = new Feature[features.size()];
418
                                for (int i = 0; i < features.size(); i++) {
419
                                        Feature fea = (Feature) features.get(i);
420
                                        if (fea.getGeometry() instanceof org.cresques.px.gml.Point3D) {
421
                                                Point point = (Point) fea.getGeometry();
422
                                                Point point2 = new Point();
423
                                                for (int j = 0; j < point.pointNr(); j++) {
424
                                                        point2.add(point.get(j));
425
                                                }
426
                                                point2.setTextPoint(point.isTextPoint());
427
                                                fea.setGeometry(point2);
428
                                                features2D[i] = fea;
429

    
430
                                        } else if (fea.getGeometry() instanceof LineString3D) {
431
                                                LineString lineString = (LineString) fea.getGeometry();
432
                                                LineString lineString2 = new LineString();
433
                                                for (int j = 0; j < lineString.pointNr(); j++) {
434
                                                        lineString2.add(lineString.get(j));
435
                                                }
436
                                                fea.setGeometry(lineString2);
437
                                                features2D[i] = fea;
438
                                        } else if (fea.getGeometry() instanceof Polygon3D) {
439
                                                Polygon polygon = (Polygon) fea.getGeometry();
440
                                                Polygon polygon2 = new Polygon();
441
                                                for (int j = 0; j < polygon.pointNr(); j++) {
442
                                                        polygon2.add(polygon.get(j));
443
                                                }
444
                                                fea.setGeometry(polygon2);
445
                                                features2D[i] = fea;
446
                                        }
447
                                }
448
                                features.clear();
449
                                for (int i = 0; i < features2D.length; i++) {
450
                                        features.add(features2D[i]);
451
                                }
452
                        }
453

    
454
                        for (int i = 0; i < features.size(); i++) {
455

    
456
                                FeatureData feature = store.createFeatureData(store
457
                                                .getStoreServices().getDefaultFeatureType());
458

    
459
                                try {
460
                                        Feature fea = (Feature) features.get(i);
461

    
462
                                        feature.set(ID_FIELD_ID, Integer.valueOf(i));
463
                                        feature.set(ID_FIELD_ENTITY, fea.getProp("dxfEntity"));
464
                                        feature.set(ID_FIELD_LAYER, fea.getProp("layer"));
465
                                        feature.set(ID_FIELD_COLOR, Integer.valueOf(fea
466
                                                        .getProp("color")));
467
                                        feature.set(ID_FIELD_TEXT, fea.getProp("text"));
468
                                        feature.set(ID_FIELD_HEIGHTTEXT, Double.valueOf(fea
469
                                                        .getProp("textHeight")));
470
                                        feature.set(ID_FIELD_ROTATIONTEXT, Double.valueOf(fea
471
                                                        .getProp("textRotation")));
472
                                        feature.set(ID_FIELD_ELEVATION, Double.valueOf(fea
473
                                                        .getProp("elevation")));
474
                                        feature.set(ID_FIELD_THICKNESS, Double.valueOf(fea
475
                                                        .getProp("thickness")));
476
                                        // FIXME: Abria que pillar el resto de atributos del DXF.
477

    
478
                                        store.addFeatureData(feature);
479

    
480

    
481
                                        // FIXME: Habia una incongruencia en el codigo ya que al
482
                                        // campo
483
                                        // ID_FIELD_GEOMETRY igual le asignaba una geometria que un
484
                                        // valor de cadena como 'Point3D', 'Polyline2D' o
485
                                        // 'Polyline3D'
486
                                        // Faltaria un atributo ID_FIELD_FSHAPE ?
487
                                        //
488

    
489
                                        if (fea.getGeometry() instanceof Point
490
                                                        && !(fea.getGeometry() instanceof org.cresques.px.gml.Point3D)) {
491
                                                Point point = (Point) fea.getGeometry();
492
                                                Point2D pto = new Point2D.Double();
493
                                                pto = point.get(0);
494
                                                if (point.isTextPoint()) {
495
                                                        Geometry geom = gFactory
496
                                                                        .createPoint2D(new org.gvsig.fmap.geom.primitive.Point2D(
497
                                                                                        pto.getX(), pto.getY()));
498
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
499
                                                } else {
500
                                                        Geometry geom = gFactory
501
                                                                        .createPoint2D(new org.gvsig.fmap.geom.primitive.Point2D(
502
                                                                                        pto.getX(), pto.getY()));
503
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
504
                                                }
505
                                        } else if (fea.getGeometry() instanceof org.cresques.px.gml.Point3D) {
506
                                                org.cresques.px.gml.Point3D point = (org.cresques.px.gml.Point3D) fea
507
                                                                .getGeometry();
508
                                                Point3D pto = new Point3D();
509
                                                pto = point.getPoint3D(0);
510
                                                if (point.isTextPoint()) {
511
                                                        Geometry geom = gFactory.createPoint3D(pto.getX(),
512
                                                                        pto.getY(), pto.getZ());
513
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
514
                                                } else {
515
                                                        Geometry geom = gFactory.createPoint3D(pto.getX(),
516
                                                                        pto.getY(), pto.getZ());
517
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
518
                                                }
519
                                        } else if (fea.getGeometry() instanceof LineString
520
                                                        && !(fea.getGeometry() instanceof LineString3D)) {
521
                                                GeneralPathX genPathX = new GeneralPathX();
522
                                                Point2D[] pts = new Point2D[fea.getGeometry().pointNr()];
523
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
524
                                                        pts[j] = fea.getGeometry().get(j);
525
                                                }
526
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
527
                                                for (int j = 1; j < pts.length; j++) {
528
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
529
                                                }
530
                                                Geometry geom = gFactory.createPolyline2D(genPathX);
531
                                                feature.set(ID_FIELD_GEOMETRY, geom);
532

    
533
                                        } else if (fea.getGeometry() instanceof LineString3D) {
534
                                                GeneralPathX genPathX = new GeneralPathX();
535
                                                Point3D[] pts = new Point3D[fea.getGeometry().pointNr()];
536
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
537
                                                        pts[j] = ((LineString3D) fea.getGeometry())
538
                                                                        .getPoint3D(j);
539
                                                }
540
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
541
                                                for (int j = 1; j < pts.length; j++) {
542
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
543
                                                }
544
                                                double[] elevations = new double[pts.length];
545
                                                for (int j = 0; j < pts.length; j++) {
546
                                                        elevations[j] = pts[j].getZ();
547
                                                }
548
                                                Geometry geom = gFactory.createPolyline3D(genPathX,
549
                                                                elevations);
550
                                                feature.set(ID_FIELD_GEOMETRY, geom);
551

    
552
                                        } else if (fea.getGeometry() instanceof Polygon
553
                                                        && !(fea.getGeometry() instanceof Polygon3D)) {
554
                                                GeneralPathX genPathX = new GeneralPathX();
555
                                                Point2D firstPt = new Point2D.Double();
556
                                                firstPt = fea.getGeometry().get(0);
557
                                                Point2D[] pts = new Point2D[fea.getGeometry().pointNr() + 1];
558
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
559
                                                        pts[j] = fea.getGeometry().get(j);
560
                                                }
561
                                                pts[fea.getGeometry().pointNr()] = firstPt;
562
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
563
                                                for (int j = 1; j < pts.length; j++) {
564
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
565
                                                }
566
                                                Geometry geom = gFactory.createPolygon2D(genPathX);
567
                                                feature.set(ID_FIELD_GEOMETRY, geom);
568

    
569
                                        } else if (fea.getGeometry() instanceof Polygon3D) {
570
                                                GeneralPathX genPathX = new GeneralPathX();
571
                                                Point3D firstPt = new Point3D();
572
                                                firstPt = ((Polygon3D) fea.getGeometry()).getPoint3D(0);
573
                                                Point3D[] pts = new Point3D[fea.getGeometry().pointNr() + 1];
574
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
575
                                                        pts[j] = ((Polygon3D) fea.getGeometry())
576
                                                                        .getPoint3D(j);
577
                                                }
578
                                                pts[fea.getGeometry().pointNr()] = firstPt;
579
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
580
                                                for (int j = 1; j < pts.length; j++) {
581
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
582
                                                }
583
                                                double[] elevations = new double[pts.length];
584
                                                for (int j = 0; j < pts.length; j++) {
585
                                                        elevations[j] = pts[j].getZ();
586
                                                }
587
                                                Geometry geom = gFactory.createPolygon3D(genPathX,
588
                                                                elevations);
589
                                                feature.set(ID_FIELD_GEOMETRY, geom);
590
                                        } else {
591
                                                getLogger().warn(
592
                                                        MessageFormat.format(
593
                                                                "load: geometry type {1} not supported",
594
                                                                new Object[] { fea.getGeometry().getClass().getName() }
595
                                                        )
596
                                                );
597
                                        }
598
                                } catch (Exception e) {
599
                                        throw new LoadException(e, fileName);
600
                                }
601
                                if (leyendBuilder != null) {
602
                                        leyendBuilder.process(feature);
603
                                }
604

    
605
                        }
606
                        return featureDatas;
607
                }
608

    
609
        }
610

    
611
        public class Writer {
612
                private Double DEFAULT_ELEVATION = new Double(0);
613

    
614
                private DxfFile.EntityFactory entityMaker;
615

    
616
                private IProjection proj = null;
617

    
618
                private int handle = 40; // Revisar porqu? es 40.
619

    
620
                private int k = 0;
621

    
622
                private boolean dxf3DFile = false;
623
                private String fileName;
624

    
625
                public Writer initialice(File file, IProjection projection) {
626
                        this.proj = projection;
627
                        this.fileName = file.getAbsolutePath();
628
                        entityMaker = new DxfEntityMaker(proj);
629

    
630
                        return this;
631
                }
632

    
633
                public void begin() {
634
                        entityMaker = new DxfEntityMaker(proj);
635
                }
636

    
637
                public void end() throws WriteException {
638
                        try {
639
                                DxfFile dxfFile = new DxfFile(null, fileName, entityMaker);
640
                                dxfFile.setCadFlag(true);
641
                                if (dxf3DFile) {
642
                                        dxfFile.setDxf3DFlag(true);
643
                                }
644
                                dxfFile.save(fileName);
645
                                dxfFile.close();
646
                        } catch (Exception e) {
647
                                throw new WriteException(fileName, e);
648
                        }
649
                }
650

    
651
                public void add(FeatureData feature) throws WriteException {
652
                        try {
653
                                Geometry geom = feature.getDefaultGeometry();
654

    
655
                                if (Point2DZ.class.isAssignableFrom(geom.getClass())) {
656
                                        dxf3DFile = true;
657
                                        k = createPoint3D(handle, k, feature);
658

    
659
                                } else if (org.gvsig.fmap.geom.primitive.Point2D.class
660
                                                .isAssignableFrom(geom.getClass())) {
661
                                        k = createPoint2D(handle, k, feature);
662

    
663
                                } else if (Curve2DZ.class.isAssignableFrom(geom.getClass())) {
664
                                        dxf3DFile = true;
665
                                        k = createPolyline3D(handle, k, feature);
666

    
667
                                } else if (Arc2D.class.isAssignableFrom(geom.getClass())) {
668
                                        k = createArc2D(handle, k, feature);
669

    
670
                                } else if (Curve2D.class.isAssignableFrom(geom.getClass())) {
671
                                        k = createLwPolyline2D(handle, k, feature, false);
672

    
673
                                } else if (Surface2DZ.class.isAssignableFrom(geom.getClass())) {
674
                                        dxf3DFile = true;
675
                                        k = createPolyline3D(handle, k, feature);
676

    
677
                                } else if (Circle2D.class.isAssignableFrom(geom.getClass())) {
678
                                        k = createCircle2D(handle, k, feature);
679

    
680
                                } else if (Ellipse2D.class.isAssignableFrom(geom.getClass())) {
681
                                        k = createEllipse2D(handle, k, feature);
682

    
683
                                } else if (Surface2D.class.isAssignableFrom(geom.getClass())) {
684
                                        k = createLwPolyline2D(handle, k, feature, true);
685

    
686
                                } else {
687
                                        getLogger().warn(
688
                                                        MessageFormat.format(
689
                                                                        "Geometry '{1}' not yet supported",
690
                                                                        new Object[] {geom.getClass().getName()}
691
                                                                )
692
                                                );
693
                                        k++;
694
                                }
695
                        } catch (Exception e) {
696
                                throw new WriteException(fileName, e);
697
                        }
698

    
699
                }
700

    
701
                private boolean hasText(FeatureData feature) {
702
                        if (feature.isNull(ID_FIELD_TEXT)) {
703
                                return false;
704
                        }
705
                        if (feature.get(ID_FIELD_TEXT).equals("")) {
706
                                return false;
707
                        }
708
                        return true;
709
                }
710

    
711
                private DxfGroupVector updateProperties(FeatureData feature, int k) {
712
                        DxfGroupVector polv = new DxfGroupVector();
713

    
714
                        String layer = (String) feature.get(ID_FIELD_LAYER);
715
                        Integer color = (Integer) feature.get(ID_FIELD_COLOR);
716
                        Double thickness = (Double) feature.get(ID_FIELD_THICKNESS);
717

    
718
                        DxfGroup geometryLayer = new DxfGroup(8, layer);
719

    
720
                        DxfGroup handleGroup = new DxfGroup();
721
                        handleGroup.setCode(5);
722
                        handleGroup.setData(new Integer(handle + k).toString());
723

    
724
                        DxfGroup handleColor = new DxfGroup();
725
                        handleColor.setCode(62);
726
                        handleColor.setData(color);
727

    
728
                        DxfGroup handleThickness = new DxfGroup();
729
                        handleThickness.setCode(39);
730
                        handleThickness.setData(thickness);
731

    
732
                        polv.add(geometryLayer);
733
                        polv.add(handleGroup);
734
                        polv.add(handleColor);
735
                        return polv;
736
                }
737

    
738
                private int createPoint2D(int handle, int k, FeatureData feature)
739
                                throws Exception {
740

    
741
                        if (hasText(feature)) {
742
                                return createText2D(handle, k, feature);
743
                        }
744
                        org.gvsig.fmap.geom.primitive.Point2D point = new org.gvsig.fmap.geom.primitive.Point2D(
745
                                        0, 0);
746
                        double[] pointCoords = new double[6];
747
                        PathIterator pointIt = (feature.getDefaultGeometry())
748
                                        .getPathIterator(null);
749
                        while (!pointIt.isDone()) {
750
                                pointIt.currentSegment(pointCoords);
751
                                point = new org.gvsig.fmap.geom.primitive.Point2D(
752
                                                pointCoords[0], pointCoords[1]);
753
                                pointIt.next();
754
                        }
755
                        Point2D pto = new Point2D.Double(point.getX(), point.getY());
756

    
757
                        DxfGroup px = new DxfGroup();
758
                        DxfGroup py = new DxfGroup();
759
                        DxfGroup pz = new DxfGroup();
760
                        px.setCode(10);
761
                        px.setData(new Double(pto.getX()));
762
                        py.setCode(20);
763
                        py.setData(new Double(pto.getY()));
764
                        pz.setCode(30);
765
                        // FIXME: POINT del DXF tiene cota. Le asigno cero arbitrariamente.
766
                        pz.setData(new Double(0.0));
767
                        DxfGroupVector pv = updateProperties(feature, k);
768
                        pv.add(px);
769
                        pv.add(py);
770
                        pv.add(pz);
771
                        entityMaker.createPoint(pv);
772
                        k++;
773
                        return k;
774
                }
775

    
776
                private int createText2D(int handle, int k, FeatureData feature)
777
                                throws Exception {
778

    
779
                        String text = feature.get(ID_FIELD_TEXT).toString();
780
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
781
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
782

    
783
                        DxfGroup handleText = new DxfGroup();
784
                        handleText.setCode(1);
785
                        handleText.setData(text);
786

    
787
                        DxfGroup handleHeightText = new DxfGroup();
788
                        handleHeightText.setCode(40);
789
                        handleHeightText.setData(heightText);
790

    
791
                        DxfGroup handleRotationText = new DxfGroup();
792
                        handleRotationText.setCode(50);
793
                        handleRotationText.setData(rotationText);
794

    
795
                        org.gvsig.fmap.geom.primitive.Point2D point = new org.gvsig.fmap.geom.primitive.Point2D(
796
                                        0, 0);
797
                        double[] pointCoords = new double[6];
798
                        PathIterator pointIt = (feature.getDefaultGeometry())
799
                                        .getPathIterator(null);
800
                        while (!pointIt.isDone()) {
801
                                pointIt.currentSegment(pointCoords);
802
                                point = new org.gvsig.fmap.geom.primitive.Point2D(
803
                                                pointCoords[0], pointCoords[1]);
804
                                pointIt.next();
805
                        }
806
                        Point2D pto = new Point2D.Double(point.getX(), point.getY());
807
                        DxfGroup handleGroup = new DxfGroup();
808
                        handleGroup.setCode(5);
809
                        handleGroup.setData(new Integer(handle + k).toString());
810
                        DxfGroup px = new DxfGroup();
811
                        DxfGroup py = new DxfGroup();
812
                        DxfGroup pz = new DxfGroup();
813
                        px.setCode(10);
814
                        px.setData(new Double(pto.getX()));
815
                        py.setCode(20);
816
                        py.setData(new Double(pto.getY()));
817
                        pz.setCode(30);
818
                        // FIXME: POINT del DXF tiene cota. Le asigno cero arbitrariamente.
819
                        pz.setData(new Double(0.0));
820
                        DxfGroupVector pv = updateProperties(feature, k);
821
                        pv.add(handleText);
822
                        pv.add(handleHeightText);
823
                        pv.add(handleRotationText);
824
                        pv.add(handleGroup);
825
                        pv.add(px);
826
                        pv.add(py);
827
                        pv.add(pz);
828
                        entityMaker.createText(pv);
829
                        k++;
830
                        return k;
831
                }
832

    
833
                private int createPoint3D(int handle, int k, FeatureData feature)
834
                                throws Exception {
835
                        if (hasText(feature)) {
836
                                return createText3D(handle, k, feature);
837
                        }
838
                        Point2DZ point = new Point2DZ(0, 0, 0);
839
                        double[] pointCoords = new double[6];
840
                        PathIterator pointIt = (feature.getDefaultGeometry())
841
                                        .getPathIterator(null);
842
                        while (!pointIt.isDone()) {
843
                                pointIt.currentSegment(pointCoords);
844
                                point = new Point2DZ(pointCoords[0], pointCoords[1],
845
                                                pointCoords[2]);
846
                                pointIt.next();
847
                        }
848
                        Point3D pto = new Point3D(point.getX(), point.getY(),
849
                                        point.getZs()[0]);
850
                        DxfGroup px = new DxfGroup();
851
                        DxfGroup py = new DxfGroup();
852
                        DxfGroup pz = new DxfGroup();
853
                        px.setCode(10);
854
                        px.setData(new Double(pto.getX()));
855
                        py.setCode(20);
856
                        py.setData(new Double(pto.getY()));
857
                        pz.setCode(30);
858
                        pz.setData(new Double(pto.getZ()));
859
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
860
                                        .getZs();
861
                        Double elevation = DEFAULT_ELEVATION;
862
                        elevation = new Double(velev[0]);
863
                        DxfGroup handleElevation = new DxfGroup();
864
                        handleElevation.setCode(38);
865
                        handleElevation.setData(elevation);
866

    
867
                        DxfGroupVector pv = updateProperties(feature, k);
868
                        pv.add(handleElevation);
869
                        pv.add(px);
870
                        pv.add(py);
871
                        pv.add(pz);
872
                        entityMaker.createPoint(pv);
873
                        k++;
874
                        return k;
875
                }
876

    
877
                private int createText3D(int handle, int k, FeatureData feature)
878
                                throws Exception {
879

    
880
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
881
                        .getZs();
882

    
883
                        Double elevation = new Double(velev[0]);
884
                        String text = feature.get(ID_FIELD_TEXT).toString();
885
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
886
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
887

    
888
                        DxfGroup handleText = new DxfGroup();
889
                        handleText.setCode(1);
890
                        handleText.setData(text);
891

    
892
                        DxfGroup handleHeightText = new DxfGroup();
893
                        handleHeightText.setCode(40);
894
                        handleHeightText.setData(heightText);
895

    
896
                        DxfGroup handleRotationText = new DxfGroup();
897
                        handleRotationText.setCode(50);
898
                        handleRotationText.setData(rotationText);
899

    
900
                        DxfGroup handleElevation = new DxfGroup();
901
                        handleElevation.setCode(38);
902
                        handleElevation.setData(elevation);
903

    
904
                        Point2DZ point = (Point2DZ) (feature
905
                                        .getDefaultGeometry()).getInternalShape();
906

    
907
                        DxfGroup handleGroup = new DxfGroup();
908
                        handleGroup.setCode(5);
909
                        handleGroup.setData(new Integer(handle + k).toString());
910
                        DxfGroup px = new DxfGroup();
911
                        DxfGroup py = new DxfGroup();
912
                        DxfGroup pz = new DxfGroup();
913
                        px.setCode(10);
914
                        px.setData(new Double(point.getX()));
915
                        py.setCode(20);
916
                        py.setData(new Double(point.getY()));
917
                        pz.setCode(30);
918
                        pz.setData(new Double(point.getZs()[0]));
919
                        DxfGroupVector pv = updateProperties(feature, k);
920
                        pv.add(handleElevation);
921
                        pv.add(handleText);
922
                        pv.add(handleHeightText);
923
                        pv.add(handleRotationText);
924
                        pv.add(handleGroup);
925
                        pv.add(px);
926
                        pv.add(py);
927
                        pv.add(pz);
928
                        entityMaker.createText(pv);
929
                        k++;
930
                        return k;
931
                }
932

    
933
                private int createLwPolyline2D(int handle, int k, FeatureData feature,
934
                                boolean isPolygon) throws Exception {
935
                        boolean first = true;
936
                        DxfGroupVector polv = updateProperties(feature, k);
937
                        Vector vpoints = new Vector();
938

    
939
                        DxfGroup polylineFlag = new DxfGroup();
940
                        polylineFlag.setCode(70);
941
                        if (isPolygon) {
942
                                polylineFlag.setData(new Integer(1)); // cerrada
943
                        } else {
944
                                polylineFlag.setData(new Integer(0)); // abierta
945
                        }
946

    
947
                        PathIterator theIterator = (feature.getDefaultGeometry())
948
                                        .getPathIterator(null, Converter.FLATNESS); // polyLine.
949
                                                                                                                                // getPathIterator
950
                                                                                                                                // (null,
951
                        // flatness);
952

    
953
                        double[] theData = new double[6];
954
                        while (!theIterator.isDone()) {
955
                                int theType = theIterator.currentSegment(theData);
956
                                switch (theType) {
957
                                case PathIterator.SEG_MOVETO:
958
                                        if (!first) {
959
                                                for (int j = 0; j < vpoints.size(); j++) {
960
                                                        DxfGroup xvertex = new DxfGroup();
961
                                                        xvertex.setCode(10);
962
                                                        xvertex
963
                                                                        .setData(new Double(
964
                                                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
965
                                                                                                        .get(j)).getX()));
966
                                                        DxfGroup yvertex = new DxfGroup();
967
                                                        yvertex.setCode(20);
968
                                                        yvertex
969
                                                                        .setData(new Double(
970
                                                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
971
                                                                                                        .get(j)).getY()));
972
                                                        polv.add(xvertex);
973
                                                        polv.add(yvertex);
974
                                                }
975

    
976
                                                entityMaker.createLwPolyline(polv);
977
                                                k++;
978
                                                polv = updateProperties(feature, k);
979

    
980
                                        }
981
                                        first = false;
982
                                        polv.add(polylineFlag);
983
                                        vpoints.clear();
984
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
985
                                                        theData[0], theData[1]));
986
                                        break;
987
                                case PathIterator.SEG_LINETO:
988
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
989
                                                        theData[0], theData[1]));
990
                                        break;
991
                                case PathIterator.SEG_QUADTO:
992
                                        break;
993
                                case PathIterator.SEG_CUBICTO:
994
                                        break;
995
                                case PathIterator.SEG_CLOSE:
996
                                        polylineFlag.setData(new Integer(1)); // cerrada
997
                                        break;
998

    
999
                                }
1000
                                theIterator.next();
1001
                        }
1002

    
1003
                        for (int j = 0; j < vpoints.size(); j++) {
1004
                                DxfGroup xvertex = new DxfGroup();
1005
                                xvertex.setCode(10);
1006
                                xvertex
1007
                                                .setData(new Double(
1008
                                                                ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1009
                                                                                .get(j)).getX()));
1010
                                DxfGroup yvertex = new DxfGroup();
1011
                                yvertex.setCode(20);
1012
                                yvertex
1013
                                                .setData(new Double(
1014
                                                                ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1015
                                                                                .get(j)).getY()));
1016
                                polv.add(xvertex);
1017
                                polv.add(yvertex);
1018
                        }
1019

    
1020
                        entityMaker.createLwPolyline(polv);
1021
                        k++;
1022
                        return k;
1023
                }
1024

    
1025
                private int createPolyline3D(int handle, int k, FeatureData feature)
1026
                                throws Exception {
1027
                        DxfGroupVector polv = updateProperties(feature, k);
1028
                        Vector vpoints = new Vector();
1029
                        PathIterator theIterator = (feature.getDefaultGeometry())
1030
                                        .getPathIterator(null, Converter.FLATNESS); // polyLine.
1031
                                                                                                                                // getPathIterator
1032
                                                                                                                                // (null,
1033
                        // flatness);
1034
                        double[] theData = new double[6];
1035
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
1036
                                        .getZs();
1037
                        while (!theIterator.isDone()) {
1038
                                int theType = theIterator.currentSegment(theData);
1039
                                switch (theType) {
1040
                                case PathIterator.SEG_MOVETO:
1041
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
1042
                                                        theData[0], theData[1]));
1043
                                        break;
1044
                                case PathIterator.SEG_LINETO:
1045
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
1046
                                                        theData[0], theData[1]));
1047
                                        break;
1048
                                }
1049
                                theIterator.next();
1050
                        }
1051
                        if (constantElevation(velev)) {
1052
                                DxfGroup polylineFlag = new DxfGroup();
1053
                                polylineFlag.setCode(70);
1054
                                polylineFlag.setData(new Integer(0));
1055
                                polv.add(polylineFlag);
1056
                                DxfGroup elevation = new DxfGroup();
1057
                                elevation.setCode(38);
1058
                                elevation.setData(new Double(velev[0]));
1059
                                polv.add(elevation);
1060
                                for (int j = 0; j < vpoints.size(); j++) {
1061
                                        DxfGroup xvertex = new DxfGroup();
1062
                                        xvertex.setCode(10);
1063
                                        xvertex.setData(new Double(
1064
                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1065
                                                                        .get(j)).getX()));
1066
                                        DxfGroup yvertex = new DxfGroup();
1067
                                        yvertex.setCode(20);
1068
                                        yvertex.setData(new Double(
1069
                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1070
                                                                        .get(j)).getY()));
1071
                                        polv.add(xvertex);
1072
                                        polv.add(yvertex);
1073
                                }
1074
                                entityMaker.createLwPolyline(polv);
1075
                                k++;
1076
                        } else {
1077
                                DxfGroup polylineFlag = new DxfGroup();
1078
                                polylineFlag.setCode(70);
1079
                                polylineFlag.setData(new Integer(8));
1080
                                polv.add(polylineFlag);
1081
                                DxfGroup xgroup = new DxfGroup();
1082
                                xgroup.setCode(10);
1083
                                xgroup.setData(new Double(0.0));
1084
                                polv.add(xgroup);
1085
                                DxfGroup ygroup = new DxfGroup();
1086
                                ygroup.setCode(20);
1087
                                ygroup.setData(new Double(0.0));
1088
                                polv.add(ygroup);
1089
                                DxfGroup elevation = new DxfGroup();
1090
                                elevation.setCode(30);
1091
                                elevation.setData(new Double(0.0));
1092
                                polv.add(elevation);
1093
                                DxfGroup subclassMarker = new DxfGroup(100, "AcDb3dPolyline");
1094
                                polv.add(subclassMarker);
1095
                                entityMaker.createPolyline(polv);
1096
                                k++;
1097
                                for (int j = 0; j < vpoints.size(); j++) {
1098
                                        DxfGroupVector verv = new DxfGroupVector();
1099
                                        DxfGroup entityType = new DxfGroup(0, "VERTEX");
1100
                                        verv.add(entityType);
1101
                                        DxfGroup generalSubclassMarker = new DxfGroup(100,
1102
                                                        "AcDbEntity");
1103
                                        verv.add(generalSubclassMarker);
1104
                                        DxfGroup layerName = new DxfGroup(8, "default");
1105
                                        verv.add(layerName);
1106
                                        DxfGroup vertexSubclassMarker = new DxfGroup(100,
1107
                                                        "AcDbVertex");
1108
                                        verv.add(vertexSubclassMarker);
1109
                                        DxfGroup xvertex = new DxfGroup();
1110
                                        xvertex.setCode(10);
1111
                                        xvertex.setData(new Double(
1112
                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1113
                                                                        .get(j)).getX()));
1114
                                        DxfGroup yvertex = new DxfGroup();
1115
                                        yvertex.setCode(20);
1116
                                        yvertex.setData(new Double(
1117
                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1118
                                                                        .get(j)).getY()));
1119
                                        DxfGroup zvertex = new DxfGroup();
1120
                                        zvertex.setCode(30);
1121
                                        zvertex.setData(new Double(velev[j]));
1122
                                        verv.add(xvertex);
1123
                                        verv.add(yvertex);
1124
                                        verv.add(zvertex);
1125
                                        entityMaker.addVertex(verv);
1126
                                        k++;
1127
                                }
1128
                                DxfGroupVector seqv = new DxfGroupVector();
1129
                                DxfGroup entityType = new DxfGroup(0, "SEQEND");
1130
                                seqv.add(entityType);
1131
                                DxfGroup generalSubclassMarker = new DxfGroup(100, "AcDbEntity");
1132
                                seqv.add(generalSubclassMarker);
1133
                                DxfGroup layerName = new DxfGroup(8, "default");
1134
                                seqv.add(layerName);
1135
                                DxfGroup handleSeqGroup = new DxfGroup();
1136
                                handleSeqGroup.setCode(5);
1137
                                handleSeqGroup.setData(new Integer(handle + k).toString());
1138
                                seqv.add(handleSeqGroup);
1139
                                entityMaker.endSeq();
1140
                                k++;
1141
                        }
1142
                        return k;
1143
                }
1144

    
1145
                private boolean constantElevation(double[] velev) {
1146
                        boolean constant = true;
1147
                        for (int i = 0; i < velev.length; i++) {
1148
                                for (int j = 0; j < velev.length; j++) {
1149
                                        if (j > i) {
1150
                                                if (velev[i] != velev[j]) {
1151
                                                        constant = false;
1152
                                                        break;
1153
                                                }
1154
                                        }
1155
                                }
1156
                                break;
1157
                        }
1158
                        return constant;
1159
                }
1160

    
1161
                private int createCircle2D(int handle, int k, FeatureData feature)
1162
                                throws Exception {
1163
                        DxfGroupVector polv = updateProperties(feature, k);
1164
                        DxfGroup circleFlag = new DxfGroup();
1165
                        circleFlag.setCode(100);
1166
                        polv.add(circleFlag);
1167

    
1168
                        DxfGroup xvertex = new DxfGroup();
1169
                        xvertex.setCode(10);
1170
                        Circle2D circle = (Circle2D) (feature
1171
                                        .getDefaultGeometry()).getInternalShape();
1172
                        xvertex.setData(new Double(circle.getCenter().getX()));
1173
                        DxfGroup yvertex = new DxfGroup();
1174
                        yvertex.setCode(20);
1175
                        yvertex.setData(new Double(circle.getCenter().getY()));
1176
                        DxfGroup zvertex = new DxfGroup();
1177
                        zvertex.setCode(30);
1178
                        // TODO: COORDENADA Z. REVISAR ESTO PARA ENTIDADES 3D
1179
                        zvertex.setData(new Double(0));
1180

    
1181
                        DxfGroup radius = new DxfGroup();
1182
                        radius.setCode(40);
1183
                        radius.setData(new Double(circle.getRadio()));
1184

    
1185
                        polv.add(xvertex);
1186
                        polv.add(yvertex);
1187
                        polv.add(zvertex);
1188
                        polv.add(radius);
1189

    
1190
                        entityMaker.createCircle(polv);
1191
                        k++;
1192
                        return k;
1193
                }
1194

    
1195
                private int createArc2D(int handle, int k, FeatureData feature)
1196
                                throws Exception {
1197
                        Arc2D arc = (Arc2D) (feature.getDefaultGeometry())
1198
                                        .getInternalShape();
1199
                        Point2D[] pts = new Point2D[3];
1200
                        pts[0] = arc.getInit();
1201
                        pts[1] = arc.getMid();
1202
                        pts[2] = arc.getEnd();
1203
                        Point2D center = arc.getCenter();
1204
                        double radius = center.distance(pts[0]);
1205
                        double initAngle = UtilFunctions.getAngle(center, pts[0]);
1206
                        initAngle = Math.toDegrees(initAngle);
1207
                        double midAngle = UtilFunctions.getAngle(center, pts[1]);
1208
                        midAngle = Math.toDegrees(midAngle);
1209
                        double endAngle = UtilFunctions.getAngle(center, pts[2]);
1210
                        endAngle = Math.toDegrees(endAngle);
1211

    
1212
                        DxfGroup ax = new DxfGroup();
1213
                        DxfGroup ay = new DxfGroup();
1214
                        DxfGroup ac = new DxfGroup();
1215
                        DxfGroup ai = new DxfGroup();
1216
                        DxfGroup ae = new DxfGroup();
1217
                        ax.setCode(10);
1218
                        ax.setData(new Double(center.getX()));
1219
                        ay.setCode(20);
1220
                        ay.setData(new Double(center.getY()));
1221
                        ac.setCode(40);
1222
                        ac.setData(new Double(radius));
1223
                        ai.setCode(50);
1224
                        ai.setData(new Double(initAngle));
1225
                        ae.setCode(51);
1226
                        ae.setData(new Double(endAngle));
1227
                        DxfGroupVector av = updateProperties(feature, k);
1228
                        av.add(ax);
1229
                        av.add(ay);
1230
                        av.add(ac);
1231
                        av.add(ai);
1232
                        av.add(ae);
1233
                        entityMaker.createArc(av);
1234
                        k++;
1235
                        return k;
1236
                }
1237

    
1238
                private int createEllipse2D(int handle, int k, FeatureData feature)
1239
                                throws Exception {
1240
                        Ellipse2D ellipse = (Ellipse2D) (feature
1241
                                        .getDefaultGeometry()).getInternalShape();
1242

    
1243
                        Point2D center = new Point2D.Double(
1244
                                        (ellipse.getInit().getX() + ellipse.getEnd().getX()) / 2,
1245
                                        (ellipse.getInit().getY() + ellipse.getEnd().getY()) / 2);
1246
                        double mAxisL = ellipse.getDist() * 2;
1247
                        double maAxisL = ellipse.getInit().distance(ellipse.getEnd());
1248

    
1249
                        Point2D endPointOfMajorAxis = ellipse.getEnd();
1250
                        double azimut = Math
1251
                                        .atan2(endPointOfMajorAxis.getX() - center.getX(),
1252
                                                        endPointOfMajorAxis.getY() - center.getY());
1253
                        double azimut2 = azimut + Math.PI / 2.0;
1254
                        if (azimut2 >= Math.PI * 2) {
1255
                                azimut2 = azimut2 - Math.PI * 2;
1256
                        }
1257
                        Point2D endPointOfMinorAxis = new Point2D.Double(center.getX()
1258
                                        + (ellipse.getDist() * Math.sin(azimut2)), center.getY()
1259
                                        + (ellipse.getDist() * Math.cos(azimut2)));
1260

    
1261
                        if (mAxisL >= maAxisL) {
1262
                                // El menor debe ser menor que el mayor. Los cambiamos.
1263
                                double aux = mAxisL;
1264
                                mAxisL = maAxisL;
1265
                                maAxisL = aux;
1266
                                // Tambi?n cambiamos los puntos finales de los ejes.
1267
                                Point2D pAux = endPointOfMinorAxis;
1268
                                endPointOfMinorAxis = endPointOfMajorAxis;
1269
                                endPointOfMajorAxis = pAux;
1270
                        }
1271
                        double mToMAR = mAxisL / maAxisL;
1272
                        DxfGroup x = new DxfGroup();
1273
                        DxfGroup y = new DxfGroup();
1274
                        DxfGroup xc = new DxfGroup();
1275
                        DxfGroup yc = new DxfGroup();
1276
                        DxfGroup minToMaj = new DxfGroup();
1277
                        x.setCode(10);
1278
                        x.setData(new Double(center.getX()));
1279
                        y.setCode(20);
1280
                        y.setData(new Double(center.getY()));
1281
                        xc.setCode(11);
1282
                        xc.setData(new Double(endPointOfMajorAxis.getX() - center.getX()));
1283
                        yc.setCode(21);
1284
                        yc.setData(new Double(endPointOfMajorAxis.getY() - center.getY()));
1285
                        minToMaj.setCode(40);
1286
                        minToMaj.setData(new Double(mToMAR));
1287
                        DxfGroupVector av = updateProperties(feature, k);
1288
                        av.add(x);
1289
                        av.add(y);
1290
                        av.add(xc);
1291
                        av.add(yc);
1292
                        av.add(minToMaj);
1293
                        entityMaker.createEllipse(av);
1294
                        k++;
1295
                        return k;
1296
                }
1297

    
1298
        }
1299

    
1300
        public boolean closeResourceRequested(ResourceProvider resource) {
1301
                return true;
1302
        }
1303

    
1304
        public int getFeatureReferenceOIDType() {
1305
                return DataTypes.LONG;
1306
        }
1307

    
1308
        public boolean supportsAppendMode() {
1309
                return false;
1310
        }
1311

    
1312
        public void append(org.gvsig.fmap.data.feature.Feature feature) {
1313
                throw new UnsupportedOperationException();
1314
        }
1315

    
1316
        public void beginAppend() {
1317
                throw new UnsupportedOperationException();
1318
        }
1319

    
1320
        public void endAppend() {
1321
                throw new UnsupportedOperationException();
1322
        }
1323

    
1324
        public PersistentState getState() throws PersistenceException {
1325
                return AbstractPersistenceManager.getState(this);
1326
        }
1327

    
1328
        public void loadState(PersistentState state) throws PersistenceException {
1329
                // TODO Auto-generated method stub
1330
                throw new NotYetImplemented();
1331
        }
1332

    
1333
        public void setState(PersistentState state) throws PersistenceException {
1334
                // TODO Auto-generated method stub
1335
                throw new NotYetImplemented();
1336
        }
1337

    
1338
        public Object createNewOID() {
1339
                return new Integer(this.data.size() + ++counterNewsOIDs);
1340
        }
1341

    
1342

    
1343
}