Statistics
| Revision:

svn-gvsig-desktop / branches / Mobile_Compatible_Hito_1 / libFMap_dataFile / src / org / gvsig / data / datastores / vectorial / file / dxf / DXFFeaturesWriter.java @ 22125

History | View | Annotate | Download (30.1 KB)

1
package org.gvsig.data.datastores.vectorial.file.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.util.Iterator;
8
import java.util.Vector;
9

    
10
import org.gvsig.projection.cts.IProjection;
11
import org.cresques.io.DxfFile;
12
import org.cresques.io.DxfGroup;
13
import org.cresques.io.DxfGroupVector;
14
import org.cresques.px.dxf.DxfEntityMaker;
15
import org.gvsig.data.DataException;
16
import org.gvsig.data.OpenException;
17
import org.gvsig.data.ReadException;
18
import org.gvsig.data.WriteException;
19
import org.gvsig.data.datastores.vectorial.FeaturesWriter;
20
import org.gvsig.data.datastores.vectorial.InitializeWriterException;
21
import org.gvsig.data.vectorial.Feature;
22
import org.gvsig.data.vectorial.FeatureAttributeDescriptor;
23
import org.gvsig.data.vectorial.FeatureStore;
24
import org.gvsig.data.vectorial.FeatureType;
25
import org.gvsig.fmap.geom.Geometry;
26
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
27
import org.gvsig.fmap.geom.primitive.Arc2D;
28
import org.gvsig.fmap.geom.primitive.Circle2D;
29
import org.gvsig.fmap.geom.primitive.Curve2D;
30
import org.gvsig.fmap.geom.primitive.Curve2DZ;
31
import org.gvsig.fmap.geom.primitive.Ellipse2D;
32
import org.gvsig.fmap.geom.primitive.Point2DZ;
33
import org.gvsig.fmap.geom.primitive.Surface2D;
34
import org.gvsig.fmap.geom.primitive.Surface2DZ;
35
import org.gvsig.fmap.geom.util.Converter;
36
import org.gvsig.fmap.geom.util.UtilFunctions;
37

    
38

    
39
public class DXFFeaturesWriter implements FeaturesWriter {
40
        private String DEFAULT_LAYER="default";
41
        private Integer DEFAULT_COLOR=new Integer(0);
42
        private Double DEFAULT_ELEVATION=new Double(0);
43
        private Double DEFAULT_THICKNESS=new Double(0);
44
        private String DEFAULT_TEXT="";
45
        private Double DEFAULT_HEIGHTTEXT=new Double(10);
46
        private Double DEFAULT_ROTATIONTEXT=new Double(0);
47

    
48
//        private DxfFieldsMapping fieldsMapping = null;
49

    
50
        private File file;
51

    
52
        private DxfFile.EntityFactory entityMaker;
53

    
54
        private IProjection proj = null;
55

    
56
        int handle = 40; // Revisar porqu? es 40.
57

    
58
        int k = 0;
59

    
60
        boolean dxf3DFile = false;
61
        private int indexText=-1;//En DXF es 7.
62
        private int indexHeightText=-1;//En DXF es 8.
63
        private int indexRotationText=-1;//En DXF es 9.
64
        private FeatureType featureType;
65

    
66
        public void init(FeatureStore store) {
67
                DXFStoreParameters dxfParameters=(DXFStoreParameters)store.getParameters();
68
                file=dxfParameters.getFile();
69
                proj=dxfParameters.getProjection();
70
                featureType=store.getDefaultFeatureType();
71
//                fieldsMapping = new DxfFieldsMapping();
72
//                fieldsMapping.setLayerField("Layer");
73
//                fieldsMapping.setColorField("Color");
74
//                fieldsMapping.setElevationField("Elevation");
75
//                fieldsMapping.setThicknessField("Thickness");
76
//                fieldsMapping.setTextField("Text");
77
//                fieldsMapping.setHeightText("HeightText");
78
//                fieldsMapping.setRotationText("Layer");
79
        }
80

    
81
        public void postProcess() throws WriteException {
82
//                 Escribimos realmente lo que hemos montado en memoria.
83
                DxfFile dxfFile = new DxfFile(null, file.getAbsolutePath(), entityMaker);
84
                dxfFile.setCadFlag(true);
85
                if (dxf3DFile)
86
                        dxfFile.setDxf3DFlag(true);
87
                try {
88
                        dxfFile.save(file.getAbsolutePath());
89
                } catch (IOException e) {
90
                        throw new WriteException("DXF Writer",e);
91
                }
92
                dxfFile.close();
93
        }
94

    
95
        public void preProcess() throws InitializeWriterException, ReadException {
96
//                if (fieldsMapping == null) {
97
//                        throw new InitializeWriterException ("DXF Writer",null);
98
//                }
99
                // NOTA: La proyecci?n no se usa absolutamente para nada (al menos
100
                // por ahora). Las entidades se escribir?n con las coordenadas con
101
                // las que se crean.
102
//                if (proj == null) {
103
//                        throw new StartWriterVisitorException (getName(),null);
104
//                }
105

    
106
                entityMaker = new DxfEntityMaker(proj);
107
//                FieldDescription[] fieldDescriptions=getTableDefinition().getFieldsDesc();
108
                Iterator iterator=featureType.iterator();
109
                int i=0;
110
                while (iterator.hasNext()) {
111
                        FeatureAttributeDescriptor fad = (FeatureAttributeDescriptor) iterator.next();
112
                        if (fad.getName().equals("Text")){
113
                                indexText=i;
114
                        }else if (fad.getName().equals("HeightText")){
115
                                indexHeightText=i;
116
                        }else if (fad.getName().equals("RotationText")){
117
                                indexRotationText=i;
118
                        }
119
                        i++;
120
                }
121
        }
122

    
123
        public void insertFeature(Feature feature) throws WriteException {
124
                try {
125
                        Geometry geom = (Geometry)feature.getDefaultGeometry();
126
//                    Value[] values=row.getAttributes();
127
                    // TODO: Tratamiento de los campos
128
                    // y modificar los createXXX para que acepten como par?metro
129
                    // los datos de LAYER, COLOR, ELEVATION, THICKNESS, TEXT
130
                    // HEIGHTTEXT, ROTATIONTEXT y el resto que puedan hacer
131
                    // falta.
132

    
133
                    if (Point2DZ.class.isAssignableFrom(geom.getClass())) {
134
                    dxf3DFile = true;
135
                    k=createPoint3D(handle, k, feature);
136
                } else if (org.gvsig.fmap.geom.primitive.Point2D.class.isAssignableFrom(geom.getClass())) {
137
                    k=createPoint2D(handle, k, feature);
138
                } else if (Curve2DZ.class.isAssignableFrom(geom.getClass())) {
139
                    dxf3DFile = true;
140
                    k = createPolyline3D(handle, k, feature);
141
                } else if (Arc2D.class.isAssignableFrom(geom.getClass())) {
142
//                        FArc2D arc = (FArc2D) geom.getInternalShape();
143
                        k=createArc2D(handle, k, feature);
144
                } else if (Curve2D.class.isAssignableFrom(geom.getClass())) {
145
                    k=createLwPolyline2D(handle, k, feature, false);
146
                } else if (Surface2DZ.class.isAssignableFrom(geom.getClass())) {
147
                    dxf3DFile = true;
148
                    k = createPolyline3D(handle, k, feature);
149
                    // k = createPolygon3D(handle, k, geom);
150
                } else if (Circle2D.class.isAssignableFrom(geom.getClass())) {
151
//                        FCircle2D circle = (FCircle2D) geom.getInternalShape();
152
                        k=createCircle2D(handle, k, feature);
153
                } else if (Ellipse2D.class.isAssignableFrom(geom.getClass())) {
154
//                        FEllipse2D ellipse = (FEllipse2D) geom.getInternalShape();
155
                        k=createEllipse2D(handle, k, feature);
156
                 }else if (Surface2D.class.isAssignableFrom(geom.getClass())) {
157
                    // createPolygon2D(handle, k, geom);
158
                    k=createLwPolyline2D(handle, k, feature, true);
159
                }  else {
160
                    System.out.println("IGeometry not supported yet");
161
                    k++;
162
                }
163
                }
164
                catch(Exception e){
165
                        throw new WriteException("DXF Writer",e);
166
                }
167

    
168

    
169
        }
170
        public void updateFeatureType(FeatureType featureType) {
171
                // TODO Ap?ndice de m?todo generado autom?ticamente
172

    
173
        }
174

    
175

    
176
        private int createPoint2D(int handle, int k, Feature feature) throws Exception {
177

    
178
                if (indexText!= -1 && !(feature.get(indexText) == null)){
179
                        return createText2D(handle,k,feature);
180
                }
181
                org.gvsig.fmap.geom.primitive.Point2D point = new org.gvsig.fmap.geom.primitive.Point2D(0, 0);
182
                double[] pointCoords = new double[6];
183
                PathIterator pointIt = ((Geometry)feature.getDefaultGeometry()).getPathIterator(null);
184
                while (!pointIt.isDone()) {
185
                        pointIt.currentSegment(pointCoords);
186
                        point = new org.gvsig.fmap.geom.primitive.Point2D(pointCoords[0], pointCoords[1]);
187
                        pointIt.next();
188
                }
189
                Point2D pto = new Point2D.Double(point.getX(), point.getY());
190

    
191
                DxfGroup px = new DxfGroup();
192
                DxfGroup py = new DxfGroup();
193
                DxfGroup pz = new DxfGroup();
194
                px.setCode(10);
195
                px.setData(new Double(pto.getX()));
196
                py.setCode(20);
197
                py.setData(new Double(pto.getY()));
198
                pz.setCode(30);
199
//                POINT del DXF tiene cota. Le asigno cero arbitrariamente.
200
                pz.setData(new Double(0.0));
201
                DxfGroupVector pv = updateProperties(feature,k);
202
//                pv.add(pointLayer);
203
//                pv.add(handleGroup);
204
//                pv.add(handleColor);
205
//                pv.add(handleElevation);
206
//                pv.add(handleThickness);
207
                pv.add(px);
208
                pv.add(py);
209
                pv.add(pz);
210
                entityMaker.createPoint(pv);
211
                k++;
212
                return k;
213
        }
214
        private int createText2D(int handle, int k, Feature feature) throws Exception {
215
                String text=DEFAULT_TEXT;
216
                Double heightText=DEFAULT_HEIGHTTEXT;
217
                Double rotationText=DEFAULT_ROTATIONTEXT;
218

    
219
                if (indexText!=-1 && !(feature.get(indexText) == null)) {
220
                        text = feature.get(indexText).toString();
221
                }
222
                if (indexHeightText!=-1 && !(feature.get(indexHeightText) instanceof Number)) {
223
                        heightText = new Double(((Number) feature.get(indexHeightText))
224
                                        .doubleValue());
225
                }
226
                if (indexRotationText!=-1 && !(feature.get(indexRotationText) instanceof Number)) {
227
                        rotationText = new Double(((Number) feature.get(indexRotationText))
228
                                        .doubleValue());
229
                }
230
                DxfGroup handleText = new DxfGroup();
231
                handleText.setCode(1);
232
                handleText.setData(text);
233

    
234
                DxfGroup handleHeightText = new DxfGroup();
235
                handleHeightText.setCode(40);
236
                handleHeightText.setData(heightText);
237

    
238
                DxfGroup handleRotationText = new DxfGroup();
239
                handleRotationText.setCode(50);
240
                handleRotationText.setData(rotationText);
241

    
242
//                DxfGroup handleColor = new DxfGroup();
243
//                handleColor.setCode(62);
244
//                handleColor.setData(color);
245

    
246
//                DxfGroup handleElevation = new DxfGroup();
247
//                handleElevation.setCode(38);
248
//                handleElevation.setData(elevation);
249

    
250
//                DxfGroup handleThickness = new DxfGroup();
251
//                handleThickness.setCode(39);
252
//                handleThickness.setData(thickness);
253

    
254

    
255
                org.gvsig.fmap.geom.primitive.Point2D point = new org.gvsig.fmap.geom.primitive.Point2D(0, 0);
256
                double[] pointCoords = new double[6];
257
                PathIterator pointIt = ((Geometry)feature.getDefaultGeometry()).getPathIterator(null);
258
                while (!pointIt.isDone()) {
259
                        pointIt.currentSegment(pointCoords);
260
                        point = new org.gvsig.fmap.geom.primitive.Point2D(pointCoords[0], pointCoords[1]);
261
                        pointIt.next();
262
                }
263
                Point2D pto = new Point2D.Double(point.getX(), point.getY());
264
//                DxfGroup pointLayer = new DxfGroup(8, layer);
265
                DxfGroup handleGroup = new DxfGroup();
266
                handleGroup.setCode(5);
267
                handleGroup.setData(new Integer(handle + k).toString());
268
                DxfGroup px = new DxfGroup();
269
                DxfGroup py = new DxfGroup();
270
                DxfGroup pz = new DxfGroup();
271
                px.setCode(10);
272
                px.setData(new Double(pto.getX()));
273
                py.setCode(20);
274
                py.setData(new Double(pto.getY()));
275
                pz.setCode(30);
276
//                POINT del DXF tiene cota. Le asigno cero arbitrariamente.
277
                pz.setData(new Double(0.0));
278
                DxfGroupVector pv = updateProperties(feature,k);
279
//                pv.add(pointLayer);
280
//                pv.add(handleColor);
281
//                pv.add(handleElevation);
282
//                pv.add(handleThickness);
283
                pv.add(handleText);
284
                pv.add(handleHeightText);
285
                pv.add(handleRotationText);
286
                pv.add(handleGroup);
287
                pv.add(px);
288
                pv.add(py);
289
                pv.add(pz);
290
                entityMaker.createText(pv);
291
                k++;
292
                return k;
293
        }
294
        private DxfGroupVector updateProperties(Feature feature,int k){
295
                DxfGroupVector polv = new DxfGroupVector();
296
                String layer=DEFAULT_LAYER;
297
                Integer color=DEFAULT_COLOR;
298
//                Double elevation=DEFAULT_ELEVATION;
299
                Double thickness=DEFAULT_THICKNESS;
300
                if (featureType.size() > 6) {
301
                        FeatureAttributeDescriptor fad=(FeatureAttributeDescriptor)featureType.get("Layer");
302
//                        FeatureAttributeDescriptor fad=(FeatureAttributeDescriptor)featureType.get(3);
303
                        if (fad!=null &&
304
                                        !(feature.get(3) == null) &&
305
                                        feature.get(3) instanceof String) {
306
                                layer = feature.get(3).toString();
307
                        }
308
                        fad=(FeatureAttributeDescriptor)featureType.get("Color");
309
//                        fad=(FeatureAttributeDescriptor)featureType.get(4);
310
                        if (fad!=null
311
                                        && !(feature.get(4) == null) &&
312
                                        feature.get(4) instanceof Number) {
313
                                color = new Integer(((Number) feature.get(4)).intValue());
314
                        }
315
                        // if (!(values[5] instanceof NullValue)){
316
                        // elevation= new Double(((NumericValue)values[5]).doubleValue());
317
                        // }
318
                        fad=(FeatureAttributeDescriptor)featureType.get("Thickness");
319
//                        fad=(FeatureAttributeDescriptor)featureType.get(6);
320
                        if (fad!=null &&
321
                                        !(feature.get(6) == null) &&
322
                                        feature.get(6) instanceof Number) {
323
                                thickness = new Double(((Number) feature.get(6)).doubleValue());
324
                        }
325
                }
326
                DxfGroup geometryLayer = new DxfGroup(8, layer);
327

    
328
                DxfGroup handleGroup = new DxfGroup();
329
                handleGroup.setCode(5);
330
                handleGroup.setData(new Integer(handle + k).toString());
331

    
332
                DxfGroup handleColor = new DxfGroup();
333
                handleColor.setCode(62);
334
                handleColor.setData(color);
335

    
336
//                DxfGroup handleElevation = new DxfGroup();
337
//                handleElevation.setCode(38);
338
//                handleElevation.setData(elevation);
339

    
340
                DxfGroup handleThickness = new DxfGroup();
341
                handleThickness.setCode(39);
342
                handleThickness.setData(thickness);
343

    
344

    
345
                polv.add(geometryLayer);
346
//                polv.add(handleElevation);
347
                polv.add(handleGroup);
348
                polv.add(handleColor);
349
                return polv;
350
        }
351
        private int createPoint3D(int handle, int k, Feature feature) throws Exception {
352
                if (indexText!=-1 && !(feature.get(indexText) == null)){
353
                        return createText3D(handle,k,feature);
354
                }
355
                Point2DZ point = new Point2DZ(0, 0, 0);
356
                double[] pointCoords = new double[6];
357
                PathIterator pointIt = ((Geometry)feature.getDefaultGeometry()).getPathIterator(null);
358
                while (!pointIt.isDone()) {
359
                        pointIt.currentSegment(pointCoords);
360
                        point = new Point2DZ(pointCoords[0], pointCoords[1], pointCoords[2]);
361
                        pointIt.next();
362
                }
363
                org.cresques.geo.Point2DZ pto = new org.cresques.geo.Point2DZ(point.getX(), point.getY(), point.getZs()[0]);
364
//                DxfGroup pointLayer = new DxfGroup(8, "default");
365
//                DxfGroup handleGroup = new DxfGroup();
366
//                handleGroup.setCode(5);
367
//                handleGroup.setData(new Integer(handle + k).toString());
368
                DxfGroup px = new DxfGroup();
369
                DxfGroup py = new DxfGroup();
370
                DxfGroup pz = new DxfGroup();
371
                px.setCode(10);
372
                px.setData(new Double(pto.getX()));
373
                py.setCode(20);
374
                py.setData(new Double(pto.getY()));
375
                pz.setCode(30);
376
                pz.setData(new Double(pto.getZ()));
377
                double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry()).getZs();
378
                Double elevation= DEFAULT_ELEVATION;
379
                elevation = new Double(velev[0]);
380
                DxfGroup handleElevation = new DxfGroup();
381
                handleElevation.setCode(38);
382
                handleElevation.setData(elevation);
383

    
384
                DxfGroupVector pv = updateProperties(feature,k);
385
                pv.add(handleElevation);
386
//                pv.add(pointLayer);
387
//                pv.add(handleGroup);
388
                pv.add(px);
389
                pv.add(py);
390
                pv.add(pz);
391
                entityMaker.createPoint(pv);
392
                k++;
393
                return k;
394
        }
