Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libCq CMS for java.old / src / org / cresques / px / dxf / DxfFeatureMaker.java @ 3151

History | View | Annotate | Download (123 KB)

1
/*
2
 * Cresques Mapping Suite. Graphic Library for constructing mapping applications.
3
 *
4
 * Copyright (C) 2004-5.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 *
20
 * For more information, contact:
21
 *
22
 * cresques@gmail.com
23
 */
24
package org.cresques.px.dxf;
25

    
26
import org.cresques.cts.ICoordTrans;
27
import org.cresques.cts.IProjection;
28

    
29
import org.cresques.geo.Point3D;
30
import org.cresques.geo.Projected;
31
import org.cresques.geo.ViewPortData;
32

    
33
import org.cresques.io.DxfFile;
34
import org.cresques.io.DxfGroup;
35
import org.cresques.io.DxfGroupVector;
36

    
37
import org.cresques.px.Extent;
38
import org.cresques.px.IObjList;
39
import org.cresques.px.gml.Feature;
40
import org.cresques.px.gml.FeatureCollection;
41
import org.cresques.px.gml.InsPoint3D;
42
import org.cresques.px.gml.LineString;
43
import org.cresques.px.gml.LineString3D;
44
import org.cresques.px.gml.Polygon;
45
import org.cresques.px.gml.Polygon3D;
46

    
47
import java.awt.Graphics2D;
48
import java.awt.geom.Point2D;
49

    
50
import java.util.Iterator;
51
import java.util.Vector;
52

    
53

    
54
/**
55
 * La clase DxfFeatureMaker facilita la creaci?n de entidades en un modelo de datos
56
 * GIS. La creaci?n se realiza partiendo de las entidades obtenidas de un fichero DXF.
57
 * @author jmorell
58
 */
59
public class DxfFeatureMaker implements DxfFile.EntityFactory, Projected {
60
    IProjection proj = null;
61

    
62
    //Feature lastFeature = null;
63
    Feature lastFeaBordes = null;
64
    Feature lastFeaFondos = null;
65
    boolean isDoubleFeatured = false;
66
    FeatureCollection features = null;
67
    double bulge = 0.0;
68
    double xtruX = 0.0;
69
    double xtruY = 0.0;
70
    double xtruZ = 1.0;
71
    int polylineFlag = 0;
72
    Point3D firstPt = new Point3D();
73
    Point3D ptAnterior = null;
74
    boolean addingToBlock = false;
75
    int iterator = 0;
76
    FeatureCollection blk = null;
77
    Vector blkList = null;
78
    DxfTable layers = null;
79
    private Vector faces = null;
80
    private boolean hasFaces = false;
81
    private int facesIterador = 1;
82
    private Point2D facesFirstPoint = null;
83
    private Vector attributes = null;
84
    private boolean constantPolylineElevation;
85
    private double lastVertexElevation;
86
    private boolean dxf3DFile;
87
    
88
    /**
89
     * Constructor de DxfFeatureMaker.
90
     * @param proj, proyecci?n cartogr?fica en la que se encontrar?n las entidades
91
     * que creemos.
92
     */
93
    public DxfFeatureMaker(IProjection proj) {
94
        this.proj = proj;
95
        layers = new DxfTable();
96
        features = new FeatureCollection(proj);
97
        blkList = new Vector();
98
        attributes = new Vector();
99
        dxf3DFile = false;
100
    }
101

    
102
    /* (non-Javadoc)
103
     * @see org.cresques.io.DxfFile.EntityFactory#setAddingToBlock(boolean)
104
     */
105
    public void setAddingToBlock(boolean a) {
106
        addingToBlock = a;
107
    }
108

    
109
    /* (non-Javadoc)
110
     * @see org.cresques.io.DxfFile.EntityFactory#createLayer(org.cresques.io.DxfGroupVector)
111
     */
112
    public void createLayer(DxfGroupVector v) throws Exception {
113
        int color = v.getDataAsInt(62);
114
        DxfLayer layer = new DxfLayer(v.getDataAsString(2),
115
                                      Math.abs(v.getDataAsInt(62)));
116

    
117
        if (color < 0) {
118
            layer.isOff = true;
119
        }
120

    
121
        layer.lType = v.getDataAsString(6);
122
        layer.setFlags(v.getDataAsInt(70));
123

    
124
        // compruebo flags
125
        if ((layer.flags & 0x01) == 0x01) {
126
            layer.frozen = true;
127
        }
128

    
129
        if ((layer.flags & 0x02) == 0x02) {
130
            layer.frozen = true;
131
        }
132

    
133
        System.out.println("LAYER color=" + layer.getColor());
134

    
135
        layers.add(layer);
136
    }
137

    
138
    /* (non-Javadoc)
139
     * @see org.cresques.io.DxfFile.EntityFactory#createPolyline(org.cresques.io.DxfGroupVector)
140
     */
141
    public void createPolyline(DxfGroupVector grp) throws Exception {
142
        LineString3D lineString3D = new LineString3D();
143
        Polygon3D polygon3D = new Polygon3D();
144

    
145
        //Feature feature= new Feature();
146
        Feature feaBordes = new Feature();
147
        Feature feaFondos = new Feature();
148
        double x = 0.0;
149
        double y = 0.0;
150
        double z = 0.0;
151
        int flags = 0;
152
        constantPolylineElevation = true;
153

    
154
        // 041122: Cada polyline tiene asociado un objeto faces distinto.
155
        faces = new Vector();
156

    
157
        //feature.setProp("dxfEntity", "Polyline");
158
        feaBordes.setProp("dxfEntity", "Polyline");
159
        feaFondos.setProp("dxfEntity", "Polyline");
160

    
161
        if (grp.hasCode(8)) {
162
            //feature.setProp("layer", grp.getDataAsString(8));         
163
            feaBordes.setProp("layer", grp.getDataAsString(8));
164
            feaFondos.setProp("layer", grp.getDataAsString(8));
165
        }
166

    
167
        if (grp.hasCode(39)) {
168
            Double doub = new Double(grp.getDataAsDouble(39));
169
            String string = doub.toString();
170

    
171
            //feature.setProp("thickness", string);
172
            feaBordes.setProp("thickness", string);
173
            feaFondos.setProp("thickness", string);
174
        } else {
175
            Double doub = new Double(0.0);
176

    
177
            //feature.setProp("thickness", doub.toString());
178
            feaBordes.setProp("thickness", doub.toString());
179
            feaFondos.setProp("thickness", doub.toString());
180
        }
181

    
182
        if (grp.hasCode(62)) {
183
            Integer integer = new Integer(grp.getDataAsInt(62));
184
            String string = integer.toString();
185

    
186
            //feature.setProp("color", string);
187
            feaBordes.setProp("color", string);
188
            feaFondos.setProp("color", string);
189
            feaBordes.setProp("colorByLayer", "false");
190
            feaFondos.setProp("colorByLayer", "false");
191
        } else {
192
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
193
            int clr = layer.colorNumber;
194
            Integer integer = new Integer(clr);
195
            String string = integer.toString();
196

    
197
            //feature.setProp("color", string);
198
            feaBordes.setProp("color", string);
199
            feaFondos.setProp("color", string);
200
            feaBordes.setProp("colorByLayer", "true");
201
            feaFondos.setProp("colorByLayer", "true");
202
        }
203

    
204
        if (grp.hasCode(10)) {
205
            x = grp.getDataAsDouble(10);
206
        }
207

    
208
        if (grp.hasCode(20)) {
209
            y = grp.getDataAsDouble(20);
210
        }
211

    
212
        if (grp.hasCode(30)) {
213
            z = grp.getDataAsDouble(30);
214

    
215
            if (z != 0.0) {
216
                dxf3DFile = true;
217
            }
218

    
219
            Double doub = new Double(z);
220
            String string = doub.toString();
221

    
222
            //feature.setProp("elevation", string);
223
            feaBordes.setProp("elevation", string);
224
            feaFondos.setProp("elevation", string);
225
        } else {
226
            Double doub = new Double(0.0);
227

    
228
            //feature.setProp("elevation", doub.toString());
229
            feaBordes.setProp("elevation", doub.toString());
230
            feaFondos.setProp("elevation", doub.toString());
231
        }
232

    
233
        if (grp.hasCode(70)) {
234
            flags = grp.getDataAsInt(70);
235
        }
236

    
237
        if (grp.hasCode(210)) {
238
            xtruX = grp.getDataAsDouble(210);
239
        }
240

    
241
        if (grp.hasCode(220)) {
242
            xtruY = grp.getDataAsDouble(220);
243
        }
244

    
245
        if (grp.hasCode(230)) {
246
            xtruZ = grp.getDataAsDouble(230);
247
        }
248

    
249
        if (((flags & 0x01) == 0x01) || ((flags & 0x40) == 0x40)) {
250
            feaBordes.setGeometry(lineString3D);
251
            feaFondos.setGeometry(polygon3D);
252
            lastFeaBordes = feaBordes;
253
            lastFeaFondos = feaFondos;
254
            isDoubleFeatured = true;
255
        } else if ((flags & 0x01) == 0x00) {
256
            feaBordes.setGeometry(lineString3D);
257
            lastFeaBordes = feaBordes;
258
            isDoubleFeatured = false;
259
        } else {
260
            System.out.println("Detectada una Polyline Flag que no corresponde");
261
            System.out.println("a una Polyline corriente, ni a una Closed Polyline");
262
        }
263
    }
264

    
265
    /* (non-Javadoc)
266
     * @see org.cresques.io.DxfFile.EntityFactory#endSeq(org.cresques.io.DxfGroupVector)
267
     */
268
    public void endSeq() throws Exception {
269
        if (isDoubleFeatured) {
270
            if (lastFeaBordes.getGeometry() instanceof LineString3D) {
271
                Feature feaBordes = lastFeaBordes;
272
                Feature feaFondos = lastFeaFondos;
273
                LineString3D lineString3D = (LineString3D) feaBordes.getGeometry();
274
                Polygon3D polygon3D = (Polygon3D) feaFondos.getGeometry();
275
                lineString3D.add(firstPt);
276

    
277
                if ((bulge != 0) &&
278
                        !((lineString3D.get(lineString3D.pointNr() - 2).getX() == lineString3D.get(lineString3D.pointNr() -
279
                                                                                                       1)
280
                                                                                                  .getX()) &&
281
                        (lineString3D.get(lineString3D.pointNr() - 2).getY() == lineString3D.get(lineString3D.pointNr() -
282
                                                                                                     1)
283
                                                                                                .getY()))) {
284
                    // 041122: Correcci?n del bug en los bulges de FIXT3.DXF
285
                    Vector arc = createArc(new Point2D.Double(lineString3D.get(lineString3D.pointNr() -
286
                                                                               2)
287
                                                                          .getX(),
288
                                                              lineString3D.get(lineString3D.pointNr() -
289
                                                                               2)
290
                                                                          .getY()),
291
                                           new Point2D.Double(lineString3D.get(lineString3D.pointNr() -
292
                                                                               1)
293
                                                                          .getX(),
294
                                                              lineString3D.get(lineString3D.pointNr() -
295
                                                                               1)
296
                                                                          .getY()),
297
                                           bulge);
298
                    lineString3D.remove(lineString3D.pointNr() - 1);
299
                    lineString3D.remove(lineString3D.pointNr() - 1);
300
                    polygon3D.remove(lineString3D.pointNr() - 1);
301
                    polygon3D.remove(lineString3D.pointNr() - 1);
302

    
303
                    if (bulge > 0) {
304
                        for (int i = 0; i < arc.size(); i++) {
305
                            Point2D ptAux = new Point2D.Double();
306
                            double z = ((Point3D) lineString3D.get(lineString3D.pointNr() -
307
                                                                   2)).getZ();
308
                            ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
309
                                                     ((Point2D) arc.get(i)).getY());
310

    
311
                            Point3D ptAux3D = new Point3D(ptAux.getX(),
312
                                                          ptAux.getY(), z);
313
                            lineString3D.add(ptAux3D);
314
                            polygon3D.add(ptAux3D);
315

    
316
                            if (lineString3D.pointNr() == 1) {
317
                                firstPt = ptAux3D;
318
                            }
319
                        }
320
                    } else {
321
                        for (int i = arc.size() - 1; i >= 0; i--) {
322
                            Point2D ptAux = new Point2D.Double();
323
                            double z = ((Point3D) lineString3D.get(lineString3D.pointNr() -
324
                                                                   2)).getZ();
325
                            ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
326
                                                     ((Point2D) arc.get(i)).getY());
327

    
328
                            Point3D ptAux3D = new Point3D(ptAux.getX(),
329
                                                          ptAux.getY(), z);
330
                            lineString3D.add(ptAux3D);
331
                            polygon3D.add(ptAux3D);
332

    
333
                            if ((lineString3D.pointNr() == 1) ||
334
                                    (polygon3D.pointNr() == 1)) {
335
                                firstPt = ptAux3D;
336
                            }
337
                        }
338
                    }
339

    
340
                    // 041122
341
                    bulge = 0.0;
342
                }
343

    
344
                if (hasFaces) {
345
                    //System.out.println("Sabe que es un poligono.");
346
                    //System.out.println("POLYLINE: caras=" +faces.size()+", puntos="+ lineString.pointNr());
347
                    LineString ls1 = new LineString();
348
                    Polygon pl1 = new Polygon();
349
                    LineString ls2 = new LineString();
350
                    Polygon pl2 = new Polygon();
351
                    LineString ls = new LineString();
352
                    Polygon pl = new Polygon();
353
                    int[] face;
354
                    int i0;
355
                    int i1;
356
                    Iterator iter = faces.iterator();
357

    
358
                    while (iter.hasNext()) {
359
                        face = (int[]) iter.next();
360
                        i0 = face[3];
361

    
362
                        for (int i = 0; i < 4; i++) {
363
                            i1 = face[i];
364

    
365
                            if (i0 > 0) {
366
                                if ((facesIterador % 2) != 0) {
367
                                    ls1.add((Point2D) lineString3D.get(i0 - 1));
368
                                    pl1.add((Point2D) polygon3D.get(i0 - 1));
369
                                } else {
370
                                    ls2.add((Point2D) lineString3D.get(i0 - 1));
371
                                    pl2.add((Point2D) polygon3D.get(i0 - 1));
372
                                }
373

    
374
                                facesIterador = facesIterador + 1;
375
                            }
376

    
377
                            i0 = i1;
378
                        }
379
                    }
380

    
381
                    facesFirstPoint = new Point2D.Double(ls1.get(0).getX(),
382
                                                         ls1.get(0).getY());
383

    
384
                    for (int i = 0; i < ls1.pointNr(); i++) {
385
                        ls.add(ls1.get(i));
386
                        pl.add(pl1.get(i));
387
                    }
388

    
389
                    for (int i = ls2.pointNr() - 1; i > 0; i--) {
390
                        ls.add(ls2.get(i));
391
                        pl.add(pl2.get(i));
392
                    }
393

    
394
                    ls.add(facesFirstPoint);
395
                    pl.add(facesFirstPoint);
396
                    lastFeaBordes.setGeometry(ls);
397
                    lastFeaFondos.setGeometry(pl);
398
                } else {
399
                    lastFeaBordes.setGeometry(lineString3D);
400
                    lastFeaFondos.setGeometry(polygon3D);
401
                }
402

    
403
                // 041130: Rellena las props con los atributos.
404
                completeAttributes(lastFeaBordes);
405
                completeAttributes(lastFeaFondos);
406

    
407
                setPolylineElevation(lastFeaBordes, lastFeaFondos);
408

    
409
                if (addingToBlock == false) {
410
                    //features.add(lastFeaBordes);
411
                    features.add(lastFeaFondos);
412
                } else {
413
                    //blk.add(lastFeaBordes);
414
                    blk.add(lastFeaFondos);
415
                }
416

    
417
                lastFeaBordes = null;
418
                lastFeaFondos = null;
419
            } else if (lastFeaBordes.getGeometry() instanceof InsPoint3D) {
420
                // Se trata de un SEQEND despues de un ATTRIB
421
                copyAttributes(lastFeaBordes);
422

    
423
                gestionaInsert(lastFeaBordes);
424

    
425
                if (addingToBlock == false) {
426
                    features.add(lastFeaFondos);
427
                } else {
428
                    blk.add(lastFeaBordes);
429
                }
430

    
431
                lastFeaBordes = null;
432
                lastFeaFondos = null;
433
            } else {
434
                // Caso no contemplado.
435
            }
436
        } else {
437
            if (lastFeaBordes.getGeometry() instanceof LineString3D) {
438
                Feature feaBordes = lastFeaBordes;
439
                LineString3D lineString3D = (LineString3D) feaBordes.getGeometry();
440

    
441
                if ((bulge != 0) &&
442
                        !((lineString3D.get(lineString3D.pointNr() - 2).getX() == lineString3D.get(lineString3D.pointNr() -
443
                                                                                                       1)
444
                                                                                                  .getX()) &&
445
                        (lineString3D.get(lineString3D.pointNr() - 2).getY() == lineString3D.get(lineString3D.pointNr() -
446
                                                                                                     1)
447
                                                                                                .getY()))) {
448
                    // 041122: Correcci?n del bug en los bulges de FIXT3.DXF
449
                    Vector arc = createArc(new Point2D.Double(lineString3D.get(lineString3D.pointNr() -
450
                                                                               2)
451
                                                                          .getX(),
452
                                                              lineString3D.get(lineString3D.pointNr() -
453
                                                                               2)
454
                                                                          .getY()),
455
                                           new Point2D.Double(lineString3D.get(lineString3D.pointNr() -
456
                                                                               1)
457
                                                                          .getX(),
458
                                                              lineString3D.get(lineString3D.pointNr() -
459
                                                                               1)
460
                                                                          .getY()),
461
                                           bulge);
462
                    lineString3D.remove(lineString3D.pointNr() - 1);
463
                    lineString3D.remove(lineString3D.pointNr() - 1);
464

    
465
                    if (bulge > 0) {
466
                        for (int i = 0; i < arc.size(); i++) {
467
                            Point2D ptAux = new Point2D.Double();
468
                            double z = ((Point3D) lineString3D.get(lineString3D.pointNr() -
469
                                                                   2)).getZ();
470
                            ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
471
                                                     ((Point2D) arc.get(i)).getY());
472

    
473
                            Point3D ptAux3D = new Point3D(ptAux.getX(),
474
                                                          ptAux.getY(), z);
475
                            lineString3D.add(ptAux3D);
476

    
477
                            if (lineString3D.pointNr() == 1) {
478
                                firstPt = ptAux3D;
479
                            }
480
                        }
481
                    } else {
482
                        for (int i = arc.size() - 1; i >= 0; i--) {
483
                            Point2D ptAux = new Point2D.Double();
484
                            double z = ((Point3D) lineString3D.get(lineString3D.pointNr() -
485
                                                                   2)).getZ();
486
                            ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
487
                                                     ((Point2D) arc.get(i)).getY());
488

    
489
                            Point3D ptAux3D = new Point3D(ptAux.getX(),
490
                                                          ptAux.getY(), z);
491
                            lineString3D.add(ptAux3D);
492

    
493
                            if (lineString3D.pointNr() == 1) {
494
                                firstPt = ptAux3D;
495
                            }
496
                        }
497
                    }
498

    
499
                    // 041122
500
                    bulge = 0.0;
501
                }
