Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dalfile / src / org / gvsig / fmap / dal / store / dxf / DXFStoreProvider.java @ 25789

History | View | Annotate | Download (41.7 KB)

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

    
3
import java.awt.geom.PathIterator;
4
import java.awt.geom.Point2D;
5
import java.io.File;
6
import java.text.MessageFormat;
7
import java.util.ArrayList;
8
import java.util.Iterator;
9
import java.util.List;
10
import java.util.Set;
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.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30
import org.gvsig.fmap.dal.DataServerExplorer;
31
import org.gvsig.fmap.dal.DataStoreNotification;
32
import org.gvsig.fmap.dal.DataTypes;
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.exception.InitializeException;
35
import org.gvsig.fmap.dal.exception.LoadException;
36
import org.gvsig.fmap.dal.exception.OpenException;
37
import org.gvsig.fmap.dal.exception.ReadException;
38
import org.gvsig.fmap.dal.exception.WriteException;
39
import org.gvsig.fmap.dal.feature.EditableFeatureType;
40
import org.gvsig.fmap.dal.feature.FeatureSet;
41
import org.gvsig.fmap.dal.feature.exception.PerformEditingException;
42
import org.gvsig.fmap.dal.feature.spi.FeatureData;
43
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
44
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
45
import org.gvsig.fmap.dal.feature.spi.LegendBuilder;
46
import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider;
47
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
48
import org.gvsig.fmap.dal.resource.exception.ResourceNotifyCloseException;
49
import org.gvsig.fmap.dal.resource.exception.ResourceNotifyOpenException;
50
import org.gvsig.fmap.dal.resource.file.FileResource;
51
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
52
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
53
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
54
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
55
import org.gvsig.fmap.geom.Geometry;
56
import org.gvsig.fmap.geom.GeometryFactory;
57
import org.gvsig.fmap.geom.GeometryManager;
58
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
59
import org.gvsig.fmap.geom.primitive.Arc2D;
60
import org.gvsig.fmap.geom.primitive.Circle2D;
61
import org.gvsig.fmap.geom.primitive.Curve2D;
62
import org.gvsig.fmap.geom.primitive.Curve2DZ;
63
import org.gvsig.fmap.geom.primitive.DefaultEnvelope;
64
import org.gvsig.fmap.geom.primitive.Ellipse2D;
65
import org.gvsig.fmap.geom.primitive.Envelope;
66
import org.gvsig.fmap.geom.primitive.GeneralPathX;
67
import org.gvsig.fmap.geom.primitive.Point2DZ;
68
import org.gvsig.fmap.geom.primitive.Surface2D;
69
import org.gvsig.fmap.geom.primitive.Surface2DZ;
70
import org.gvsig.fmap.geom.util.Converter;
71
import org.gvsig.fmap.geom.util.UtilFunctions;
72
import org.gvsig.tools.dynobject.exception.DynMethodException;
73
import org.gvsig.tools.exception.NotYetImplemented;
74
import org.gvsig.tools.persistence.AbstractPersistenceManager;
75
import org.gvsig.tools.persistence.PersistenceException;
76
import org.gvsig.tools.persistence.PersistentState;
77

    
78
public class DXFStoreProvider extends AbstractMemoryStoreProvider implements
79
                ResourceConsumer {
80

    
81
        public static final String NAME = "DXF";
82
        public static final String DESCRIPTION = "DXF file";
83
        public static final String DYNCLASS_NAME = "DXFFile";
84

    
85
        private int ID_FIELD_ID = 0;
86
        private int ID_FIELD_GEOMETRY = 1;
87
        private int ID_FIELD_ENTITY = 2;
88
        private int ID_FIELD_LAYER = 3;
89
        private int ID_FIELD_COLOR = 4;
90
        private int ID_FIELD_ELEVATION = 5;
91
        private int ID_FIELD_THICKNESS = 6;
92
        private int ID_FIELD_TEXT = 7;
93
        private int ID_FIELD_HEIGHTTEXT = 8;
94
        private int ID_FIELD_ROTATIONTEXT = 9;
95

    
96
        private IProjection projection;
97
        private ResourceProvider resource;
98
        private LegendBuilder leyendBuilder;
99

    
100
        private int counterNewsOIDs;
101
        private Envelope envelope;
102
        private Writer writer;
103

    
104
        private DXFStoreParameters getParameters() {
105
                return (DXFStoreParameters) this.parameters;
106
        }
107

    
108
        public DXFStoreProvider(DXFStoreParameters parameters) {
109
                super(parameters);
110
        }
111

    
112
        public FeatureStoreProvider initialize(FeatureStoreProviderServices store)
113
                        throws InitializeException {
114
                super.initialize(store);
115

    
116
                counterNewsOIDs = 0;
117
                //                projection = CRSFactory.getCRS(getParameters().getSRSID());
118

    
119
                File file = getParameters().getFile();
120
                resource = this.createResource(
121
                                FileResource.NAME,
122
                                new Object[] { file.getAbsolutePath() }
123
                        );
124
                resource.addConsumer(this);
125

    
126
                this.projection = this.getParameters().getCRS();
127

    
128
                try {
129
                        leyendBuilder = (LegendBuilder) store.invokeDynMethod(
130
                                        LegendBuilder.DYNMETHOD_BUILDER_NAME, null);
131
                } catch (DynMethodException e) {
132
                        leyendBuilder = null;
133
                } catch (Exception e) {
134
                        throw new InitializeException(e);
135
                }
136
                this.initializeFeatureTypes();
137
                return this;
138
        }
139

    
140
        public String getName() {
141
                return NAME;
142
        }
143

    
144
        public boolean allowWrite() {
145
                return true;
146
        }
147

    
148
        public Object getLeyend() throws OpenException {
149
                this.open();
150
                if (leyendBuilder == null) {
151
                        return null;
152
                }
153
                return leyendBuilder.getLegend();
154
        }
155

    
156
        public void open() throws OpenException {
157
                if (this.data != null) {
158
                        return;
159
                }
160
                try {
161
                        this.resource.begin();
162

    
163
                        if (this.resource.getData() != null) {
164
                                this.data = (ArrayList) this.resource.getData();
165
                        } else {
166
                                this.data = new ArrayList();
167
                                this.counterNewsOIDs = 0;
168
                                Reader reader = new Reader().initialice(
169
                                                this,
170
                                                new File((String) this.resource.get()),
171
                                                projection,
172
                                                this.leyendBuilder
173
                                        );
174
                                reader.begin(this.store);
175

    
176
                                ArrayList types = new ArrayList();
177
                                Iterator it = reader.getTypes().iterator();
178
                                while (it.hasNext()) {
179
                                        types.add(((EditableFeatureType) it.next())
180
                                                        .getNotEditableCopy());
181
                                }
182

    
183
                                this.store.setFeatureTypes(types, reader.getDefaultType()
184
                                                .getNotEditableCopy());
185
                                resource.notifyOpen();
186
                                reader.load();
187
                                this.envelope = reader.getEnvelope();
188
                                reader.end();
189
                                resource.notifyClose();
190
                                this.resource.setData(this.data);
191
                        }
192
                } catch (Exception e) {
193
                        this.data = null;
194
                        try {
195
                                throw new OpenException(resource.getName(), e);
196
                        } catch (AccessResourceException e1) {
197
                                throw new OpenException(this.getName(), e);
198
                        }
199
                } finally {
200
                        this.resource.end();
201
                }
202
        }
203

    
204

    
205
        public DataServerExplorer getExplorer() throws ReadException {
206
                DataManager manager = DALLocator.getDataManager();
207
                FilesystemServerExplorerParameters params;
208
                try {
209
                        params = (FilesystemServerExplorerParameters) manager
210
                                .createServerExplorerParameters(FilesystemServerExplorer.NAME);
211
                        params.setRoot(this.getParameters().getFile().getParent());
212
                        return manager.createServerExplorer(params);
213
                } catch (DataException e) {
214
                        throw new ReadException(this.getName(), e);
215
                }
216

    
217
        }
218

    
219

    
220
        private FeatureData getFeatureDataFormFeature(Object feature) {
221
                org.gvsig.fmap.dal.feature.impl.DefaultFeature f = (org.gvsig.fmap.dal.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 = 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.notifyChanges();
244
                        features.dispose();
245
                        counterNewsOIDs = 0;
246

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

    
254
        public class Reader {
255
                private File file;
256
                private String fileName;
257
                private IProjection projection;
258
                private List types;
259
                private LegendBuilder leyendBuilder;
260
                private AbstractMemoryStoreProvider store;
261
                private Envelope envelope;
262

    
263
                public Reader initialice(AbstractMemoryStoreProvider store, File file,
264
                                IProjection projection,
265
                                LegendBuilder leyendBuilder) {
266
                        this.store = store;
267
                        this.file = file;
268
                        this.fileName = file.getAbsolutePath();
269
                        this.projection = projection;
270
                        this.leyendBuilder = leyendBuilder;
271
                        return this;
272
                }
273

    
274
                public Envelope getEnvelope() {
275
                        return this.envelope;
276
                }
277

    
278
                public void begin(FeatureStoreProviderServices store) {
279

    
280
                        EditableFeatureType featureType = store.createFeatureType();
281

    
282
                        ID_FIELD_ID = featureType.add("ID", DataTypes.INT)
283
                                        .setDefaultValue(Integer.valueOf(0))
284
                                .getIndex();
285

    
286
                        ID_FIELD_GEOMETRY = featureType.add("Geometry",
287
                                        DataTypes.GEOMETRY)
288
                                .getIndex();
289
                        featureType.setDefaultGeometryAttributeName("Geometry");
290

    
291
                        // FIXME: Cual es el size y el valor por defecto para Entity ?
292
                        ID_FIELD_ENTITY = featureType.add("Entity",
293
                                        DataTypes.STRING, 100)
294
                                        .setDefaultValue("")
295
                                        .getIndex();
296

    
297
                        // FIXME: Cual es el size de Layer ?
298
                        ID_FIELD_LAYER = featureType.add("Layer",
299
                                        DataTypes.STRING, 100)
300
                                        .setDefaultValue(
301
                                        "default").getIndex();
302

    
303
                        ID_FIELD_COLOR = featureType.add("Color",
304
                                        DataTypes.INT)
305
                                        .setDefaultValue(
306
                                        Integer.valueOf(0)).getIndex();
307

    
308
                        ID_FIELD_ELEVATION = featureType.add("Elevation",
309
                                        DataTypes.DOUBLE)
310
                                        .setDefaultValue(
311
                                        Double.valueOf(0)).getIndex();
312

    
313
                        ID_FIELD_THICKNESS = featureType.add("Thickness",
314
                                        DataTypes.DOUBLE)
315
                                        .setDefaultValue(
316
                                        Double.valueOf(0)).getIndex();
317

    
318
                        // FIXME: Cual es el size de Text ?
319
                        ID_FIELD_TEXT = featureType.add("Text",
320
                                        DataTypes.STRING, 100)
321
                                        .setDefaultValue("")
322
                                        .getIndex();
323

    
324
                        ID_FIELD_HEIGHTTEXT = featureType.add("HeightText",
325
                                        DataTypes.DOUBLE).setDefaultValue(
326
                                        Double.valueOf(10)).getIndex();
327

    
328
                        ID_FIELD_ROTATIONTEXT = featureType.add("Rotation",
329
                                        DataTypes.DOUBLE).setDefaultValue(
330
                                        Double.valueOf(0)).getIndex();
331

    
332

    
333

    
334
                        // FIXME: Parece que el DXF puede tener mas atributos opcionales.
335
                        // Habria que ver de pillarlos ?
336

    
337
                        types = new ArrayList();
338
                        types.add(featureType);
339

    
340
                        if (leyendBuilder != null) {
341
                                leyendBuilder.begin();
342
                        }
343

    
344
                }
345

    
346
                public void end() {
347
                        if (leyendBuilder != null) {
348
                                leyendBuilder.end();
349
                        }
350
                }
351

    
352
                public List getTypes() {
353
                        return types;
354
                }
355

    
356
                public EditableFeatureType getDefaultType() {
357
                        return (EditableFeatureType) types.get(0);
358
                }
359

    
360
                private Double toDouble(String value) {
361
                        if (value == null) {
362
                                return Double.valueOf(0);
363
                        }
364
                        return Double.valueOf(value);
365
                }
366

    
367
                public void load() throws DataException {
368

    
369
                        this.envelope = new DefaultEnvelope(2); // FIXME comprobar
370

    
371
                        DxfFile.EntityFactory featureMaker = new DxfFeatureMaker(projection);
372
                        DxfFile.VarSettings headerManager = new DxfHeaderManager();
373
                        DxfFile dxfFeatureFile = new DxfFile(projection, file
374
                                        .getAbsolutePath(), featureMaker, headerManager);
375

    
376
                        try {
377
                                dxfFeatureFile.load();
378
                        } catch (Exception e1) {
379
                                throw new LoadException(e1, fileName);
380
                        }
381

    
382
                        IObjList.vector features = (IObjList.vector) ((DxfFeatureMaker) featureMaker)
383
                                        .getObjects();
384
                        String acadVersion = ((DxfHeaderManager) headerManager)
385
                                        .getAcadVersion();
386

    
387

    
388
                        getLogger().info("load: acadVersion = '" + acadVersion + "'");
389

    
390
                        GeometryFactory gFactory = GeometryManager.getInstance()
391
                                        .getGeometryFactory();
392

    
393
                        if (!featureMaker.isDxf3DFile() && !headerManager.isWritedDxf3D()) {
394
                                // y no est?n todos a 9999
395
                                Feature[] features2D = new Feature[features.size()];
396
                                for (int i = 0; i < features.size(); i++) {
397
                                        Feature fea = (Feature) features.get(i);
398
                                        if (fea.getGeometry() instanceof org.cresques.px.gml.Point3D) {
399
                                                Point point = (Point) fea.getGeometry();
400
                                                Point point2 = new Point();
401
                                                for (int j = 0; j < point.pointNr(); j++) {
402
                                                        point2.add(point.get(j));
403
                                                }
404
                                                point2.setTextPoint(point.isTextPoint());
405
                                                fea.setGeometry(point2);
406
                                                features2D[i] = fea;
407

    
408
                                        } else if (fea.getGeometry() instanceof LineString3D) {
409
                                                LineString lineString = (LineString) fea.getGeometry();
410
                                                LineString lineString2 = new LineString();
411
                                                for (int j = 0; j < lineString.pointNr(); j++) {
412
                                                        lineString2.add(lineString.get(j));
413
                                                }
414
                                                fea.setGeometry(lineString2);
415
                                                features2D[i] = fea;
416
                                        } else if (fea.getGeometry() instanceof Polygon3D) {
417
                                                Polygon polygon = (Polygon) fea.getGeometry();
418
                                                Polygon polygon2 = new Polygon();
419
                                                for (int j = 0; j < polygon.pointNr(); j++) {
420
                                                        polygon2.add(polygon.get(j));
421
                                                }
422
                                                fea.setGeometry(polygon2);
423
                                                features2D[i] = fea;
424
                                        }
425
                                }
426
                                features.clear();
427
                                for (int i = 0; i < features2D.length; i++) {
428
                                        features.add(features2D[i]);
429
                                }
430
                        }
431

    
432
                        for (int i = 0; i < features.size(); i++) {
433

    
434
                                FeatureData feature = store.createFeatureData(store
435
                                                .getStoreServices().getDefaultFeatureType());
436

    
437
                                try {
438
                                        Feature fea = (Feature) features.get(i);
439

    
440
                                        feature.set(ID_FIELD_ID, Integer.valueOf(i));
441
                                        feature.set(ID_FIELD_ENTITY, fea.getProp("dxfEntity"));
442
                                        feature.set(ID_FIELD_LAYER, fea.getProp("layer"));
443
                                        feature.set(ID_FIELD_COLOR, Integer.valueOf(fea
444
                                                        .getProp("color")));
445
                                        feature.set(ID_FIELD_TEXT, fea.getProp("text"));
446
                                        feature.set(ID_FIELD_HEIGHTTEXT, toDouble(fea
447
                                                        .getProp("textHeight")));
448
                                        feature.set(ID_FIELD_ROTATIONTEXT, toDouble(fea
449
                                                        .getProp("textRotation")));
450
                                        feature.set(ID_FIELD_ELEVATION, toDouble(fea
451
                                                        .getProp("elevation")));
452
                                        feature.set(ID_FIELD_THICKNESS, toDouble(fea
453
                                                        .getProp("thickness")));
454
                                        // FIXME: Abria que pillar el resto de atributos del DXF.
455

    
456
                                        store.addFeatureData(feature);
457

    
458

    
459
                                        // FIXME: Habia una incongruencia en el codigo ya que al
460
                                        // campo
461
                                        // ID_FIELD_GEOMETRY igual le asignaba una geometria que un
462
                                        // valor de cadena como 'Point3D', 'Polyline2D' o
463
                                        // 'Polyline3D'
464
                                        // Faltaria un atributo ID_FIELD_FSHAPE ?
465
                                        //
466

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

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

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

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

    
591
                        }
592
                }
593

    
594
        }
595

    
596
        public class Writer {
597
                private Double DEFAULT_ELEVATION = new Double(0);
598

    
599
                private DxfFile.EntityFactory entityMaker;
600

    
601
                private IProjection proj = null;
602

    
603
                private int handle = 40; // Revisar porqu? es 40.
604

    
605
                private int k = 0;
606

    
607
                private boolean dxf3DFile = false;
608
                private String fileName;
609

    
610
                public Writer initialice(File file, IProjection projection) {
611
                        this.proj = projection;
612
                        this.fileName = file.getAbsolutePath();
613
                        entityMaker = new DxfEntityMaker(proj);
614

    
615
                        return this;
616
                }
617

    
618
                public void begin() {
619
                        entityMaker = new DxfEntityMaker(proj);
620
                }
621

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

    
636
                public void add(FeatureData feature) throws WriteException {
637
                        try {
638
                                Geometry geom = feature.getDefaultGeometry();
639

    
640
                                if (Point2DZ.class.isAssignableFrom(geom.getClass())) {
641
                                        dxf3DFile = true;
642
                                        k = createPoint3D(handle, k, feature);
643

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

    
648
                                } else if (Curve2DZ.class.isAssignableFrom(geom.getClass())) {
649
                                        dxf3DFile = true;
650
                                        k = createPolyline3D(handle, k, feature);
651

    
652
                                } else if (Arc2D.class.isAssignableFrom(geom.getClass())) {
653
                                        k = createArc2D(handle, k, feature);
654

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

    
658
                                } else if (Surface2DZ.class.isAssignableFrom(geom.getClass())) {
659
                                        dxf3DFile = true;
660
                                        k = createPolyline3D(handle, k, feature);
661

    
662
                                } else if (Circle2D.class.isAssignableFrom(geom.getClass())) {
663
                                        k = createCircle2D(handle, k, feature);
664

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

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

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

    
684
                }
685

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

    
696
                private DxfGroupVector updateProperties(FeatureData feature, int k) {
697
                        DxfGroupVector polv = new DxfGroupVector();
698

    
699
                        String layer = (String) feature.get(ID_FIELD_LAYER);
700
                        Integer color = (Integer) feature.get(ID_FIELD_COLOR);
701
                        Double thickness = (Double) feature.get(ID_FIELD_THICKNESS);
702

    
703
                        DxfGroup geometryLayer = new DxfGroup(8, layer);
704

    
705
                        DxfGroup handleGroup = new DxfGroup();
706
                        handleGroup.setCode(5);
707
                        handleGroup.setData(new Integer(handle + k).toString());
708

    
709
                        DxfGroup handleColor = new DxfGroup();
710
                        handleColor.setCode(62);
711
                        handleColor.setData(color);
712

    
713
                        DxfGroup handleThickness = new DxfGroup();
714
                        handleThickness.setCode(39);
715
                        handleThickness.setData(thickness);
716

    
717
                        polv.add(geometryLayer);
718
                        polv.add(handleGroup);
719
                        polv.add(handleColor);
720
                        return polv;
721
                }
722

    
723
                private int createPoint2D(int handle, int k, FeatureData feature)
724
                                throws Exception {
725

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

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

    
761
                private int createText2D(int handle, int k, FeatureData feature)
762
                                throws Exception {
763

    
764
                        String text = feature.get(ID_FIELD_TEXT).toString();
765
                        Double heightText = (Double) feature.get(ID_FIELD_HEIGHTTEXT);
766
                        Double rotationText = (Double) feature.get(ID_FIELD_ROTATIONTEXT);
767

    
768
                        DxfGroup handleText = new DxfGroup();
769
                        handleText.setCode(1);
770
                        handleText.setData(text);
771

    
772
                        DxfGroup handleHeightText = new DxfGroup();
773
                        handleHeightText.setCode(40);
774
                        handleHeightText.setData(heightText);
775

    
776
                        DxfGroup handleRotationText = new DxfGroup();
777
                        handleRotationText.setCode(50);
778
                        handleRotationText.setData(rotationText);
779

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

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

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

    
862
                private int createText3D(int handle, int k, FeatureData feature)
863
                                throws Exception {
864

    
865
                        double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry())
866
                        .getZs();
867

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

    
873
                        DxfGroup handleText = new DxfGroup();
874
                        handleText.setCode(1);
875
                        handleText.setData(text);
876

    
877
                        DxfGroup handleHeightText = new DxfGroup();
878
                        handleHeightText.setCode(40);
879
                        handleHeightText.setData(heightText);
880

    
881
                        DxfGroup handleRotationText = new DxfGroup();
882
                        handleRotationText.setCode(50);
883
                        handleRotationText.setData(rotationText);
884

    
885
                        DxfGroup handleElevation = new DxfGroup();
886
                        handleElevation.setCode(38);
887
                        handleElevation.setData(elevation);
888

    
889
                        Point2DZ point = (Point2DZ) (feature
890
                                        .getDefaultGeometry()).getInternalShape();
891

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

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

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

    
932
                        PathIterator theIterator = (feature.getDefaultGeometry())
933
                                        .getPathIterator(null, Converter.FLATNESS); // polyLine.
934
                                                                                                                                // getPathIterator
935
                                                                                                                                // (null,
936
                        // flatness);
937

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

    
961
                                                entityMaker.createLwPolyline(polv);
962
                                                k++;
963
                                                polv = updateProperties(feature, k);
964

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

    
984
                                }
985
                                theIterator.next();
986
                        }
987

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

    
1005
                        entityMaker.createLwPolyline(polv);
1006
                        k++;
1007
                        return k;
1008
                }
1009

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

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

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

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

    
1166
                        DxfGroup radius = new DxfGroup();
1167
                        radius.setCode(40);
1168
                        radius.setData(new Double(circle.getRadio()));
1169

    
1170
                        polv.add(xvertex);
1171
                        polv.add(yvertex);
1172
                        polv.add(zvertex);
1173
                        polv.add(radius);
1174

    
1175
                        entityMaker.createCircle(polv);
1176
                        k++;
1177
                        return k;
1178
                }
1179

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

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

    
1223
                private int createEllipse2D(int handle, int k, FeatureData feature)
1224
                                throws Exception {
1225
                        Ellipse2D ellipse = (Ellipse2D) (feature
1226
                                        .getDefaultGeometry()).getInternalShape();
1227

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

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

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

    
1283
        }
1284

    
1285
        public boolean closeResourceRequested(ResourceProvider resource) {
1286
                return true;
1287
        }
1288

    
1289
        public int getFeatureReferenceOIDType() {
1290
                return DataTypes.LONG;
1291
        }
1292

    
1293
        public boolean supportsAppendMode() {
1294
                return false;
1295
        }
1296

    
1297
        public void append(org.gvsig.fmap.dal.feature.Feature feature) {
1298
                try {
1299
                        writer.add(getFeatureDataFormFeature(feature));
1300
                } catch (WriteException e) {
1301
                        // TODO Auto-generated catch block
1302
                        e.printStackTrace();
1303
                }
1304
        }
1305

    
1306
        public void beginAppend() {
1307
                try {
1308
                        writer = new Writer().initialice((File) resource.get(), projection);
1309
                        writer.begin();
1310
                } catch (AccessResourceException e) {
1311
                        // TODO Auto-generated catch block
1312
                        e.printStackTrace();
1313
                }
1314
        }
1315

    
1316
        public void endAppend() {
1317
                try {
1318
                        resource.notifyOpen();
1319
                        writer.end();
1320
                        resource.notifyClose();
1321
                        counterNewsOIDs = 0;
1322
                        resource.end();
1323
                } catch (ResourceNotifyOpenException e) {
1324
                        // TODO Auto-generated catch block
1325
                        e.printStackTrace();
1326
                } catch (ResourceNotifyCloseException e) {
1327
                        // TODO Auto-generated catch block
1328
                        e.printStackTrace();
1329
                } catch (WriteException e) {
1330
                        // TODO Auto-generated catch block
1331
                        e.printStackTrace();
1332
                }
1333
        }
1334

    
1335
        public PersistentState getState() throws PersistenceException {
1336
                return AbstractPersistenceManager.getState(this);
1337
        }
1338

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

    
1344
        public void setState(PersistentState state) throws PersistenceException {
1345
                // TODO Auto-generated method stub
1346
                throw new NotYetImplemented();
1347
        }
1348

    
1349
        public Object createNewOID() {
1350
                return new Integer(++counterNewsOIDs);
1351
        }
1352

    
1353
        protected void initializeFeatureTypes() throws InitializeException {
1354
                try {
1355
                        this.open();
1356
                } catch (OpenException e) {
1357
                        throw new InitializeException(this.getName(), e);
1358
                }
1359
        }
1360

    
1361
        public Envelope getEnvelope() throws DataException {
1362
                return this.envelope;
1363
        }
1364

    
1365
        public Object getMetadataID() {
1366
                // TODO Auto-generated method stub
1367
                return null;
1368
        }
1369

    
1370
        public Iterator getChilds() {
1371
                // TODO Auto-generated method stub
1372
                return null;
1373
        }
1374

    
1375
        /*
1376
         * (non-Javadoc)
1377
         * 
1378
         * @see org.gvsig.metadata.Metadata#getMetadataChildren()
1379
         */
1380
        public Set getMetadataChildren() {
1381
                return null;
1382
        }
1383

    
1384
        /*
1385
         * (non-Javadoc)
1386
         * 
1387
         * @see org.gvsig.metadata.Metadata#getMetadataName()
1388
         */
1389
        public String getMetadataName() {
1390
                return this.getParameters().getFileName();
1391
        }
1392

    
1393
        /*
1394
         * (non-Javadoc)
1395
         * 
1396
         * @see
1397
         * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
1398
         * gvsig.fmap.dal.resource.spi.ResourceProvider)
1399
         */
1400
        public void resourceChanged(ResourceProvider resource) {
1401
                this.store.notifyChange(DataStoreNotification.RESOURCE_CHANGED,
1402
                                resource);
1403
        }
1404
}