395
        private int createText3D(int handle, int k, Feature feature)        throws Exception {
396
                Double elevation = DEFAULT_ELEVATION;
397
                String text = DEFAULT_TEXT;
398
                Double heightText = DEFAULT_HEIGHTTEXT;
399
                Double rotationText = DEFAULT_ROTATIONTEXT;
400

    
401
                double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry()).getZs();
402
                elevation = new Double(velev[0]);
403

    
404
                if (indexText!=-1 && !(feature.get(indexText) == null)) {
405
                        text = feature.get(indexText).toString();
406
                }
407
                if (indexHeightText!=-1 && feature.get(indexHeightText) instanceof Number) {
408
                        heightText = new Double(((Number) feature.get(indexHeightText)).doubleValue());
409
                }
410
                if (indexRotationText!=-1 && feature.get(indexRotationText) instanceof Number) {
411
                        rotationText = new Double(((Number) feature.get(indexRotationText)).doubleValue());
412
                }
413

    
414
                DxfGroup handleText = new DxfGroup();
415
                handleText.setCode(1);
416
                handleText.setData(text);
417

    
418
                DxfGroup handleHeightText = new DxfGroup();
419
                handleHeightText.setCode(40);
420
                handleHeightText.setData(heightText);
421

    
422
                DxfGroup handleRotationText = new DxfGroup();
