Statistics
| Revision:

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

History | View | Annotate | Download (38.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.crs.CRSFactory;
29
import org.gvsig.fmap.data.DataExplorer;
30
import org.gvsig.fmap.data.DataStoreParameters;
31
import org.gvsig.fmap.data.DataTypes;
32
import org.gvsig.fmap.data.exceptions.CreateException;
33
import org.gvsig.fmap.data.exceptions.DataException;
34
import org.gvsig.fmap.data.exceptions.InitializeException;
35
import org.gvsig.fmap.data.exceptions.LoadException;
36
import org.gvsig.fmap.data.exceptions.OpenException;
37
import org.gvsig.fmap.data.exceptions.ReadException;
38
import org.gvsig.fmap.data.exceptions.WriteException;
39
import org.gvsig.fmap.data.feature.EditableFeatureType;
40
import org.gvsig.fmap.data.feature.FeatureSet;
41
import org.gvsig.fmap.data.feature.FeatureType;
42
import org.gvsig.fmap.data.feature.exceptions.PerformEditingException;
43
import org.gvsig.fmap.data.feature.spi.FeatureData;
44
import org.gvsig.fmap.data.feature.spi.FeatureStoreProvider;
45
import org.gvsig.fmap.data.feature.spi.FeatureStoreProviderServices;
46
import org.gvsig.fmap.data.feature.spi.LegendBuilder;
47
import org.gvsig.fmap.data.feature.spi.memory.AbstractMemoryStoreProvider;
48
import org.gvsig.fmap.data.resource.exception.AccessResourceException;
49
import org.gvsig.fmap.data.resource.file.FileResource;
50
import org.gvsig.fmap.data.resource.spi.ResourceConsumer;
51
import org.gvsig.fmap.data.resource.spi.ResourceProvider;
52
import org.gvsig.fmap.geom.Geometry;
53
import org.gvsig.fmap.geom.GeometryFactory;
54
import org.gvsig.fmap.geom.GeometryManager;
55
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
56
import org.gvsig.fmap.geom.primitive.Arc2D;
57
import org.gvsig.fmap.geom.primitive.Circle2D;
58
import org.gvsig.fmap.geom.primitive.Curve2D;
59
import org.gvsig.fmap.geom.primitive.Curve2DZ;
60
import org.gvsig.fmap.geom.primitive.Ellipse2D;
61
import org.gvsig.fmap.geom.primitive.GeneralPathX;
62
import org.gvsig.fmap.geom.primitive.Point2DZ;
63
import org.gvsig.fmap.geom.primitive.Surface2D;
64
import org.gvsig.fmap.geom.primitive.Surface2DZ;
65
import org.gvsig.fmap.geom.util.Converter;
66
import org.gvsig.fmap.geom.util.UtilFunctions;
67
import org.gvsig.tools.operations.OperationNotSupportedException;
68

    
69
public class DXFStoreProvider extends AbstractMemoryStoreProvider implements
70
                ResourceConsumer {
71

    
72
        final public static String STORE_NAME = "DXF";
73
        final public static String STORE_DESCRIPTION = "DXF file";
74

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

    
86
        private IProjection projection;
87
        private ResourceProvider resource;
88
        private LegendBuilder leyendBuilder;
89

    
90
        private DXFStoreParameters getParameters() {
91
                return (DXFStoreParameters) this.store.getParameters();
92
        }
93

    
94
        public FeatureStoreProvider initialize(FeatureStoreProviderServices store)
95
                        throws InitializeException {
96
                super.initialize(store);
97

    
98
                projection = CRSFactory.getCRS(getParameters().getSRSID());
99

    
100
                resource = this.createResource(
101
                                FileResource.RESOURCE_TYPE_NAME,
102
                                new Object[] { getParameters().getFileName() }
103
                        );
104
                resource.addConsumer(this);
105

    
106
                try {
107
                        leyendBuilder = (LegendBuilder) store.invokeOperation(
108
                                        LegendBuilder.OPERATION_NAME, null);
109
                } catch (OperationNotSupportedException e) {
110
                        leyendBuilder = null;
111
                } catch (Exception e) {
112
                        throw new InitializeException(e);
113
                }
114
                return this;
115
        }
116

    
117
        public String getName() {
118
                return STORE_NAME;
119
        }
120

    
121
        public boolean allowWrite() {
122
                return true;
123
        }
124

    
125
        public boolean canCreate() {
126
                return true;
127
        }
128

    
129
        public Object getLeyend() throws OpenException {
130
                this.open();
131
                if (leyendBuilder == null) {
132
                        return null;
133
                }
134
                return leyendBuilder.getLegend();
135
        }
136

    
137
        public void open() throws OpenException {
138
                if (this.data != null) {
139
                        return;
140
                }
141
                try {
142
                        this.resource.begin();
143

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

    
172

    
173
        public DataExplorer getExplorer() throws ReadException {
174
                // FIXME: falta implementar
175
                return null;
176
        }
177

    
178
        public void create(DataStoreParameters parameters, FeatureType featureType,
179
                        boolean overwrite) throws CreateException {
180

    
181
                // FIXME: falta gestionar 'overwrite'
182

    
183
                IProjection projection;
184
                DXFStoreParameters params = (DXFStoreParameters) parameters;
185

    
186
                projection = CRSFactory.getCRS(params.getSRSID());
187

    
188
                FileResource resource;
189
                try {
190
                        resource = (FileResource) this.createResource(
191
                                        FileResource.RESOURCE_TYPE_NAME, new Object[] { params
192
                                                        .getFileName() });
193
                } catch (InitializeException e1) {
194
                        throw new CreateException(params.getFileName(), e1);
195
                }
196
                resource.addConsumer(this);
197

    
198

    
199
                try {
200
                        resource.begin();
201
                        Builder builder = new Builder().initialice(
202
                                        resource.getFileName(),
203
                                        projection);
204
                        resource.notifyOpen();
205
                        builder.begin();
206
                        builder.create();
207
                        builder.end();
208
                        resource.notifyClose();
209

    
210
                        resource.setData(null); // FIXME: Seguro que hay que ponerlo a null
211
                                                                        // ??
212
                        resource.notifyChanges();
213
                } catch (Exception e) {
214
                        throw new CreateException(params.getFileName(), e);
215
                } finally {
216
                        resource.end();
217
                }
218
        }
219

    
220
        private FeatureData getFeatureDataFormFeature(Object feature) {
221
                org.gvsig.fmap.data.feature.impl.DefaultFeature f = (org.gvsig.fmap.data.feature.impl.DefaultFeature) feature;
222
                return f.getData();
223
        }
224

    
225
        public void performEditing(Iterator deleteds, Iterator inserteds, Iterator updateds) throws PerformEditingException {
226

    
227
                String fileName = "";
228
                try {
229
                        resource.begin();
230

    
231
                        File file = (File) resource.get();
232
                        fileName = file.getAbsolutePath();
233
                        Writer writer = new Writer().initialice(file, projection);
234
                        FeatureSet features = this.getStoreServices().getFeatureSet();
235

    
236
                        writer.begin();
237
                        Iterator it = features.fastIterator();
238
                        while (it.hasNext()) {
239
                                writer.add(getFeatureDataFormFeature(it.next()));
240
                        }
241
                        resource.notifyOpen();
242
                        writer.end();
243
                        resource.notifyClose();
244
                        features.dispose();
245

    
246
                } catch (Exception e) {
247
                        throw new PerformEditingException(fileName, e);
248
                } finally {
249
                        resource.end();
250
                }
251
        }
252

    
253
        public class Builder {
254
                private String fileName;
255
                private IProjection projection;
256

    
257
                public Builder initialice(String fileName, IProjection projection) {
258
                        this.fileName = fileName;
259
                        this.projection = projection;
260
                        return this;
261
                }
262

    
263
                public void begin() {
264

    
265
                }
266

    
267
                public void end() {
268

    
269
                }
270

    
271
                public void create() throws IOException {
272
                        DxfEntityMaker entityMaker = new DxfEntityMaker(projection);
273
                        DxfFile dxfFile = new DxfFile(null, fileName, entityMaker);
274
                        dxfFile.setCadFlag(true);
275
                        dxfFile.setDxf3DFlag(false);
276
                        dxfFile.save(fileName);
277
                }
278
        }
279

    
280

    
281
        public class Reader {
282
                private File file;
283
                private String fileName;
284
                private IProjection projection;
285
                private List types;
286
                private LegendBuilder leyendBuilder;
287

    
288
                public Reader initialice(File file, IProjection projection,
289
                                LegendBuilder leyendBuilder) {
290
                        this.file = file;
291
                        this.fileName = file.getAbsolutePath();
292
                        this.projection = projection;
293
                        this.leyendBuilder = leyendBuilder;
294
                        return this;
295
                }
296

    
297
                public void begin(FeatureStoreProviderServices store) {
298

    
299
                        EditableFeatureType featureType = store.createFeatureType();
300

    
301
                        ID_FIELD_ID = featureType.add("ID", DataTypes.INT)
302
                                        .setDefaultValue(Integer.valueOf(0))
303
                                .getIndex();
304

    
305
                        ID_FIELD_GEOMETRY = featureType.add("Geometry",
306
                                        DataTypes.GEOMETRY)
307
                                .getIndex();
308

    
309
                        // FIXME: Cual es el size y el valor por defecto para Entity ?
310
                        ID_FIELD_ENTITY = featureType.add("Entity",
311
                                        DataTypes.STRING, 100)
312
                                        .setDefaultValue("")
313
                                        .getIndex();
314

    
315
                        // FIXME: Cual es el size de Layer ?
316
                        ID_FIELD_LAYER = featureType.add("Layer",
317
                                        DataTypes.STRING, 100)
318
                                        .setDefaultValue(
319
                                        "default").getIndex();
320

    
321
                        ID_FIELD_COLOR = featureType.add("Color",
322
                                        DataTypes.INT)
323
                                        .setDefaultValue(
324
                                        Integer.valueOf(0)).getIndex();
325

    
326
                        ID_FIELD_ELEVATION = featureType.add("Elevation",
327
                                        DataTypes.DOUBLE)
328
                                        .setDefaultValue(
329
                                        Double.valueOf(0)).getIndex();
330

    
331
                        ID_FIELD_THICKNESS = featureType.add("Thickness",
332
                                        DataTypes.DOUBLE)
333
                                        .setDefaultValue(
334
                                        Double.valueOf(0)).getIndex();
335

    
336
                        // FIXME: Cual es el size de Text ?
337
                        ID_FIELD_TEXT = featureType.add("Text",
338
                                        DataTypes.STRING, 100)
339
                                        .setDefaultValue("")
340
                                        .getIndex();
341

    
342
                        ID_FIELD_HEIGHTTEXT = featureType.add("HeightText",
343
                                        DataTypes.DOUBLE).setDefaultValue(
344
                                        Double.valueOf(10)).getIndex();
345

    
346
                        ID_FIELD_ROTATIONTEXT = featureType.add("Rotation",
347
                                        DataTypes.DOUBLE).setDefaultValue(
348
                                        Double.valueOf(0)).getIndex();
349

    
350

    
351
                        // FIXME: Parece que el DXF puede tener mas atributos opcionales.
352
                        // Habria que ver de pillarlos ?
353

    
354
                        types = new ArrayList();
355
                        types.add(featureType.getNotEditableCopy());
356

    
357
                        if (leyendBuilder != null) {
358
                                leyendBuilder.begin();
359
                        }
360

    
361
                }
362

    
363
                public void end() {
364
                        if (leyendBuilder != null) {
365
                                leyendBuilder.end();
366
                        }
367
                }
368

    
369
                public List getTypes() {
370
                        return types;
371
                }
372

    
373
                public EditableFeatureType getDefaultType() {
374
                        return (EditableFeatureType) types.get(0);
375
                }
376

    
377
                public List get() throws DataException {
378

    
379
                        ArrayList featureDatas = new ArrayList();
380

    
381
                        DxfFile.EntityFactory featureMaker = new DxfFeatureMaker(projection);
382
                        DxfFile.VarSettings headerManager = new DxfHeaderManager();
383
                        DxfFile dxfFeatureFile = new DxfFile(projection, file
384
                                        .getAbsolutePath(), featureMaker, headerManager);
385

    
386
                        try {
387
                                dxfFeatureFile.load();
388
                        } catch (Exception e1) {
389
                                throw new LoadException(e1, fileName);
390
                        }
391

    
392
                        IObjList.vector features = (IObjList.vector) ((DxfFeatureMaker) featureMaker)
393
                                        .getObjects();
394
                        String acadVersion = ((DxfHeaderManager) headerManager)
395
                                        .getAcadVersion();
396

    
397

    
398
                        getLogger().info("load: acadVersion = '" + acadVersion + "'");
399

    
400
                        GeometryFactory gFactory = GeometryManager.getInstance()
401
                                        .getGeometryFactory();
402

    
403
                        if (!featureMaker.isDxf3DFile() && !headerManager.isWritedDxf3D()) {
404
                                // y no est?n todos a 9999
405
                                Feature[] features2D = new Feature[features.size()];
406
                                for (int i = 0; i < features.size(); i++) {
407
                                        Feature fea = (Feature) features.get(i);
408
                                        if (fea.getGeometry() instanceof org.cresques.px.gml.Point3D) {
409
                                                Point point = (Point) fea.getGeometry();
410
                                                Point point2 = new Point();
411
                                                for (int j = 0; j < point.pointNr(); j++) {
412
                                                        point2.add(point.get(j));
413
                                                }
414
                                                point2.setTextPoint(point.isTextPoint());
415
                                                fea.setGeometry(point2);
416
                                                features2D[i] = fea;
417

    
418
                                        } else if (fea.getGeometry() instanceof LineString3D) {
419
                                                LineString lineString = (LineString) fea.getGeometry();
420
                                                LineString lineString2 = new LineString();
421
                                                for (int j = 0; j < lineString.pointNr(); j++) {
422
                                                        lineString2.add(lineString.get(j));
423
                                                }
424
                                                fea.setGeometry(lineString2);
425
                                                features2D[i] = fea;
426
                                        } else if (fea.getGeometry() instanceof Polygon3D) {
427
                                                Polygon polygon = (Polygon) fea.getGeometry();
428
                                                Polygon polygon2 = new Polygon();
429
                                                for (int j = 0; j < polygon.pointNr(); j++) {
430
                                                        polygon2.add(polygon.get(j));
431
                                                }
432
                                                fea.setGeometry(polygon2);
433
                                                features2D[i] = fea;
434
                                        }
435
                                }
436
                                features.clear();
437
                                for (int i = 0; i < features2D.length; i++) {
438
                                        features.add(features2D[i]);
439
                                }
440
                        }
441

    
442
                        for (int i = 0; i < features.size(); i++) {
443

    
444
                                FeatureData feature = createFeatureData(store
445
                                                .getDefaultFeatureType(), new Long(featureDatas.size()));
446

    
447
                                try {
448
                                        Feature fea = (Feature) features.get(i);
449

    
450
                                        feature.set(ID_FIELD_ID, Integer.valueOf(i));
451
                                        feature.set(ID_FIELD_ENTITY, fea.getProp("dxfEntity"));
452
                                        feature.set(ID_FIELD_LAYER, fea.getProp("layer"));
453
                                        feature.set(ID_FIELD_COLOR, Integer.valueOf(fea
454
                                                        .getProp("color")));
455
                                        feature.set(ID_FIELD_TEXT, fea.getProp("text"));
456
                                        feature.set(ID_FIELD_HEIGHTTEXT, Double.valueOf(fea
457
                                                        .getProp("textHeight")));
458
                                        feature.set(ID_FIELD_ROTATIONTEXT, Double.valueOf(fea
459
                                                        .getProp("textRotation")));
460
                                        feature.set(ID_FIELD_ELEVATION, Double.valueOf(fea
461
                                                        .getProp("elevation")));
462
                                        feature.set(ID_FIELD_THICKNESS, Double.valueOf(fea
463
                                                        .getProp("thickness")));
464
                                        // FIXME: Abria que pillar el resto de atributos del DXF.
465

    
466
                                        featureDatas.add(feature);
467

    
468

    
469
                                        // FIXME: Habia una incongruencia en el codigo ya que al
470
                                        // campo
471
                                        // ID_FIELD_GEOMETRY igual le asignaba una geometria que un
472
                                        // valor de cadena como 'Point3D', 'Polyline2D' o
473
                                        // 'Polyline3D'
474
                                        // Faltaria un atributo ID_FIELD_FSHAPE ?
475
                                        //
476

    
477
                                        if (fea.getGeometry() instanceof Point
478
                                                        && !(fea.getGeometry() instanceof org.cresques.px.gml.Point3D)) {
479
                                                Point point = (Point) fea.getGeometry();
480
                                                Point2D pto = new Point2D.Double();
481
                                                pto = point.get(0);
482
                                                if (point.isTextPoint()) {
483
                                                        Geometry geom = gFactory
484
                                                                        .createPoint2D(new org.gvsig.fmap.geom.primitive.Point2D(
485
                                                                                        pto.getX(), pto.getY()));
486
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
487
                                                } else {
488
                                                        Geometry geom = gFactory
489
                                                                        .createPoint2D(new org.gvsig.fmap.geom.primitive.Point2D(
490
                                                                                        pto.getX(), pto.getY()));
491
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
492
                                                }
493
                                        } else if (fea.getGeometry() instanceof org.cresques.px.gml.Point3D) {
494
                                                org.cresques.px.gml.Point3D point = (org.cresques.px.gml.Point3D) fea
495
                                                                .getGeometry();
496
                                                Point3D pto = new Point3D();
497
                                                pto = point.getPoint3D(0);
498
                                                if (point.isTextPoint()) {
499
                                                        Geometry geom = gFactory.createPoint3D(pto.getX(),
500
                                                                        pto.getY(), pto.getZ());
501
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
502
                                                } else {
503
                                                        Geometry geom = gFactory.createPoint3D(pto.getX(),
504
                                                                        pto.getY(), pto.getZ());
505
                                                        feature.set(ID_FIELD_GEOMETRY, geom);
506
                                                }
507
                                        } else if (fea.getGeometry() instanceof LineString
508
                                                        && !(fea.getGeometry() instanceof LineString3D)) {
509
                                                GeneralPathX genPathX = new GeneralPathX();
510
                                                Point2D[] pts = new Point2D[fea.getGeometry().pointNr()];
511
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
512
                                                        pts[j] = fea.getGeometry().get(j);
513
                                                }
514
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
515
                                                for (int j = 1; j < pts.length; j++) {
516
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
517
                                                }
518
                                                Geometry geom = gFactory.createPolyline2D(genPathX);
519
                                                feature.set(ID_FIELD_GEOMETRY, geom);
520

    
521
                                        } else if (fea.getGeometry() instanceof LineString3D) {
522
                                                GeneralPathX genPathX = new GeneralPathX();
523
                                                Point3D[] pts = new Point3D[fea.getGeometry().pointNr()];
524
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
525
                                                        pts[j] = ((LineString3D) fea.getGeometry())
526
                                                                        .getPoint3D(j);
527
                                                }
528
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
529
                                                for (int j = 1; j < pts.length; j++) {
530
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
531
                                                }
532
                                                double[] elevations = new double[pts.length];
533
                                                for (int j = 0; j < pts.length; j++) {
534
                                                        elevations[j] = pts[j].getZ();
535
                                                }
536
                                                Geometry geom = gFactory.createPolyline3D(genPathX,
537
                                                                elevations);
538
                                                feature.set(ID_FIELD_GEOMETRY, geom);
539

    
540
                                        } else if (fea.getGeometry() instanceof Polygon
541
                                                        && !(fea.getGeometry() instanceof Polygon3D)) {
542
                                                GeneralPathX genPathX = new GeneralPathX();
543
                                                Point2D firstPt = new Point2D.Double();
544
                                                firstPt = fea.getGeometry().get(0);
545
                                                Point2D[] pts = new Point2D[fea.getGeometry().pointNr() + 1];
546
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
547
                                                        pts[j] = fea.getGeometry().get(j);
548
                                                }
549
                                                pts[fea.getGeometry().pointNr()] = firstPt;
550
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
551
                                                for (int j = 1; j < pts.length; j++) {
552
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
553
                                                }
554
                                                Geometry geom = gFactory.createPolygon2D(genPathX);
555
                                                feature.set(ID_FIELD_GEOMETRY, geom);
556

    
557
                                        } else if (fea.getGeometry() instanceof Polygon3D) {
558
                                                GeneralPathX genPathX = new GeneralPathX();
559
                                                Point3D firstPt = new Point3D();
560
                                                firstPt = ((Polygon3D) fea.getGeometry()).getPoint3D(0);
561
                                                Point3D[] pts = new Point3D[fea.getGeometry().pointNr() + 1];
562
                                                for (int j = 0; j < fea.getGeometry().pointNr(); j++) {
563
                                                        pts[j] = ((Polygon3D) fea.getGeometry())
564
                                                                        .getPoint3D(j);
565
                                                }
566
                                                pts[fea.getGeometry().pointNr()] = firstPt;
567
                                                genPathX.moveTo(pts[0].getX(), pts[0].getY());
568
                                                for (int j = 1; j < pts.length; j++) {
569
                                                        genPathX.lineTo(pts[j].getX(), pts[j].getY());
570
                                                }
571
                                                double[] elevations = new double[pts.length];
572
                                                for (int j = 0; j < pts.length; j++) {
573
                                                        elevations[j] = pts[j].getZ();
574
                                                }
575
                                                Geometry geom = gFactory.createPolygon3D(genPathX,
576
                                                                elevations);
577
                                                feature.set(ID_FIELD_GEOMETRY, geom);
578
                                        } else {
579
                                                getLogger().warn(
580
                                                        MessageFormat.format(
581
                                                                "load: geometry type {1} not supported",
582
                                                                new Object[] { fea.getGeometry().getClass().getName() }
583
                                                        )
584
                                                );
585
                                        }
586
                                } catch (Exception e) {
587
                                        throw new LoadException(e, fileName);
588
                                }
589
                                if (leyendBuilder != null) {
590
                                        leyendBuilder.process(feature);
591
                                }
592

    
593
                        }
594
                        return featureDatas;
595
                }
596

    
597
        }
598

    
599
        public class Writer {
600
                private Double DEFAULT_ELEVATION = new Double(0);
601

    
602
                private DxfFile.EntityFactory entityMaker;
603

    
604
                private IProjection proj = null;
605

    
606
                private int handle = 40; // Revisar porqu? es 40.
607

    
608
                private int k = 0;
609

    
610
                private boolean dxf3DFile = false;
611
                private String fileName;
612

    
613
                public Writer initialice(File file, IProjection projection) {
614
                        this.proj = projection;
615
                        this.fileName = file.getAbsolutePath();
616
                        entityMaker = new DxfEntityMaker(proj);
617

    
618
                        return this;
619
                }
620

    
621
                public void begin() {
622
                        entityMaker = new DxfEntityMaker(proj);
623
                }
624

    
625
                public void end() throws WriteException {
626
                        try {
627
                                DxfFile dxfFile = new DxfFile(null, fileName, entityMaker);
628
                                dxfFile.setCadFlag(true);
629
                                if (dxf3DFile) {
630
                                        dxfFile.setDxf3DFlag(true);
631
                                }
632
                                dxfFile.save(fileName);
633
                                dxfFile.close();
634
                        } catch (Exception e) {
635
                                throw new WriteException(fileName, e);
636
                        }
637
                }
638

    
639
                public void add(FeatureData feature) throws WriteException {
640
                        try {
641
                                Geometry geom = feature.getDefaultGeometry();
642

    
643
                                if (Point2DZ.class.isAssignableFrom(geom.getClass())) {
644
                                        dxf3DFile = true;
645
                                        k = createPoint3D(handle, k, feature);
646

    
647
                                } else if (org.gvsig.fmap.geom.primitive.Point2D.class
648
                                                .isAssignableFrom(geom.getClass())) {
649
                                        k = createPoint2D(handle, k, feature);
650

    
651
                                } else if (Curve2DZ.class.isAssignableFrom(geom.getClass())) {
652
                                        dxf3DFile = true;
653
                                        k = createPolyline3D(handle, k, feature);
654

    
655
                                } else if (Arc2D.class.isAssignableFrom(geom.getClass())) {
656
                                        k = createArc2D(handle, k, feature);
657

    
658
                                } else if (Curve2D.class.isAssignableFrom(geom.getClass())) {
659
                                        k = createLwPolyline2D(handle, k, feature, false);
660

    
661
                                } else if (Surface2DZ.class.isAssignableFrom(geom.getClass())) {
662
                                        dxf3DFile = true;
663
                                        k = createPolyline3D(handle, k, feature);
664

    
665
                                } else if (Circle2D.class.isAssignableFrom(geom.getClass())) {
666
                                        k = createCircle2D(handle, k, feature);
667

    
668
                                } else if (Ellipse2D.class.isAssignableFrom(geom.getClass())) {
669
                                        k = createEllipse2D(handle, k, feature);
670

    
671
                                } else if (Surface2D.class.isAssignableFrom(geom.getClass())) {
672
                                        k = createLwPolyline2D(handle, k, feature, true);
673

    
674
                                } else {
675
                                        getLogger().warn(
676
                                                        MessageFormat.format(
677
                                                                        "Geometry '{1}' not yet supported",
678
                                                                        new Object[] {geom.getClass().getName()}
679
                                                                )
680
                                                );
681
                                        k++;
682
                                }
683
                        } catch (Exception e) {
684
                                throw new WriteException(fileName, e);
685
                        }
686

    
687
                }
688

    
689
                private boolean hasText(FeatureData feature) {
690
                        if (feature.isNull(ID_FIELD_TEXT)) {
691
                                return false;
692
                        }
693
                        if (feature.get(ID_FIELD_TEXT).equals("")) {
694
                                return false;
695
                        }
696
                        return true;
697
                }
698

    
699
                private DxfGroupVector updateProperties(FeatureData feature, int k) {
700
                        DxfGroupVector polv = new DxfGroupVector();
701

    
702
                        String layer = (String) feature.get(ID_FIELD_LAYER);
703
                        Integer color = (Integer) feature.get(ID_FIELD_COLOR);
704
                        Double thickness = (Double) feature.get(ID_FIELD_THICKNESS);
705

    
706
                        DxfGroup geometryLayer = new DxfGroup(8, layer);
707

    
708
                        DxfGroup handleGroup = new DxfGroup();
709
                        handleGroup.setCode(5);
710
                        handleGroup.setData(new Integer(handle + k).toString());
711

    
712
                        DxfGroup handleColor = new DxfGroup();
713
                        handleColor.setCode(62);
714
                        handleColor.setData(color);
715

    
716
                        DxfGroup handleThickness = new DxfGroup();
717
                        handleThickness.setCode(39);
718
                        handleThickness.setData(thickness);
719

    
720
                        polv.add(geometryLayer);
721
                        polv.add(handleGroup);
722
                        polv.add(handleColor);
723
                        return polv;
724
                }
725

    
726
                private int createPoint2D(int handle, int k, FeatureData feature)
727
                                throws Exception {
728

    
729
                        if (hasText(feature)) {
730
                                return createText2D(handle, k, feature);
731
                        }
732
                        org.gvsig.fmap.geom.primitive.Point2D point = new org.gvsig.fmap.geom.primitive.Point2D(
733
                                        0, 0);
734
                        double[] pointCoords = new double[6];
735
                        PathIterator pointIt = (feature.getDefaultGeometry())
736
                                        .getPathIterator(null);
737
                        while (!pointIt.isDone()) {
738
                                pointIt.currentSegment(pointCoords);
739
                                point = new org.gvsig.fmap.geom.primitive.Point2D(
740
                                                pointCoords[0], pointCoords[1]);
741
                                pointIt.next();
742
                        }
743
                        Point2D pto = new Point2D.Double(point.getX(), point.getY());
744

    
745
                        DxfGroup px = new DxfGroup();
746
                        DxfGroup py = new DxfGroup();
747
                        DxfGroup pz = new DxfGroup();
748
                        px.setCode(10);
749
                        px.setData(new Double(pto.getX()));
750
                        py.setCode(20);
751
                        py.setData(new Double(pto.getY()));
752
                        pz.setCode(30);
753
                        // FIXME: POINT del DXF tiene cota. Le asigno cero arbitrariamente.
754
                        pz.setData(new Double(0.0));
755
                        DxfGroupVector pv = updateProperties(feature, k);
756
                        pv.add(px);
757
                        pv.add(py);
758
                        pv.add(pz);
759
                        entityMaker.createPoint(pv);
760
                        k++;
761
                        return k;
762
                }
763

    
764
                private int createText2D(int handle, int k, FeatureData feature)
765
                                throws Exception {
766

    
767
                        String text = feature.get(ID_FIELD_TEXT).toString();
768
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
769
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
770

    
771
                        DxfGroup handleText = new DxfGroup();
772
                        handleText.setCode(1);
773
                        handleText.setData(text);
774

    
775
                        DxfGroup handleHeightText = new DxfGroup();
776
                        handleHeightText.setCode(40);
777
                        handleHeightText.setData(heightText);
778

    
779
                        DxfGroup handleRotationText = new DxfGroup();
780
                        handleRotationText.setCode(50);
781
                        handleRotationText.setData(rotationText);
782

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

    
821
                private int createPoint3D(int handle, int k, FeatureData feature)
822
                                throws Exception {
823
                        if (hasText(feature)) {
824
                                return createText3D(handle, k, feature);
825
                        }
826
                        Point2DZ point = new Point2DZ(0, 0, 0);
827
                        double[] pointCoords = new double[6];
828
                        PathIterator pointIt = (feature.getDefaultGeometry())
829
                                        .getPathIterator(null);
830
                        while (!pointIt.isDone()) {
831
                                pointIt.currentSegment(pointCoords);
832
                                point = new Point2DZ(pointCoords[0], pointCoords[1],
833
                                                pointCoords[2]);
834
                                pointIt.next();
835
                        }
836
                        Point3D pto = new Point3D(point.getX(), point.getY(),
837
                                        point.getZs()[0]);
838
                        DxfGroup px = new DxfGroup();
839
                        DxfGroup py = new DxfGroup();
840
                        DxfGroup pz = new DxfGroup();
841
                        px.setCode(10);
842
                        px.setData(new Double(pto.getX()));
843
                        py.setCode(20);
844
                        py.setData(new Double(pto.getY()));
845
                        pz.setCode(30);
846
                        pz.setData(new Double(pto.getZ()));
847
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
848
                                        .getZs();
849
                        Double elevation = DEFAULT_ELEVATION;
850
                        elevation = new Double(velev[0]);
851
                        DxfGroup handleElevation = new DxfGroup();
852
                        handleElevation.setCode(38);
853
                        handleElevation.setData(elevation);
854

    
855
                        DxfGroupVector pv = updateProperties(feature, k);
856
                        pv.add(handleElevation);
857
                        pv.add(px);
858
                        pv.add(py);
859
                        pv.add(pz);
860
                        entityMaker.createPoint(pv);
861
                        k++;
862
                        return k;
863
                }
864

    
865
                private int createText3D(int handle, int k, FeatureData feature)
866
                                throws Exception {
867

    
868
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
869
                        .getZs();
870

    
871
                        Double elevation = new Double(velev[0]);
872
                        String text = feature.get(ID_FIELD_TEXT).toString();
873
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
874
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
875

    
876
                        DxfGroup handleText = new DxfGroup();
877
                        handleText.setCode(1);
878
                        handleText.setData(text);
879

    
880
                        DxfGroup handleHeightText = new DxfGroup();
881
                        handleHeightText.setCode(40);
882
                        handleHeightText.setData(heightText);
883

    
884
                        DxfGroup handleRotationText = new DxfGroup();
885
                        handleRotationText.setCode(50);
886
                        handleRotationText.setData(rotationText);
887

    
888
                        DxfGroup handleElevation = new DxfGroup();
889
                        handleElevation.setCode(38);
890
                        handleElevation.setData(elevation);
891

    
892
                        Point2DZ point = (Point2DZ) (feature
893
                                        .getDefaultGeometry()).getInternalShape();
894

    
895
                        DxfGroup handleGroup = new DxfGroup();
896
                        handleGroup.setCode(5);
897
                        handleGroup.setData(new Integer(handle + k).toString());
898
                        DxfGroup px = new DxfGroup();
899
                        DxfGroup py = new DxfGroup();
900
                        DxfGroup pz = new DxfGroup();
901
                        px.setCode(10);
902
                        px.setData(new Double(point.getX()));
903
                        py.setCode(20);
904
                        py.setData(new Double(point.getY()));
905
                        pz.setCode(30);
906
                        pz.setData(new Double(point.getZs()[0]));
907
                        DxfGroupVector pv = updateProperties(feature, k);
908
                        pv.add(handleElevation);
909
                        pv.add(handleText);
910
                        pv.add(handleHeightText);
911
                        pv.add(handleRotationText);
912
                        pv.add(handleGroup);
913
                        pv.add(px);
914
                        pv.add(py);
915
                        pv.add(pz);
916
                        entityMaker.createText(pv);
917
                        k++;
918
                        return k;
919
                }
920

    
921
                private int createLwPolyline2D(int handle, int k, FeatureData feature,
922
                                boolean isPolygon) throws Exception {
923
                        boolean first = true;
924
                        DxfGroupVector polv = updateProperties(feature, k);
925
                        Vector vpoints = new Vector();
926

    
927
                        DxfGroup polylineFlag = new DxfGroup();
928
                        polylineFlag.setCode(70);
929
                        if (isPolygon) {
930
                                polylineFlag.setData(new Integer(1)); // cerrada
931
                        } else {
932
                                polylineFlag.setData(new Integer(0)); // abierta
933
                        }
934

    
935
                        PathIterator theIterator = (feature.getDefaultGeometry())
936
                                        .getPathIterator(null, Converter.FLATNESS); // polyLine.
937
                                                                                                                                // getPathIterator
938
                                                                                                                                // (null,
939
                        // flatness);
940

    
941
                        double[] theData = new double[6];
942
                        while (!theIterator.isDone()) {
943
                                int theType = theIterator.currentSegment(theData);
944
                                switch (theType) {
945
                                case PathIterator.SEG_MOVETO:
946
                                        if (!first) {
947
                                                for (int j = 0; j < vpoints.size(); j++) {
948
                                                        DxfGroup xvertex = new DxfGroup();
949
                                                        xvertex.setCode(10);
950
                                                        xvertex
951
                                                                        .setData(new Double(
952
                                                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
953
                                                                                                        .get(j)).getX()));
954
                                                        DxfGroup yvertex = new DxfGroup();
955
                                                        yvertex.setCode(20);
956
                                                        yvertex
957
                                                                        .setData(new Double(
958
                                                                                        ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
959
                                                                                                        .get(j)).getY()));
960
                                                        polv.add(xvertex);
961
                                                        polv.add(yvertex);
962
                                                }
963

    
964
                                                entityMaker.createLwPolyline(polv);
965
                                                k++;
966
                                                polv = updateProperties(feature, k);
967

    
968
                                        }
969
                                        first = false;
970
                                        polv.add(polylineFlag);
971
                                        vpoints.clear();
972
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
973
                                                        theData[0], theData[1]));
974
                                        break;
975
                                case PathIterator.SEG_LINETO:
976
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
977
                                                        theData[0], theData[1]));
