Statistics
| Revision:

root / trunk / libraries / libDataSourceBaseDrivers / src / org / gvsig / data / datastores / vectorial / driver / dxf / DXFFeaturesWriter.java @ 19613

History | View | Annotate | Download (27.7 KB)

1
package org.gvsig.data.datastores.vectorial.driver.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.Vector;
8

    
9
import org.cresques.cts.IProjection;
10
import org.cresques.geo.Point3D;
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.datastores.vectorial.driver.IDriver;
16
import org.gvsig.data.datastores.vectorial.driver.IFeaturesWriter;
17
import org.gvsig.data.exception.InitializeWriterException;
18
import org.gvsig.data.exception.WriteException;
19
import org.gvsig.data.vectorial.IFeature;
20
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor;
21
import org.gvsig.data.vectorial.IFeatureType;
22

    
23
import com.iver.cit.gvsig.fmap.core.FArc2D;
24
import com.iver.cit.gvsig.fmap.core.FCircle2D;
25
import com.iver.cit.gvsig.fmap.core.FEllipse2D;
26
import com.iver.cit.gvsig.fmap.core.FGeometry;
27
import com.iver.cit.gvsig.fmap.core.FPoint2D;
28
import com.iver.cit.gvsig.fmap.core.FPoint3D;
29
import com.iver.cit.gvsig.fmap.core.FShape;
30
import com.iver.cit.gvsig.fmap.core.IGeometry;
31
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
32
import com.iver.cit.gvsig.fmap.edition.UtilFunctions;
33
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
34

    
35
public class DXFFeaturesWriter implements IFeaturesWriter {
36
        private String DEFAULT_LAYER="default";
37
        private Integer DEFAULT_COLOR=new Integer(0);
38
        private Double DEFAULT_ELEVATION=new Double(0);
39
        private Double DEFAULT_THICKNESS=new Double(0);
40
        private String DEFAULT_TEXT="";
41
        private Double DEFAULT_HEIGHTTEXT=new Double(10);
42
        private Double DEFAULT_ROTATIONTEXT=new Double(0);
43

    
44
        private DxfFieldsMapping fieldsMapping = null;
45

    
46
        private File file;
47

    
48
        private DxfFile.EntityFactory entityMaker;
49

    
50
        private IProjection proj = null;
51

    
52
        private DxfFile dxfFile;
53

    
54
        int handle = 40; // Revisar porqu? es 40.
55

    
56
        int k = 0;
57

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

    
64
        public void init(IDriver driver) {
65
                DXFDriverParameters dxfParameters=(DXFDriverParameters)driver.getParameters();
66
                file=dxfParameters.getDXFFile();
67
                proj=dxfParameters.getProjection();
68
                featureType=driver.getFeatureType();
69
                fieldsMapping = new DxfFieldsMapping();
70
                fieldsMapping.setLayerField("Layer");
71
                fieldsMapping.setColorField("Color");
72
                fieldsMapping.setElevationField("Elevation");
73
                fieldsMapping.setThicknessField("Thickness");
74
                fieldsMapping.setTextField("Text");
75
                fieldsMapping.setHeightText("HeightText");
76
                fieldsMapping.setRotationText("Layer");
77
        }
78

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

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

    
103
                entityMaker = new DxfEntityMaker(proj);
104
//                FieldDescription[] fieldDescriptions=getTableDefinition().getFieldsDesc();
105
                for (int i=0;i<featureType.size();i++){
106
                        IFeatureAttributeDescriptor fad=(IFeatureAttributeDescriptor)featureType.get(i);
107
                        if (fad.getName().equals("Text")){
108
                                indexText=i;
109
                        }else if (fad.getName().equals("HeightText")){
110
                                indexHeightText=i;
111
                        }else if (fad.getName().equals("RotationText")){
112
                                indexRotationText=i;
113
                        }
114
                }
115
        }