423
                handleRotationText.setCode(50);
424
                handleRotationText.setData(rotationText);
425

    
426
//                DxfGroup handleColor = new DxfGroup();
427
//                handleColor.setCode(62);
428
//                handleColor.setData(color);
429

    
430
                DxfGroup handleElevation = new DxfGroup();
431
                handleElevation.setCode(38);
432
                handleElevation.setData(elevation);
433

    
434
//                DxfGroup handleThickness = new DxfGroup();
435
//                handleThickness.setCode(39);
436
//                handleThickness.setData(thickness);
437

    
438
//                FPoint3D point = new FPoint3D(0, 0, 0);
439
//                double[] pointCoords = new double[6];
440
                Point2DZ point = (Point2DZ)((Geometry)feature.getDefaultGeometry()).getInternalShape();
441
//                while (!pointIt.isDone()) {
442
//                pointIt.currentSegment(pointCoords);
443
//                point = new FPoint3D(pointCoords[0], pointCoords[1]);
444
//                pointIt.next();
445
//                }
446
//                Point2D pto = new Point2D.Double(point.getX(), point.getY());
447
//                DxfGroup pointLayer = new DxfGroup(8, layer);
448
                DxfGroup handleGroup = new DxfGroup();
449
                handleGroup.setCode(5);
