Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dataFile / src / org / gvsig / fmap / data / store / dxf / DXFStoreProvider.java @ 24456

History | View | Annotate | Download (40 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.exception.NotYetImplemented;
68
import org.gvsig.tools.operations.OperationNotSupportedException;
69
import org.gvsig.tools.persistence.AbstractPersistenceManager;
70
import org.gvsig.tools.persistence.PersistenceException;
71
import org.gvsig.tools.persistence.PersistentState;
72

    
73
public class DXFStoreProvider extends AbstractMemoryStoreProvider implements
74
                ResourceConsumer {
75

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

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

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

    
94
        private int counterNewsOIDs;
95

    
96
        private DXFStoreParameters getParameters() {
97
                return (DXFStoreParameters) this.parameters;
98
        }
99

    
100
        public DXFStoreProvider(DXFStoreParameters parameters) {
101
                super(parameters);
102
        }
103

    
104
        public FeatureStoreProvider initialize(FeatureStoreProviderServices store)
105
                        throws InitializeException {
106
                super.initialize(store);
107

    
108
                counterNewsOIDs = 0;
109
                //                projection = CRSFactory.getCRS(getParameters().getSRSID());
110

    
111
                resource = this.createResource(
112
                                FileResource.NAME,
113
                                new Object[] { getParameters().getFileName() }
114
                        );
115
                resource.addConsumer(this);
116

    
117
                this.projection = CRSFactory.getCRS(this.getParameters().getSRSID());
118

    
119
                try {
120
                        leyendBuilder = (LegendBuilder) store.invokeOperation(
121
                                        LegendBuilder.OPERATION_NAME, null);
122
                } catch (OperationNotSupportedException e) {
123
                        leyendBuilder = null;
124
                } catch (Exception e) {
125
                        throw new InitializeException(e);
126
                }
127
                return this;
128
        }
129

    
130
        public String getName() {
131
                return NAME;
132
        }
133

    
134
        public boolean allowWrite() {
135
                return true;
136
        }
137

    
138
        public boolean canCreate() {
139
                return true;
140
        }
141

    
142
        public Object getLeyend() throws OpenException {
143
                this.open();
144
                if (leyendBuilder == null) {
145
                        return null;
146
                }
147
                return leyendBuilder.getLegend();
148
        }
149

    
150
        public void open() throws OpenException {
151
                if (this.data != null) {
152
                        return;
153
                }
154
                try {
155
                        this.resource.begin();
156

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

    
186

    
187
        public DataExplorer getExplorer() throws ReadException {
188
                // FIXME: falta implementar
189
                return null;
190
        }
191

    
192
        public void create(DataStoreParameters parameters, FeatureType featureType,
193
                        boolean overwrite) throws CreateException {
194

    
195
                // FIXME: falta gestionar 'overwrite'
196

    
197
                IProjection projection = null;
198
                DXFStoreParameters params = (DXFStoreParameters) parameters;
199

    
200
                //                projection = CRSFactory.getCRS(params.getSRSID());
201

    
202
                FileResource resource;
203
                try {
204
                        resource = (FileResource) this.createResource(
205
                                        FileResource.NAME,
206
                                        new Object[] { params
207
                                                        .getFileName() });
208
                } catch (InitializeException e1) {
209
                        throw new CreateException(params.getFileName(), e1);
210
                }
211
                resource.addConsumer(this);
212

    
213

    
214
                try {
215
                        resource.begin();
216
                        Builder builder = new Builder().initialice(
217
                                        resource.getFileName(),
218
                                        projection);
219
                        resource.notifyOpen();
220
                        builder.begin();
221
                        builder.create();
222
                        builder.end();
223
                        resource.notifyClose();
224

    
225
                        resource.setData(null); // FIXME: Seguro que hay que ponerlo a null
226
                                                                        // ??
227
                        resource.notifyChanges();
228
                } catch (Exception e) {
229
                        throw new CreateException(params.getFileName(), e);
230
                } finally {
231
                        resource.end();
232
                }
233
        }
234

    
235
        private FeatureData getFeatureDataFormFeature(Object feature) {
236
                org.gvsig.fmap.data.feature.impl.DefaultFeature f = (org.gvsig.fmap.data.feature.impl.DefaultFeature) feature;
237
                return f.getData();
238
        }
239

    
240
        public void performEditing(Iterator deleteds, Iterator inserteds, Iterator updateds) throws PerformEditingException {
241

    
242
                String fileName = "";
243
                try {
244
                        resource.begin();
245

    
246
                        File file = (File) resource.get();
247
                        fileName = file.getAbsolutePath();
248
                        Writer writer = new Writer().initialice(file, projection);
249
                        FeatureSet features = this.getStoreServices().getFeatureSet();
250

    
251
                        writer.begin();
252
                        Iterator it = features.fastIterator();
253
                        while (it.hasNext()) {
254
                                writer.add(getFeatureDataFormFeature(it.next()));
255
                        }
256
                        resource.notifyOpen();
257
                        writer.end();
258
                        resource.notifyClose();
259
                        features.dispose();
260
                        counterNewsOIDs = 0;
261

    
262
                } catch (Exception e) {
263
                        throw new PerformEditingException(fileName, e);
264
                } finally {
265
                        resource.end();
266
                }
267
        }
268

    
269
        public class Builder {
270
                private String fileName;
271
                private IProjection projection;
272

    
273
                public Builder initialice(String fileName, IProjection projection) {
274
                        this.fileName = fileName;
275
                        this.projection = projection;
276
                        return this;
277
                }
278

    
279
                public void begin() {
280

    
281
                }
282

    
283
                public void end() {
284

    
285
                }
286

    
287
                public void create() throws IOException {
288
                        DxfEntityMaker entityMaker = new DxfEntityMaker(projection);
289
                        DxfFile dxfFile = new DxfFile(null, fileName, entityMaker);
290
                        dxfFile.setCadFlag(true);
291
                        dxfFile.setDxf3DFlag(false);
292
                        dxfFile.save(fileName);
293
                }
294
        }
295

    
296

    
297
        public class Reader {
298
                private File file;
299
                private String fileName;
300
                private IProjection projection;
301
                private List types;
302
                private LegendBuilder leyendBuilder;
303
                private AbstractMemoryStoreProvider store;
304

    
305
                public Reader initialice(AbstractMemoryStoreProvider store, File file,
306
                                IProjection projection,
307
                                LegendBuilder leyendBuilder) {
308
                        this.store = store;
309
                        this.file = file;
310
                        this.fileName = file.getAbsolutePath();
311
                        this.projection = projection;
312
                        this.leyendBuilder = leyendBuilder;
313
                        return this;
314
                }
315

    
316
                public void begin(FeatureStoreProviderServices store) {
317

    
318
                        EditableFeatureType featureType = store.createFeatureType();
319

    
320
                        ID_FIELD_ID = featureType.add("ID", DataTypes.INT)
321
                                        .setDefaultValue(Integer.valueOf(0))
322
                                .getIndex();
323

    
324
                        ID_FIELD_GEOMETRY = featureType.add("Geometry",
325
                                        DataTypes.GEOMETRY)
326
                                .getIndex();
327

    
328
                        // FIXME: Cual es el size y el valor por defecto para Entity ?
329
                        ID_FIELD_ENTITY = featureType.add("Entity",
330
                                        DataTypes.STRING, 100)
331
                                        .setDefaultValue("")
332
                                        .getIndex();
333

    
334
                        // FIXME: Cual es el size de Layer ?
335
                        ID_FIELD_LAYER = featureType.add("Layer",
336
                                        DataTypes.STRING, 100)
337
                                        .setDefaultValue(
338
                                        "default").getIndex();
339

    
340
                        ID_FIELD_COLOR = featureType.add("Color",
341
                                        DataTypes.INT)
342
                                        .setDefaultValue(
343
                                        Integer.valueOf(0)).getIndex();
344

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

    
350
                        ID_FIELD_THICKNESS = featureType.add("Thickness",
351
                                        DataTypes.DOUBLE)
352
                                        .setDefaultValue(
353
                                        Double.valueOf(0)).getIndex();
354

    
355
                        // FIXME: Cual es el size de Text ?
356
                        ID_FIELD_TEXT = featureType.add("Text",
357
                                        DataTypes.STRING, 100)
358
                                        .setDefaultValue("")
359
                                        .getIndex();
360

    
361
                        ID_FIELD_HEIGHTTEXT = featureType.add("HeightText",
362
                                        DataTypes.DOUBLE).setDefaultValue(
363
                                        Double.valueOf(10)).getIndex();
364

    
365
                        ID_FIELD_ROTATIONTEXT = featureType.add("Rotation",
366
                                        DataTypes.DOUBLE).setDefaultValue(
367
                                        Double.valueOf(0)).getIndex();
368

    
369

    
370
                        // FIXME: Parece que el DXF puede tener mas atributos opcionales.
371
                        // Habria que ver de pillarlos ?
372

    
373
                        types = new ArrayList();
374
                        types.add(featureType);
375

    
376
                        if (leyendBuilder != null) {
377
                                leyendBuilder.begin();
378
                        }
379

    
380
                }
381

    
382
                public void end() {
383
                        if (leyendBuilder != null) {
384
                                leyendBuilder.end();
385
                        }
386
                }
387

    
388
                public List getTypes() {
389
                        return types;
390
                }
391

    
392
                public EditableFeatureType getDefaultType() {
393
                        return (EditableFeatureType) types.get(0);
394
                }
395

    
396
                public List get() throws DataException {
397

    
398
                        ArrayList featureDatas = new ArrayList();
399

    
400
                        DxfFile.EntityFactory featureMaker = new DxfFeatureMaker(projection);
401
                        DxfFile.VarSettings headerManager = new DxfHeaderManager();
402
                        DxfFile dxfFeatureFile = new DxfFile(projection, file
403
                                        .getAbsolutePath(), featureMaker, headerManager);
404

    
405
                        try {
406
                                dxfFeatureFile.load();
407
                        } catch (Exception e1) {
408
                                throw new LoadException(e1, fileName);
409
                        }
410

    
411
                        IObjList.vector features = (IObjList.vector) ((DxfFeatureMaker) featureMaker)
412
                                        .getObjects();
413
                        String acadVersion = ((DxfHeaderManager) headerManager)
414
                                        .getAcadVersion();
415

    
416

    
417
                        getLogger().info("load: acadVersion = '" + acadVersion + "'");
418

    
419
                        GeometryFactory gFactory = GeometryManager.getInstance()
420
                                        .getGeometryFactory();
421

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

    
437
                                        } else if (fea.getGeometry() instanceof LineString3D) {
438
                                                LineString lineString = (LineString) fea.getGeometry();
439
                                                LineString lineString2 = new LineString();
440
                                                for (int j = 0; j < lineString.pointNr(); j++) {
441
                                                        lineString2.add(lineString.get(j));
442
                                                }
443
                                                fea.setGeometry(lineString2);
444
                                                features2D[i] = fea;
445
                                        } else if (fea.getGeometry() instanceof Polygon3D) {
446
                                                Polygon polygon = (Polygon) fea.getGeometry();
447
                                                Polygon polygon2 = new Polygon();
448
                                                for (int j = 0; j < polygon.pointNr(); j++) {
449
                                                        polygon2.add(polygon.get(j));
450
                                                }
451
                                                fea.setGeometry(polygon2);
452
                                                features2D[i] = fea;
453
                                        }
454
                                }
455
                                features.clear();
456
                                for (int i = 0; i < features2D.length; i++) {
457
                                        features.add(features2D[i]);
458
                                }
459
                        }
460

    
461
                        for (int i = 0; i < features.size(); i++) {
462

    
463
                                FeatureData feature = store.createFeatureData(store
464
                                                .getStoreServices().getDefaultFeatureType());
465

    
466
                                try {
467
                                        Feature fea = (Feature) features.get(i);
468

    
469
                                        feature.set(ID_FIELD_ID, Integer.valueOf(i));
470
                                        feature.set(ID_FIELD_ENTITY, fea.getProp("dxfEntity"));
471
                                        feature.set(ID_FIELD_LAYER, fea.getProp("layer"));
472
                                        feature.set(ID_FIELD_COLOR, Integer.valueOf(fea
473
                                                        .getProp("color")));
474
                                        feature.set(ID_FIELD_TEXT, fea.getProp("text"));
475
                                        feature.set(ID_FIELD_HEIGHTTEXT, Double.valueOf(fea
476
                                                        .getProp("textHeight")));
477
                                        feature.set(ID_FIELD_ROTATIONTEXT, Double.valueOf(fea
478
                                                        .getProp("textRotation")));
479
                                        feature.set(ID_FIELD_ELEVATION, Double.valueOf(fea
480
                                                        .getProp("elevation")));
481
                                        feature.set(ID_FIELD_THICKNESS, Double.valueOf(fea
482
                                                        .getProp("thickness")));
483
                                        // FIXME: Abria que pillar el resto de atributos del DXF.
484

    
485
                                        store.addFeatureData(feature);
486

    
487

    
488
                                        // FIXME: Habia una incongruencia en el codigo ya que al
489
                                        // campo
490
                                        // ID_FIELD_GEOMETRY igual le asignaba una geometria que un
491
                                        // valor de cadena como 'Point3D', 'Polyline2D' o
492
                                        // 'Polyline3D'
493
                                        // Faltaria un atributo ID_FIELD_FSHAPE ?
494
                                        //
495

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

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

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

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

    
612
                        }
613
                        return featureDatas;
614
                }
615

    
616
        }
617

    
618
        public class Writer {
619
                private Double DEFAULT_ELEVATION = new Double(0);
620

    
621
                private DxfFile.EntityFactory entityMaker;
622

    
623
                private IProjection proj = null;
624

    
625
                private int handle = 40; // Revisar porqu? es 40.
626

    
627
                private int k = 0;
628

    
629
                private boolean dxf3DFile = false;
630
                private String fileName;
631

    
632
                public Writer initialice(File file, IProjection projection) {
633
                        this.proj = projection;
634
                        this.fileName = file.getAbsolutePath();
635
                        entityMaker = new DxfEntityMaker(proj);
636

    
637
                        return this;
638
                }
639

    
640
                public void begin() {
641
                        entityMaker = new DxfEntityMaker(proj);
642
                }
643

    
644
                public void end() throws WriteException {
645
                        try {
646
                                DxfFile dxfFile = new DxfFile(null, fileName, entityMaker);
647
                                dxfFile.setCadFlag(true);
648
                                if (dxf3DFile) {
649
                                        dxfFile.setDxf3DFlag(true);
650
                                }
651
                                dxfFile.save(fileName);
652
                                dxfFile.close();
653
                        } catch (Exception e) {
654
                                throw new WriteException(fileName, e);
655
                        }
656
                }
657

    
658
                public void add(FeatureData feature) throws WriteException {
659
                        try {
660
                                Geometry geom = feature.getDefaultGeometry();
661

    
662
                                if (Point2DZ.class.isAssignableFrom(geom.getClass())) {
663
                                        dxf3DFile = true;
664
                                        k = createPoint3D(handle, k, feature);
665

    
666
                                } else if (org.gvsig.fmap.geom.primitive.Point2D.class
667
                                                .isAssignableFrom(geom.getClass())) {
668
                                        k = createPoint2D(handle, k, feature);
669

    
670
                                } else if (Curve2DZ.class.isAssignableFrom(geom.getClass())) {
671
                                        dxf3DFile = true;
672
                                        k = createPolyline3D(handle, k, feature);
673

    
674
                                } else if (Arc2D.class.isAssignableFrom(geom.getClass())) {
675
                                        k = createArc2D(handle, k, feature);
676

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

    
680
                                } else if (Surface2DZ.class.isAssignableFrom(geom.getClass())) {
681
                                        dxf3DFile = true;
682
                                        k = createPolyline3D(handle, k, feature);
683

    
684
                                } else if (Circle2D.class.isAssignableFrom(geom.getClass())) {
685
                                        k = createCircle2D(handle, k, feature);
686

    
687
                                } else if (Ellipse2D.class.isAssignableFrom(geom.getClass())) {
688
                                        k = createEllipse2D(handle, k, feature);
689

    
690
                                } else if (Surface2D.class.isAssignableFrom(geom.getClass())) {
691
                                        k = createLwPolyline2D(handle, k, feature, true);
692

    
693
                                } else {
694
                                        getLogger().warn(
695
                                                        MessageFormat.format(
696
                                                                        "Geometry '{1}' not yet supported",
697
                                                                        new Object[] {geom.getClass().getName()}
698
                                                                )
699
                                                );
700
                                        k++;
701
                                }
702
                        } catch (Exception e) {
703
                                throw new WriteException(fileName, e);
704
                        }
705

    
706
                }
707

    
708
                private boolean hasText(FeatureData feature) {
709
                        if (feature.isNull(ID_FIELD_TEXT)) {
710
                                return false;
711
                        }
712
                        if (feature.get(ID_FIELD_TEXT).equals("")) {
713
                                return false;
714
                        }
715
                        return true;
716
                }
717

    
718
                private DxfGroupVector updateProperties(FeatureData feature, int k) {
719
                        DxfGroupVector polv = new DxfGroupVector();
720

    
721
                        String layer = (String) feature.get(ID_FIELD_LAYER);
722
                        Integer color = (Integer) feature.get(ID_FIELD_COLOR);
723
                        Double thickness = (Double) feature.get(ID_FIELD_THICKNESS);
724

    
725
                        DxfGroup geometryLayer = new DxfGroup(8, layer);
726

    
727
                        DxfGroup handleGroup = new DxfGroup();
728
                        handleGroup.setCode(5);
729
                        handleGroup.setData(new Integer(handle + k).toString());
730

    
731
                        DxfGroup handleColor = new DxfGroup();
732
                        handleColor.setCode(62);
733
                        handleColor.setData(color);
734

    
735
                        DxfGroup handleThickness = new DxfGroup();
736
                        handleThickness.setCode(39);
737
                        handleThickness.setData(thickness);
738

    
739
                        polv.add(geometryLayer);
740
                        polv.add(handleGroup);
741
                        polv.add(handleColor);
742
                        return polv;
743
                }
744

    
745
                private int createPoint2D(int handle, int k, FeatureData feature)
746
                                throws Exception {
747

    
748
                        if (hasText(feature)) {
749
                                return createText2D(handle, k, feature);
750
                        }
751
                        org.gvsig.fmap.geom.primitive.Point2D point = new org.gvsig.fmap.geom.primitive.Point2D(
752
                                        0, 0);
753
                        double[] pointCoords = new double[6];
754
                        PathIterator pointIt = (feature.getDefaultGeometry())
755
                                        .getPathIterator(null);
756
                        while (!pointIt.isDone()) {
757
                                pointIt.currentSegment(pointCoords);
758
                                point = new org.gvsig.fmap.geom.primitive.Point2D(
759
                                                pointCoords[0], pointCoords[1]);
760
                                pointIt.next();
761
                        }
762
                        Point2D pto = new Point2D.Double(point.getX(), point.getY());
763

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

    
783
                private int createText2D(int handle, int k, FeatureData feature)
784
                                throws Exception {
785

    
786
                        String text = feature.get(ID_FIELD_TEXT).toString();
787
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
788
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
789

    
790
                        DxfGroup handleText = new DxfGroup();
791
                        handleText.setCode(1);
792
                        handleText.setData(text);
793

    
794
                        DxfGroup handleHeightText = new DxfGroup();
795
                        handleHeightText.setCode(40);
796
                        handleHeightText.setData(heightText);
797

    
798
                        DxfGroup handleRotationText = new DxfGroup();
799
                        handleRotationText.setCode(50);
800
                        handleRotationText.setData(rotationText);
801

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

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

    
874
                        DxfGroupVector pv = updateProperties(feature, k);
875
                        pv.add(handleElevation);
876
                        pv.add(px);
877
                        pv.add(py);
878
                        pv.add(pz);
879
                        entityMaker.createPoint(pv);
880
                        k++;
881
                        return k;
882
                }
883

    
884
                private int createText3D(int handle, int k, FeatureData feature)
885
                                throws Exception {
886

    
887
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
888
                        .getZs();
889

    
890
                        Double elevation = new Double(velev[0]);
891
                        String text = feature.get(ID_FIELD_TEXT).toString();
892
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
893
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
894

    
895
                        DxfGroup handleText = new DxfGroup();
896
                        handleText.setCode(1);
897
                        handleText.setData(text);
898

    
899
                        DxfGroup handleHeightText = new DxfGroup();
900
                        handleHeightText.setCode(40);
901
                        handleHeightText.setData(heightText);
902

    
903
                        DxfGroup handleRotationText = new DxfGroup();
904
                        handleRotationText.setCode(50);
905
                        handleRotationText.setData(rotationText);
906

    
907
                        DxfGroup handleElevation = new DxfGroup();
908
                        handleElevation.setCode(38);
909
                        handleElevation.setData(elevation);
910

    
911
                        Point2DZ point = (Point2DZ) (feature
912
                                        .getDefaultGeometry()).getInternalShape();
913

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

    
940
                private int createLwPolyline2D(int handle, int k, FeatureData feature,
941
                                boolean isPolygon) throws Exception {
942
                        boolean first = true;
943
                        DxfGroupVector polv = updateProperties(feature, k);
944
                        Vector vpoints = new Vector();
945

    
946
                        DxfGroup polylineFlag = new DxfGroup();
947
                        polylineFlag.setCode(70);
948
                        if (isPolygon) {
949
                                polylineFlag.setData(new Integer(1)); // cerrada
950
                        } else {
951
                                polylineFlag.setData(new Integer(0)); // abierta
952
                        }
953

    
954
                        PathIterator theIterator = (feature.getDefaultGeometry())
955
                                        .getPathIterator(null, Converter.FLATNESS); // polyLine.
956
                                                                                                                                // getPathIterator
957
                                                                                                                                // (null,
958
                        // flatness);
959

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

    
983
                                                entityMaker.createLwPolyline(polv);
984
                                                k++;
985
                                                polv = updateProperties(feature, k);
986

    
987
                                        }
988
                                        first = false;
989
                                        polv.add(polylineFlag);
990
                                        vpoints.clear();
991
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
992
                                                        theData[0], theData[1]));
993
                                        break;
994
                                case PathIterator.SEG_LINETO:
995
                                        vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(
996
                                                        theData[0], theData[1]));
997
                                        break;
998
                                case PathIterator.SEG_QUADTO:
999
                                        break;
1000
                                case PathIterator.SEG_CUBICTO:
1001
                                        break;
1002
                                case PathIterator.SEG_CLOSE:
1003
                                        polylineFlag.setData(new Integer(1)); // cerrada
1004
                                        break;
1005

    
1006
                                }
1007
                                theIterator.next();
1008
                        }