502

    
503
                if (hasFaces) {
504
                    //System.out.println("POLYLINE: caras=" +faces.size()+", puntos="+ lineString.pointNr());
505
                    LineString ls1 = new LineString();
506
                    LineString ls2 = new LineString();
507
                    LineString ls = new LineString();
508
                    int[] face;
509
                    int i0;
510
                    int i1;
511
                    Iterator iter = faces.iterator();
512

    
513
                    while (iter.hasNext()) {
514
                        face = (int[]) iter.next();
515
                        i0 = face[3];
516

    
517
                        for (int i = 0; i < 4; i++) {
518
                            i1 = face[i];
519

    
520
                            if (i0 > 0) {
521
                                if ((facesIterador % 2) != 0) {
522
                                    ls1.add((Point2D) lineString3D.get(i0 - 1));
523

    
524
                                    //ls.add((Point2D)lineString.get(Math.abs(i1)-1));
525
                                } else {
526
                                    ls2.add((Point2D) lineString3D.get(i0 - 1));
527

    
528
                                    //ls.add((Point2D)lineString.get(Math.abs(i1)-1));
529
                                }
530

    
531
                                facesIterador = facesIterador + 1;
532
                            }
533

    
534
                            i0 = i1;
535
                        }
536
                    }
537

    
538
                    facesFirstPoint = new Point2D.Double(ls1.get(0).getX(),
539
                                                         ls1.get(0).getY());
540

    
541
                    for (int i = 0; i < ls1.pointNr(); i++) {
542
                        ls.add(ls1.get(i));
543
                    }
544

    
545
                    for (int i = ls2.pointNr() - 1; i > 0; i--) {
546
                        ls.add(ls2.get(i));
547
                    }
548

    
549
                    ls.add(facesFirstPoint);
550
                    lastFeaBordes.setGeometry(ls);
551
                } else {
552
                    lastFeaBordes.setGeometry(lineString3D);
553
                }
554

    
555
                // 041130: Rellena las props con los atributos.
556
                completeAttributes(lastFeaBordes);
557

    
558
                setPolylineElevation(lastFeaBordes);
559

    
560
                if (addingToBlock == false) {
561
                    features.add(lastFeaBordes);
562
                } else {
563
                    blk.add(lastFeaBordes);
564
                }
565

    
566
                lastFeaBordes = null;
567
            } else {
568
                // Se trata de un SEQEND despues de un ATTRIB
569
            }
570
        }
571

    
572
        xtruX = 0.0;
573
        xtruY = 0.0;
574
        xtruZ = 1.0;
575
        bulge = 0.0;
576
        isDoubleFeatured = false;
577
        hasFaces = false;
578
        facesIterador = 1;
579
    }
580
    
581
    /**
582
     * Establece un valor constante para la elevaci?n de una polil?nea.
583
     * @param feaBordes, la polil?nea.
584
     */
585
    private void setPolylineElevation(Feature feaBordes) {
586
        if (constantPolylineElevation) {
587
            Double doub = new Double(lastVertexElevation);
588
            String string = doub.toString();
589
            feaBordes.setProp("elevation", string);
590
        } else {
591
            Double doub = new Double(0.0);
592
            String string = doub.toString();
593
            feaBordes.setProp("elevation", string);
594
        }
595
    }
596
    
597
    /**
598
     * Establece un valor constante para la elevaci?n de un pol?gono.
599
     * @param feaBordes, borde del pol?gono.
600
     * @param feaFondos, fondo del pol?gono.
601
     */
602
    private void setPolylineElevation(Feature feaBordes, Feature feaFondos) {
603
        if (constantPolylineElevation) {
604
            Double doub = new Double(lastVertexElevation);
605
            String string = doub.toString();
606
            feaBordes.setProp("elevation", string);
607
            feaFondos.setProp("elevation", string);
608
        } else {
609
            Double doub = new Double(0.0);
610
            String string = doub.toString();
611
            feaBordes.setProp("elevation", string);
612
            feaFondos.setProp("elevation", string);
613
        }
614
    }
615

    
616
    /* (non-Javadoc)
617
     * @see org.cresques.io.DxfFile.EntityFactory#addVertex(org.cresques.io.DxfGroupVector)
618
     */
619
    public void addVertex(DxfGroupVector grp) throws Exception {
620
        double x = 0.0;
621
        double y = 0.0;
622
        double z = 0.0;
623
        int vFlags = 0;
624

    
625
        if (isDoubleFeatured) {
626
            Feature feaBordes = lastFeaBordes;
627
            Feature feaFondos = lastFeaFondos;
628
            LineString3D lineString3D = (LineString3D) feaBordes.getGeometry();
629
            Polygon3D polygon3D = (Polygon3D) feaFondos.getGeometry();
630

    
631
            if (grp.hasCode(8)) {
632
                feaBordes.setProp("layer", grp.getDataAsString(8));
633
                feaFondos.setProp("layer", grp.getDataAsString(8));
634
            }
635

    
636
            if (grp.hasCode(70)) {
637
                vFlags = grp.getDataAsInt(70);
638
            }
639

    
640
            x = grp.getDataAsDouble(10);
641
            y = grp.getDataAsDouble(20);
642
            z = grp.getDataAsDouble(30);
643

    
644
            Point3D point_in = new Point3D(x, y, z);
645
            Point3D xtru = new Point3D(xtruX, xtruY, xtruZ);
646
            Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
647
            x = point_out.getX();
648
            y = point_out.getY();
649
            z = point_out.getZ();
650

    
651
            if (z != 0.0) {
652
                dxf3DFile = true;
653
            }
654

    
655
            if ((z != lastVertexElevation) && (lineString3D.pointNr() > 0)) {
656
                constantPolylineElevation = false;
657
            }
658

    
659
            lastVertexElevation = z;
660

    
661
            //System.out.println("addVertex(): vFlags = " + vFlags);
662
            if (((vFlags & 0x80) == 0x80) && ((vFlags & 0x40) == 0)) {
663
                int[] face = { 0, 0, 0, 0 };
664
                face[0] = grp.getDataAsInt(71);
665
                face[1] = grp.getDataAsInt(72);
666
                face[2] = grp.getDataAsInt(73);
667
                face[3] = grp.getDataAsInt(74);
668
                addFace(face);
669
            } else if ((vFlags & 0x10) == 0x10) {
670
                // Son vertices que se trataran cuando se implementen
671
                // los splines. En principio no se hace nada con ellos.
672
            } else {
673
                Point3D pt = new Point3D(proj.createPoint(x, y).getX(),
674
                                         proj.createPoint(x, y).getY(), z);
675
                lineString3D.add(pt);
676
                polygon3D.add(pt);
677

    
678
                if (lineString3D.pointNr() == 1) {
679
                    firstPt = pt;
680
                }
681

    
682
                if (bulge == 0.0) {
683
                    if (grp.hasCode(42)) {
684
                        bulge = grp.getDataAsDouble(42);
685
                    } else {
686
                        bulge = 0.0;
687
                    }
688
                } else {
689
                    double bulge_aux = 0.0;
690

    
691
                    if (grp.hasCode(42)) {
692
                        bulge_aux = grp.getDataAsDouble(42);
693
                    } else {
694
                        bulge_aux = 0.0;
695
                    }
696

    
697
                    //int cnt = lineString.pointNr();
698
                    if ((ptAnterior.getX() == pt.getX()) &&
699
                            (ptAnterior.getY() == pt.getY())) {
700
                        // no se construye el arco
701
                    } else {
702
                        lineString3D.remove(lineString3D.pointNr() - 1);
703
                        lineString3D.remove(lineString3D.pointNr() - 1);
704
                        polygon3D.remove(polygon3D.pointNr() - 1);
705
                        polygon3D.remove(polygon3D.pointNr() - 1);
706

    
707
                        Vector arc = createArc(ptAnterior, pt, bulge);
708

    
709
                        if (bulge > 0) {
710
                            for (int i = 0; i < arc.size(); i++) {
711
                                Point2D ptAux = new Point2D.Double();
712
                                ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
713
                                                         ((Point2D) arc.get(i)).getY());
714

    
715
                                Point3D ptAux3D = new Point3D(ptAux.getX(),
716
                                                              ptAux.getY(), z);
717
                                lineString3D.add(ptAux3D);
718
                                polygon3D.add(ptAux3D);
719

    
720
                                if (lineString3D.pointNr() == 1) {
721
                                    firstPt = ptAux3D;
722
                                }
723
                            }
724
                        } else {
725
                            for (int i = arc.size() - 1; i >= 0; i--) {
726
                                Point2D ptAux = new Point2D.Double();
727
                                ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
728
                                                         ((Point2D) arc.get(i)).getY());
729

    
730
                                Point3D ptAux3D = new Point3D(ptAux.getX(),
731
                                                              ptAux.getY(), z);
732
                                lineString3D.add(ptAux3D);
733
                                polygon3D.add(ptAux3D);
734

    
735
                                if ((lineString3D.pointNr() == 1) ||
736
                                        (polygon3D.pointNr() == 1)) {
737
                                    firstPt = ptAux3D;
738
                                }
739
                            }
740
                        }
741
                    }
742

    
743
                    bulge = bulge_aux;
744
                }
745

    
746
                ptAnterior = pt;
747
            }
748
        } else {
749
            Feature feaBordes = lastFeaBordes;
750
            LineString3D lineString3D = (LineString3D) feaBordes.getGeometry();
751

    
752
            if (grp.hasCode(8)) {
753
                feaBordes.setProp("layer", grp.getDataAsString(8));
754
            }
755

    
756
            if (grp.hasCode(70)) {
757
                vFlags = grp.getDataAsInt(70);
758
            }
759

    
760
            x = grp.getDataAsDouble(10);
761
            y = grp.getDataAsDouble(20);
762
            z = grp.getDataAsDouble(30);
763

    
764
            Point3D point_in = new Point3D(x, y, z);
765
            Point3D xtru = new Point3D(xtruX, xtruY, xtruZ);
766
            Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
767
            x = point_out.getX();
768
            y = point_out.getY();
769
            z = point_out.getZ();
770

    
771
            if (z != 0.0) {
772
                dxf3DFile = true;
773
            }
774

    
775
            if ((z != lastVertexElevation) && (lineString3D.pointNr() > 0)) {
776
                constantPolylineElevation = false;
777
            }
778

    
779
            lastVertexElevation = z;
780

    
781
            if (((vFlags & 0x80) == 0x80) && ((vFlags & 0x40) == 0)) {
782
                int[] face = { 0, 0, 0, 0 };
783
                face[0] = grp.getDataAsInt(71);
784
                face[1] = grp.getDataAsInt(72);
785
                face[2] = grp.getDataAsInt(73);
786
                face[3] = grp.getDataAsInt(74);
787
                addFace(face);
788
            } else if ((vFlags & 16) == 16) {
789
                // no se hace nada.
790
            } else {
791
                Point3D pt = new Point3D(proj.createPoint(x, y).getX(),
792
                                         proj.createPoint(x, y).getY(), z);
793
                lineString3D.add(pt);
794

    
795
                //System.out.println("addVertex: pt = " + pt);
796
                if (lineString3D.pointNr() == 1) {
797
                    firstPt = pt;
798

    
799
                    //System.out.println("addVertex(Primer pto de la lineString, firstPt=pt): firstPt = " + firstPt);
800
                }
801

    
802
                if (bulge == 0.0) {
803
                    if (grp.hasCode(42)) {
804
                        bulge = grp.getDataAsDouble(42);
805
                    } else {
806
                        bulge = 0.0;
807
                    }
808

    
809
                    //System.out.println("addVertex: El vertice anterior tenia bulge=0.0");
810
                } else {
811
                    //System.out.println("addVertex: El vertice anterior tiene bulge = " + bulge);
812
                    double bulge_aux = 0.0;
813

    
814
                    if (grp.hasCode(42)) {
815
                        bulge_aux = grp.getDataAsDouble(42);
816
                    } else {
817
                        bulge_aux = 0.0;
818
                    }
819

    
820
                    if ((ptAnterior.getX() == pt.getX()) &&
821
                            (ptAnterior.getY() == pt.getY())) {
822
                        // no se construye el arco
823
                    } else {
824
                        // Borro los puntos inicio y final del arco.
825
                        lineString3D.remove(lineString3D.pointNr() - 1);
826
                        lineString3D.remove(lineString3D.pointNr() - 1);
827

    
828
                        Vector arc = createArc(ptAnterior, pt, bulge);
829

    
830
                        if (bulge > 0) {
831
                            for (int i = 0; i < arc.size(); i++) {
832
                                Point2D ptAux = new Point2D.Double();
833
                                ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
834
                                                         ((Point2D) arc.get(i)).getY());
835

    
836
                                Point3D ptAux3D = new Point3D(ptAux.getX(),
837
                                                              ptAux.getY(), z);
838
                                lineString3D.add(ptAux3D);
839

    
840
                                if (lineString3D.pointNr() == 1) {
841
                                    firstPt = ptAux3D;
842
                                }
843
                            }
844
                        } else {
845
                            for (int i = arc.size() - 1; i >= 0; i--) {
846
                                Point2D ptAux = new Point2D.Double();
847
                                ptAux = proj.createPoint(((Point2D) arc.get(i)).getX(),
848
                                                         ((Point2D) arc.get(i)).getY());
849

    
850
                                Point3D ptAux3D = new Point3D(ptAux.getX(),
851
                                                              ptAux.getY(), z);
852
                                lineString3D.add(ptAux3D);
853

    
854
                                if (lineString3D.pointNr() == 1) {
855
                                    firstPt = ptAux3D;
856
                                }
857
                            }
858
                        }
859
                    }
860

    
861
                    bulge = bulge_aux;
862
                }
863

    
864
                ptAnterior = pt;
865
            }
866
        }
867
    }
868

    
869
    /* (non-Javadoc)
870
     * @see org.cresques.io.DxfFile.EntityFactory#createLwPolyline(org.cresques.io.DxfGroupVector)
871
     */