450
                handleGroup.setData(new Integer(handle + k).toString());
451
                DxfGroup px = new DxfGroup();
452
                DxfGroup py = new DxfGroup();
453
                DxfGroup pz = new DxfGroup();
454
                px.setCode(10);
455
                px.setData(new Double(point.getX()));
456
                py.setCode(20);
457
                py.setData(new Double(point.getY()));
458
                pz.setCode(30);
459
                pz.setData(new Double(point.getZs()[0]));
460
                DxfGroupVector pv = updateProperties(feature,k);
461
//                pv.add(pointLayer);
462
//                pv.add(handleColor);
463
                pv.add(handleElevation);
464
//                pv.add(handleThickness);
465
                pv.add(handleText);
466
                pv.add(handleHeightText);
467
                pv.add(handleRotationText);
468
                pv.add(handleGroup);
469
                pv.add(px);
470
                pv.add(py);
471
                pv.add(pz);
472
                entityMaker.createText(pv);
473
                k++;
474
                return k;
475
        }
476
        private int createLwPolyline2D(int handle, int k, Feature feature, boolean isPolygon)
477
        throws Exception {
478
                boolean first=true;
479
                DxfGroupVector polv = updateProperties(feature,k);
480
                Vector vpoints = new Vector();
481

    
482
                DxfGroup polylineFlag = new DxfGroup();
483
                polylineFlag.setCode(70);
484
                if (isPolygon)
485
                        polylineFlag.setData(new Integer(1)); // cerrada
486
                else
487
                        polylineFlag.setData(new Integer(0)); // abierta
488

    
489
                PathIterator theIterator = ((Geometry)feature.getDefaultGeometry()).getPathIterator(null, Converter.FLATNESS); // polyLine.getPathIterator(null,
490
                // flatness);
491

    
492
                double[] theData = new double[6];
493
                while (!theIterator.isDone()) {
494
                        int theType = theIterator.currentSegment(theData);
495
                        switch (theType) {
496
                        case PathIterator.SEG_MOVETO:
497
                                if (!first)
498
                                {
499
                                        for (int j = 0; j < vpoints.size(); j++) {
500
                                                DxfGroup xvertex = new DxfGroup();
501
                                                xvertex.setCode(10);
502
                                                xvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getX()));
503
                                                DxfGroup yvertex = new DxfGroup();
504
                                                yvertex.setCode(20);
505
                                                yvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getY()));
506
                                                polv.add(xvertex);
507
                                                polv.add(yvertex);
508
                                        }