978
                                        break;
979
                                case PathIterator.SEG_QUADTO:
980
                                        break;
981
                                case PathIterator.SEG_CUBICTO:
982
                                        break;
983
                                case PathIterator.SEG_CLOSE:
984
                                        polylineFlag.setData(new Integer(1)); // cerrada
985
                                        break;
986

    
987
                                }
988
                                theIterator.next();
989
                        }
990

    
991
                        for (int j = 0; j < vpoints.size(); j++) {
992
                                DxfGroup xvertex = new DxfGroup();
993
                                xvertex.setCode(10);
994
                                xvertex
995
                                                .setData(new Double(
996
                                                                ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
997
                                                                                .get(j)).getX()));
998
                                DxfGroup yvertex = new DxfGroup();
999
                                yvertex.setCode(20);
1000
                                yvertex
1001
                                                .setData(new Double(
1002
                                                                ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1003
                                                                                .get(j)).getY()));
1004
                                polv.add(xvertex);
1005
                                polv.add(yvertex);
1006
                        }
1007

    
1008
                        entityMaker.createLwPolyline(polv);
1009
                        k++;
1010
                        return k;
1011
                }
1012

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

    
1133
                private boolean constantElevation(double[] velev) {
1134
                        boolean constant = true;
1135
                        for (int i = 0; i < velev.length; i++) {
1136
                                for (int j = 0; j < velev.length; j++) {
1137
                                        if (j > i) {
1138
                                                if (velev[i] != velev[j]) {
1139
                                                        constant = false;
1140
                                                        break;
1141
                                                }
1142
                                        }
1143
                                }
1144
                                break;
1145
                        }
1146
                        return constant;
1147
                }