116

    
117
        public void insertFeature(IFeature feature) throws WriteException {
118
                try {
119
                        IGeometry geom = (IGeometry)feature.getDefaultGeometry();
120
//                    Value[] values=row.getAttributes();
121
                    // TODO: Tratamiento de los campos
122
                    // y modificar los createXXX para que acepten como par?metro
123
                    // los datos de LAYER, COLOR, ELEVATION, THICKNESS, TEXT
124
                    // HEIGHTTEXT, ROTATIONTEXT y el resto que puedan hacer
125
                    // falta.
126

    
127
                    if (geom.getGeometryType()==FShape.POINT) {
128
                    k=createPoint2D(handle, k, feature);
129
                } else if (geom.getGeometryType()==(FShape.POINT | FShape.Z)) {
130
                    dxf3DFile = true;
131
                    k=createPoint3D(handle, k, feature);
132
                } else if (geom.getGeometryType()==FShape.LINE) {
133
                    k=createLwPolyline2D(handle, k, feature, false);
134
                } else if (geom.getGeometryType()==(FShape.LINE | FShape.Z)) {
135
                    dxf3DFile = true;
136
                    k = createPolyline3D(handle, k, feature);
137
                } else if (geom.getGeometryType()==FShape.POLYGON) {
138
                    // createPolygon2D(handle, k, geom);
139
                    k=createLwPolyline2D(handle, k, feature, true);
140
                } else if (geom.getGeometryType()==(FShape.POLYGON | FShape.Z)) {
141
                    dxf3DFile = true;
142
                    k = createPolyline3D(handle, k, feature);
143
                    // k = createPolygon3D(handle, k, geom);
144
                } else if (geom.getGeometryType()==FShape.CIRCLE) {
145
//                        FCircle2D circle = (FCircle2D) geom.getInternalShape();
146
                        k=createCircle2D(handle, k, feature);
147
                } else if (geom.getGeometryType()==FShape.ARC) {
148
//                        FArc2D arc = (FArc2D) geom.getInternalShape();
149
                        k=createArc2D(handle, k, feature);
150
                } else if (geom.getGeometryType()==FShape.ELLIPSE) {
151
//                        FEllipse2D ellipse = (FEllipse2D) geom.getInternalShape();
152
                        k=createEllipse2D(handle, k, feature);
153
                 } else {
154
                    System.out.println("IGeometry not supported yet");
155
                    k++;
156
                }
157
                }
158
                catch(Exception e){
159
                        throw new WriteException("DXF Writer",e);
160
                }
161

    
162

    
163
        }
164
        public void updateFeatureType(IFeatureType featureType) {
165
                // TODO Ap?ndice de m?todo generado autom?ticamente
166

    
167
        }
168

    
169

    
170
        private int createPoint2D(int handle, int k, IFeature feature) throws Exception {
171

    
172
                if (indexText!= -1 && !(feature.get(indexText) == null)){
173
                        return createText2D(handle,k,feature);
174
                }
175
                FPoint2D point = new FPoint2D(0, 0);
176
                double[] pointCoords = new double[6];
177
                PathIterator pointIt = ((IGeometry)feature.getDefaultGeometry()).getPathIterator(null);
178
                while (!pointIt.isDone()) {
179
                        pointIt.currentSegment(pointCoords);
180
                        point = new FPoint2D(pointCoords[0], pointCoords[1]);
181
                        pointIt.next();
182
                }
183
                Point2D pto = new Point2D.Double(point.getX(), point.getY());
184

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

    
213
                if (indexText!=-1 && !(feature.get(indexText) == null)) {
214
                        text = feature.get(indexText).toString();
215
                }
216
                if (indexHeightText!=-1 && !(feature.get(indexHeightText) instanceof Number)) {
217
                        heightText = new Double(((Number) feature.get(indexHeightText))
218
                                        .doubleValue());
219
                }
220
                if (indexRotationText!=-1 && !(feature.get(indexRotationText) instanceof Number)) {
221
                        rotationText = new Double(((Number) feature.get(indexRotationText))
222
                                        .doubleValue());
223
                }
224
                DxfGroup handleText = new DxfGroup();
225
                handleText.setCode(1);
226
                handleText.setData(text);
227

    
228
                DxfGroup handleHeightText = new DxfGroup();
229
                handleHeightText.setCode(40);
230
                handleHeightText.setData(heightText);
231

    
232
                DxfGroup handleRotationText = new DxfGroup();
233
                handleRotationText.setCode(50);
234
                handleRotationText.setData(rotationText);
235

    
236
//                DxfGroup handleColor = new DxfGroup();
237
//                handleColor.setCode(62);
238
//                handleColor.setData(color);
239

    
240
//                DxfGroup handleElevation = new DxfGroup();
241
//                handleElevation.setCode(38);
242
//                handleElevation.setData(elevation);
243

    
244
//                DxfGroup handleThickness = new DxfGroup();
245
//                handleThickness.setCode(39);
246
//                handleThickness.setData(thickness);
247

    
248

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

    
319
                DxfGroup handleGroup = new DxfGroup();
320
                handleGroup.setCode(5);
321
                handleGroup.setData(new Integer(handle + k).toString());
322

    
323
                DxfGroup handleColor = new DxfGroup();
324
                handleColor.setCode(62);
325
                handleColor.setData(color);
326

    
327
//                DxfGroup handleElevation = new DxfGroup();
328
//                handleElevation.setCode(38);
329
//                handleElevation.setData(elevation);
330

    
331
                DxfGroup handleThickness = new DxfGroup();
332
                handleThickness.setCode(39);
333
                handleThickness.setData(thickness);
334

    
335

    
336
                polv.add(geometryLayer);
337
//                polv.add(handleElevation);
338
                polv.add(handleGroup);
339
                polv.add(handleColor);
340
                return polv;
341
        }