509

    
510
                                        entityMaker.createLwPolyline(polv);
511
                                        k++;
512
                                        polv = updateProperties(feature,k);
513

    
514
                                }
515
                                first=false;
516
                                polv.add(polylineFlag);
517
                                vpoints.clear();
518
                                vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(theData[0], theData[1]));
519
                                break;
520
                        case PathIterator.SEG_LINETO:
521
                                vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(theData[0], theData[1]));
522
                                break;
523
                        case PathIterator.SEG_QUADTO:
524
//                                vpoints.add(new FPoint2D(theData[0], theData[1]));
525
//                                vpoints.add(new FPoint2D(theData[2], theData[3]));
526
                                break;
527
                        case PathIterator.SEG_CUBICTO:
528
//                                vpoints.add(new FPoint2D(theData[0], theData[1]));
529
//                                vpoints.add(new FPoint2D(theData[2], theData[3]));
530
//                                vpoints.add(new FPoint2D(theData[4], theData[5]));
531
                                break;
532
                        case PathIterator.SEG_CLOSE:
533
                                polylineFlag.setData(new Integer(1)); // cerrada
534
                                break;
535

    
536
                        }
537
                        theIterator.next();
538
                }
539

    
540
                for (int j = 0; j < vpoints.size(); j++) {
541
                        DxfGroup xvertex = new DxfGroup();
542
                        xvertex.setCode(10);
543
                        xvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getX()));
544
                        DxfGroup yvertex = new DxfGroup();
545
                        yvertex.setCode(20);
546
                        yvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getY()));
547
                        polv.add(xvertex);
548
                        polv.add(yvertex);
549
                }