1148

    
1149
                private int createCircle2D(int handle, int k, FeatureData feature)
1150
                                throws Exception {
1151
                        DxfGroupVector polv = updateProperties(feature, k);
1152
                        DxfGroup circleFlag = new DxfGroup();
1153
                        circleFlag.setCode(100);
1154
                        polv.add(circleFlag);
1155

    
1156
                        DxfGroup xvertex = new DxfGroup();
1157
                        xvertex.setCode(10);
1158
                        Circle2D circle = (Circle2D) (feature
1159
                                        .getDefaultGeometry()).getInternalShape();
1160
                        xvertex.setData(new Double(circle.getCenter().getX()));
1161
                        DxfGroup yvertex = new DxfGroup();
1162
                        yvertex.setCode(20);
1163
                        yvertex.setData(new Double(circle.getCenter().getY()));
1164
                        DxfGroup zvertex = new DxfGroup();
1165
                        zvertex.setCode(30);
1166
                        // TODO: COORDENADA Z. REVISAR ESTO PARA ENTIDADES 3D
1167
                        zvertex.setData(new Double(0));
1168

    
1169
                        DxfGroup radius = new DxfGroup();
1170
                        radius.setCode(40);
1171
                        radius.setData(new Double(circle.getRadio()));
1172

    
1173
                        polv.add(xvertex);
1174
                        polv.add(yvertex);
1175
                        polv.add(zvertex);
1176
                        polv.add(radius);
1177

    
1178
                        entityMaker.createCircle(polv);
1179
                        k++;
1180
                        return k;
1181
                }