342
        private int createPoint3D(int handle, int k, IFeature feature) throws Exception {
343
                if (indexText!=-1 && !(feature.get(indexText) == null)){
344
                        return createText3D(handle,k,feature);
345
                }
346
                FPoint3D point = new FPoint3D(0, 0, 0);
347
                double[] pointCoords = new double[6];
348
                PathIterator pointIt = ((IGeometry)feature.getDefaultGeometry()).getPathIterator(null);
349
                while (!pointIt.isDone()) {
350
                        pointIt.currentSegment(pointCoords);
351
                        point = new FPoint3D(pointCoords[0], pointCoords[1], pointCoords[2]);
352
                        pointIt.next();
353
                }
354
                Point3D pto = new Point3D(point.getX(), point.getY(), point.getZs()[0]);
355
//                DxfGroup pointLayer = new DxfGroup(8, "default");
356
//                DxfGroup handleGroup = new DxfGroup();
357
//                handleGroup.setCode(5);
358
//                handleGroup.setData(new Integer(handle + k).toString());
359
                DxfGroup px = new DxfGroup();
360
                DxfGroup py = new DxfGroup();
361
                DxfGroup pz = new DxfGroup();
362
                px.setCode(10);
363
                px.setData(new Double(pto.getX()));
364
                py.setCode(20);
365
                py.setData(new Double(pto.getY()));
366
                pz.setCode(30);
367
                pz.setData(new Double(pto.getZ()));
368
                double[] velev = ((FGeometry) feature.getDefaultGeometry()).getZs();
369
                Double elevation= DEFAULT_ELEVATION;
370
                elevation = new Double(velev[0]);
371
                DxfGroup handleElevation = new DxfGroup();
372
                handleElevation.setCode(38);
373
                handleElevation.setData(elevation);
374

    
375
                DxfGroupVector pv = updateProperties(feature,k);
376
                pv.add(handleElevation);
377
//                pv.add(pointLayer);
378
//                pv.add(handleGroup);
379
                pv.add(px);
380
                pv.add(py);
381
                pv.add(pz);
382
                entityMaker.createPoint(pv);
383
                k++;
384
                return k;
385
        }