872
    public void createLwPolyline(DxfGroupVector grp) throws Exception {
873
        double x = 0.0;
874
        double y = 0.0;
875
        double elev = 0.0;
876
        DxfGroup g = null;
877
        LineString3D lineString3D = new LineString3D();
878
        Polygon3D polygon3D = new Polygon3D();
879

    
880
        //Geometry geometria;
881
        //Feature feature= new Feature();
882
        Feature feaBordes = new Feature();
883
        Feature feaFondos = new Feature();
884
        int flags = 0;
885
        int NumberOfVertices = 0;
886
        double extx = 0.0;
887
        double exty = 0.0;
888
        double extz = 1.0;
889

    
890
        //feature.setProp("dxfEntity", "LwPolyline");
891
        feaBordes.setProp("dxfEntity", "LwPolyline");
892
        feaFondos.setProp("dxfEntity", "LwPolyline");
893

    
894
        if (grp.hasCode(8)) {
895
            //feature.setProp("layer", grp.getDataAsString(8));
896
            feaBordes.setProp("layer", grp.getDataAsString(8));
897
        }
898

    
899
        feaFondos.setProp("layer", grp.getDataAsString(8));
900

    
901
        if (grp.hasCode(38)) {
902
            elev = grp.getDataAsDouble(38);
903

    
904
            if (elev != 0.0) {
905
                dxf3DFile = true;
906
            }
907

    
908
            Double doub = new Double(elev);
909
            String string = doub.toString();
910

    
911
            //feature.setProp("elevation", string);
912
            feaBordes.setProp("elevation", string);
913
            feaFondos.setProp("elevation", string);
914
        } else {
915
            Double doub = new Double(0.0);
916

    
917
            //feature.setProp("elevation", doub.toString());
918
            feaBordes.setProp("elevation", doub.toString());
919
            feaFondos.setProp("elevation", doub.toString());
920
        }
921

    
922
        if (grp.hasCode(39)) {
923
            Double doub = new Double(grp.getDataAsDouble(39));
924
            String string = doub.toString();
925

    
926
            //feature.setProp("thickness", string);
927
            feaBordes.setProp("thickness", string);
928
            feaFondos.setProp("thickness", string);
929
        } else {
930
            Double doub = new Double(0.0);
931

    
932
            //feature.setProp("thickness", doub.toString());
933
            feaBordes.setProp("thickness", doub.toString());
934
            feaFondos.setProp("thickness", doub.toString());
935
        }
936

    
937
        if (grp.hasCode(62)) {
938
            Integer integer = new Integer(grp.getDataAsInt(62));
939
            String string = integer.toString();
940

    
941
            //feature.setProp("color", string);
942
            feaBordes.setProp("color", string);
943
            feaFondos.setProp("color", string);
944
            feaBordes.setProp("colorByLayer", "false");
945
            feaFondos.setProp("colorByLayer", "false");
946
        } else {
947
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
948
            int clr = layer.colorNumber;
949
            Integer integer = new Integer(clr);
950
            String string = integer.toString();
951

    
952
            //feature.setProp("color", string);
953
            feaBordes.setProp("color", string);
954
            feaFondos.setProp("color", string);
955
            feaBordes.setProp("colorByLayer", "true");
956
            feaFondos.setProp("colorByLayer", "true");
957
        }
958

    
959
        if (grp.hasCode(70)) {
960
            flags = grp.getDataAsInt(70);
961
        }
962

    
963
        if ((flags & 0x01) == 0x01) {
964
            //geometria = new Polygon();
965
            feaBordes.setGeometry(lineString3D);
966
            feaFondos.setGeometry(polygon3D);
967
            isDoubleFeatured = true;
968
        } else {
969
            //geometria = new LineString();
970
            feaBordes.setGeometry(lineString3D);
971
            isDoubleFeatured = false;
972
        }
973

    
974
        if (grp.hasCode(90)) {
975
            NumberOfVertices = grp.getDataAsInt(90);
976
        }
977

    
978
        if (grp.hasCode(210)) {
979
            extx = grp.getDataAsDouble(210);
980
        }
981

    
982
        if (grp.hasCode(220)) {
983
            exty = grp.getDataAsDouble(220);
984
        }
985

    
986
        if (grp.hasCode(230)) {
987
            extz = grp.getDataAsDouble(230);
988
        }
989

    
990
        int j = 0;
991
        double firstX = 0.0;
992
        double firstY = 0.0;
993
        boolean hasBulge = false;
994
        double bulgeLwp = 0.0;
995

    
996
        for (int i = 0; i < grp.size(); i++) {
997
            g = (DxfGroup) grp.get(i);
998

    
999
            if (g.getCode() == 10) {
1000
                j++;
1001
                x = ((Double) g.getData()).doubleValue();
1002
            } else if (g.getCode() == 20) {
1003
                y = ((Double) g.getData()).doubleValue();
1004

    
1005
                // A?adiendo extrusion a LwPolyline ...
1006
                Point3D point_in1 = new Point3D(x, y, elev);
1007
                Point3D xtru = new Point3D(extx, exty, extz);
1008
                Point3D point_out1 = DxfCalXtru.CalculateXtru(point_in1, xtru);
1009
                x = point_out1.getX();
1010
                y = point_out1.getY();
1011
                elev = point_out1.getZ();
1012

    
1013
                //
1014
                if (hasBulge) {
1015
                    Point2D finalPoint = new Point2D.Double(x, y);
1016

    
1017
                    if ((((LineString3D) lineString3D).get(lineString3D.pointNr() -
1018
                                                               1).getX() == finalPoint.getX()) &&
1019
                            (((LineString3D) lineString3D).get(lineString3D.pointNr() -
1020
                                                                   1).getY() == finalPoint.getY())) {
1021
                        // no se construye el arco
1022
                    } else {
1023
                        Vector arc = createArc(((LineString3D) lineString3D).get(lineString3D.pointNr() -
1024
                                                                                 1),
1025
                                               finalPoint, bulgeLwp);
1026
                        lineString3D.remove(lineString3D.pointNr() - 1);
1027

    
1028
                        if (isDoubleFeatured) {
1029
                            polygon3D.remove(polygon3D.pointNr() - 1);
1030
                        }
1031

    
1032
                        if (bulgeLwp > 0) {
1033
                            for (int k = 0; k < arc.size(); k++) {
1034
                                Point2D ptAux = new Point2D.Double();
1035
                                ptAux = proj.createPoint(((Point2D) arc.get(k)).getX(),
1036
                                                         ((Point2D) arc.get(k)).getY());
1037

    
1038
                                //System.out.println("createLwPolyline: ptAux = " + ptAux);
1039
                                Point3D ptAux3D = new Point3D(ptAux.getX(),
1040
                                                              ptAux.getY(), elev);
1041
                                lineString3D.add(ptAux3D);
1042

    
1043
                                //if (lineString.pointNr() == 1) firstPt = ptAux;
1044
                                if (isDoubleFeatured) {
1045
                                    polygon3D.add(ptAux3D);
1046
                                }
1047

    
1048
                                if ((lineString3D.pointNr() == 1) ||
1049
                                        (polygon3D.pointNr() == 1)) {
1050
                                    firstPt = ptAux3D;
1051
                                }
1052
                            }
1053
                        } else {
1054
                            for (int k = arc.size() - 1; k >= 0; k--) {
1055
                                Point2D ptAux = new Point2D.Double();
1056
                                ptAux = proj.createPoint(((Point2D) arc.get(k)).getX(),
1057
                                                         ((Point2D) arc.get(k)).getY());
1058

    
1059
                                Point3D ptAux3D = new Point3D(ptAux.getX(),
1060
                                                              ptAux.getY(), elev);
1061
                                lineString3D.add(ptAux3D);
1062

    
1063
                                if (isDoubleFeatured) {
1064
                                    polygon3D.add(ptAux3D);
1065
                                }
1066

    
1067
                                if ((lineString3D.pointNr() == 1) ||
1068
                                        (polygon3D.pointNr() == 1)) {
1069
                                    firstPt = ptAux3D;
1070
                                }
1071
                            }
1072
                        }
1073
                    }
1074

    
1075
                    hasBulge = false;
1076
                    bulgeLwp = 0.0;
1077
                } else {
1078
                    //System.out.println("createLwPolyline: hasBulge siempre es false");
1079
                    Point3D ptAux3D = new Point3D(proj.createPoint(x, y).getX(),
1080
                                                  proj.createPoint(x, y).getY(),
1081
                                                  elev);
1082
                    lineString3D.add(ptAux3D);
1083

    
1084
                    if (isDoubleFeatured) {
1085
                        polygon3D.add(ptAux3D);
1086
                    }
1087
                }
1088

    
1089
                if (j == 1) {
1090
                    firstX = x;
1091
                    firstY = y;
1092
                }
1093

    
1094
                x = 0.0;
1095
                y = 0.0;
1096
            } else if (g.getCode() == 42) {
1097
                //System.out.println("createLwPolyline: Lee el bulgeLwp");
1098
                hasBulge = true;
1099
                bulgeLwp = ((Double) g.getData()).doubleValue();
1100
            }
1101
        }
1102

    
1103
        if (isDoubleFeatured) {
1104
            //geometria.add(proj.createPoint(firstX, firstY));          
1105
            Point3D ptAux3D = new Point3D(proj.createPoint(firstX, firstY).getX(),
1106
                                          proj.createPoint(firstX, firstY).getY(),
1107
                                          elev);
1108
            lineString3D.add(ptAux3D);
1109
            polygon3D.add(ptAux3D);
1110
        }
1111

    
1112
        lastFeaBordes = feaBordes;
1113

    
1114
        if (isDoubleFeatured) {
1115
            lastFeaFondos = feaFondos;
1116
        }
1117

    
1118
        // 041130: Rellena las props con los atributos.
1119
        completeAttributes(lastFeaBordes);
1120
        completeAttributes(lastFeaFondos);
1121

    
1122
        //features.add(feature);
1123
        if (addingToBlock == false) {
1124
            if (isDoubleFeatured) {
1125
                features.add(feaFondos);
1126
            } else {
1127
                features.add(feaBordes);
1128
            }
1129
        } else {
1130
            //System.out.println("createLwPolyline(): A?adimos una lwpolilinea al bloque " + iterator);
1131
            if (isDoubleFeatured) {
1132
                blk.add(feaFondos);
1133
            } else {
1134
                blk.add(feaBordes);
1135
            }
1136
        }
1137

    
1138
        isDoubleFeatured = false;
1139
    }
1140

    
1141
    /* (non-Javadoc)
1142
     * @see org.cresques.io.DxfFile.EntityFactory#createLine(org.cresques.io.DxfGroupVector)
1143
     */
1144
    public void createLine(DxfGroupVector grp) throws Exception {
1145
        double x = 0.0;
1146
        double y = 0.0;
1147
        double z1 = 0.0;
1148
        double z2 = 0.0;
1149
        double elev = 0.0;
1150
        DxfGroup g = null;
1151
        Point2D pt1 = null;
1152
        Point2D pt2 = null;
1153
        LineString3D lineString3D = new LineString3D();
1154
        Feature feature = new Feature();
1155
        double extx = 0.0;
1156
        double exty = 0.0;
1157
        double extz = 1.0;
1158

    
1159
        feature.setProp("dxfEntity", "Line");
1160

    
1161
        if (grp.hasCode(8)) {
1162
            feature.setProp("layer", grp.getDataAsString(8));
1163
        }
1164

    
1165
        if (grp.hasCode(39)) {
1166
            Double doub = new Double(grp.getDataAsDouble(39));
1167
            String string = doub.toString();
1168
            feature.setProp("thickness", string);
1169
        } else {
1170
            Double doub = new Double(0.0);
1171
            feature.setProp("thickness", doub.toString());
1172
        }
1173

    
1174
        if (grp.hasCode(62)) {
1175
            Integer integer = new Integer(grp.getDataAsInt(62));
1176
            String string = integer.toString();
1177
            feature.setProp("color", string);
1178
            feature.setProp("colorByLayer", "false");
1179
        } else {
1180
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
1181
            int clr = layer.colorNumber;
1182
            Integer integer = new Integer(clr);
1183
            String string = integer.toString();
1184
            feature.setProp("color", string);
1185
            feature.setProp("colorByLayer", "true");
1186
        }
1187

    
1188
        x = grp.getDataAsDouble(10);
1189
        y = grp.getDataAsDouble(20);
1190
        z1 = grp.getDataAsDouble(30);
1191

    
1192
        /*if (grp.hasCode(30)) {
1193
            z1 = grp.getDataAsDouble(30);
1194
            elev = z1;
1195
            Double doub = new Double(elev);
1196
            String string = doub.toString();
1197
            //feature.setProp("elevation", string);
1198
        }*/
1199
        pt1 = proj.createPoint(x, y);
1200
        x = grp.getDataAsDouble(11);
1201
        y = grp.getDataAsDouble(21);
1202
        z2 = grp.getDataAsDouble(31);
1203

    
1204
        /*if (grp.hasCode(31)) {
1205
            z2 = grp.getDataAsDouble(31);
1206
        } else {
1207
            // Cuando no se especifican z para las lineas se asume que la
1208
            // z es cero.
1209
            Double doub = new Double(0.0);
1210
            //feature.setProp("elevation", doub.toString());
1211
        }*/
1212
        pt2 = proj.createPoint(x, y);
1213

    
1214
        if (grp.hasCode(210)) {
1215
            extx = grp.getDataAsDouble(210);
1216
        }
1217

    
1218
        if (grp.hasCode(220)) {
1219
            exty = grp.getDataAsDouble(220);
1220
        }
1221

    
1222
        if (grp.hasCode(230)) {
1223
            extz = grp.getDataAsDouble(230);
1224
        }
1225

    
1226
        Point3D point_in1 = new Point3D(pt1.getX(), pt1.getY(), z1);
1227
        Point3D point_in2 = new Point3D(pt2.getX(), pt2.getY(), z2);
1228
        Point3D xtru = new Point3D(extx, exty, extz);
1229
        Point3D point_out1 = DxfCalXtru.CalculateXtru(point_in1, xtru);
1230
        Point3D point_out2 = DxfCalXtru.CalculateXtru(point_in2, xtru);
1231

    
1232
        if (point_out1.getZ() != 0.0) {
1233
            dxf3DFile = true;
1234
        }
1235

    
1236
        if (point_out2.getZ() != 0.0) {
1237
            dxf3DFile = true;
1238
        }
1239

    
1240
        if (point_out1.getZ() == point_out2.getZ()) {
1241
            elev = z1;
1242

    
1243
            Double doub = new Double(elev);
1244
            String string = doub.toString();
1245
            feature.setProp("elevation", string);
1246
        } else {
1247
            elev = 0.0;
1248

    
1249
            Double doub = new Double(elev);
1250
            String string = doub.toString();
1251
            feature.setProp("elevation", string);
1252
        }
1253

    
1254
        //pt1.setLocation(point_out1);
1255
        //pt2.setLocation(point_out2);
1256
        lineString3D.add(point_out1);
1257
        lineString3D.add(point_out2);
1258

    
1259
        feature.setGeometry(lineString3D);
1260

    
1261
        // 041130: Rellena las props con los atributos.
1262
        completeAttributes(feature);
1263

    
1264
        //features.add(feature);
1265
        if (addingToBlock == false) {
1266
            //System.out.println("createLine(): A?adimos una linea a la lista de entidades");
1267
            features.add(feature);
1268
        } else {
1269
            //System.out.println("createLine(): A?adimos una linea al bloque " + iterator);
1270
            blk.add(feature);
1271
        }
1272
    }
1273

    
1274
    /* (non-Javadoc)
1275
     * @see org.cresques.io.DxfFile.EntityFactory#createText(org.cresques.io.DxfGroupVector)
1276
     */