1182

    
1183
                private int createArc2D(int handle, int k, FeatureData feature)
1184
                                throws Exception {
1185
                        Arc2D arc = (Arc2D) (feature.getDefaultGeometry())
1186
                                        .getInternalShape();
1187
                        Point2D[] pts = new Point2D[3];
1188
                        pts[0] = arc.getInit();
1189
                        pts[1] = arc.getMid();
1190
                        pts[2] = arc.getEnd();
1191
                        Point2D center = arc.getCenter();
1192
                        double radius = center.distance(pts[0]);
1193
                        double initAngle = UtilFunctions.getAngle(center, pts[0]);
1194
                        initAngle = Math.toDegrees(initAngle);
1195
                        double midAngle = UtilFunctions.getAngle(center, pts[1]);
1196
                        midAngle = Math.toDegrees(midAngle);
1197
                        double endAngle = UtilFunctions.getAngle(center, pts[2]);
1198
                        endAngle = Math.toDegrees(endAngle);
1199

    
1200
                        DxfGroup ax = new DxfGroup();
1201
                        DxfGroup ay = new DxfGroup();
1202
                        DxfGroup ac = new DxfGroup();
1203
                        DxfGroup ai = new DxfGroup();
1204
                        DxfGroup ae = new DxfGroup();
1205
                        ax.setCode(10);
1206
                        ax.setData(new Double(center.getX()));
1207
                        ay.setCode(20);
1208
                        ay.setData(new Double(center.getY()));
1209
                        ac.setCode(40);
1210
                        ac.setData(new Double(radius));
1211
                        ai.setCode(50);
1212
                        ai.setData(new Double(initAngle));
1213
                        ae.setCode(51);
1214
                        ae.setData(new Double(endAngle));
1215
                        DxfGroupVector av = updateProperties(feature, k);
1216
                        av.add(ax);
1217
                        av.add(ay);
1218
                        av.add(ac);
1219
                        av.add(ai);
1220
                        av.add(ae);
1221
                        entityMaker.createArc(av);
1222
                        k++;
1223
                        return k;
1224
                }