386
        private int createText3D(int handle, int k, IFeature feature)        throws Exception {
387
                Double elevation = DEFAULT_ELEVATION;
388
                String text = DEFAULT_TEXT;
389
                Double heightText = DEFAULT_HEIGHTTEXT;
390
                Double rotationText = DEFAULT_ROTATIONTEXT;
391

    
392
                double[] velev = ((FGeometry) feature.getDefaultGeometry()).getZs();
393
                elevation = new Double(velev[0]);
394

    
395
                if (indexText!=-1 && !(feature.get(indexText) == null)) {
396
                        text = feature.get(indexText).toString();
397
                }
398
                if (indexHeightText!=-1 && feature.get(indexHeightText) instanceof Number) {
399
                        heightText = new Double(((Number) feature.get(indexHeightText)).doubleValue());
400
                }
401
                if (indexRotationText!=-1 && feature.get(indexRotationText) instanceof Number) {
402
                        rotationText = new Double(((Number) feature.get(indexRotationText)).doubleValue());
403
                }
404

    
405
                DxfGroup handleText = new DxfGroup();
406
                handleText.setCode(1);
407
                handleText.setData(text);
408

    
409
                DxfGroup handleHeightText = new DxfGroup();
410
                handleHeightText.setCode(40);
411
                handleHeightText.setData(heightText);
412

    
413
                DxfGroup handleRotationText = new DxfGroup();
414
                handleRotationText.setCode(50);
415
                handleRotationText.setData(rotationText);
416

    
417
//                DxfGroup handleColor = new DxfGroup();
418
//                handleColor.setCode(62);
419
//                handleColor.setData(color);
420

    
421
                DxfGroup handleElevation = new DxfGroup();
422
                handleElevation.setCode(38);
423
                handleElevation.setData(elevation);
424

    
425
//                DxfGroup handleThickness = new DxfGroup();
426
//                handleThickness.setCode(39);
427
//                handleThickness.setData(thickness);
428

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

    
473
                DxfGroup polylineFlag = new DxfGroup();
474
                polylineFlag.setCode(70);
475
                if (isPolygon)
476
                        polylineFlag.setData(new Integer(1)); // cerrada
477
                else
478
                        polylineFlag.setData(new Integer(0)); // abierta
479

    
480
                PathIterator theIterator = ((IGeometry)feature.getDefaultGeometry()).getPathIterator(null, FConverter.FLATNESS); // polyLine.getPathIterator(null,
481
                // flatness);
482

    
483
                double[] theData = new double[6];
484
                while (!theIterator.isDone()) {
485
                        int theType = theIterator.currentSegment(theData);
486
                        switch (theType) {
487
                        case PathIterator.SEG_MOVETO:
488
                                if (!first)
489
                                {
490
                                        for (int j = 0; j < vpoints.size(); j++) {
491
                                                DxfGroup xvertex = new DxfGroup();
492
                                                xvertex.setCode(10);
493
                                                xvertex.setData(new Double(((FPoint2D) vpoints.get(j)).getX()));
494
                                                DxfGroup yvertex = new DxfGroup();
495
                                                yvertex.setCode(20);
496
                                                yvertex.setData(new Double(((FPoint2D) vpoints.get(j)).getY()));
497
                                                polv.add(xvertex);
498
                                                polv.add(yvertex);
499
                                        }
500

    
501
                                        entityMaker.createLwPolyline(polv);
502
                                        k++;
503
                                        polv = updateProperties(feature,k);
504

    
505
                                }
506
                                first=false;
507
                                polv.add(polylineFlag);
508
                                vpoints.clear();
509
                                vpoints.add(new FPoint2D(theData[0], theData[1]));
510
                                break;
511
                        case PathIterator.SEG_LINETO:
512
                                vpoints.add(new FPoint2D(theData[0], theData[1]));
513
                                break;
514
                        case PathIterator.SEG_QUADTO:
515
//                                vpoints.add(new FPoint2D(theData[0], theData[1]));
516
//                                vpoints.add(new FPoint2D(theData[2], theData[3]));
517
                                break;
518
                        case PathIterator.SEG_CUBICTO:
519
//                                vpoints.add(new FPoint2D(theData[0], theData[1]));
520
//                                vpoints.add(new FPoint2D(theData[2], theData[3]));
521
//                                vpoints.add(new FPoint2D(theData[4], theData[5]));
522
                                break;
523
                        case PathIterator.SEG_CLOSE:
524
                                polylineFlag.setData(new Integer(1)); // cerrada
525
                                break;
526

    
527
                        }
528
                        theIterator.next();
529
                }
530

    
531
                for (int j = 0; j < vpoints.size(); j++) {
532
                        DxfGroup xvertex = new DxfGroup();
533
                        xvertex.setCode(10);
534
                        xvertex.setData(new Double(((FPoint2D) vpoints.get(j)).getX()));
535
                        DxfGroup yvertex = new DxfGroup();
536
                        yvertex.setCode(20);
537
                        yvertex.setData(new Double(((FPoint2D) vpoints.get(j)).getY()));
538
                        polv.add(xvertex);
539
                        polv.add(yvertex);
540
                }
541

    
542
                entityMaker.createLwPolyline(polv);
543
                k++;
544
                return k;
545
        }
546

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

    
658
        private boolean constantElevation(double[] velev) {
659
                boolean constant = true;
660
                for (int i = 0; i < velev.length; i++) {
661
                        for (int j = 0; j < velev.length; j++) {
662
                                if (j > i) {
663
                                        if (velev[i] != velev[j]) {
664
                                                constant = false;
665
                                                break;
666
                                        }
667
                                }
668
                        }
669
                        break;
670
                }
671
                return constant;
672
        }
673
        private int createCircle2D(int handle, int k, IFeature feature) throws Exception {
674
                DxfGroupVector polv = updateProperties(feature,k);
675
                DxfGroup circleFlag = new DxfGroup();
676
                circleFlag.setCode(100);
677
                polv.add(circleFlag);
678

    
679
                DxfGroup xvertex = new DxfGroup();
680
                xvertex.setCode(10);
681
                FCircle2D circle = (FCircle2D) ((IGeometry)feature.getDefaultGeometry()).getInternalShape();
682
                xvertex.setData(new Double(circle.getCenter().getX()));
683
                DxfGroup yvertex = new DxfGroup();
684
                yvertex.setCode(20);
685
                yvertex.setData(new Double(circle.getCenter().getY()));
686
                DxfGroup zvertex = new DxfGroup();
687
                zvertex.setCode(30);
688
                zvertex.setData(new Double(0)); // TODO: COORDENADA Z. REVISAR ESTO PARA
689
                // ENTIDADES 3D
690

    
691
                DxfGroup radius = new DxfGroup();
692
                radius.setCode(40);
693
                radius.setData(new Double(circle.getRadio()));
694

    
695
                polv.add(xvertex);
696
                polv.add(yvertex);
697
                polv.add(zvertex);
698
                polv.add(radius);
699

    
700
                entityMaker.createCircle(polv);
701
                k++;
702
                return k;
703
        }