1277
    public void createText(DxfGroupVector grp) throws Exception {
1278
        double x = 0.0;
1279
        double y = 0.0;
1280
        double z = 0.0;
1281
        double h = 0.0;
1282
        double rot = 0.0;
1283
        DxfGroup g = null;
1284

    
1285
        //Point3D pt1 = null, pt2 = null;
1286
        Point3D pt = null;
1287
        org.cresques.px.gml.Point3D point = new org.cresques.px.gml.Point3D();
1288
        double extx = 0.0;
1289
        double exty = 0.0;
1290
        double extz = 1.0;
1291

    
1292
        point.setTextPoint(true);
1293

    
1294
        Feature feature = new Feature();
1295

    
1296
        feature.setProp("dxfEntity", "Text");
1297

    
1298
        if (grp.hasCode(8)) {
1299
            feature.setProp("layer", grp.getDataAsString(8));
1300
        }
1301

    
1302
        if (grp.hasCode(39)) {
1303
            Double doub = new Double(grp.getDataAsDouble(39));
1304
            String string = doub.toString();
1305
            feature.setProp("thickness", string);
1306
        } else {
1307
            Double doub = new Double(0.0);
1308
            feature.setProp("thickness", doub.toString());
1309
        }
1310

    
1311
        if (grp.hasCode(62)) {
1312
            Integer integer = new Integer(grp.getDataAsInt(62));
1313
            String string = integer.toString();
1314
            feature.setProp("color", string);
1315
            feature.setProp("colorByLayer", "false");
1316
        } else {
1317
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
1318
            int clr = layer.colorNumber;
1319
            Integer integer = new Integer(clr);
1320
            String string = integer.toString();
1321
            feature.setProp("color", string);
1322
            feature.setProp("colorByLayer", "true");
1323
        }
1324

    
1325
        if (grp.hasCode(1)) {
1326
            String strAux1 = grp.getDataAsString(1);
1327
            strAux1 = DxfConvTexts.ConvertText(strAux1);
1328
            feature.setProp("text", strAux1);
1329
        } else {
1330
            feature.setProp("text", "No Text Code");
1331
        }
1332

    
1333
        if (grp.hasCode(40)) {
1334
            Double heightD = new Double(grp.getDataAsDouble(40));
1335
            String heightS = heightD.toString();
1336
            feature.setProp("textHeight", heightS);
1337
        } else {
1338
            feature.setProp("textHeight", "20.0");
1339
        }
1340

    
1341
        if (grp.hasCode(50)) {
1342
            Double rotD = new Double(grp.getDataAsDouble(50));
1343
            String rotS = rotD.toString();
1344
            feature.setProp("textRotation", rotS);
1345

    
1346
            //System.out.println("rotS = " + rotS);
1347
        } else {
1348
            feature.setProp("textRotation", "0.0");
1349
        }
1350

    
1351
        x = grp.getDataAsDouble(10);
1352
        y = grp.getDataAsDouble(20);
1353
        z = grp.getDataAsDouble(30);
1354

    
1355
        /*if (grp.hasCode(30)){
1356
            Double doub = new Double(z);
1357
            String string = doub.toString();
1358
            feature.setProp("elevation", string);
1359
        } else {
1360
            Double doub = new Double(0.0);
1361
            feature.setProp("elevation", doub.toString());
1362
        }*/
1363
        if (grp.hasCode(210)) {
1364
            extx = grp.getDataAsDouble(210);
1365
        }
1366

    
1367
        if (grp.hasCode(220)) {
1368
            exty = grp.getDataAsDouble(220);
1369
        }
1370

    
1371
        if (grp.hasCode(230)) {
1372
            extz = grp.getDataAsDouble(230);
1373
        }
1374

    
1375
        Point3D point_in = new Point3D(x, y, z);
1376
        Point3D xtru = new Point3D(extx, exty, extz);
1377
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
1378
        x = point_out.getX();
1379
        y = point_out.getY();
1380
        z = point_out.getZ();
1381

    
1382
        Double doub = new Double(z);
1383
        feature.setProp("elevation", doub.toString());
1384

    
1385
        if (z != 0.0) {
1386
            dxf3DFile = true;
1387
        }
1388

    
1389
        point.add(new Point3D(x, y, z));
1390
        feature.setGeometry(point);
1391

    
1392
        // 041130: Rellena las props con los atributos.
1393
        completeAttributes(feature);
1394

    
1395
        //features.add(feature);
1396
        if (addingToBlock == false) {
1397
            features.add(feature);
1398
        } else {
1399
            //System.out.println("createText(): A?adimos un text al bloque " + iterator);
1400
            blk.add(feature);
1401
        }
1402
    }
1403

    
1404
    /* (non-Javadoc)
1405
     * @see org.cresques.io.DxfFile.EntityFactory#createMText(org.cresques.io.DxfGroupVector)
1406
     */
1407
    public void createMText(DxfGroupVector grp) throws Exception {
1408
        double x = 0.0;
1409
        double y = 0.0;
1410
        double z = 0.0;
1411
        double h = 0.0;
1412
        double rot = 0.0;
1413
        DxfGroup g = null;
1414

    
1415
        //Point2D pt1 = null, pt2 = null;
1416
        Point3D pt = null;
1417
        org.cresques.px.gml.Point3D point = new org.cresques.px.gml.Point3D();
1418
        double extx = 0.0;
1419
        double exty = 0.0;
1420
        double extz = 1.0;
1421

    
1422
        point.setTextPoint(true);
1423

    
1424
        Feature feature = new Feature();
1425

    
1426
        feature.setProp("dxfEntity", "Text");
1427

    
1428
        if (grp.hasCode(8)) {
1429
            feature.setProp("layer", grp.getDataAsString(8));
1430
        }
1431

    
1432
        if (grp.hasCode(39)) {
1433
            Double doub = new Double(grp.getDataAsDouble(39));
1434
            String string = doub.toString();
1435
            feature.setProp("thickness", string);
1436
        } else {
1437
            Double doub = new Double(0.0);
1438
            feature.setProp("thickness", doub.toString());
1439
        }
1440

    
1441
        if (grp.hasCode(62)) {
1442
            Integer integer = new Integer(grp.getDataAsInt(62));
1443
            String string = integer.toString();
1444
            feature.setProp("color", string);
1445
            feature.setProp("colorByLayer", "false");
1446
        } else {
1447
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
1448
            int clr = layer.colorNumber;
1449
            Integer integer = new Integer(clr);
1450
            String string = integer.toString();
1451
            feature.setProp("color", string);
1452
            feature.setProp("colorByLayer", "true");
1453
        }
1454

    
1455
        if (grp.hasCode(1)) {
1456
            String strAux1 = grp.getDataAsString(1);
1457
            strAux1 = DxfConvTexts.ConvertText(strAux1);
1458
            feature.setProp("text", strAux1);
1459
        } else {
1460
            feature.setProp("text", "No Text Code");
1461
        }
1462

    
1463
        if (grp.hasCode(40)) {
1464
            Double heightD = new Double(grp.getDataAsDouble(40));
1465
            String heightS = heightD.toString();
1466
            feature.setProp("textHeight", heightS);
1467
        } else {
1468
            feature.setProp("textHeight", "20.0");
1469
        }
1470

    
1471
        if (grp.hasCode(50)) {
1472
            Double rotD = new Double(grp.getDataAsDouble(50));
1473
            String rotS = rotD.toString();
1474
            feature.setProp("textRotation", rotS);
1475

    
1476
            //System.out.println("rotS = " + rotS);
1477
        } else {
1478
            feature.setProp("textRotation", "0.0");
1479
        }
1480

    
1481
        if (grp.hasCode(71)) {
1482
            int attachPoint = grp.getDataAsInt(71);
1483

    
1484
            if (attachPoint == 1) {
1485
            } else if (attachPoint == 2) {
1486
            } else if (attachPoint == 3) {
1487
            } else if (attachPoint == 4) {
1488
            } else if (attachPoint == 5) {
1489
            } else if (attachPoint == 6) {
1490
            } else if (attachPoint == 7) {
1491
            } else if (attachPoint == 8) {
1492
            } else if (attachPoint == 9) {
1493
            }
1494
        }
1495

    
1496
        if (grp.hasCode(72)) {
1497
            int drawDirection = grp.getDataAsInt(71);
1498

    
1499
            if (drawDirection == 1) {
1500
            } else if (drawDirection == 3) {
1501
            } else if (drawDirection == 5) {
1502
            }
1503
        }
1504

    
1505
        if (grp.hasCode(73)) {
1506
            int spacingStyle = grp.getDataAsInt(71);
1507

    
1508
            if (spacingStyle == 1) {
1509
            } else if (spacingStyle == 2) {
1510
            }
1511
        }
1512

    
1513
        x = grp.getDataAsDouble(10);
1514
        y = grp.getDataAsDouble(20);
1515
        z = grp.getDataAsDouble(30);
1516

    
1517
        /*if (grp.hasCode(30)){
1518
            z = grp.getDataAsDouble(30);
1519
            Double doub = new Double(z);
1520
            String string = doub.toString();
1521
            feature.setProp("elevation", string);
1522
        } else {
1523
            Double doub = new Double(0.0);
1524
            feature.setProp("elevation", doub.toString());
1525
        }*/
1526
        if (grp.hasCode(210)) {
1527
            extx = grp.getDataAsDouble(210);
1528
        }
1529

    
1530
        if (grp.hasCode(220)) {
1531
            exty = grp.getDataAsDouble(220);
1532
        }
1533

    
1534
        if (grp.hasCode(230)) {
1535
            extz = grp.getDataAsDouble(230);
1536
        }
1537

    
1538
        Point3D point_in = new Point3D(x, y, z);
1539
        Point3D xtru = new Point3D(extx, exty, extz);
1540
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
1541
        x = point_out.getX();
1542
        y = point_out.getY();
1543
        z = point_out.getZ();
1544

    
1545
        Double doub = new Double(z);
1546
        feature.setProp("elevation", doub.toString());
1547

    
1548
        if (z != 0.0) {
1549
            dxf3DFile = true;
1550
        }
1551

    
1552
        point.add(new Point3D(x, y, z));
1553
        feature.setGeometry(point);
1554

    
1555
        // 041130: Rellena las props con los atributos.
1556
        completeAttributes(feature);
1557

    
1558
        //features.add(feature);
1559
        if (addingToBlock == false) {
1560
            features.add(feature);
1561
        } else {
1562
            //System.out.println("createText(): A?adimos un text al bloque " + iterator);
1563
            blk.add(feature);
1564
        }
1565
    }
1566

    
1567
    /* (non-Javadoc)
1568
     * @see org.cresques.io.DxfFile.EntityFactory#createPoint(org.cresques.io.DxfGroupVector)
1569
     */
1570
    public void createPoint(DxfGroupVector grp) throws Exception {
1571
        double x = 0.0;
1572
        double y = 0.0;
1573
        double z = 0.0;
1574
        DxfGroup g = null;
1575
        Point3D pt = null;
1576
        double extx = 0.0;
1577
        double exty = 0.0;
1578
        double extz = 1.0;
1579
        org.cresques.px.gml.Point3D point = new org.cresques.px.gml.Point3D();
1580
        Feature feature = new Feature();
1581

    
1582
        feature.setProp("dxfEntity", "Point");
1583

    
1584
        if (grp.hasCode(8)) {
1585
            feature.setProp("layer", grp.getDataAsString(8));
1586
        }
1587

    
1588
        if (grp.hasCode(39)) {
1589
            Double doub = new Double(grp.getDataAsDouble(39));
1590
            String string = doub.toString();
1591
            feature.setProp("thickness", string);
1592
        } else {
1593
            Double doub = new Double(0.0);
1594
            feature.setProp("thickness", doub.toString());
1595
        }
1596

    
1597
        if (grp.hasCode(62)) {
1598
            Integer integer = new Integer(grp.getDataAsInt(62));
1599
            String string = integer.toString();
1600
            feature.setProp("color", string);
1601
            feature.setProp("colorByLayer", "false");
1602
        } else {
1603
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
1604
            int clr = layer.colorNumber;
1605
            Integer integer = new Integer(clr);
1606
            String string = integer.toString();
1607
            feature.setProp("color", string);
1608
            feature.setProp("colorByLayer", "true");
1609
        }
1610

    
1611
        x = grp.getDataAsDouble(10);
1612
        y = grp.getDataAsDouble(20);
1613
        z = grp.getDataAsDouble(30);
1614

    
1615
        /*if (grp.hasCode(30)) {
1616
            z = grp.getDataAsDouble(30);
1617
            Double doub = new Double(z);
1618
            String string = doub.toString();
1619
            feature.setProp("elevation", string);
1620
        } else {
1621
            Double doub = new Double(0.0);
1622
            feature.setProp("elevation", doub.toString());
1623
        }*/
1624
        if (grp.hasCode(210)) {
1625
            extx = grp.getDataAsDouble(210);
1626
        }
1627

    
1628
        if (grp.hasCode(220)) {
1629
            exty = grp.getDataAsDouble(220);
1630
        }
1631

    
1632
        if (grp.hasCode(230)) {
1633
            extz = grp.getDataAsDouble(230);
1634
        }
1635

    
1636
        Point3D point_in = new Point3D(x, y, z);
1637
        Point3D xtru = new Point3D(extx, exty, extz);
1638
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
1639
        x = point_out.getX();
1640
        y = point_out.getY();
1641
        z = point_out.getZ();
1642

    
1643
        Double doub = new Double(z);
1644
        feature.setProp("elevation", doub.toString());
1645

    
1646
        if (z != 0.0) {
1647
            dxf3DFile = true;
1648
        }
1649

    
1650
        point.add(new Point3D(x, y, z));
1651
        feature.setGeometry(point);
1652

    
1653
        // 041130: Rellena las props con los atributos.
1654
        completeAttributes(feature);
1655

    
1656
        /*for (int i=0;i<attributes.size();i++) {
1657
            String[] att = new String[2];
1658
            att = (String[])attributes.get(i);
1659
            feature.setProp(att[0],att[1]);
1660
        }*/
1661

    
1662
        //features.add(feature);
1663
        if (addingToBlock == false) {
1664
            features.add(feature);
1665
        } else {
1666
            //System.out.println("createPoint(): A?adimos un punto al bloque " + iterator);
1667
            blk.add(feature);
1668
        }
1669
    }
1670

    
1671
    /* (non-Javadoc)
1672
     * @see org.cresques.io.DxfFile.EntityFactory#createCircle(org.cresques.io.DxfGroupVector)
1673
     */