1225

    
1226
                private int createEllipse2D(int handle, int k, FeatureData feature)
1227
                                throws Exception {
1228
                        Ellipse2D ellipse = (Ellipse2D) (feature
1229
                                        .getDefaultGeometry()).getInternalShape();
1230

    
1231
                        Point2D center = new Point2D.Double(
1232
                                        (ellipse.getInit().getX() + ellipse.getEnd().getX()) / 2,
1233
                                        (ellipse.getInit().getY() + ellipse.getEnd().getY()) / 2);
1234
                        double mAxisL = ellipse.getDist() * 2;
1235
                        double maAxisL = ellipse.getInit().distance(ellipse.getEnd());
1236

    
1237
                        Point2D endPointOfMajorAxis = ellipse.getEnd();
1238
                        double azimut = Math
1239
                                        .atan2(endPointOfMajorAxis.getX() - center.getX(),
1240
                                                        endPointOfMajorAxis.getY() - center.getY());
1241
                        double azimut2 = azimut + Math.PI / 2.0;
1242
                        if (azimut2 >= Math.PI * 2) {
1243
                                azimut2 = azimut2 - Math.PI * 2;
1244
                        }
1245
                        Point2D endPointOfMinorAxis = new Point2D.Double(center.getX()
1246
                                        + (ellipse.getDist() * Math.sin(azimut2)), center.getY()
1247
                                        + (ellipse.getDist() * Math.cos(azimut2)));
1248

    
1249
                        if (mAxisL >= maAxisL) {
1250
                                // El menor debe ser menor que el mayor. Los cambiamos.
1251
                                double aux = mAxisL;
1252
                                mAxisL = maAxisL;
1253
                                maAxisL = aux;
1254
                                // Tambi?n cambiamos los puntos finales de los ejes.
1255
                                Point2D pAux = endPointOfMinorAxis;
1256
                                endPointOfMinorAxis = endPointOfMajorAxis;
1257
                                endPointOfMajorAxis = pAux;
1258
                        }
1259
                        double mToMAR = mAxisL / maAxisL;
1260
                        DxfGroup x = new DxfGroup();
1261
                        DxfGroup y = new DxfGroup();
1262
                        DxfGroup xc = new DxfGroup();
1263
                        DxfGroup yc = new DxfGroup();
1264
                        DxfGroup minToMaj = new DxfGroup();
1265
                        x.setCode(10);
1266
                        x.setData(new Double(center.getX()));
1267
                        y.setCode(20);
1268
                        y.setData(new Double(center.getY()));
1269
                        xc.setCode(11);
1270
                        xc.setData(new Double(endPointOfMajorAxis.getX() - center.getX()));
1271
                        yc.setCode(21);
1272
                        yc.setData(new Double(endPointOfMajorAxis.getY() - center.getY()));
1273
                        minToMaj.setCode(40);
1274
                        minToMaj.setData(new Double(mToMAR));
1275
                        DxfGroupVector av = updateProperties(feature, k);
1276
                        av.add(x);
1277
                        av.add(y);
1278
                        av.add(xc);
1279
                        av.add(yc);
1280
                        av.add(minToMaj);
1281
                        entityMaker.createEllipse(av);
1282
                        k++;
1283
                        return k;
1284
                }
1285

    
1286
        }
1287

    
1288
        public boolean closeResourceRequested(ResourceProvider resource) {
1289
                return true;
1290
        }
1291

    
1292
        public int getFeatureReferenceIdType() {
1293
                return DataTypes.LONG;
1294
        }
1295

    
1296
        public FeatureData getFeatureData(Object refId)
1297
                        throws DataException {
1298
                this.open();
1299
                Long id = (Long) refId;
1300
                return (FeatureData) this.data.get(id.intValue());
1301

    
1302
        }
1303

    
1304
}