1009

    
1010
                        for (int j = 0; j < vpoints.size(); j++) {
1011
                                DxfGroup xvertex = new DxfGroup();
1012
                                xvertex.setCode(10);
1013
                                xvertex
1014
                                                .setData(new Double(
1015
                                                                ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1016
                                                                                .get(j)).getX()));
1017
                                DxfGroup yvertex = new DxfGroup();
1018
                                yvertex.setCode(20);
1019
                                yvertex
1020
                                                .setData(new Double(
1021
                                                                ((org.gvsig.fmap.geom.primitive.Point2D) vpoints
1022
                                                                                .get(j)).getY()));
1023
                                polv.add(xvertex);
1024
                                polv.add(yvertex);
1025
                        }
1026

    
1027
                        entityMaker.createLwPolyline(polv);
1028
                        k++;
1029
                        return k;
1030
                }
1031

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

    
1152
                private boolean constantElevation(double[] velev) {
1153
                        boolean constant = true;
1154
                        for (int i = 0; i < velev.length; i++) {
1155
                                for (int j = 0; j < velev.length; j++) {
1156
                                        if (j > i) {
1157
                                                if (velev[i] != velev[j]) {
1158
                                                        constant = false;
1159
                                                        break;
1160
                                                }
1161
                                        }
1162
                                }
1163
                                break;
1164
                        }
1165
                        return constant;
1166
                }
