Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dataFile / src / org / gvsig / fmap / data / feature / file / dxf / DXFFeaturesWriter.java @ 22373

History | View | Annotate | Download (30.2 KB)

1
package org.gvsig.fmap.data.feature.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.cresques.cts.IProjection;
11
import org.cresques.geo.Point3D;
12
import org.cresques.io.DxfFile;
13
import org.cresques.io.DxfGroup;
14
import org.cresques.io.DxfGroupVector;
15
import org.cresques.px.dxf.DxfEntityMaker;
16
import org.gvsig.fmap.data.DataException;
17
import org.gvsig.fmap.data.OpenException;
18
import org.gvsig.fmap.data.ReadException;
19
import org.gvsig.fmap.data.WriteException;
20
import org.gvsig.fmap.data.feature.Feature;
21
import org.gvsig.fmap.data.feature.FeatureAttributeDescriptor;
22
import org.gvsig.fmap.data.feature.FeatureStore;
23
import org.gvsig.fmap.data.feature.FeatureType;
24
import org.gvsig.fmap.data.feature.FeaturesWriter;
25
import org.gvsig.fmap.data.feature.InitializeWriterException;
26
import org.gvsig.fmap.geom.Geometry;
27
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
28
import org.gvsig.fmap.geom.primitive.Arc2D;
29
import org.gvsig.fmap.geom.primitive.Circle2D;
30
import org.gvsig.fmap.geom.primitive.Curve2D;
31
import org.gvsig.fmap.geom.primitive.Curve2DZ;
32
import org.gvsig.fmap.geom.primitive.Ellipse2D;
33
import org.gvsig.fmap.geom.primitive.Point2DZ;
34
import org.gvsig.fmap.geom.primitive.Surface2D;
35
import org.gvsig.fmap.geom.primitive.Surface2DZ;
36
import org.gvsig.fmap.geom.util.Converter;
37
import org.gvsig.fmap.geom.util.UtilFunctions;
38

    
39

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

    
49
//        private DxfFieldsMapping fieldsMapping = null;
50

    
51
        private File file;
52

    
53
        private DxfFile.EntityFactory entityMaker;
54

    
55
        private IProjection proj = null;
56

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

    
59
        int k = 0;
60

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

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

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

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

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

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

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

    
169

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

    
174
        }
175

    
176

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

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

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

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

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

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

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

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

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

    
255

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

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

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

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

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

    
345

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
856
        }
857

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

    
865
        }
866

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

    
875
        }
876
        public boolean canWriteGeometry(int gvSIGgeometryType) {
877
                return true; // I guess all geometries can be here...
878
        }
879
}