550

    
551
                entityMaker.createLwPolyline(polv);
552
                k++;
553
                return k;
554
        }
555

    
556
        private int createPolyline3D(int handle, int k, Feature feature)
557
        throws Exception {
558
                DxfGroupVector polv = updateProperties(feature,k);
559
                Vector vpoints = new Vector();
560
                PathIterator theIterator = ((Geometry)feature.getDefaultGeometry()).getPathIterator(null, Converter.FLATNESS); // polyLine.getPathIterator(null,
561
                // flatness);
562
                double[] theData = new double[6];
563
                double[] velev = ((AbstractPrimitive) feature.getDefaultGeometry()).getZs();
564
                while (!theIterator.isDone()) {
565
                        int theType = theIterator.currentSegment(theData);
566
                        switch (theType) {
567
                        case PathIterator.SEG_MOVETO:
568
                                vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(theData[0], theData[1]));
569
                                break;
570
                        case PathIterator.SEG_LINETO:
571
                                vpoints.add(new org.gvsig.fmap.geom.primitive.Point2D(theData[0], theData[1]));
572
                                break;
573
                        }
574
                        theIterator.next();
575
                }
576
                if (constantElevation(velev)) {
577
                        DxfGroup polylineFlag = new DxfGroup();
578
                        polylineFlag.setCode(70);
579
                        polylineFlag.setData(new Integer(0));
580
                        polv.add(polylineFlag);
581
                        DxfGroup elevation = new DxfGroup();
582
                        elevation.setCode(38);
583
                        elevation.setData(new Double(velev[0]));
584
                        polv.add(elevation);
585
                        for (int j = 0; j < vpoints.size(); j++) {
586
                                DxfGroup xvertex = new DxfGroup();
587
                                xvertex.setCode(10);
588
                                xvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getX()));
589
                                DxfGroup yvertex = new DxfGroup();
590
                                yvertex.setCode(20);
591
                                yvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getY()));
592
                                polv.add(xvertex);
593
                                polv.add(yvertex);
594
                        }
595
                        entityMaker.createLwPolyline(polv);
596
                        k++;
597
                } else {
598
                        DxfGroup polylineFlag = new DxfGroup();
599
                        polylineFlag.setCode(70);
600
                        polylineFlag.setData(new Integer(8));
601
                        polv.add(polylineFlag);
602
                        DxfGroup xgroup = new DxfGroup();
603
                        xgroup.setCode(10);
604
                        xgroup.setData(new Double(0.0));
605
                        polv.add(xgroup);
606
                        DxfGroup ygroup = new DxfGroup();
607
                        ygroup.setCode(20);
608
                        ygroup.setData(new Double(0.0));
609
                        polv.add(ygroup);
610
                        DxfGroup elevation = new DxfGroup();
611
                        elevation.setCode(30);
612
                        elevation.setData(new Double(0.0));
613
                        polv.add(elevation);
614
                        DxfGroup subclassMarker = new DxfGroup(100, "AcDb3dPolyline");
615
                        polv.add(subclassMarker);
616
                        entityMaker.createPolyline(polv);
617
                        k++;
618
                        for (int j = 0; j < vpoints.size(); j++) {
619
                                DxfGroupVector verv = new DxfGroupVector();
620
                                DxfGroup entityType = new DxfGroup(0, "VERTEX");
621
                                verv.add(entityType);
622
                                DxfGroup generalSubclassMarker = new DxfGroup(100, "AcDbEntity");
623
                                verv.add(generalSubclassMarker);
624
                                DxfGroup layerName = new DxfGroup(8, "default");
625
                                verv.add(layerName);
626
                                DxfGroup vertexSubclassMarker = new DxfGroup(100, "AcDbVertex");
627
                                verv.add(vertexSubclassMarker);
628
                                // DxfGroup vertex3DSubclassMarker = new DxfGroup(100,
629
                                // "AcDb3dPolylineVertex");
630
                                // verv.add(vertex3DSubclassMarker);
631
                                DxfGroup xvertex = new DxfGroup();
632
                                xvertex.setCode(10);
633
                                xvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getX()));
634
                                DxfGroup yvertex = new DxfGroup();
635
                                yvertex.setCode(20);
636
                                yvertex.setData(new Double(((org.gvsig.fmap.geom.primitive.Point2D) vpoints.get(j)).getY()));
637
                                DxfGroup zvertex = new DxfGroup();
638
                                zvertex.setCode(30);
639
                                zvertex.setData(new Double(velev[j]));
640
                                verv.add(xvertex);
641
                                verv.add(yvertex);
642
                                verv.add(zvertex);
643
                                entityMaker.addVertex(verv);
644
                                k++;
645
                        }
646
                        DxfGroupVector seqv = new DxfGroupVector();
647
                        DxfGroup entityType = new DxfGroup(0, "SEQEND");
648
                        seqv.add(entityType);
649
                        // DxfGroup handle = new DxfGroup();
650
                        // elevation.setCode(5);
651
                        // elevation.setData(new Integer(getHandle()));
652
                        // seqv.add(handle);
653
                        DxfGroup generalSubclassMarker = new DxfGroup(100, "AcDbEntity");