704
        private int createArc2D(int handle, int k,IFeature feature) throws Exception {
705
                FArc2D arc = (FArc2D) ((IGeometry)feature.getDefaultGeometry()).getInternalShape();
706
                Point2D[] pts = new Point2D[3];
707
                pts[0] = arc.getInit();
708
                pts[1] = arc.getMid();
709
                pts[2] = arc.getEnd();
710
                Point2D center = arc.getCenter();
711
                double radius = center.distance(pts[0]);
712
                double initAngle = UtilFunctions.getAngle(center, pts[0]);
713
                initAngle = Math.toDegrees(initAngle);
714
                // System.out.println("initAngle = " + initAngle);
715
                double midAngle = UtilFunctions.getAngle(center, pts[1]);
716
                midAngle = Math.toDegrees(midAngle);
717
                // System.out.println("midAngle = " + midAngle);
718
                double endAngle = UtilFunctions.getAngle(center, pts[2]);
719
                endAngle = Math.toDegrees(endAngle);
720

    
721
                 // if (!UtilFunctions.isCCW(pts[0],pts[1],pts[2])){
722
                if (!FConverter.isCCW(pts)){
723
                         double aux=initAngle;
724
                         initAngle=endAngle;
725
                         endAngle=aux;
726
                }
727
//                DxfGroup arcLayer = new DxfGroup(8, "default");
728
                DxfGroup ax = new DxfGroup();
729
                DxfGroup ay = new DxfGroup();
730
                DxfGroup ac = new DxfGroup();
731
                DxfGroup ai = new DxfGroup();
732
                DxfGroup ae = new DxfGroup();
733
                ax.setCode(10);
734
                ax.setData(new Double(center.getX()));
735
                ay.setCode(20);
736
                ay.setData(new Double(center.getY()));
737
                ac.setCode(40);
738
                ac.setData(new Double(radius));
739
                ai.setCode(50);
740
                ai.setData(new Double(initAngle));
741
                ae.setCode(51);
742
                ae.setData(new Double(endAngle));
743
                DxfGroupVector av = updateProperties(feature,k);
744
//                av.add(arcLayer);
745
                av.add(ax);
746
                av.add(ay);
747
                av.add(ac);
748
                av.add(ai);
749
                av.add(ae);
750
                entityMaker.createArc(av);
751
                k++;
752
                return k;
753
        }
754
        private int createEllipse2D(int handle, int k,IFeature feature) throws Exception {
755
                FEllipse2D ellipse = (FEllipse2D)((IGeometry)feature.getDefaultGeometry()).getInternalShape();
756

    
757
                Point2D center = new Point2D.Double((ellipse.getInit().getX() + ellipse
758
                                .getEnd().getX()) / 2, (ellipse.getInit().getY() + ellipse.getEnd()
759
                                .getY()) / 2);
760
                double mAxisL = ellipse.getDist() * 2;
761
                // System.out.println("mAxisL = " + mAxisL);
762
                /*
763
                 * System.out.println("mAxisL/(center.distance(fElip.getEnd()))*2 = " +
764
                 * mAxisL/(center.distance(fElip.getEnd()))*2); minToMaj.setData(new
765
                 * Double(mAxisL/()*2));
766
                 */
767
                double maAxisL = ellipse.getInit().distance(ellipse.getEnd());
768

    
769
                Point2D endPointOfMajorAxis = ellipse.getEnd();
770
                double azimut = Math.atan2(endPointOfMajorAxis.getX() - center.getX(),
771
                                endPointOfMajorAxis.getY() - center.getY());
772
                double azimut2 = azimut + Math.PI / 2.0;
773
                if (azimut2 >= Math.PI * 2)
774
                        azimut2 = azimut2 - Math.PI * 2;
775
                Point2D endPointOfMinorAxis = new Point2D.Double(center.getX()
776
                                + (ellipse.getDist() * Math.sin(azimut2)), center.getY()
777
                                + (ellipse.getDist() * Math.cos(azimut2)));
778

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