1674
    public void createCircle(DxfGroupVector grp) throws Exception {
1675
        double x = 0.0;
1676
        double y = 0.0;
1677
        double z = 0.0;
1678
        double r = 0.0;
1679
        Point3D firstPt = new Point3D();
1680
        DxfGroup g = null;
1681
        double extx = 0.0;
1682
        double exty = 0.0;
1683
        double extz = 1.0;
1684
        LineString3D lineString3D = new LineString3D();
1685
        Polygon3D polygon3D = new Polygon3D();
1686
        Feature feaBordes = new Feature();
1687
        Feature feaFondos = new Feature();
1688

    
1689
        feaBordes.setProp("dxfEntity", "Circle");
1690
        feaFondos.setProp("dxfEntity", "Circle");
1691

    
1692
        if (grp.hasCode(8)) {
1693
            feaBordes.setProp("layer", grp.getDataAsString(8));
1694
        }
1695

    
1696
        feaFondos.setProp("layer", grp.getDataAsString(8));
1697

    
1698
        if (grp.hasCode(39)) {
1699
            Double doub = new Double(grp.getDataAsDouble(39));
1700
            String string = doub.toString();
1701
            feaBordes.setProp("thickness", string);
1702
            feaFondos.setProp("thickness", string);
1703
        } else {
1704
            Double doub = new Double(0.0);
1705
            feaBordes.setProp("thickness", doub.toString());
1706
            feaFondos.setProp("thickness", doub.toString());
1707
        }
1708

    
1709
        if (grp.hasCode(62)) {
1710
            Integer integer = new Integer(grp.getDataAsInt(62));
1711
            String string = integer.toString();
1712
            feaBordes.setProp("color", string);
1713
            feaFondos.setProp("color", string);
1714
            feaBordes.setProp("colorByLayer", "false");
1715
            feaFondos.setProp("colorByLayer", "false");
1716
        } else {
1717
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
1718
            int clr = layer.colorNumber;
1719
            Integer integer = new Integer(clr);
1720
            String string = integer.toString();
1721
            feaBordes.setProp("color", string);
1722
            feaFondos.setProp("color", string);
1723
            feaBordes.setProp("colorByLayer", "true");
1724
            feaFondos.setProp("colorByLayer", "true");
1725
        }
1726

    
1727
        x = grp.getDataAsDouble(10);
1728
        y = grp.getDataAsDouble(20);
1729
        z = grp.getDataAsDouble(30);
1730

    
1731
        /*if (grp.hasCode(30)) {
1732
            z = grp.getDataAsDouble(30);
1733
            Double doub = new Double(z);
1734
            String string = doub.toString();
1735
            feaBordes.setProp("elevation", string);
1736
            feaFondos.setProp("elevation", string);
1737
        } else {
1738
            Double doub = new Double(0.0);
1739
            feaBordes.setProp("elevation", doub.toString());
1740
            feaFondos.setProp("elevation", doub.toString());
1741
        }*/
1742
        if (grp.hasCode(40)) {
1743
            r = grp.getDataAsDouble(40);
1744
        }
1745

    
1746
        if (grp.hasCode(210)) {
1747
            extx = grp.getDataAsDouble(210);
1748
        }
1749

    
1750
        if (grp.hasCode(220)) {
1751
            exty = grp.getDataAsDouble(220);
1752
        }
1753

    
1754
        if (grp.hasCode(230)) {
1755
            extz = grp.getDataAsDouble(230);
1756
        }
1757

    
1758
        Point3D point_in = new Point3D(x, y, z);
1759
        Point3D xtru = new Point3D(extx, exty, extz);
1760
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
1761
        x = point_out.getX();
1762
        y = point_out.getY();
1763
        z = point_out.getZ();
1764

    
1765
        Double doub = new Double(z);
1766
        feaBordes.setProp("elevation", doub.toString());
1767
        feaFondos.setProp("elevation", doub.toString());
1768

    
1769
        if (z != 0.0) {
1770
            dxf3DFile = true;
1771
        }
1772

    
1773
        Point2D c = proj.createPoint(x, y);
1774
        Point3D center = new Point3D(c.getX(), c.getY(), z);
1775
        Point3D[] pts = new Point3D[360];
1776
        int angulo = 0;
1777

    
1778
        for (angulo = 0; angulo < 360; angulo++) {
1779
            pts[angulo] = new Point3D(center.getX(), center.getY(),
1780
                                      center.getZ());
1781
            pts[angulo] = new Point3D(pts[angulo].getX() +
1782
                                      (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1783
                                      pts[angulo].getY() +
1784
                                      (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1785
                                      center.getZ());
1786

    
1787
            if (pts.length == 1) {
1788
                firstPt = pts[angulo];
1789
            }
1790
        }
1791

    
1792
        for (int i = 0; i < pts.length; i++) {
1793
            lineString3D.add(pts[i]);
1794
            polygon3D.add(pts[i]);
1795
        }
1796

    
1797
        feaBordes.setGeometry(lineString3D);
1798
        feaFondos.setGeometry(polygon3D);
1799

    
1800
        // 041130: Rellena las props con los atributos.
1801
        completeAttributes(feaBordes);
1802
        completeAttributes(feaFondos);
1803

    
1804
        //features.add(feature);
1805
        if (addingToBlock == false) {
1806
            //System.out.println("createCircle(): A?ade un circulo a la lista de entidades");
1807
            //features.add(feaBordes);
1808
            features.add(feaFondos);
1809
        } else {
1810
            //System.out.println("createCircle(): A?adimos un circulo al bloque " + iterator);
1811
            //blk.add(feaBordes);
1812
            blk.add(feaFondos);
1813
        }
1814
    }
1815

    
1816
    /* (non-Javadoc)
1817
     * @see org.cresques.io.DxfFile.EntityFactory#createArc(org.cresques.io.DxfGroupVector)
1818
     */
1819
    public void createArc(DxfGroupVector grp) throws Exception {
1820
        double x = 0.0;
1821
        double y = 0.0;
1822
        double z = 0.0;
1823
        double r = 0.0;
1824
        double empieza = 0.0;
1825
        double acaba = 0.0;
1826
        DxfGroup g = null;
1827
        double extx = 0.0;
1828
        double exty = 0.0;
1829
        double extz = 1.0;
1830
        LineString3D lineString3D = new LineString3D();
1831
        Feature feature = new Feature();
1832

    
1833
        feature.setProp("dxfEntity", "Arc");
1834

    
1835
        if (grp.hasCode(8)) {
1836
            feature.setProp("layer", grp.getDataAsString(8));
1837
        }
1838

    
1839
        if (grp.hasCode(39)) {
1840
            Double doub = new Double(grp.getDataAsDouble(39));
1841
            String string = doub.toString();
1842
            feature.setProp("thickness", string);
1843
        } else {
1844
            Double doub = new Double(0.0);
1845
            feature.setProp("thickness", doub.toString());
1846
        }
1847

    
1848
        if (grp.hasCode(62)) {
1849
            Integer integer = new Integer(grp.getDataAsInt(62));
1850
            String string = integer.toString();
1851
            feature.setProp("color", string);
1852
            feature.setProp("colorByLayer", "false");
1853
        } else {
1854
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
1855
            int clr = layer.colorNumber;
1856
            Integer integer = new Integer(clr);
1857
            String string = integer.toString();
1858
            feature.setProp("color", string);
1859
            feature.setProp("colorByLayer", "true");
1860
        }
1861

    
1862
        x = grp.getDataAsDouble(10);
1863
        y = grp.getDataAsDouble(20);
1864
        z = grp.getDataAsDouble(30);
1865

    
1866
        /*if (grp.hasCode(30)) {
1867
            z = grp.getDataAsDouble(30);
1868
            Double doub = new Double(z);
1869
            String string = doub.toString();
1870
            feature.setProp("elevation", string);
1871
        } else {
1872
            Double doub = new Double(0.0);
1873
            feature.setProp("elevation", doub.toString());
1874
        }*/
1875
        if (grp.hasCode(40)) {
1876
            r = grp.getDataAsDouble(40);
1877
        }
1878

    
1879
        if (grp.hasCode(50)) {
1880
            empieza = grp.getDataAsDouble(50);
1881
        }
1882

    
1883
        if (grp.hasCode(51)) {
1884
            acaba = grp.getDataAsDouble(51);
1885
        }
1886

    
1887
        if (grp.hasCode(210)) {
1888
            extx = grp.getDataAsDouble(210);
1889
        }
1890

    
1891
        if (grp.hasCode(220)) {
1892
            exty = grp.getDataAsDouble(220);
1893
        }
1894

    
1895
        if (grp.hasCode(230)) {
1896
            extz = grp.getDataAsDouble(230);
1897
        }
1898

    
1899
        Point3D point_in = new Point3D(x, y, z);
1900
        Point3D xtru = new Point3D(extx, exty, extz);
1901
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
1902
        x = point_out.getX();
1903
        y = point_out.getY();
1904
        z = point_out.getZ();
1905

    
1906
        Double doub = new Double(z);
1907
        feature.setProp("elevation", doub.toString());
1908

    
1909
        if (z != 0.0) {
1910
            dxf3DFile = true;
1911
        }
1912

    
1913
        Point2D c = proj.createPoint(x, y);
1914
        Point3D center = new Point3D(c.getX(), c.getY(), z);
1915

    
1916
        //System.out.println("empieza = " + empieza + ", acaba = " + acaba);
1917
        int iempieza = (int) empieza;
1918
        int iacaba = (int) acaba;
1919

    
1920
        //System.out.println("iempieza = " + iempieza + ", iacaba = " + iacaba);
1921
        double angulo = 0;
1922
        Point3D[] pts = null;
1923

    
1924
        if (empieza <= acaba) {
1925
            pts = new Point3D[(iacaba - iempieza) + 2];
1926
            angulo = empieza;
1927
            pts[0] = new Point3D(center.getX() +
1928
                                 (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1929
                                 center.getY() +
1930
                                 (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1931
                                 center.getZ());
1932

    
1933
            for (int i = 1; i <= ((iacaba - iempieza) + 1); i++) {
1934
                angulo = (double) (iempieza + i);
1935
                pts[i] = new Point3D(center.getX() +
1936
                                     (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1937
                                     center.getY() +
1938
                                     (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1939
                                     center.getZ());
1940
            }
1941

    
1942
            angulo = acaba;
1943
            pts[(iacaba - iempieza) + 1] = new Point3D(center.getX() +
1944
                                                       (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1945
                                                       center.getY() +
1946
                                                       (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1947
                                                       center.getZ());
1948
        } else {
1949
            pts = new Point3D[(360 - iempieza) + iacaba + 2];
1950
            angulo = empieza;
1951

    
1952
            //System.out.println("pts[0] = " + pts[0] + ", center = " + center + ", angulo = " + angulo);
1953
            pts[0] = new Point3D(center.getX() +
1954
                                 (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1955
                                 center.getY() +
1956
                                 (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1957
                                 center.getZ());
1958

    
1959
            for (int i = 1; i <= (360 - iempieza); i++) {
1960
                angulo = (double) (iempieza + i);
1961
                pts[i] = new Point3D(center.getX() +
1962
                                     (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1963
                                     center.getY() +
1964
                                     (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1965
                                     center.getZ());
1966
            }
1967

    
1968
            for (int i = (360 - iempieza) + 1;
1969
                     i <= ((360 - iempieza) + iacaba); i++) {
1970
                angulo = (double) (i - (360 - iempieza));
1971
                pts[i] = new Point3D(center.getX() +
1972
                                     (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1973
                                     center.getY() +
1974
                                     (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1975
                                     center.getZ());
1976
            }
1977

    
1978
            angulo = acaba;
1979
            pts[(360 - iempieza) + iacaba + 1] = new Point3D(center.getX() +
1980
                                                             (r * Math.cos((angulo * Math.PI) / (double) 180.0)),
1981
                                                             center.getY() +
1982
                                                             (r * Math.sin((angulo * Math.PI) / (double) 180.0)),
1983
                                                             center.getZ());
1984
        }
1985

    
1986
        for (int i = 0; i < pts.length; i++) {
1987
            lineString3D.add(pts[i]);
1988
        }
1989

    
1990
        feature.setGeometry(lineString3D);
1991

    
1992
        // 041130: Rellena las props con los atributos.
1993
        completeAttributes(feature);
1994

    
1995
        //features.add(feature);
1996
        if (addingToBlock == false) {
1997
            features.add(feature);
1998
        } else {
1999
            //System.out.println("createArc(): A?adimos un arco al bloque " + iterator);
2000
            blk.add(feature);
2001
        }
2002
    }
2003

    
2004
    /* (non-Javadoc)
2005
     * @see org.cresques.io.DxfFile.EntityFactory#createInsert(org.cresques.io.DxfGroupVector)
2006
     */
2007
    public void createInsert(DxfGroupVector grp) throws Exception {
2008
        double x = 0.0;
2009
        double y = 0.0;
2010
        double z = 0.0;
2011
        DxfGroup g = null;
2012
        Point3D pt = new Point3D(0.0, 0.0, 0.0);
2013
        Point3D scaleFactor = new Point3D(1.0, 1.0, 1.0);
2014
        double rotAngle = 0.0;
2015
        String blockName = "";
2016
        double extx = 0.0;
2017
        double exty = 0.0;
2018
        double extz = 1.0;
2019

    
2020
        InsPoint3D insert = new InsPoint3D();
2021
        Feature feature = new Feature();
2022
        org.cresques.px.gml.Point3D secondGeom = new org.cresques.px.gml.Point3D();
2023
        Feature secondFeat = new Feature();
2024
        int attributesFollowFlag = 0;
2025

    
2026
        feature.setProp("dxfEntity", "Insert");
2027
        secondFeat.setProp("dxfEntity", "Insert");
2028

    
2029
        if (grp.hasCode(2)) {
2030
            blockName = grp.getDataAsString(2);
2031

    
2032
            //feature.setProp("blockName", blockName);
2033
            insert.setBlockName(blockName);
2034
        }
2035

    
2036
        if (grp.hasCode(8)) {
2037
            feature.setProp("layer", grp.getDataAsString(8));
2038
            secondFeat.setProp("layer", grp.getDataAsString(8));
2039
        }
2040

    
2041
        Double doub = new Double(0.0);
2042
        secondFeat.setProp("thickness", doub.toString());
2043

    
2044
        if (grp.hasCode(62)) {
2045
            Integer integer = new Integer(grp.getDataAsInt(62));
2046
            String string = integer.toString();
2047
            feature.setProp("color", string);
2048
            secondFeat.setProp("color", string);
2049
            feature.setProp("colorByLayer", "false");
2050
            secondFeat.setProp("colorByLayer", "false");
2051
        } else {
2052
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2053
            int clr = layer.colorNumber;
2054
            Integer integer = new Integer(clr);
2055
            String string = integer.toString();
2056
            feature.setProp("color", string);
2057
            secondFeat.setProp("color", string);
2058
            feature.setProp("colorByLayer", "true");
2059
            secondFeat.setProp("colorByLayer", "true");
2060
        }
2061

    
2062
        if (grp.hasCode(66)) {
2063
            attributesFollowFlag = grp.getDataAsInt(66);
2064
        }
2065

    
2066
        x = grp.getDataAsDouble(10);
2067
        y = grp.getDataAsDouble(20);
2068
        z = grp.getDataAsDouble(30);
2069

    
2070
        /*if (grp.hasCode(30)) {
2071
            z = grp.getDataAsDouble(30);
2072
            Double doubz = new Double(z);
2073
            String string = doubz.toString();
2074
            feature.setProp("elevation", string);
2075
            secondFeat.setProp("elevation", string);
2076
        } else {
2077
            Double elev = new Double(z);
2078
            //feature.setProp("elevation", doub.toString());
2079
            feature.setProp("elevation", elev.toString());
2080
            secondFeat.setProp("elevation", elev.toString());
2081
        }*/
2082
        if (grp.hasCode(41)) {
2083
            scaleFactor.setLocation(grp.getDataAsDouble(41), scaleFactor.getY());
2084
            insert.setScaleFactor(scaleFactor);
2085
        } else {
2086
            insert.setScaleFactor(scaleFactor);
2087
        }
2088

    
2089
        if (grp.hasCode(42)) {
2090
            scaleFactor.setLocation(scaleFactor.getX(), grp.getDataAsDouble(42));
2091
            insert.setScaleFactor(scaleFactor);
2092
        } else {
2093
            insert.setScaleFactor(scaleFactor);
2094
        }
2095

    
2096
        if (grp.hasCode(43)) {
2097
            scaleFactor = new Point3D(scaleFactor.getX(), scaleFactor.getY(),
2098
                                      grp.getDataAsDouble(43));
2099
            insert.setScaleFactor(scaleFactor);
2100
        } else {
2101
            insert.setScaleFactor(scaleFactor);
2102
        }
2103

    
2104
        if (grp.hasCode(50)) {
2105
            rotAngle = grp.getDataAsDouble(50);
2106
            insert.setRotAngle(rotAngle);
2107
        }
2108

    
2109
        if (grp.hasCode(210)) {
2110
            extx = grp.getDataAsDouble(210);
2111
        }
2112

    
2113
        if (grp.hasCode(220)) {
2114
            exty = grp.getDataAsDouble(220);
2115
        }
2116

    
2117
        if (grp.hasCode(230)) {
2118
            extz = grp.getDataAsDouble(230);
2119
        }
2120

    
2121
        Point3D point_in = new Point3D(x, y, z);
2122
        Point3D xtru = new Point3D(extx, exty, extz);
2123
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
2124
        x = point_out.getX();
2125
        y = point_out.getY();
2126
        z = point_out.getZ();
2127

    
2128
        Double doubz = new Double(z);
2129
        feature.setProp("elevation", doubz.toString());
2130
        secondFeat.setProp("elevation", doubz.toString());
2131

    
2132
        if (z != 0.0) {
2133
            dxf3DFile = true;
2134
        }
2135

    
2136
        insert.setBlkList(blkList);
2137

    
2138
        insert.encuentraBloque(blockName);
2139

    
2140
        insert.add(new Point3D(x, y, z));
2141
        secondGeom.add(new Point3D(x, y, z));
2142

    
2143
        feature.setGeometry(insert);
2144
        secondFeat.setGeometry(secondGeom);
2145

    
2146
        // 041130: Rellena las props con los atributos.
2147
        completeAttributes(feature);
2148
        completeAttributes(secondFeat);
2149

    
2150
        /*for (int i=0;i<attributes.size();i++) {
2151
            String[] att = new String[2];
2152
            att = (String[])attributes.get(i);
2153
            secondFeat.setProp(att[0],att[1]);
2154
        }*/
2155
        if ((insert.getBlockFound() == true) && (attributesFollowFlag != 1)) {
2156
            gestionaInsert(feature);
2157
        }
2158

    
2159
        //if (addingToBlock == false) {
2160
        //features.add(secondFeat);
2161
        //}
2162
        //if (addingToBlock == true/* && insert.getBlockFound() == true*/) {
2163
        //System.out.println("createInsert(): A?adimos un insert al bloque " + iterator);
2164
        //blk.add(feature);
2165
        //}
2166
        // 041129: A?adido para implementar los ATTRIBS.
2167
        if (attributesFollowFlag == 1) {
2168
            isDoubleFeatured = true;
2169
            lastFeaBordes = feature;
2170
            lastFeaFondos = secondFeat;
2171
        } else {
2172
            if (addingToBlock == false) {
2173
                features.add(secondFeat);
2174
            }
2175

    
2176
            if (addingToBlock == true /* && insert.getBlockFound() == true*/) {
2177
                //System.out.println("createInsert(): A?adimos un insert al bloque " + iterator);
2178
                blk.add(feature);
2179
            }
2180
        }
2181
    }
2182

    
2183
    /* (non-Javadoc)
2184
     * @see org.cresques.io.DxfFile.EntityFactory#createSolid(org.cresques.io.DxfGroupVector)
2185
     */
2186
    public void createSolid(DxfGroupVector grp) throws Exception {
2187
        double x = 0.0;
2188
        double y = 0.0;
2189
        double z1 = 0.0;
2190
        double z2 = 0.0;
2191
        double z3 = 0.0;
2192
        double z4 = 0.0;
2193
        DxfGroup g = null;
2194

    
2195
        //Point2D pt1 = null, pt2 = null, pt3 = null, pt4 = null;
2196
        Point3D[] pts = new Point3D[4];
2197

    
2198
        //DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2199
        double extx = 0.0;
2200
        double exty = 0.0;
2201
        double extz = 1.0;
2202

    
2203
        LineString3D lineString3D = new LineString3D();
2204
        Polygon3D polygon3D = new Polygon3D();
2205
        Feature feaBordes = new Feature();
2206
        Feature feaFondos = new Feature();
2207

    
2208
        //double elev = 0;
2209
        feaBordes.setProp("dxfEntity", "Solid");
2210
        feaFondos.setProp("dxfEntity", "Solid");
2211

    
2212
        if (grp.hasCode(8)) {
2213
            feaBordes.setProp("layer", grp.getDataAsString(8));
2214
        }
2215

    
2216
        feaFondos.setProp("layer", grp.getDataAsString(8));
2217
        x = grp.getDataAsDouble(10);
2218
        y = grp.getDataAsDouble(20);
2219
        z1 = grp.getDataAsDouble(30);
2220

    
2221
        /*if (grp.hasCode(30)) {
2222
            z1 = grp.getDataAsDouble(30);
2223
        } else {
2224
            Double doub = new Double(0.0);
2225
            feaBordes.setProp("elevation", doub.toString());
2226
            feaFondos.setProp("elevation", doub.toString());
2227
        }*/
2228
        Point2D pto = proj.createPoint(x, y);
2229
        Point3D pto3D = new Point3D(pto.getX(), pto.getY(), z1);
2230
        pts[0] = pto3D;
2231
        x = grp.getDataAsDouble(11);
2232
        y = grp.getDataAsDouble(21);
2233
        z2 = grp.getDataAsDouble(31);
2234
        pto = proj.createPoint(x, y);
2235
        pto3D = new Point3D(pto.getX(), pto.getY(), z2);
2236
        pts[1] = pto3D;
2237
        x = grp.getDataAsDouble(12);
2238
        y = grp.getDataAsDouble(22);
2239
        z3 = grp.getDataAsDouble(32);
2240
        pto = proj.createPoint(x, y);
2241
        pto3D = new Point3D(pto.getX(), pto.getY(), z3);
2242
        pts[2] = pto3D;
2243

    
2244
        if (grp.hasCode(13)) {
2245
            x = grp.getDataAsDouble(13);
2246
        }
2247

    
2248
        if (grp.hasCode(23)) {
2249
            y = grp.getDataAsDouble(23);
2250
        }
2251

    
2252
        if (grp.hasCode(33)) {
2253
            z4 = grp.getDataAsDouble(33);
2254
        }
2255

    
2256
        pto = proj.createPoint(x, y);
2257
        pto3D = new Point3D(pto.getX(), pto.getY(), z4);
2258
        pts[3] = pto3D;
2259

    
2260
        if (grp.hasCode(39)) {
2261
            Double doub = new Double(grp.getDataAsDouble(39));
2262
            String string = doub.toString();
2263
            feaBordes.setProp("thickness", string);
2264
            feaFondos.setProp("thickness", string);
2265
        } else {
2266
            Double doub = new Double(0.0);
2267
            feaBordes.setProp("thickness", doub.toString());
2268
            feaFondos.setProp("thickness", doub.toString());
2269
        }
2270

    
2271
        if (grp.hasCode(62)) {
2272
            Integer integer = new Integer(grp.getDataAsInt(62));
2273
            String string = integer.toString();
2274
            feaBordes.setProp("color", string);
2275
            feaFondos.setProp("color", string);
2276
            feaBordes.setProp("colorByLayer", "false");
2277
            feaFondos.setProp("colorByLayer", "false");
2278
        } else {
2279
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2280
            int clr = layer.colorNumber;
2281
            Integer integer = new Integer(clr);
2282
            String string = integer.toString();
2283
            feaBordes.setProp("color", string);
2284
            feaFondos.setProp("color", string);
2285
            feaBordes.setProp("colorByLayer", "true");
2286
            feaFondos.setProp("colorByLayer", "true");
2287
        }
2288

    
2289
        if (grp.hasCode(210)) {
2290
            extx = grp.getDataAsDouble(210);
2291
        }
2292

    
2293
        if (grp.hasCode(220)) {
2294
            exty = grp.getDataAsDouble(220);
2295
        }
2296

    
2297
        if (grp.hasCode(230)) {
2298
            extz = grp.getDataAsDouble(230);
2299
        }
2300

    
2301
        Point3D point_in1 = new Point3D(pts[0].getX(), pts[0].getY(), z1);
2302
        Point3D point_in2 = new Point3D(pts[1].getX(), pts[1].getY(), z2);
2303
        Point3D point_in3 = new Point3D(pts[2].getX(), pts[2].getY(), z3);
2304
        Point3D point_in4 = new Point3D(pts[3].getX(), pts[3].getY(), z4);
2305
        Point3D xtru = new Point3D(extx, exty, extz);
2306
        Point3D point_out1 = DxfCalXtru.CalculateXtru(point_in1, xtru);
2307
        Point3D point_out2 = DxfCalXtru.CalculateXtru(point_in2, xtru);
2308
        Point3D point_out3 = DxfCalXtru.CalculateXtru(point_in3, xtru);
2309
        Point3D point_out4 = DxfCalXtru.CalculateXtru(point_in4, xtru);
2310
        pts[0] = new Point3D(point_out1);
2311
        pts[1] = new Point3D(point_out2);
2312
        pts[2] = new Point3D(point_out3);
2313
        pts[3] = new Point3D(point_out4);
2314

    
2315
        if ((pts[0].getZ() != 0.0) || (pts[1].getZ() != 0.0) ||
2316
                (pts[2].getZ() != 0.0) || (pts[3].getZ() != 0.0)) {
2317
            dxf3DFile = true;
2318
        }
2319

    
2320
        Point3D aux = pts[3];
2321
        pts[2] = pts[3];
2322
        pts[3] = aux;
2323

    
2324
        if ((pts[0].getZ() == pts[1].getZ()) &&
2325
                (pts[1].getZ() == pts[2].getZ()) &&
2326
                (pts[2].getZ() == pts[3].getZ())) {
2327
            Double doub = new Double(pts[0].getZ());
2328
            String string = doub.toString();
2329
            feaBordes.setProp("elevation", string);
2330
            feaFondos.setProp("elevation", string);
2331
        } else {
2332
            Double doub = new Double(0.0);
2333
            String string = doub.toString();
2334
            feaBordes.setProp("elevation", string);
2335
            feaFondos.setProp("elevation", string);
2336
        }
2337

    
2338
        for (int i = 0; i < pts.length; i++) {
2339
            lineString3D.add(pts[i]);
2340
            polygon3D.add(pts[i]);
2341
        }
2342

    
2343
        // Para cerrarlos.
2344
        lineString3D.add(pts[0]);
2345
        polygon3D.add(pts[0]);
2346

    
2347
        feaBordes.setGeometry(lineString3D);
2348
        feaFondos.setGeometry(polygon3D);
2349

    
2350
        // 041130: Rellena las props con los atributos.
2351
        completeAttributes(feaBordes);
2352
        completeAttributes(feaFondos);
2353

    
2354
        //features.add(feature);
2355
        if (addingToBlock == false) {
2356
            //System.out.println("createSolid(): A?ade un solid a la lista de entidades");
2357
            //features.add(feaBordes);
2358
            features.add(feaFondos);
2359
        } else {
2360
            //System.out.println("createSolid(): A?adimos un circulo al bloque " + iterator);
2361
            //blk.add(feaBordes);
2362
            blk.add(feaFondos);
2363
        }
2364
    }
2365

    
2366
    /* (non-Javadoc)
2367
     * @see org.cresques.io.DxfFile.EntityFactory#createSpline(org.cresques.io.DxfGroupVector)
2368
     */
2369
    public void createSpline(DxfGroupVector grp) throws Exception {
2370
        double x = 0.0; //elev = 0.0;
2371
        double y = 0.0; //elev = 0.0;
2372
        double z = 0.0; //elev = 0.0;
2373

    
2374
        //double elev = 0.0;
2375
        DxfGroup g = null;
2376
        LineString3D lineString3D = new LineString3D();
2377
        Polygon3D polygon3D = new Polygon3D();
2378

    
2379
        //Geometry geometria;
2380
        //Feature feature= new Feature();
2381
        Feature feaBordes = new Feature();
2382
        Feature feaFondos = new Feature();
2383
        int flags = 0;
2384

    
2385
        //feature.setProp("dxfEntity", "LwPolyline");
2386
        feaBordes.setProp("dxfEntity", "Spline");
2387
        feaFondos.setProp("dxfEntity", "Spline");
2388

    
2389
        if (grp.hasCode(8)) {
2390
            //feature.setProp("layer", grp.getDataAsString(8));
2391
            feaBordes.setProp("layer", grp.getDataAsString(8));
2392
            feaFondos.setProp("layer", grp.getDataAsString(8));
2393
        }
2394

    
2395
        if (grp.hasCode(39)) {
2396
            Double doub = new Double(grp.getDataAsDouble(39));
2397
            String string = doub.toString();
2398

    
2399
            //feature.setProp("thickness", string);
2400
            feaBordes.setProp("thickness", string);
2401
            feaFondos.setProp("thickness", string);
2402
        } else {
2403
            Double doub = new Double(0.0);
2404

    
2405
            //feature.setProp("thickness", doub.toString());
2406
            feaBordes.setProp("thickness", doub.toString());
2407
            feaFondos.setProp("thickness", doub.toString());
2408
        }
2409

    
2410
        if (grp.hasCode(62)) {
2411
            Integer integer = new Integer(grp.getDataAsInt(62));
2412
            String string = integer.toString();
2413

    
2414
            //feature.setProp("color", string);
2415
            feaBordes.setProp("color", string);
2416
            feaFondos.setProp("color", string);
2417
            feaBordes.setProp("colorByLayer", "false");
2418
            feaFondos.setProp("colorByLayer", "false");
2419
        } else {
2420
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2421
            int clr = layer.colorNumber;
2422
            Integer integer = new Integer(clr);
2423
            String string = integer.toString();
2424

    
2425
            //feature.setProp("color", string);
2426
            feaBordes.setProp("color", string);
2427
            feaFondos.setProp("color", string);
2428
            feaBordes.setProp("colorByLayer", "true");
2429
            feaFondos.setProp("colorByLayer", "true");
2430
        }
2431

    
2432
        if (grp.hasCode(70)) {
2433
            flags = grp.getDataAsInt(70);
2434
        }
2435

    
2436
        if ((flags & 0x01) == 0x01) {
2437
            //geometria = new Polygon();
2438
            feaBordes.setGeometry(lineString3D);
2439
            feaFondos.setGeometry(polygon3D);
2440
            isDoubleFeatured = true;
2441
        } else {
2442
            //geometria = new LineString();
2443
            feaBordes.setGeometry(lineString3D);
2444
            isDoubleFeatured = false;
2445
        }
2446

    
2447
        int j = 0;
2448
        double firstX = 0.0;
2449
        double firstY = 0.0;
2450
        double firstZ = 0.0;
2451

    
2452
        for (int i = 0; i < grp.size(); i++) {
2453
            g = (DxfGroup) grp.get(i);
2454

    
2455
            if (g.getCode() == 10) {
2456
                j++;
2457
                x = ((Double) g.getData()).doubleValue();
2458
            } else if (g.getCode() == 20) {
2459
                y = ((Double) g.getData()).doubleValue();
2460
            } else if (g.getCode() == 30) {
2461
                z = ((Double) g.getData()).doubleValue();
2462

    
2463
                Point2D p = proj.createPoint(x, y);
2464
                Point3D p3d = new Point3D(p.getX(), p.getY(), z);
2465
                lineString3D.add(p3d);
2466

    
2467
                if (isDoubleFeatured) {
2468
                    polygon3D.add(p3d);
2469
                }
2470

    
2471
                if (j == 1) {
2472
                    firstX = x;
2473
                    firstY = y;
2474
                    firstZ = z;
2475
                }
2476

    
2477
                //elev = z;
2478
                x = 0.0;
2479
                y = 0.0;
2480
                z = 0.0;
2481
            }
2482
        }
2483

    
2484
        //Double doub = new Double(elev);
2485
        //String string = doub.toString();
2486
        //feature.setProp("elevation", string);
2487
        //feaBordes.setProp("elevation", string);
2488
        //feaFondos.setProp("elevation", string);
2489
        if (isDoubleFeatured) {
2490
            Point2D p = proj.createPoint(firstX, firstY);
2491
            Point3D p3d = new Point3D(p.getX(), p.getY(), z);
2492
            lineString3D.add(p3d);
2493
            polygon3D.add(p3d);
2494
        }
2495

    
2496
        double zprev = 0;
2497
        boolean constSplineElev = true;
2498

    
2499
        for (int i = 0; i < lineString3D.pointNr(); i++) {
2500
            z = lineString3D.getPoint3D(i).getZ();
2501

    
2502
            if (z != 0.0) {
2503
                dxf3DFile = true;
2504
            }
2505

    
2506
            if ((i > 0) && (z != zprev)) {
2507
                constSplineElev = false;
2508
            }
2509

    
2510
            zprev = z;
2511
        }
2512

    
2513
        if (constSplineElev) {
2514
            Double doub = new Double(lineString3D.getPoint3D(0).getZ());
2515
            String string = doub.toString();
2516
            feaBordes.setProp("elevation", string);
2517

    
2518
            if (isDoubleFeatured) {
2519
                feaFondos.setProp("elevation", string);
2520
            }
2521
        } else {
2522
            Double doub = new Double(0.0);
2523
            String string = doub.toString();
2524
            feaBordes.setProp("elevation", string);
2525

    
2526
            if (isDoubleFeatured) {
2527
                feaFondos.setProp("elevation", string);
2528
            }
2529
        }
2530

    
2531
        lastFeaBordes = feaBordes;
2532

    
2533
        if (isDoubleFeatured) {
2534
            lastFeaFondos = feaFondos;
2535
        }
2536

    
2537
        // 041130: Rellena las props con los atributos.
2538
        completeAttributes(feaBordes);
2539
        completeAttributes(feaFondos);
2540

    
2541
        //features.add(feature);
2542
        if (addingToBlock == false) {
2543
            if (isDoubleFeatured) {
2544
                features.add(feaFondos);
2545
            } else {
2546
                features.add(feaBordes);
2547
            }
2548
        } else {
2549
            //System.out.println("createLwPolyline(): A?adimos una lwpolilinea al bloque " + iterator);
2550
            if (isDoubleFeatured) {
2551
                blk.add(feaFondos);
2552
            } else {
2553
                blk.add(feaBordes);
2554
            }
2555
        }
2556

    
2557
        isDoubleFeatured = false;
2558
    }
2559

    
2560
    /* (non-Javadoc)
2561
     * @see org.cresques.io.DxfFile.EntityFactory#createAttdef(org.cresques.io.DxfGroupVector)
2562
     */
2563
    public void createAttdef(DxfGroupVector grp) throws Exception {
2564
        DxfGroup g = null;
2565

    
2566
        String defaultValue = "";
2567
        String tagString = "";
2568
        String textStyleName = "";
2569
        String[] attribute = new String[2];
2570
        boolean tagDefined = false;
2571
        boolean defValDefined = false;
2572

    
2573
        if (grp.hasCode(1)) {
2574
            defaultValue = grp.getDataAsString(1);
2575
            attribute[1] = DxfConvTexts.ConvertText(defaultValue);
2576
            defValDefined = true;
2577

    
2578
            if (tagDefined) {
2579
                attributes.add(attribute);
2580
            }
2581
        }
2582

    
2583
        if (grp.hasCode(2)) {
2584
            tagString = grp.getDataAsString(2);
2585
            attribute[0] = DxfConvTexts.ConvertText(tagString);
2586
            tagDefined = true;
2587

    
2588
            if (defValDefined) {
2589
                attributes.add(attribute);
2590
            }
2591
        }
2592

    
2593
        if (grp.hasCode(7)) {
2594
            textStyleName = grp.getDataAsString(7);
2595
            textStyleName = DxfConvTexts.ConvertText(textStyleName);
2596
        }
2597

    
2598
        setNewAttributes();
2599
    }
2600

    
2601
    /* (non-Javadoc)
2602
     * @see org.cresques.io.DxfFile.EntityFactory#createAttrib(org.cresques.io.DxfGroupVector)
2603
     */
2604
    public void createAttrib(DxfGroupVector grp) throws Exception {
2605
        double x = 0.0;
2606
        double y = 0.0;
2607
        double z = 0.0;
2608
        double h = 0.0;
2609
        double rot = 0.0;
2610
        DxfGroup g = null;
2611

    
2612
        //Point2D pt1 = null, pt2 = null;
2613
        Point3D pt = null;
2614
        org.cresques.px.gml.Point3D point = new org.cresques.px.gml.Point3D();
2615

    
2616
        point.setTextPoint(true);
2617

    
2618
        String defaultValue = "";
2619
        String tagString = "";
2620
        String textStyleName = "";
2621
        String[] att = new String[2];
2622
        boolean tagDefined = false;
2623
        boolean defValDefined = false;
2624
        int attributeFlags = 0;
2625

    
2626
        double extx = 0.0;
2627
        double exty = 0.0;
2628
        double extz = 1.0;
2629

    
2630
        Feature insFea = lastFeaBordes;
2631
        Feature ptFea = lastFeaFondos;
2632

    
2633
        Feature feature = new Feature();
2634

    
2635
        feature.setProp("dxfEntity", "Attrib"); // <-- Es un INSERT con attributes.
2636

    
2637
        if (grp.hasCode(8)) {
2638
            feature.setProp("layer", grp.getDataAsString(8));
2639
        }
2640

    
2641
        if (grp.hasCode(39)) {
2642
            Double doub = new Double(grp.getDataAsDouble(39));
2643
            String string = doub.toString();
2644
            feature.setProp("thickness", string);
2645
        } else {
2646
            Double doub = new Double(0.0);
2647
            feature.setProp("thickness", doub.toString());
2648
        }
2649

    
2650
        if (grp.hasCode(62)) {
2651
            Integer integer = new Integer(grp.getDataAsInt(62));
2652
            String string = integer.toString();
2653
            feature.setProp("color", string);
2654
            feature.setProp("colorByLayer", "false");
2655
        } else {
2656
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2657
            int clr = layer.colorNumber;
2658
            Integer integer = new Integer(clr);
2659
            String string = integer.toString();
2660
            feature.setProp("color", string);
2661
            feature.setProp("colorByLayer", "true");
2662
        }
2663

    
2664
        if (grp.hasCode(1)) {
2665
            String strAux1 = grp.getDataAsString(1);
2666
            strAux1 = DxfConvTexts.ConvertText(strAux1);
2667
            defaultValue = strAux1;
2668
            att[1] = DxfConvTexts.ConvertText(defaultValue);
2669
            defValDefined = true;
2670

    
2671
            if (tagDefined) {
2672
                insFea.setProp(att[0], att[1]);
2673
                ptFea.setProp(att[0], att[1]);
2674
            }
2675

    
2676
            feature.setProp("text", strAux1);
2677
        }
2678

    
2679
        if (grp.hasCode(2)) {
2680
            String strAux2 = grp.getDataAsString(2);
2681
            strAux2 = DxfConvTexts.ConvertText(strAux2);
2682
            tagString = strAux2;
2683
            att[0] = DxfConvTexts.ConvertText(tagString);
2684
            tagDefined = true;
2685

    
2686
            if (defValDefined) {
2687
                insFea.setProp(att[0], att[1]);
2688
                ptFea.setProp(att[0], att[1]);
2689
            }
2690
        }
2691

    
2692
        if (grp.hasCode(7)) {
2693
            textStyleName = grp.getDataAsString(7);
2694
            textStyleName = DxfConvTexts.ConvertText(textStyleName);
2695
        }
2696

    
2697
        if (grp.hasCode(70)) {
2698
            attributeFlags = grp.getDataAsInt(70);
2699
        }
2700

    
2701
        if (grp.hasCode(40)) {
2702
            Double heightD = new Double(grp.getDataAsDouble(40));
2703
            String heightS = heightD.toString();
2704
            feature.setProp("textHeight", heightS);
2705
        } else {
2706
            feature.setProp("textHeight", "20.0");
2707
        }
2708

    
2709
        if (grp.hasCode(50)) {
2710
            Double rotD = new Double(grp.getDataAsDouble(50));
2711
            String rotS = rotD.toString();
2712
            feature.setProp("textRotation", rotS);
2713
        } else {
2714
            feature.setProp("textRotation", "0.0");
2715
        }
2716

    
2717
        x = grp.getDataAsDouble(10);
2718
        y = grp.getDataAsDouble(20);
2719
        z = grp.getDataAsDouble(30);
2720

    
2721
        /*if (grp.hasCode(30)){
2722
            z = grp.getDataAsDouble(30);
2723
            Double doub = new Double(z);
2724
            String string = doub.toString();
2725
            feature.setProp("elevation", string);
2726
        } else {
2727
            Double doub = new Double(0.0);
2728
            feature.setProp("elevation", doub.toString());
2729
        }*/
2730
        if (grp.hasCode(210)) {
2731
            extx = grp.getDataAsDouble(210);
2732
        }
2733

    
2734
        if (grp.hasCode(220)) {
2735
            exty = grp.getDataAsDouble(220);
2736
        }
2737

    
2738
        if (grp.hasCode(230)) {
2739
            extz = grp.getDataAsDouble(230);
2740
        }
2741

    
2742
        Point3D point_in = new Point3D(x, y, z);
2743
        Point3D xtru = new Point3D(extx, exty, extz);
2744
        Point3D point_out = DxfCalXtru.CalculateXtru(point_in, xtru);
2745
        x = point_out.getX();
2746
        y = point_out.getY();
2747
        z = point_out.getZ();
2748

    
2749
        Double doub = new Double(z);
2750
        feature.setProp("elevation", doub.toString());
2751

    
2752
        if (z != 0.0) {
2753
            dxf3DFile = true;
2754
        }
2755

    
2756
        point.add(new Point3D(x, y, z));
2757
        feature.setGeometry(point);
2758

    
2759
        // 041130: Rellena las props con los atributos.
2760
        completeAttributes(feature);
2761

    
2762
        if (attributeFlags == 8) {
2763
            if (addingToBlock == false) {
2764
                features.add(feature);
2765
            } else {
2766
                blk.add(feature);
2767
            }
2768
        }
2769
    }
2770

    
2771
    /* (non-Javadoc)
2772
     * @see org.cresques.io.DxfFile.EntityFactory#createBlock(org.cresques.io.DxfGroupVector)
2773
     */
2774
    public void createBlock(DxfGroupVector grp) throws Exception {
2775
        //DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2776
        blk = new FeatureCollection(proj);
2777

    
2778
        Point3D basePoint = new Point3D();
2779
        String blockName = "";
2780

    
2781
        //System.out.println("createBlock(): Creamos nuevo bloque, el bloque " + iterator);
2782
        addingToBlock = true;
2783

    
2784
        //System.out.println("createBlock(): A?adimos el bloque " + iterator + " a la lista de bloques");
2785
        blkList.add(iterator, blk);
2786

    
2787
        //System.out.println("createBlock(): Rellenamos la informacion del bloque " + iterator);
2788
        if (grp.hasCode(8)) {
2789
            blk.setProp("layer", grp.getDataAsString(8));
2790
        }
2791

    
2792
        if (grp.hasCode(62)) {
2793
            Integer integer = new Integer(grp.getDataAsInt(62));
2794
            String string = integer.toString();
2795
            blk.setProp("color", string);
2796
            blk.setProp("colorByLayer", "false");
2797
        } else {
2798
            DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2799
            int clr = layer.colorNumber;
2800
            Integer integer = new Integer(clr);
2801
            String string = integer.toString();
2802
            blk.setProp("color", string);
2803
            blk.setProp("colorByLayer", "true");
2804
        }
2805

    
2806
        if (grp.hasCode(1)) {
2807
            blockName = grp.getDataAsString(1);
2808

    
2809
            //blk.setBlkName(blockName);
2810
            blk.setProp("blockName", blockName);
2811
        }
2812

    
2813
        if (grp.hasCode(2)) {
2814
            blockName = grp.getDataAsString(2);
2815

    
2816
            //blk.setBlkName(blockName);
2817
            blk.setProp("blockName", blockName);
2818
        }
2819

    
2820
        if (grp.hasCode(10)) {
2821
            Double basePointX = new Double(grp.getDataAsDouble(10));
2822
            basePoint.X = grp.getDataAsDouble(10);
2823
            blk.setProp("basePointX", basePointX.toString());
2824
        }
2825

    
2826
        if (grp.hasCode(20)) {
2827
            Double basePointY = new Double(grp.getDataAsDouble(20));
2828
            basePoint.Y = grp.getDataAsDouble(20);
2829
            blk.setProp("basePointY", basePointY.toString());
2830
        }
2831

    
2832
        if (grp.hasCode(30)) {
2833
            Double basePointZ = new Double(grp.getDataAsDouble(30));
2834
            basePoint.Z = grp.getDataAsDouble(30);
2835

    
2836
            if (basePoint.getZ() != 0.0) {
2837
                dxf3DFile = true;
2838
            }
2839

    
2840
            blk.setProp("basePointZ", basePointZ.toString());
2841
        }
2842

    
2843
        if (grp.hasCode(70)) {
2844
            //blk.flags = grp.getDataAsInt(70);
2845
            Integer blockFlags = new Integer(grp.getDataAsInt(70));
2846
            blk.setProp("blockFlags", blockFlags.toString());
2847

    
2848
            // 041103: Hoy por hoy esto no lo utilizamos.
2849
        }
2850
    }
2851

    
2852
    /* (non-Javadoc)
2853
     * @see org.cresques.io.DxfFile.EntityFactory#endBlk(org.cresques.io.DxfGroupVector)
2854
     */
2855
    public void endBlk(DxfGroupVector grp) throws Exception {
2856
        //DxfLayer layer = (DxfLayer) layers.getByName(grp.getDataAsString(8));
2857
        setAddingToBlock(false);
2858
        iterator = iterator + 1;
2859
    }
2860

    
2861
    /* (non-Javadoc)
2862
     * @see org.cresques.io.DxfFile.EntityFactory#testBlocks()
2863
     */
2864
    public void testBlocks() {
2865
        //System.out.println("getBlkList() = " + getBlkList());
2866
        Vector blkList = getBlkList();
2867
        FeatureCollection block = null;
2868
        Feature feature = null;
2869
        InsPoint3D insert = null;
2870

    
2871
        for (int i = 0; i < blkList.size(); i++) {
2872
            //System.out.println("compruebaBloques(): Bloque " + i +" de " + blkList.size());
2873
            block = (FeatureCollection) blkList.get(i);
2874

    
2875
            int aux = block.size();
2876

    
2877
            for (int j = 0; j < aux; j++) {
2878
                feature = (Feature) block.get(j);
2879

    
2880
                //if (feature.getGeometry() instanceof InsPoint && feature.getProp("isAnInsert") == "true") {
2881
                if (feature.getGeometry() instanceof InsPoint3D) {
2882
                    insert = (InsPoint3D) feature.getGeometry();
2883

    
2884
                    String nomBlock = insert.getBlockName();
2885

    
2886
                    if (insert.getBlockFound() == false) {
2887
                        //System.out.println("compruebaBloques(): Ahora se ocupa del DxfInsert " + nomBlock);
2888
                        insert.encuentraBloque(nomBlock);
2889

    
2890
                        //gestionaInsert(feature);
2891
                        //block.add(feature);
2892
                    }
2893
                }
2894
            }
2895
        }
2896
    }
2897

    
2898
    /**
2899
     * M?todo que permite incluir en la lista general de objetos los objetos que se
2900
     * encuentran dentro del bloque referenciado por cada InsPoint3D.
2901
     * @param feature, el punto de inserci?n.
2902
     */
2903
    private void gestionaInsert(Feature feature) {
2904
        Feature feature2 = null;
2905
        org.cresques.px.gml.Point3D point = null;
2906
        LineString3D lineString3D = null;
2907
        Polygon3D polygon3D = null;
2908
        InsPoint3D insert = new InsPoint3D();
2909
        insert = (InsPoint3D) feature.getGeometry();
2910

    
2911
        double bPointX = 0.0;
2912
        double bPointY = 0.0;
2913
        double bPointZ = 0.0;
2914

    
2915
        //if (insert.getBlockFound() == true) {
2916
        bPointX = Double.parseDouble(insert.getBlock().getProp("basePointX"));
2917
        bPointY = Double.parseDouble(insert.getBlock().getProp("basePointY"));
2918
        bPointZ = Double.parseDouble(insert.getBlock().getProp("basePointZ"));
2919

    
2920
        //}
2921
        double sFactorX = insert.getScaleFactor().getX();
2922
        double sFactorY = insert.getScaleFactor().getY();
2923
        double sFactorZ = insert.getScaleFactor().getZ();
2924
        double rAngleGra = insert.getRotAngle();
2925
        double rAngleRad = (rAngleGra * Math.PI) / 180.0;
2926
        InsPoint3D insert2 = null;
2927

    
2928
        for (int i = 0; i < insert.getBlock().size(); i++) {
2929
            //System.out.println("gestionaInserts: insert.getBlock().features.size() = " + insert.getBlock().size());
2930
            feature2 = (Feature) insert.getBlock().get(i);
2931

    
2932
            // Para que los elementos dentro del bloque tengan la misma layer
2933
            // y color que el insert al que corresponden.
2934
            // Segun la especificacion del formato DXF de Autodesk, la layer
2935
            // de las entities dentro de un bloque es la del bloque. La
2936
            // layer especifica para estos elementos en la defincion del
2937
            // bloque se ignora.
2938
            //System.out.println("gestionaInsert(): layer = " + feature2.getProp("layer"));
2939
            if ((feature2.getProp("colorByLayer").equals("false") ||
2940
                    feature2.getProp("layer").equals("0")) &&
2941
                    !feature.getProp("layer").equals("0")) {
2942
                feature2.setProp("color", feature.getProp("color"));
2943
            }
2944

    
2945
            feature2.setProp("layer", feature.getProp("layer"));
2946

    
2947
            Point3D point1 = new Point3D();
2948
            Point3D point11 = new Point3D();
2949
            Point3D pointAux = null;
2950

    
2951
            if (feature2.getGeometry() instanceof InsPoint3D) {
2952
                //System.out.println("gestionaInsert(): Encuentra bloques dentro de bloques");
2953
                insert2 = (InsPoint3D) feature2.getGeometry();
2954
                point1 = insert2.getPoint3D(0);
2955

    
2956
                pointAux = new Point3D(point1.getX() - bPointX,
2957
                                       point1.getY() - bPointY,
2958
                                       point1.getZ() - bPointZ);
2959

    
2960
                double laX = insert.getPoint3D(0).getX() +
2961
                             (((pointAux.getX() * sFactorX) * Math.cos(rAngleRad)) +
2962
                             ((pointAux.getY() * sFactorY) * (-1) * Math.sin(rAngleRad)));
2963
                double laY = insert.getPoint3D(0).getY() +
2964
                             (((pointAux.getX() * sFactorX) * Math.sin(rAngleRad)) +
2965
                             ((pointAux.getY() * sFactorY) * Math.cos(rAngleRad)));
2966
                double laZ = insert.getPoint3D(0).getZ() +
2967
                             (pointAux.getZ() * sFactorZ);
2968
                point11 = new Point3D(laX, laY, laZ);
2969

    
2970
                InsPoint3D insert3 = new InsPoint3D();
2971

    
2972
                insert3.add(point11);
2973

    
2974
                insert3.setBlkList(insert2.getBlkList());
2975
                insert3.setBlock(insert2.getBlock());
2976
                insert3.setBlockName(insert2.getBlockName());
2977
                insert3.setRotAngle(insert2.getRotAngle());
2978

    
2979
                Point3D newScale = new Point3D(insert2.getScaleFactor().getX() * sFactorX,
2980
                                               insert2.getScaleFactor().getY() * sFactorY,
2981
                                               insert2.getScaleFactor().getZ() * sFactorZ);
2982
                insert3.setScaleFactor(newScale);
2983

    
2984
                Feature feature3 = new Feature();
2985
                feature3.setProp("layer", feature2.getProp("layer"));
2986
                feature3.setProp("color", feature2.getProp("color"));
2987
                feature3.setProp("dxfEntity", feature2.getProp("dxfEntity"));
2988
                feature3.setProp("elevation", feature2.getProp("elevation"));
2989

    
2990
                //041130
2991
                for (int j = 0; j < attributes.size(); j++) {
2992
                    String[] att = new String[2];
2993
                    att = (String[]) attributes.get(j);
2994
                    feature3.setProp(att[0], feature2.getProp(att[0]));
2995
                }
2996

    
2997
                feature3.setGeometry(insert3);
2998

    
2999
                gestionaInsert(feature3);
3000
            } else if (feature2.getGeometry() instanceof LineString3D) {
3001
                lineString3D = (LineString3D) feature2.getGeometry();
3002

    
3003
                LineString3D lineString2 = new LineString3D();
3004
                Point3D[] points = new Point3D[lineString3D.pointNr()];
3005
                Point3D[] pointss = new Point3D[lineString3D.pointNr()];
3006

    
3007
                for (int j = 0; j < lineString3D.pointNr(); j++) {
3008
                    points[j] = (Point3D) lineString3D.get(j);
3009
                    pointss[j] = new Point3D();
3010

    
3011
                    pointAux = new Point3D(points[j].getX() - bPointX,
3012
                                           points[j].getY() - bPointY,
3013
                                           points[j].getZ() - bPointZ);
3014

    
3015
                    double laX = insert.getPoint3D(0).getX() +
3016
                                 (((pointAux.getX() * sFactorX) * Math.cos(rAngleRad)) +
3017
                                 ((pointAux.getY() * sFactorY) * (-1) * Math.sin(rAngleRad)));
3018
                    double laY = insert.getPoint3D(0).getY() +
3019
                                 (((pointAux.getX() * sFactorX) * Math.sin(rAngleRad)) +
3020
                                 ((pointAux.getY() * sFactorY) * Math.cos(rAngleRad)));
3021
                    double laZ = insert.getPoint3D(0).getZ() +
3022
                                 (pointAux.getZ() * sFactorZ);
3023
                    pointss[j] = new Point3D(laX, laY, laZ);
3024
                    lineString2.add(pointss[j]);
3025
                }
3026

    
3027
                Feature feature3 = new Feature();
3028
                feature3.setProp("layer", feature2.getProp("layer"));
3029
                feature3.setProp("color", feature2.getProp("color"));
3030
                feature3.setProp("dxfEntity", feature2.getProp("dxfEntity"));
3031

    
3032
                if (feature2.getProp("elevation") != null) {
3033
                    feature3.setProp("elevation", feature2.getProp("elevation"));
3034
                }
3035

    
3036
                feature3.setProp("thickness", feature2.getProp("thickness"));
3037

    
3038
                //041130
3039
                for (int j = 0; j < attributes.size(); j++) {
3040
                    String[] att = new String[2];
3041
                    att = (String[]) attributes.get(j);
3042

    
3043
                    String str = att[0];
3044
                    feature3.setProp(str, feature2.getProp(str));
3045
                }
3046

    
3047
                feature3.setGeometry(lineString2);
3048

    
3049
                if (addingToBlock == false) {
3050
                    features.add(feature3);
3051
                }
3052
            } else if (feature2.getGeometry() instanceof Polygon3D) {
3053
                polygon3D = (Polygon3D) feature2.getGeometry();
3054

    
3055
                Polygon3D polygon2 = new Polygon3D();
3056
                Point3D[] points = new Point3D[polygon3D.pointNr()];
3057
                Point3D[] pointss = new Point3D[polygon3D.pointNr()];
3058

    
3059
                for (int j = 0; j < polygon3D.pointNr(); j++) {
3060
                    points[j] = (Point3D) polygon3D.get(j);
3061
                    pointss[j] = new Point3D();
3062

    
3063
                    pointAux = new Point3D(points[j].getX() - bPointX,
3064
                                           points[j].getY() - bPointY,
3065
                                           points[j].getZ() - bPointZ);
3066

    
3067
                    double laX = insert.getPoint3D(0).getX() +
3068
                                 (((pointAux.getX() * sFactorX) * Math.cos(rAngleRad)) +
3069
                                 ((pointAux.getY() * sFactorY) * (-1) * Math.sin(rAngleRad)));
3070
                    double laY = insert.getPoint3D(0).getY() +
3071
                                 (((pointAux.getX() * sFactorX) * Math.sin(rAngleRad)) +
3072
                                 ((pointAux.getY() * sFactorY) * Math.cos(rAngleRad)));
3073
                    double laZ = insert.getPoint3D(0).getZ() +
3074
                                 (pointAux.getZ() * sFactorZ);
3075
                    pointss[j] = new Point3D(laX, laY, laZ);
3076
                    polygon2.add(pointss[j]);
3077
                }
3078

    
3079
                Feature feature3 = new Feature();
3080
                feature3.setProp("layer", feature2.getProp("layer"));
3081
                feature3.setProp("color", feature2.getProp("color"));
3082
                feature3.setProp("dxfEntity", feature2.getProp("dxfEntity"));
3083

    
3084
                if (feature2.getProp("elevation") != null) {
3085
                    feature3.setProp("elevation", feature2.getProp("elevation"));
3086
                }
3087

    
3088
                feature3.setProp("thickness", feature2.getProp("thickness"));
3089

    
3090
                //041130
3091
                for (int j = 0; j < attributes.size(); j++) {
3092
                    String[] att = new String[2];
3093
                    att = (String[]) attributes.get(j);
3094
                    feature3.setProp(att[0], feature2.getProp(att[0]));
3095
                }
3096

    
3097
                feature3.setGeometry(polygon2);
3098

    
3099
                if (addingToBlock == false) {
3100
                    features.add(feature3);
3101
                }
3102
            } else if (feature2.getGeometry() instanceof org.cresques.px.gml.Point3D) {
3103
                point = (org.cresques.px.gml.Point3D) feature2.getGeometry();
3104
                point1 = point.getPoint3D(0);
3105

    
3106
                pointAux = new Point3D(point1.getX() - bPointX,
3107
                                       point1.getY() - bPointY,
3108
                                       point1.getZ() - bPointZ);
3109

    
3110
                double laX = insert.getPoint3D(0).getX() +
3111
                             (((pointAux.getX() * sFactorX) * Math.cos(rAngleRad)) +
3112
                             ((pointAux.getY() * sFactorY) * (-1) * Math.sin(rAngleRad)));
3113
                double laY = insert.getPoint3D(0).getY() +
3114
                             (((pointAux.getX() * sFactorX) * Math.sin(rAngleRad)) +
3115
                             ((pointAux.getY() * sFactorY) * Math.cos(rAngleRad)));
3116
                double laZ = insert.getPoint3D(0).getZ() +
3117
                             (pointAux.getZ() * sFactorZ);
3118
                point11 = new Point3D(laX, laY, laZ);
3119

    
3120
                org.cresques.px.gml.Point3D pointt = new org.cresques.px.gml.Point3D();
3121
                pointt.add(point11);
3122

    
3123
                Feature feature3 = new Feature();
3124
                feature3.setProp("layer", feature2.getProp("layer"));
3125
                feature3.setProp("color", feature2.getProp("color"));
3126
                feature3.setProp("dxfEntity", feature2.getProp("dxfEntity"));
3127
                feature3.setProp("elevation", feature2.getProp("elevation"));
3128
                feature3.setProp("thickness", feature2.getProp("thickness"));
3129

    
3130
                if (point.isTextPoint()) {
3131
                    feature3.setProp("text", feature2.getProp("text"));
3132
                    feature3.setProp("textHeight",
3133
                                     feature2.getProp("textHeight"));
3134

    
3135
                    double auxR = Double.parseDouble(feature2.getProp("textRotation"));
3136

    
3137
                    //System.out.println("auxR = " + auxR);
3138
                    auxR = auxR + rAngleGra;
3139
                    feature3.setProp("textRotation", Double.toString(auxR));
3140

    
3141
                    //System.out.println("gestionaInsert(): feature3.getProp(textRotation) = " + feature3.getProp("textRotation"));
3142
                    pointt.setTextPoint(true);
3143
                }
3144

    
3145
                //041130
3146
                for (int j = 0; j < attributes.size(); j++) {
3147
                    String[] att = new String[2];
3148
                    att = (String[]) attributes.get(j);
3149
                    feature3.setProp(att[0], feature2.getProp(att[0]));
3150
                }
3151

    
3152
                feature3.setGeometry(pointt);
3153

    
3154
                //if (addingToBlock == false) {
3155
                features.add(feature3);
3156

    
3157
                //}
3158
            } else {
3159
                System.out.println("gestionaInsert(): Encontrado elemento desconocido");
3160
            }
3161
        }
3162
    }
3163

    
3164
    /**
3165
     * Gestiona la caracter?stica faces en las polil?neas.
3166
     * @param face
3167
     */
3168
    private void addFace(int[] face) {
3169
        hasFaces = true;
3170

    
3171
        if (faces == null) {
3172
            faces = new Vector();
3173
        }
3174

    
3175
        faces.add(face);
3176
    }
3177

    
3178
    /* (non-Javadoc)
3179
     * @see org.cresques.io.DxfFile.EntityFactory#depureAttributes()
3180
     */
3181
    public void depureAttributes() {
3182
        //String[] att = null;
3183

    
3184
        /*Set conjunto = new HashSet();
3185
        for (int i=0;i<attributes.size();i++) {
3186
            att = (String[])attributes.get(i);
3187
            String str = att[0];
3188
            conjunto.add(str);
3189
        }
3190
        //conjunto.addAll(attributes);
3191
        Vector atts = new Vector();
3192
        Vector atts2 = new Vector();
3193
        atts.addAll(conjunto);
3194
        for (int i=0;i<atts.size();i++) {
3195
            if (((String[])(attributes.get(i)))[0] == atts.get(i)) {
3196
                atts2.add(i, attributes.get(i));
3197
            }
3198
        }*/
3199
        String[] lastAtt = new String[2];
3200

    
3201
        for (int i = 0; i < attributes.size(); i++) {
3202
            String[] att = (String[]) attributes.get(i);
3203

    
3204
            for (int j = i + 1; j < attributes.size(); j++) {
3205
                //System.out.println("depureAttributes(): j = " + j);
3206
                String[] st = (String[]) attributes.get(j);
3207
                String st1 = att[0];
3208
                String st2 = st[0];
3209

    
3210
                //System.out.println("depureAttributes(): st1 = " + st1);
3211
                //System.out.println("depureAttributes(): st2 = " + st2);
3212
                if (st2.equals(st1)) {
3213
                    //System.out.println("depureAttributes(): Borra el st2");
3214
                    attributes.remove(j);
3215
                }
3216

    
3217
                if (i == (attributes.size() - 1)) {
3218
                    lastAtt = att;
3219
                }
3220
            }
3221
        }
3222

    
3223
        for (int i = attributes.size() - 2; i >= 0; i--) {
3224
            String[] att = (String[]) attributes.get(i);
3225
            String st1 = lastAtt[0];
3226
            String st2 = att[0];
3227

    
3228
            if (st2.equals(st1)) {
3229
                attributes.remove(i);
3230
            }
3231
        }
3232

    
3233
        /*String[] attStrs = new String[attributes.size()];
3234
        Vector attribs = new Vector();
3235
        for (int i=0;i<attributes.size();i++) {
3236
            att = (String[])attributes.get(i);
3237
            attStrs[i] = att[0];
3238
        }
3239
        Set attStrsNR = new HashSet();
3240
        for (int i=0;i<attStrs.length;i++) {
3241
            attStrsNR.add(attStrs[i]);
3242
        }
3243
        String[] attStrsNRA = new String[attStrsNR.size()];
3244
        attStrsNR.toArray(attStrsNRA);
3245
        for (int i=0;i<attStrsNR.size();i++) {
3246
            att[0] = attStrsNRA[i];
3247
            attribs.add(att);
3248
        }
3249
        for (int i=0;i<attributes.size();i++) {
3250
            att = (String[])attributes.get(i);
3251
            String[] att2 = new String[2];
3252
            for (int j=0;j<attribs.size();j++) {
3253
                att2 = (String[])attribs.get(j);
3254
                if (att[0].equals(att2[0])) {
3255
                    att2[1] = att[1];
3256
                }
3257
                attribs.set(j, att2);
3258
            }
3259
        }
3260
        attributes = attribs;*/
3261
    }
3262

    
3263
    /**
3264
     * Hace los setProp para los atributos extra de las entidades.
3265
     * @param feature
3266
     */
3267
    private void completeAttributes(Feature feature) {
3268
        // 041130: Rellena las props con los atributos.
3269
        for (int i = 0; i < attributes.size(); i++) {
3270
            String[] att = new String[2];
3271
            att = (String[]) attributes.get(i);
3272
            feature.setProp(att[0], att[1]);
3273
        }
3274
    }
3275

    
3276
    /**
3277
     * Copia los atributos extra cargados en InsPoint y ya perfectamente definidos a los
3278
     * elementos del bloque al que referencia el punto de insercion.
3279
     * @param feaInsert, punto de inserci?n.
3280
     */
3281
    private void copyAttributes(Feature feaInsert) {
3282
        Feature feature = null;
3283
        InsPoint3D insert = new InsPoint3D();
3284
        insert = (InsPoint3D) feaInsert.getGeometry();
3285

    
3286
        for (int i = 0; i < insert.getBlock().size(); i++) {
3287
            feature = (Feature) insert.getBlock().get(i);
3288

    
3289
            for (int j = 0; j < attributes.size(); j++) {
3290
                String[] att = new String[2];
3291
                att = (String[]) attributes.get(j);
3292
                feature.setProp(att[0], feaInsert.getProp(att[0]));
3293
            }
3294
        }
3295
    }
3296

    
3297
    /**
3298
     * Se ejecuta cuando se declaran nuevos atributos, es decir, tras cada ATTDEF.
3299
     * A?ade estos atributos a las features existentes.
3300
     */
3301
    private void setNewAttributes() {
3302
        for (int i = 0; i < features.size(); i++) {
3303
            Feature fea = new Feature();
3304
            fea = (Feature) features.get(i);
3305
            completeAttributes(fea);
3306
        }
3307

    
3308
        for (int i = 0; i < blkList.size(); i++) {
3309
            FeatureCollection bloque = new FeatureCollection(proj);
3310
            bloque = (FeatureCollection) blkList.get(i);
3311

    
3312
            for (int j = 0; j < bloque.size(); j++) {
3313
                Feature fea = new Feature();
3314
                fea = (Feature) bloque.get(j);
3315
                completeAttributes(fea);
3316
            }
3317
        }
3318
    }
3319

    
3320
    /* (non-Javadoc)
3321
     * @see org.cresques.io.DxfFile.EntityFactory#getAttributes()
3322
     */
3323
    public Vector getAttributes() {
3324
        return attributes;
3325
    }
3326

    
3327
    /* (non-Javadoc)
3328
     * @see org.cresques.io.DxfFile.EntityFactory#getExtent()
3329
     */
3330
    public Extent getExtent() {
3331
        Feature feature = new Feature();
3332
        Extent extent = new Extent();
3333
        Iterator iter = features.iterator();
3334

    
3335
        while (iter.hasNext()) {
3336
            feature = (Feature) iter.next();
3337
            extent.add(feature.getExtent());
3338
        }
3339

    
3340
        return extent;
3341
    }
3342

    
3343
    /**
3344
     * Establece la proyecci?n cartogr?fica en la que se van a crear las features.
3345
     * @param p, Proyecci?n cartogr?fica.
3346
     */
3347
    public void setProjection(IProjection p) {
3348
        proj = p;
3349
    }
3350

    
3351
    /* (non-Javadoc)
3352
     * @see org.cresques.io.DxfFile.EntityFactory#reProject(org.cresques.geo.ReProjection)
3353
     */
3354
    public void reProject(ICoordTrans rp) {
3355
        Feature feature = new Feature();
3356
        Extent extent = new Extent();
3357
        Iterator iter = features.iterator();
3358

    
3359
        while (iter.hasNext()) {
3360
            feature = (Feature) iter.next();
3361
            ((Projected) feature).reProject(rp);
3362
            extent.add(feature.getExtent());
3363
        }
3364

    
3365
        setProjection(rp.getPDest());
3366
    }
3367

    
3368
    /* (non-Javadoc)
3369
     * @see org.cresques.geo.Projected#getProjection()
3370
     */
3371
    public IProjection getProjection() {
3372
        return proj;
3373
    }
3374

    
3375
    /**
3376
     * Devuelve las features creadas.
3377
     * @return IObjList
3378
     */
3379
    public IObjList getObjects() {
3380
        return features;
3381
    }
3382

    
3383
    /**
3384
     * Permite dibujar las features creadas.
3385
     */
3386
    public void draw(Graphics2D g, ViewPortData vp) {
3387
        Iterator iter = features.iterator();
3388
        Extent extent;
3389

    
3390
        while (iter.hasNext()) {
3391
            Feature feature = new Feature();
3392
            feature = (Feature) iter.next();
3393
            extent = feature.getExtent();
3394

    
3395
            if (vp.getExtent().minX() > extent.maxX()) {
3396
                continue;
3397
            }
3398

    
3399
            if (vp.getExtent().minY() > extent.maxY()) {
3400
                continue;
3401
            }
3402

    
3403
            if (vp.getExtent().maxX() < extent.minX()) {
3404
                continue;
3405
            }
3406

    
3407
            if (vp.getExtent().maxY() < extent.minY()) {
3408
                continue;
3409
            }
3410

    
3411
            //if (!feature.layer.frozen)
3412
            feature.draw(g, vp);
3413
        }
3414
    }
3415

    
3416
    /**
3417
     * Invoca el m?todo de creaci?n de arcos para polil?neas con par?metros de
3418
     * curvatura.
3419
     * @param coord1, punto inicial del arco.
3420
     * @param coord2, punto final del arco.
3421
     * @param bulge, par?metro de curvatura.
3422
     * @return Vector con los puntos del arco.
3423
     */
3424
    public static Vector createArc(Point2D coord1, Point2D coord2, double bulge) {
3425
        return new DxfCalArcs(coord1, coord2, bulge).getPoints(1);
3426
    }
3427

    
3428
    /* (non-Javadoc)
3429
     * @see org.cresques.io.DxfFile.EntityFactory#getBlkList()
3430
     */
3431
    public Vector getBlkList() {
3432
        return blkList;
3433
    }
3434

    
3435
    /* (non-Javadoc)
3436
     * @see org.cresques.io.DxfFile.EntityFactory#getDxfEntityList()
3437
     */
3438
    public DxfEntityList getDxfEntityList() {
3439
        // TODO Auto-generated method stub
3440
        return null;
3441
    }
3442

    
3443
    /* (non-Javadoc)
3444
     * @see org.cresques.io.DxfFile.EntityFactory#getBlk()
3445
     */
3446
    public DxfBlock getBlk() {
3447
        // TODO Auto-generated method stub
3448
        return null;
3449
    }
3450

    
3451
    /* (non-Javadoc)
3452
     * @see org.cresques.io.DxfFile.EntityFactory#createEllipse(org.cresques.io.DxfGroupVector)
3453
     */
3454
    public void createEllipse(DxfGroupVector v) throws Exception {
3455
        // TODO Auto-generated method stub
3456
    }
3457

    
3458
    /**
3459
     * @return Returns the dxf3DFile.
3460
     */
3461
    public boolean isDxf3DFile() {
3462
        return dxf3DFile;
3463
    }
3464

    
3465
    /**
3466
     * @param dxf3DFile The dxf3DFile to set.
3467
     */
3468
    public void setDxf3DFile(boolean dxf3DFile) {
3469
        this.dxf3DFile = dxf3DFile;
3470
    }
3471
}