654
                        seqv.add(generalSubclassMarker);
655
                        DxfGroup layerName = new DxfGroup(8, "default");
656
                        seqv.add(layerName);
657
                        DxfGroup handleSeqGroup = new DxfGroup();
658
                        handleSeqGroup.setCode(5);
659
                        handleSeqGroup.setData(new Integer(handle + k).toString());
660
                        seqv.add(handleSeqGroup);
661
                        entityMaker.endSeq();
662
                        k++;
663
                }
664
                return k;
665
        }
666

    
667
        private boolean constantElevation(double[] velev) {
668
                boolean constant = true;
669
                for (int i = 0; i < velev.length; i++) {
670
                        for (int j = 0; j < velev.length; j++) {
671
                                if (j > i) {
672
                                        if (velev[i] != velev[j]) {
673
                                                constant = false;
674
                                                break;
675
                                        }
676
                                }
677
                        }
678
                        break;
679
                }
680
                return constant;
681
        }
682
        private int createCircle2D(int handle, int k, Feature feature) throws Exception {
683
                DxfGroupVector polv = updateProperties(feature,k);
684
                DxfGroup circleFlag = new DxfGroup();
685
                circleFlag.setCode(100);
686
                polv.add(circleFlag);
687

    
688
                DxfGroup xvertex = new DxfGroup();
689
                xvertex.setCode(10);
690
                Circle2D circle = (Circle2D) ((Geometry)feature.getDefaultGeometry()).getInternalShape();
691
                xvertex.setData(new Double(circle.getCenter().getX()));
692
                DxfGroup yvertex = new DxfGroup();
693
                yvertex.setCode(20);
694
                yvertex.setData(new Double(circle.getCenter().getY()));
695
                DxfGroup zvertex = new DxfGroup();
696
                zvertex.setCode(30);
697
                zvertex.setData(new Double(0)); // TODO: COORDENADA Z. REVISAR ESTO PARA
698
                // ENTIDADES 3D
699

    
700
                DxfGroup radius = new DxfGroup();
701
                radius.setCode(40);
702
                radius.setData(new Double(circle.getRadio()));
703

    
704
                polv.add(xvertex);
705
                polv.add(yvertex);
706
                polv.add(zvertex);
707
                polv.add(radius);
708

    
709
                entityMaker.createCircle(polv);
710
                k++;
711
                return k;
712
        }
713
        private int createArc2D(int handle, int k,Feature feature) throws Exception {
714
                Arc2D arc = (Arc2D) ((Geometry)feature.getDefaultGeometry()).getInternalShape();
715
                Point2D[] pts = new Point2D[3];
716
                pts[0] = arc.getInit();
717
                pts[1] = arc.getMid();
718
                pts[2] = arc.getEnd();
719
                Point2D center = arc.getCenter();
720
                double radius = center.distance(pts[0]);
721
                double initAngle = UtilFunctions.getAngle(center, pts[0]);
722
                initAngle = Math.toDegrees(initAngle);
723
                // System.out.println("initAngle = " + initAngle);
724
                double midAngle = UtilFunctions.getAngle(center, pts[1]);
725
                midAngle = Math.toDegrees(midAngle);
726
                // System.out.println("midAngle = " + midAngle);
727
                double endAngle = UtilFunctions.getAngle(center, pts[2]);
728
                endAngle = Math.toDegrees(endAngle);
729

    
730
                 // if (!UtilFunctions.isCCW(pts[0],pts[1],pts[2])){
731
//                if (!Converter.isCCW(pts)){
732
//                         double aux=initAngle;
733
//                         initAngle=endAngle;
734
//                         endAngle=aux;
735
//                }
736
//                DxfGroup arcLayer = new DxfGroup(8, "default");
737
                DxfGroup ax = new DxfGroup();
738
                DxfGroup ay = new DxfGroup();
739
                DxfGroup ac = new DxfGroup();
740
                DxfGroup ai = new DxfGroup();
741
                DxfGroup ae = new DxfGroup();
742
                ax.setCode(10);
743
                ax.setData(new Double(center.getX()));
744
                ay.setCode(20);
745
                ay.setData(new Double(center.getY()));
746
                ac.setCode(40);
747
                ac.setData(new Double(radius));
748
                ai.setCode(50);
749
                ai.setData(new Double(initAngle));
750
                ae.setCode(51);
751
                ae.setData(new Double(endAngle));
752
                DxfGroupVector av = updateProperties(feature,k);
753
//                av.add(arcLayer);
754
                av.add(ax);
755
                av.add(ay);
756
                av.add(ac);
757
                av.add(ai);
758
                av.add(ae);
759
                entityMaker.createArc(av);
760
                k++;
761
                return k;
762
        }