1167

    
1168
                private int createCircle2D(int handle, int k, FeatureData feature)
1169
                                throws Exception {
1170
                        DxfGroupVector polv = updateProperties(feature, k);
1171
                        DxfGroup circleFlag = new DxfGroup();
1172
                        circleFlag.setCode(100);
1173
                        polv.add(circleFlag);
1174

    
1175
                        DxfGroup xvertex = new DxfGroup();
1176
                        xvertex.setCode(10);
1177
                        Circle2D circle = (Circle2D) (feature
1178
                                        .getDefaultGeometry()).getInternalShape();
1179
                        xvertex.setData(new Double(circle.getCenter().getX()));
1180
                        DxfGroup yvertex = new DxfGroup();
1181
                        yvertex.setCode(20);
1182
                        yvertex.setData(new Double(circle.getCenter().getY()));
1183
                        DxfGroup zvertex = new DxfGroup();
1184
                        zvertex.setCode(30);
1185
                        // TODO: COORDENADA Z. REVISAR ESTO PARA ENTIDADES 3D
1186
                        zvertex.setData(new Double(0));
1187

    
1188
                        DxfGroup radius = new DxfGroup();
1189
                        radius.setCode(40);
1190
                        radius.setData(new Double(circle.getRadio()));
1191

    
1192
                        polv.add(xvertex);
1193
                        polv.add(yvertex);
1194
                        polv.add(zvertex);
1195
                        polv.add(radius);
1196

    
1197
                        entityMaker.createCircle(polv);
1198
                        k++;
1199
                        return k;
1200
                }
1201

    
1202
                private int createArc2D(int handle, int k, FeatureData feature)
1203
                                throws Exception {
1204
                        Arc2D arc = (Arc2D) (feature.getDefaultGeometry())
1205
                                        .getInternalShape();
1206
                        Point2D[] pts = new Point2D[3];
1207
                        pts[0] = arc.getInit();
1208
                        pts[1] = arc.getMid();
1209
                        pts[2] = arc.getEnd();
1210
                        Point2D center = arc.getCenter();
1211
                        double radius = center.distance(pts[0]);
1212
                        double initAngle = UtilFunctions.getAngle(center, pts[0]);
1213
                        initAngle = Math.toDegrees(initAngle);
1214
                        double midAngle = UtilFunctions.getAngle(center, pts[1]);
1215
                        midAngle = Math.toDegrees(midAngle);
1216
                        double endAngle = UtilFunctions.getAngle(center, pts[2]);
1217
                        endAngle = Math.toDegrees(endAngle);
1218

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

    
1245
                private int createEllipse2D(int handle, int k, FeatureData feature)
1246
                                throws Exception {
1247
                        Ellipse2D ellipse = (Ellipse2D) (feature
1248
                                        .getDefaultGeometry()).getInternalShape();
1249

    
1250
                        Point2D center = new Point2D.Double(
1251
                                        (ellipse.getInit().getX() + ellipse.getEnd().getX()) / 2,
1252
                                        (ellipse.getInit().getY() + ellipse.getEnd().getY()) / 2);
1253
                        double mAxisL = ellipse.getDist() * 2;
1254
                        double maAxisL = ellipse.getInit().distance(ellipse.getEnd());
1255

    
1256
                        Point2D endPointOfMajorAxis = ellipse.getEnd();
1257
                        double azimut = Math
1258
                                        .atan2(endPointOfMajorAxis.getX() - center.getX(),
1259
                                                        endPointOfMajorAxis.getY() - center.getY());
1260
                        double azimut2 = azimut + Math.PI / 2.0;
1261
                        if (azimut2 >= Math.PI * 2) {
1262
                                azimut2 = azimut2 - Math.PI * 2;
1263
                        }
1264
                        Point2D endPointOfMinorAxis = new Point2D.Double(center.getX()
1265
                                        + (ellipse.getDist() * Math.sin(azimut2)), center.getY()
1266
                                        + (ellipse.getDist() * Math.cos(azimut2)));
1267

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

    
1305
        }
1306

    
1307
        public boolean closeResourceRequested(ResourceProvider resource) {
1308
                return true;
1309
        }
1310

    
1311
        public int getFeatureReferenceOIDType() {
1312
                return DataTypes.LONG;
1313
        }
1314

    
1315
        public boolean supportsAppendMode() {
1316
                return false;
1317
        }
1318

    
1319
        public void append(org.gvsig.fmap.data.feature.Feature feature) {
1320
                throw new UnsupportedOperationException();
1321
        }
1322

    
1323
        public void beginAppend() {
1324
                throw new UnsupportedOperationException();
1325
        }
1326

    
1327
        public void endAppend() {
1328
                throw new UnsupportedOperationException();
1329
        }
1330

    
1331
        public PersistentState getState() throws PersistenceException {
1332
                return AbstractPersistenceManager.getState(this);
1333
        }
1334

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

    
1340
        public void setState(PersistentState state) throws PersistenceException {
1341
                // TODO Auto-generated method stub
1342
                throw new NotYetImplemented();
1343
        }
1344

    
1345
        public Object createNewOID() {
1346
                return new Integer(this.data.size() + ++counterNewsOIDs);
1347
        }
1348

    
1349

    
1350
}