763
        private int createEllipse2D(int handle, int k,Feature feature) throws Exception {
764
                Ellipse2D ellipse = (Ellipse2D)((Geometry)feature.getDefaultGeometry()).getInternalShape();
765

    
766
                Point2D center = new Point2D.Double((ellipse.getInit().getX() + ellipse
767
                                .getEnd().getX()) / 2, (ellipse.getInit().getY() + ellipse.getEnd()
768
                                .getY()) / 2);
769
                double mAxisL = ellipse.getDist() * 2;
770
                // System.out.println("mAxisL = " + mAxisL);
771
                /*
772
                 * System.out.println("mAxisL/(center.distance(fElip.getEnd()))*2 = " +
773
                 * mAxisL/(center.distance(fElip.getEnd()))*2); minToMaj.setData(new
774
                 * Double(mAxisL/()*2));
775
                 */
776
                double maAxisL = ellipse.getInit().distance(ellipse.getEnd());
777

    
778
                Point2D endPointOfMajorAxis = ellipse.getEnd();
779
                double azimut = Math.atan2(endPointOfMajorAxis.getX() - center.getX(),
780
                                endPointOfMajorAxis.getY() - center.getY());
781
                double azimut2 = azimut + Math.PI / 2.0;
782
                if (azimut2 >= Math.PI * 2)
783
                        azimut2 = azimut2 - Math.PI * 2;
784
                Point2D endPointOfMinorAxis = new Point2D.Double(center.getX()
785
                                + (ellipse.getDist() * Math.sin(azimut2)), center.getY()
786
                                + (ellipse.getDist() * Math.cos(azimut2)));
787

    
788
                if (mAxisL >= maAxisL) {
789
                        // El menor debe ser menor que el mayor. Los cambiamos.
790
                        double aux = mAxisL;
791
                        mAxisL = maAxisL;
792
                        maAxisL = aux;
793
                        // Tambi?n cambiamos los puntos finales de los ejes.
794
                        Point2D pAux = endPointOfMinorAxis;
795
                        endPointOfMinorAxis = endPointOfMajorAxis;
796
                        endPointOfMajorAxis = pAux;
797
                }
798
                double mToMAR = mAxisL / maAxisL;
799
                // System.out.println("mToMar = " + mToMAR);
800
//                DxfGroup arcLayer = new DxfGroup(8, "default");
801
                DxfGroup x = new DxfGroup();
802
                DxfGroup y = new DxfGroup();
803
                DxfGroup xc = new DxfGroup();
804
                DxfGroup yc = new DxfGroup();
805
                DxfGroup minToMaj = new DxfGroup();
806
                // DxfGroup start = new DxfGroup();
807
                // DxfGroup end = new DxfGroup();
808
                x.setCode(10);
809
                x.setData(new Double(center.getX()));
810
                y.setCode(20);
811
                y.setData(new Double(center.getY()));
812
                xc.setCode(11);
813
                xc.setData(new Double(endPointOfMajorAxis.getX() - center.getX()));
814
                yc.setCode(21);
815
                yc.setData(new Double(endPointOfMajorAxis.getY() - center.getY()));
816
                minToMaj.setCode(40);
817
                minToMaj.setData(new Double(mToMAR));
818
                DxfGroupVector av = updateProperties(feature,k);
819
//                av.add(arcLayer);
820
                av.add(x);
821
                av.add(y);
822
                av.add(xc);
823
                av.add(yc);
824
                av.add(minToMaj);
825
                entityMaker.createEllipse(av);
826
                k++;
827
                return k;
828
        }
829

    
830
        public static void create(DXFStoreParameters dxfParameters, FeatureType featureType) throws OpenException, InitializeWriterException {
831
                boolean dxf3DFile=false;
832

    
833
                DxfEntityMaker entityMaker = new DxfEntityMaker(dxfParameters.getProjection());
834
//                FieldDescription[] fieldDescriptions=getTableDefinition().getFieldsDesc();
835
//                for (int i=0;i<featureType.size();i++){
836
//                        FeatureAttributeDescriptor fad=(FeatureAttributeDescriptor)featureType.get(i);
837
//                        if (fad.getName().equals("Text")){
838
//                                indexText=i;
839
//                        }else if (fad.getName().equals("HeightText")){
840
//                                indexHeightText=i;
841
//                        }else if (fad.getName().equals("RotationText")){
842
//                                indexRotationText=i;
843
//                        }
844
//                }
845
                DxfFile dxfFile = new DxfFile(null, dxfParameters.getFile().getName(), entityMaker);
846
                dxfFile.setCadFlag(true);
847
                if (dxf3DFile)
848
                        dxfFile.setDxf3DFlag(true);
849
                try {
850
                        dxfFile.save(dxfParameters.getFile().getAbsolutePath());
851
                } catch (IOException e) {
852
                        throw new InitializeWriterException("DXF Writer",e);
853
                }
854

    
855
        }
856

    
857
        /* (non-Javadoc)
858
         * @see org.gvsig.data.datastores.vectorial.FeaturesWriter#cancelProcess()
859
         */
860
        public void cancelProcess() throws WriteException {
861
                // TODO Auto-generated method stub
862
                // Hacer algo????
863

    
864
        }
865

    
866
        /* (non-Javadoc)
867
         * @see org.gvsig.data.datastores.vectorial.FeaturesWriter#dispose()
868
         */
869
        public void dispose() throws DataException {
870
                this.entityMaker = null;
871
                this.proj = null;
872
                this.featureType = null;
873

    
874
        }
875
}