Statistics
| Revision:

root / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / DwgFile.java @ 9974

History | View | Annotate | Download (38.9 KB)

1
/* jdwglib. Java Library for reading Dwg files.
2
 * 
3
 * Author: Jose Morell Rama (jose.morell@gmail.com).
4
 * Port from the Pythoncad Dwg library by Art Haas.
5
 *
6
 * Copyright (C) 2005 Jose Morell, IVER TI S.A. and Generalitat Valenciana
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
21
 *
22
 * For more information, contact:
23
 *
24
 * Jose Morell (jose.morell@gmail.com)
25
 * 
26
 * or
27
 *
28
 * IVER TI S.A.
29
 *  C/Salamanca, 50
30
 *  46005 Valencia
31
 *  Spain
32
 *  +34 963163400
33
 *  dac@iver.es
34
 */
35
package com.iver.cit.jdwglib.dwg;
36

    
37
import java.awt.geom.Point2D;
38
import java.io.File;
39
import java.io.FileInputStream;
40
import java.io.IOException;
41
import java.nio.ByteBuffer;
42
import java.nio.channels.FileChannel;
43
import java.util.ArrayList;
44
import java.util.HashMap;
45
import java.util.LinkedList;
46
import java.util.List;
47
import java.util.Map;
48

    
49
import com.iver.cit.jdwglib.dwg.objects.DwgArc;
50
import com.iver.cit.jdwglib.dwg.objects.DwgAttdef;
51
import com.iver.cit.jdwglib.dwg.objects.DwgAttrib;
52
import com.iver.cit.jdwglib.dwg.objects.DwgBlock;
53
import com.iver.cit.jdwglib.dwg.objects.DwgBlockHeader;
54
import com.iver.cit.jdwglib.dwg.objects.DwgCircle;
55
import com.iver.cit.jdwglib.dwg.objects.DwgEllipse;
56
import com.iver.cit.jdwglib.dwg.objects.DwgEndblk;
57
import com.iver.cit.jdwglib.dwg.objects.DwgInsert;
58
import com.iver.cit.jdwglib.dwg.objects.DwgLayer;
59
import com.iver.cit.jdwglib.dwg.objects.DwgLine;
60
import com.iver.cit.jdwglib.dwg.objects.DwgLwPolyline;
61
import com.iver.cit.jdwglib.dwg.objects.DwgMText;
62
import com.iver.cit.jdwglib.dwg.objects.DwgPoint;
63
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline2D;
64
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline3D;
65
import com.iver.cit.jdwglib.dwg.objects.DwgSeqend;
66
import com.iver.cit.jdwglib.dwg.objects.DwgSolid;
67
import com.iver.cit.jdwglib.dwg.objects.DwgText;
68
import com.iver.cit.jdwglib.dwg.objects.DwgVertex2D;
69
import com.iver.cit.jdwglib.dwg.readers.IDwgFileReader;
70
import com.iver.cit.jdwglib.dwg.readers.DwgFileV15Reader;
71

    
72
/**
73
 * The DwgFile class provides a revision-neutral interface for reading and handling
74
 * DWG files
75
 * Reading methods are useful for reading DWG files, and handling methods like
76
 * calculateDwgPolylines() are useful for handling more complex
77
 * objects in the DWG file
78
 * 
79
 * @author jmorell
80
 * @author azabala
81
 */
82
public class DwgFile {
83
        /**
84
         * It has all known DWG version's header.
85
         * Extracted from Autodesk web.
86
         */
87
        private static HashMap acadVersions = new HashMap();
88
        static{
89
                acadVersions.put("AC1004", "Autocad R9");
90
                acadVersions.put("AC1006", "Autocad R10");
91
                acadVersions.put("AC1007", "Autocad pre-R11");
92
                acadVersions.put("AC1007", "Autocad pre-R11");
93
                acadVersions.put("AC1008", "Autocad pre-R11b");
94
                acadVersions.put("AC1009", "Autocad R12");
95
                acadVersions.put("AC1010", "Autocad pre-R13 a");
96
                acadVersions.put("AC1011", "Autocad pre-R13 b");
97
                acadVersions.put("AC1012", "Autocad R13");
98
                acadVersions.put("AC1013", "Autocad pre-R14");
99
                acadVersions.put("AC1014", "Autocad R14");
100
                acadVersions.put("AC1500", "Autocad pre-2000");
101
                acadVersions.put("AC1015", "Autocad R2000, R2000i, R2002");
102
                acadVersions.put("AC402a", "Autocad pre-2004a");
103
                acadVersions.put("AC402b", "Autocad pre-2004b");
104
                acadVersions.put("AC1018", "Autocad R2004, R2005, R2006");
105
                acadVersions.put("AC1021", "Autocad R2007");
106
        
107
        }
108

    
109
        private String fileName;
110
        private String dwgVersion;
111
        
112
        /**
113
         * Offsets to the DWG sections
114
         */
115
        private ArrayList dwgSectionOffsets;
116
        /**
117
         * Header vars readed from the HEADER section of the DWG file
118
         * */
119
        private Map headerVars;
120
        
121
        /**
122
         * This list contains what in OpenDWG specification is called
123
         * the object map ( a collection of entries where each entry contains
124
         * the seek of each object, and its size)
125
         * */
126
        private ArrayList dwgObjectOffsets;
127
        
128
        /**
129
         * For each entry in dwgObjectOffsets, we have an instance of
130
         * DwgObject in the dwgObjects collection
131
         * 
132
         * */
133
        private LinkedList dwgObjects;
134
        private HashMap handle_objects;
135
        
136

    
137
        private ArrayList dwgClasses;
138
        
139
        
140
        /**
141
         * hash map that indexes all DwgLayer objects
142
         * by its handle property
143
         * */
144
        private HashMap layerTable; 
145
        
146
        /**
147
         * Specific reader of the DWG file version (12, 13, 14, 2000, etc., each
148
         * version will have an specific reader)
149
         * */
150
        private IDwgFileReader dwgReader;
151
        private boolean dwg3DFile;
152
        /**
153
         * Memory mapped byte buffer of the whole DWG file
154
         * */
155
        private ByteBuffer bb;
156
        
157
        /*
158
         * Optimizaciones para evitar leer el fichero completo en cada
159
         * pasada.
160
         * */
161
        /**
162
         * Contains all IDwgPolyline implementations
163
         * */
164
        private List dwgPolylines;
165
        /**
166
         * map of blocks dwg entities indexed by their names.
167
         */
168
        private Map names_blocks;
169
        
170
        
171
        
172
        
173
        /**
174
         * Constructor.
175
         * @param fileName an absolute path to the DWG file
176
         */
177
        public DwgFile(String fileName) {
178
                this.fileName = fileName;
179
                
180
                dwgSectionOffsets = new ArrayList();
181
                dwgObjectOffsets = new ArrayList();
182
                headerVars = new HashMap();
183
                
184
                //TODO Si finalmente no se leen las clases, quitar
185
                //dwgClasses
186
                dwgClasses = new ArrayList();
187
                
188
                dwgObjects = new LinkedList();
189
                handle_objects = new HashMap();
190
                
191
                layerTable = new HashMap();
192
                
193
                dwgPolylines = new ArrayList();
194
                
195
                names_blocks = new HashMap();
196
        }
197
        
198
        public String getDwgVersion() {
199
                return dwgVersion;
200
        }
201
        
202
        /**
203
         * Reads a DWG file and put its objects in the dwgObjects Vector
204
         * This method is version independent
205
         * 
206
         * @throws IOException If the file location is wrong
207
         */
208
        public void read() throws IOException, 
209
                                DwgVersionNotSupportedException
210
        {
211
                setDwgVersion();
212
                if (dwgVersion.equalsIgnoreCase("Autocad R2000, R2000i, R2002")) {
213
                        dwgReader = new DwgFileV15Reader();
214
                        dwgReader.read(this, bb);
215
                } else {
216
                        DwgVersionNotSupportedException exception = 
217
                                new DwgVersionNotSupportedException("Version de DWG no soportada");
218
                        exception.setDwgVersion(dwgVersion);
219
                        throw exception;
220
                }
221
                
222
        }
223
        
224
        private void setDwgVersion() throws IOException {
225
                File file = new File(fileName);
226
                FileInputStream fileInputStream = new FileInputStream(file);
227
                FileChannel fileChannel = fileInputStream.getChannel();
228
                long channelSize = fileChannel.size();
229
                bb = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, channelSize);
230
                byte[] versionBytes = {bb.get(0), 
231
                                                                bb.get(1), 
232
                                                                bb.get(2),
233
                                                                bb.get(3),
234
                                                                bb.get(4), 
235
                                                                bb.get(5)};
236
                ByteBuffer versionByteBuffer = ByteBuffer.wrap(versionBytes);
237
                String[] bs = new String[versionByteBuffer.capacity()];
238
                String versionString = "";
239
                for (int i=0; i<versionByteBuffer.capacity(); i++) {
240
                        bs[i] = new String(new byte[]{(byte)(versionByteBuffer.get(i))});
241
                        versionString = versionString + bs[i];
242
                }
243
                String version = (String) acadVersions.get(versionString);
244
                if(version == null)
245
                        version = "Unknown Dwg format";
246
                this.dwgVersion = version;    
247
        }
248
        
249
        public void setHeader(String key, Object value){
250
                headerVars.put(key, value);
251
        }
252
        
253
        
254
        
255
        /**
256
         * Initialize a new Vector that contains the DWG file layers. 
257
         * Each layer have three parameters. 
258
         * These parameters are handle, name and color
259
         */
260
//        public void initializeLayerTable() {
261
//                layerTable = new ArrayList();
262
//                for (int i=0;i<dwgObjects.size();i++) {
263
//                        DwgObject obj = (DwgObject)dwgObjects.get(i);
264
//                        if (obj instanceof DwgLayer) {
265
//                                ArrayList layerTableRecord = new ArrayList();
266
//                                layerTableRecord.add(new Integer(obj.getHandle()));
267
//                                layerTableRecord.add(((DwgLayer)obj).getName());
268
//                                layerTableRecord.add(new Integer(((DwgLayer)obj).getColor()));
269
//                                layerTable.add(layerTableRecord);
270
//                        }
271
//                }
272
//        }
273
        
274
        /*
275
         * A DwgLayer is a DWG drawing entity, so all DwgLayer objects are
276
         * saved in dwgObjects collection.
277
         * Instead of iterate over the full collection, is faster check every object
278
         * and save all the DwgLayer instances in their own collection.
279
         *
280
         */
281
        public void addDwgLayer(DwgLayer dwgLayer){
282
                layerTable.put(new Integer(dwgLayer.getHandle()), 
283
                                dwgLayer);
284
        }
285
        
286
        public DwgLayer getDwgLayer(DwgObject entity){
287
                
288
                int handleCode = entity.getLayerHandleCode();
289
                int layerHandle = -1;
290
                
291
                int entityRecord;
292
                DwgObject object;
293
                
294
//                switch(handleCode){
295
//                        case 0x2:
296
//                        case 0x3:
297
//                        case 0x4:
298
//                        case 0x5:
299
//                                layerHandle = entity.getLayerHandle();
300
//                        break;
301
//                        
302
//                        case 0x6:
303
//                                entityRecord = entity.getIndex();
304
//                                object = this.getDwgObject(entityRecord + 1);
305
//                                layerHandle = object.getLayerHandle();
306
//                        break;
307
//                        case 0x8:
308
//                                entityRecord = entity.getIndex();
309
//                                object = this.getDwgObject(entityRecord - 1);
310
//                                layerHandle = object.getLayerHandle();
311
//                                
312
//                        break;
313
//                        case 0xA:
314
//                                //reference handle plus offset of layer handle??
315
//                                int handle = entity.getHandle();
316
//                                int offset = entity.getLayerHandle();
317
//                                layerHandle = handle + offset;
318
//                                
319
//                                
320
//                        break;
321
//                        case 0xC:
322
//                            //reference handle minus offset of layer handle??
323
//                                handle = entity.getHandle();
324
//                                offset = entity.getLayerHandle();
325
//                                layerHandle = handle + offset;
326
//                                
327
//                        break;
328
//                        default:
329
//                                System.out.println("Unknown layer handle code:"+handleCode);        
330
//                        return null;
331
//                }
332
                
333
                
334
                
335
                /*
336
                 * OpenDWG spec, v3, page 11. HANDLE REFERENCES
337
                 * 
338
                 * A handle is formed by this fields:
339
                 * a) CODE (4 bits)
340
                 * b) COUNTER (4 bits)
341
                 * c) OFFSET of the object (handle itself).
342
                 * 
343
                 * CODE could take these values:
344
                 * 1) 0x2, 0x3, 0x4, 0x5 -> offset is the handle of the layer
345
                 * 2) 0x6 -> offset is the next object handle
346
                 * 3) 0x8 -> offset is the previous object handle
347
                 * 4) 0xA -> result is reference handle plus offset
348
                  * 5) 0xC -> result is reference handle minus offset
349
                 * 
350
                 * */
351
                
352
//                Iterator lyrIterator = layerTable.values().iterator();
353
//                while(lyrIterator.hasNext()){
354
//                        DwgLayer lyr = (DwgLayer) lyrIterator.next();
355
//                        int lyrHdl = lyr.getHandle();
356
//                        int entityHdlCode = entity.getLayerHandleCode();
357
//                        int entityHdl = entity.getLayerHandle();
358
//                        int newLyrHdl = layerHandle;
359
//                        System.currentTimeMillis();
360
//                }
361
                
362
                return (DwgLayer) layerTable.
363
                                get(new Integer(layerHandle));
364
        }
365
        
366
   
367
        public String getLayerName(DwgObject entity) {                
368
                DwgLayer dwgLayer = getDwgLayer(entity);
369
                if(dwgLayer == null){//TODO Puede haber entidades sin layer???
370
                        return "";
371
                }else
372
                        return dwgLayer.getName();
373
        }
374
        
375
        /**
376
     * Returns the color of the layer of a DWG object 
377
         * 
378
     * @param entity DWG object which we want to know its layer color
379
         * @return int Layer color of the DWG object in the Autocad color code
380
         */
381
        public int getColorByLayer(DwgObject entity) {
382
                int colorByLayer;
383
                DwgLayer dwgLyr = getDwgLayer(entity);
384
                if(dwgLyr == null)
385
                        colorByLayer = 0;
386
                else
387
                        colorByLayer = dwgLyr.getColor();
388
                return colorByLayer;
389
        }
390
        
391

    
392
        //azabala: esto ahora se hace conforme se van creando los objetos
393
        //(y no al final en una segunda pasada
394
//    public void applyExtrusions() {
395
//        for (int i=0;i<dwgObjects.size();i++) {
396
//            DwgObject dwgObject = (DwgObject)dwgObjects.get(i);
397
//            if(dwgObject instanceof IDwgExtrusionable){
398
//                    ((IDwgExtrusionable)dwgObject).applyExtrussion();
399
//            }
400
//            // Seems that Autocad don't apply the extrusion to Ellipses
401
//            /*} else if (dwgObject instanceof DwgEllipse) {
402
//                double[] ellipseCenter = ((DwgEllipse)dwgObject).getCenter();
403
//                double[] ellipseExt = ((DwgEllipse)dwgObject).getExtrusion();
404
//                ellipseCenter = AcadExtrusionCalculator.CalculateAcadExtrusion(ellipseCenter, ellipseExt);
405
//                ((DwgEllipse)dwgObject).setCenter(ellipseCenter);*/
406
//        }//for
407
//    }
408
        
409
        /**
410
         * Configure the geometry of the polylines in a DWG file from the vertex list in
411
         * this DWG file. This geometry is given by an array of Points.
412
         * Besides, manage closed polylines and polylines with bulges in a GIS Data model.
413
     * It means that the arcs of the polylines will be done through a set of points and
414
     * a distance between these points.
415
         */
416
        public void calculateGisModelDwgPolylines() {
417
                /*
418
                 * Ahora mismo esto se est? haciendo al final (en una segunda pasada)
419
                 * porque posiblemente una Linea requiera de vertices que vengan
420
                 * despues, lo que complicar?a bastante todo....
421
                 * */
422
                
423
//                for (int i=0;i<dwgObjects.size();i++) {
424
                for (int i = 0; i < dwgPolylines.size(); i++){
425
//                        DwgObject pol = (DwgObject)dwgObjects.get(i);
426
                        DwgObject pol = (DwgObject)dwgPolylines.get(i);
427
                        if (pol instanceof IDwgPolyline) {
428
                                ((IDwgPolyline)pol).calculateGisModel(dwgObjects);
429
                        } 
430
                }
431
        }
432
        
433
    /**
434
     * Configure the geometry of the polylines in a DWG file from the vertex list in
435
     * this DWG file. This geometry is given by an array of Points
436
     * Besides, manage closed polylines and polylines with bulges in a GIS Data model.
437
     * It means that the arcs of the polylines will be done through a curvature
438
     * parameter called bulge associated with the points of the polyline.
439
     */
440
        //TODO Refactorizar para que solo se aplique a las Polilineas
441
        public void calculateCadModelDwgPolylines() {
442
                for (int i=0;i<dwgObjects.size();i++) {
443
                        DwgObject pol = (DwgObject)dwgObjects.get(i);
444
                        if (pol instanceof DwgPolyline2D) {
445
                                int flags = ((DwgPolyline2D)pol).getFlags();
446
                                int firstHandle = ((DwgPolyline2D)pol).getFirstVertexHandle();
447
                                int lastHandle = ((DwgPolyline2D)pol).getLastVertexHandle();
448
                                ArrayList pts = new ArrayList();
449
                                ArrayList bulges = new ArrayList();
450
                                double[] pt = new double[3];
451
                                for (int j=0;j<dwgObjects.size();j++) {
452
                                        DwgObject firstVertex = (DwgObject)dwgObjects.get(j);
453
                                        if (firstVertex instanceof DwgVertex2D) {
454
                                                int vertexHandle = firstVertex.getHandle();
455
                                                if (vertexHandle==firstHandle) {
456
                                                        int k=0;
457
                                                        while (true) {
458
                                                                DwgObject vertex = (DwgObject)dwgObjects.get(j+k);
459
                                                                int vHandle = vertex.getHandle();
460
                                                                if (vertex instanceof DwgVertex2D) {
461
                                                                        pt = ((DwgVertex2D)vertex).getPoint();
462
                                                                        pts.add(new Point2D.Double(pt[0], pt[1]));
463
                                                                        double bulge = ((DwgVertex2D)vertex).getBulge();
464
                                                                        bulges.add(new Double(bulge));
465
                                                                        k++;
466
                                                                        if (vHandle==lastHandle && vertex instanceof DwgVertex2D) {
467
                                                                                break;
468
                                                                        }
469
                                                                } else if (vertex instanceof DwgSeqend) {
470
                                                                        break;
471
                                                                }
472
                                                        }
473
                                                }
474
                                        }
475
                                }
476
                                if (pts.size()>0) {
477
                                        /*Point2D[] newPts = new Point2D[pts.size()];
478
                                        if ((flags & 0x1)==0x1) {
479
                                                newPts = new Point2D[pts.size()+1];
480
                                                for (int j=0;j<pts.size();j++) {
481
                                                        newPts[j] = (Point2D)pts.get(j);
482
                                                }
483
                                                newPts[pts.size()] = (Point2D)pts.get(0);
484
                                                bulges.add(new Double(0));
485
                                        } else {
486
                                                for (int j=0;j<pts.size();j++) {
487
                                                        newPts[j] = (Point2D)pts.get(j);
488
                                                }
489
                                        }*/
490
                                        double[] bs = new double[bulges.size()];
491
                                        for (int j=0;j<bulges.size();j++) {
492
                                                bs[j] = ((Double)bulges.get(j)).doubleValue();
493
                                        }
494
                                        ((DwgPolyline2D)pol).setBulges(bs);
495
                                        //Point2D[] points = GisModelCurveCalculator.calculateGisModelBulge(newPts, bs);
496
                                        Point2D[] points = new Point2D[pts.size()];
497
                                        for (int j=0;j<pts.size();j++) {
498
                                            points[j] = (Point2D)pts.get(j);
499
                                        }
500
                                        ((DwgPolyline2D)pol).setPts(points);
501
                                } else {
502
//                                        System.out.println("Encontrada polil?nea sin puntos ...");
503
                                        // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto
504
                                        // ocurre es porque existe un error que hay que corregir ...
505
                                }
506
                        } else if (pol instanceof DwgPolyline3D) {
507
                        } else if (pol instanceof DwgLwPolyline && ((DwgLwPolyline)pol).getVertices()!=null) {
508
                        }
509
                }
510
        }
511
        
512
        
513

    
514
        
515
    /**
516
     * Changes the location of an object extracted from a block. This location will be
517
     * obtained through the insertion parameters from the block and the corresponding
518
     * insert.
519
     * @param entity, the entity extracted from the block.
520
     * @param bPoint, offset for the coordinates of the entity.
521
     * @param insPoint, coordinates of the insertion point for the entity.
522
     * @param scale, scale for the entity.
523
     * @param rot, rotation angle for the entity.
524
     * @param id, a count as a id.
525
     * @param dwgObjectsWithoutBlocks, a object list with the elements extracted from
526
     * the blocks.
527
     */
528
        private void manageBlockEntity(DwgObject entity, double[] bPoint, Point2D insPoint, double[] scale, double rot, List dwgObjectsWithoutBlocks) {
529
                if (entity instanceof DwgArc) {
530
                        //System.out.println("Encuentra un arco dentro de un bloque ...");
531
                        DwgArc transformedEntity = new DwgArc(entity.getIndex());
532
                        double[] center = ((DwgArc)entity).getCenter();
533
                        Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]);
534
                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
535
                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
536
                        double laZ = center[2] * scale[2];
537
                        double[] transformedCenter = new double[]{laX, laY, laZ};
538
                        double radius = ((DwgArc)entity).getRadius();
539
                        double transformedRadius = radius * scale[0];
540
                        double initAngle = ((DwgArc)entity).getInitAngle();
541
                        double endAngle = ((DwgArc)entity).getEndAngle();
542
            double transformedInitAngle = initAngle + rot;
543
            if (transformedInitAngle<0) {
544
                transformedInitAngle = transformedInitAngle + (2*Math.PI);
545
            } else if (transformedInitAngle>(2*Math.PI)) {
546
                transformedInitAngle = transformedInitAngle - (2*Math.PI);
547
            }
548
            double transformedEndAngle = endAngle + rot;
549
            if (transformedEndAngle<0) {
550
                transformedEndAngle = transformedEndAngle + (2*Math.PI);
551
            } else if (transformedEndAngle>(2*Math.PI)) {
552
                transformedEndAngle = transformedEndAngle - (2*Math.PI);
553
            }
554
                        transformedEntity = (DwgArc)((DwgArc)entity).clone();
555
                        transformedEntity.setCenter(transformedCenter);
556
                        transformedEntity.setRadius(transformedRadius);
557
                        transformedEntity.setInitAngle(transformedInitAngle);
558
                        transformedEntity.setEndAngle(transformedEndAngle);
559
                        dwgObjectsWithoutBlocks.add(transformedEntity);
560
                } else if (entity instanceof DwgCircle) {
561
                        //System.out.println("Encuentra un c?rculo dentro de un bloque ...");
562
                        DwgCircle transformedEntity = new DwgCircle(entity.getIndex());
563
                        double[] center = ((DwgCircle)entity).getCenter();
564
                        Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]);
565
                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
566
                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
567
                        double laZ = center[2] * scale[2];
568
                        double[] transformedCenter = new double[]{laX, laY, laZ};
569
                        double radius = ((DwgCircle)entity).getRadius();
570
                        double transformedRadius = radius * scale[0];
571
                        transformedEntity = (DwgCircle)((DwgCircle)entity).clone();
572
                        transformedEntity.setCenter(transformedCenter);
573
                        transformedEntity.setRadius(transformedRadius);
574
                        dwgObjectsWithoutBlocks.add(transformedEntity);
575
                } else if (entity instanceof DwgEllipse) {
576
                        DwgEllipse transformedEntity = new DwgEllipse(entity.getIndex());
577
                        double[] center = ((DwgEllipse)entity).getCenter();
578
                        Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]);
579
                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
580
                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
581
                        double laZ = center[2] * scale[2];
582
                        double[] transformedCenter = new double[]{laX, laY, laZ};
583
                        double[] majorAxisVector = ((DwgEllipse)entity).getMajorAxisVector();
584
                        double[] transformedMajorAxisVector = new double[]{majorAxisVector[0] * scale[0], majorAxisVector[1] * scale[1], majorAxisVector[2] * scale[2]};
585
                        //TODO: Rotar un ?ngulo rot el vector majorAxisVector fijado en
586
                        // center.
587
                        double axisRatio = ((DwgEllipse)entity).getAxisRatio();
588
                        double transformedAxisRatio = axisRatio;
589
                        double initAngle = ((DwgEllipse)entity).getInitAngle();
590
                        double endAngle = ((DwgEllipse)entity).getEndAngle();
591
            double transformedInitAngle = initAngle + rot;
592
            if (transformedInitAngle<0) {
593
                transformedInitAngle = transformedInitAngle + (2*Math.PI);
594
            } else if (transformedInitAngle>(2*Math.PI)) {
595
                transformedInitAngle = transformedInitAngle - (2*Math.PI);
596
            }
597
            double transformedEndAngle = endAngle + rot;
598
            if (transformedEndAngle<0) {
599
                transformedEndAngle = transformedEndAngle + (2*Math.PI);
600
            } else if (transformedEndAngle>(2*Math.PI)) {
601
                transformedEndAngle = transformedEndAngle - (2*Math.PI);
602
            }
603
                        transformedEntity = (DwgEllipse)((DwgEllipse)entity).clone();
604
                        transformedEntity.setCenter(transformedCenter);
605
                        transformedEntity.setMajorAxisVector(transformedMajorAxisVector);
606
                        transformedEntity.setAxisRatio(transformedAxisRatio);
607
                        transformedEntity.setInitAngle(transformedInitAngle);
608
                        transformedEntity.setEndAngle(transformedEndAngle);
609
                        dwgObjectsWithoutBlocks.add(transformedEntity);
610
                } else if (entity instanceof DwgLine) {
611
                        //System.out.println("Encuentra una l?nea dentro de un bloque ...");
612
                        DwgLine transformedEntity = new DwgLine(entity.getIndex());
613
                        double[] p1 = ((DwgLine)entity).getP1();
614
                        double[] p2 = ((DwgLine)entity).getP2();
615
                        Point2D pointAux = new Point2D.Double(p1[0] - bPoint[0], p1[1] - bPoint[1]);
616
                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
617
                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
618
                        double[] transformedP1 = null;
619
            if (((DwgLine)entity).isZflag()) {
620
                                double laZ = p1[2] * scale[2];
621
                                transformedP1 = new double[]{laX, laY, laZ};
622
                        } else {
623
                                transformedP1 = new double[]{laX, laY};
624
                        }
625
                        //double[] transformedP1 = new double[]{laX, laY};
626
                        pointAux = new Point2D.Double(p2[0] - bPoint[0], p2[1] - bPoint[1]);
627
                        laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
628
                        laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
629
            double[] transformedP2 = null;
630
                        if (((DwgLine)entity).isZflag()) {
631
                                double laZ = p2[2] * scale[2];
632
                                transformedP2 = new double[]{laX, laY, laZ};
633
                        } else {
634
                                transformedP2 = new double[]{laX, laY};
635
                        }
636
                        //double[] transformedP2 = new double[]{laX, laY};
637
                        transformedEntity = (DwgLine)((DwgLine)entity).clone();
638
                        transformedEntity.setP1(transformedP1);
639
                        transformedEntity.setP2(transformedP2);
640
                        dwgObjectsWithoutBlocks.add(transformedEntity);
641
                } else if (entity instanceof DwgLwPolyline) {
642
            //System.out.println("Encuentra una DwgLwPolyline dentro de un bloque ...");
643
                        DwgLwPolyline transformedEntity = new DwgLwPolyline(entity.getIndex());
644
                        Point2D[] vertices = ((DwgLwPolyline)entity).getVertices();
645
                        if (vertices!=null) {
646
                            Point2D[] transformedVertices = new Point2D[vertices.length];
647
                                for (int i=0;i<vertices.length;i++) {
648
                                    Point2D pointAux = new Point2D.Double(vertices[i].getX() - bPoint[0], vertices[i].getY() - bPoint[1]);
649
                                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
650
                                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
651
                                        transformedVertices[i] = new Point2D.Double(laX, laY);
652
                                }
653
                                transformedEntity = (DwgLwPolyline)((DwgLwPolyline)entity).clone();
654
                                transformedEntity.setVertices(transformedVertices);
655
                                transformedEntity.setElevation(((DwgLwPolyline)entity).getElevation() * scale[2]);
656
                                dwgObjectsWithoutBlocks.add(transformedEntity);
657
                        }
658
                } else if (entity instanceof DwgMText) {
659
                        
660
                } else if (entity instanceof DwgPoint) {
661
                        
662
                } else if (entity instanceof DwgPolyline2D) {
663
                        //System.out.println("Encuentra una polil?nea dentro de un bloque ...");
664
                        DwgPolyline2D transformedEntity = new DwgPolyline2D(entity.getIndex());
665
                        Point2D[] vertices = ((DwgPolyline2D)entity).getPts();
666
                        if (vertices!=null) {
667
                            Point2D[] transformedVertices = new Point2D[vertices.length];
668
                                for (int i=0;i<vertices.length;i++) {
669
                                    Point2D pointAux = new Point2D.Double(vertices[i].getX() - bPoint[0], vertices[i].getY() - bPoint[1]);
670
                                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
671
                                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
672
                                        transformedVertices[i] = new Point2D.Double(laX, laY);
673
                                }
674
                                transformedEntity = (DwgPolyline2D)((DwgPolyline2D)entity).clone();
675
                                transformedEntity.setPts(transformedVertices);
676
                                transformedEntity.setElevation(((DwgPolyline2D)entity).getElevation() * scale[2]);
677
                                dwgObjectsWithoutBlocks.add(transformedEntity);
678
                        }
679
                } else if (entity instanceof DwgPolyline3D) {
680
                        
681
                } else if (entity instanceof DwgSolid) {
682
                        DwgSolid transformedEntity = new DwgSolid(entity.getIndex());
683
                        double[] corner1 = ((DwgSolid)entity).getCorner1();
684
                        double[] corner2 = ((DwgSolid)entity).getCorner2();
685
                        double[] corner3 = ((DwgSolid)entity).getCorner3();
686
                        double[] corner4 = ((DwgSolid)entity).getCorner4();
687
                        Point2D pointAux = new Point2D.Double(corner1[0] - bPoint[0], corner1[1] - bPoint[1]);
688
                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
689
                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
690
                        double[] transformedP1 = new double[]{laX, laY};
691
                        pointAux = new Point2D.Double(corner2[0] - bPoint[0], corner2[1] - bPoint[1]);
692
                        laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
693
                        laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
694
                        double[] transformedP2 = new double[]{laX, laY};
695
                        pointAux = new Point2D.Double(corner3[0] - bPoint[0], corner3[1] - bPoint[1]);
696
                        laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
697
                        laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
698
                        double[] transformedP3 = new double[]{laX, laY};
699
                        pointAux = new Point2D.Double(corner4[0] - bPoint[0], corner4[1] - bPoint[1]);
700
                        laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
701
                        laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
702
                        double[] transformedP4 = new double[]{laX, laY};
703
                        transformedEntity = (DwgSolid)((DwgSolid)entity).clone();
704
                        transformedEntity.setCorner1(transformedP1);
705
                        transformedEntity.setCorner2(transformedP2);
706
                        transformedEntity.setCorner3(transformedP3);
707
                        transformedEntity.setCorner4(transformedP4);
708
                        transformedEntity.setElevation(((DwgSolid)entity).getElevation() * scale[2]);
709
                        dwgObjectsWithoutBlocks.add(transformedEntity);
710
                } else if (entity instanceof DwgInsert) {
711
                        //System.out.println("Encuentra un insert dentro de un bloque ...");
712
                        DwgInsert transformedEntity = new DwgInsert(entity.getIndex());
713
                        double[] p = ((DwgInsert)entity).getInsertionPoint();
714
                        Point2D point = new Point2D.Double(p[0], p[1]);
715
                        double[] newScale = ((DwgInsert)entity).getScale();
716
                        double newRot = ((DwgInsert)entity).getRotation();
717
                        int newBlockHandle = ((DwgInsert)entity).getBlockHeaderHandle();
718
                        Point2D pointAux = new Point2D.Double(point.getX() - bPoint[0], point.getY() - bPoint[1]);
719
                        double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
720
                        double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
721
                        double laZ = p[2] * scale[2];
722
                        Point2D newInsPoint = new Point2D.Double(laX, laY);
723
                        newScale = new double[]{scale[0]*newScale[0], scale[1]*newScale[1], scale[2]*newScale[2]};
724
            newRot = newRot + rot;
725
            if (newRot<0) {
726
                newRot = newRot + (2*Math.PI);
727
            } else if (newRot>(2*Math.PI)) {
728
                newRot = newRot - (2*Math.PI);
729
            }
730
                        manageInsert2(newInsPoint, newScale, newRot, newBlockHandle, dwgObjectsWithoutBlocks);
731
                }
732
        }
733
        
734
    /**
735
     * Modify the geometry of the objects contained in the blocks of a DWG file and
736
     * add these objects to the DWG object list.
737
     * 
738
     */
739
        public void blockManagement() {
740
                LinkedList dwgObjectsWithoutBlocks = new LinkedList();
741
            boolean addingToBlock = false;
742
                for (int i=0; i < dwgObjects.size(); i++) {
743
                        DwgObject entity = (DwgObject)dwgObjects.get(i);
744
                        if (entity instanceof DwgArc && !addingToBlock) {
745
                                dwgObjectsWithoutBlocks.add(entity);
746
                        } else if (entity instanceof DwgEllipse && !addingToBlock) {
747
                                dwgObjectsWithoutBlocks.add(entity);
748
                        } else if (entity instanceof DwgCircle && !addingToBlock) {
749
                                dwgObjectsWithoutBlocks.add(entity);
750
                        } else if (entity instanceof DwgPolyline2D && !addingToBlock) {
751
                                dwgObjectsWithoutBlocks.add(entity);
752
                        } else if (entity instanceof DwgPolyline3D && !addingToBlock) {
753
                                dwgObjectsWithoutBlocks.add(entity);
754
                        } else if (entity instanceof DwgLwPolyline && !addingToBlock) {
755
                                dwgObjectsWithoutBlocks.add(entity);
756
                        } else if (entity instanceof DwgSolid && !addingToBlock) {
757
                                dwgObjectsWithoutBlocks.add(entity);
758
                        } else if (entity instanceof DwgLine && !addingToBlock) {
759
                                dwgObjectsWithoutBlocks.add(entity);
760
                        } else if (entity instanceof DwgPoint && !addingToBlock) {
761
                                dwgObjectsWithoutBlocks.add(entity);
762
                        } else if (entity instanceof DwgMText && !addingToBlock) {
763
                                dwgObjectsWithoutBlocks.add(entity);
764
                        } else if (entity instanceof DwgText && !addingToBlock) {
765
                                dwgObjectsWithoutBlocks.add(entity);
766
                        } else if (entity instanceof DwgAttrib && !addingToBlock) {
767
                                dwgObjectsWithoutBlocks.add(entity);
768
                        } else if (entity instanceof DwgAttdef && !addingToBlock) {
769
                                dwgObjectsWithoutBlocks.add(entity);
770
                        } else if (entity instanceof DwgBlock) {
771
                                addingToBlock = true;
772
                        } else if (entity instanceof DwgEndblk) {
773
                                addingToBlock = false;
774
                        } else if (entity instanceof DwgBlockHeader) {
775
                                addingToBlock = true;
776
                        } 
777
                        else if (entity instanceof DwgInsert && !addingToBlock) {
778
                                double[] p = ((DwgInsert)entity).getInsertionPoint();
779
                                Point2D point = new Point2D.Double(p[0], p[1]);
780
                                double[] scale = ((DwgInsert)entity).getScale();
781
                                double rot = ((DwgInsert)entity).getRotation();
782
                                int blockHandle = ((DwgInsert)entity).getBlockHeaderHandle();
783
                                manageInsert2(point, scale, rot, blockHandle, dwgObjectsWithoutBlocks);
784
                        } else {
785
                                System.out.println(entity.getClass().getName() +" en un bloque");
786
                        }
787
                }
788
                dwgObjects = dwgObjectsWithoutBlocks;
789
        }
790
        
791
    /**
792
     * Manages an INSERT of a DWG file. This object is the insertion point of a DWG
793
     * block. 
794
     * 
795
     * @param insPoint, coordinates of the insertion point.
796
     * @param scale, scale of the elements of the block that will be inserted.
797
     * @param rot, rotation angle of the elements of the block.
798
     * 
799
     * @param bHandle, offset for the coordinates of the elements of the block.
800
     * @param id, count that serves as a id.
801
     * @param dwgObjectsWithoutBlocks, a object list with the elements extracted from
802
     * the blocks.
803
     */
804
        public void manageInsert2(Point2D insPoint, double[] scale,
805
                                                        double rot, int bHandle, 
806
                                                        List dwgObjectsWithoutBlocks) {
807
                
808
                DwgObject object = (DwgObject) handle_objects.get(new Integer(bHandle));
809
                if(! (object instanceof DwgBlockHeader)){
810
                        //Hay un problema con la asignaci?n de handle
811
                        //Un INSERT tiene como handle de Block una entidad que no es block
812
                        System.out.println("handle incorrecto." + object.getClass().getName() + " no es un blockheader");
813
                        return;
814
                }
815
                DwgBlockHeader blockHeader = (DwgBlockHeader)object;
816
                double[] bPoint = blockHeader.getBasePoint();
817
                String bname = blockHeader.getName();
818
                if (bname.startsWith("*")) 
819
                        return;
820
                int firstObjectHandle = blockHeader.getFirstEntityHandle();   
821
                int lastObjectHandle = blockHeader.getLastEntityHandle();
822
                
823
                //TODO Ver que hacia el metodo antiguo cuando llegaban handles a 0
824
                //como extremos de un bloque (sera bloque vacio, supongo)
825
                if(firstObjectHandle == 0 || lastObjectHandle == 0){
826
                        System.out.println("Problemas en el bloque "+bname);
827
                        System.out.println("1er obj="+firstObjectHandle+" 2o obj="+lastObjectHandle);
828
                        return;
829
                }        
830
                
831
                //Busca el bloque cuyo nombre sea bname
832
//                El bloque no se usa para nada DwgBlock block = (DwgBlock) names_blocks.get(bname);
833
                /*
834
                 * Ahora localiza la primera entidad del bloque, 
835
                 * y a partir de ah?, a?ade
836
                 * al bloque todas las entidades que encuentre hasta la 
837
                 * ?ltima entidad del bloque
838
                 * 
839
                 * */
840
                 DwgObject firstObj = (DwgObject) handle_objects.
841
                                                 get(new Integer(firstObjectHandle));
842
                 DwgObject lastObj =  (DwgObject) handle_objects.
843
                                                 get(new Integer(lastObjectHandle));
844
                 
845
                 int firstObjIdx = dwgObjects.indexOf(firstObj);
846
                 int lastObjIdx = dwgObjects.indexOf(lastObj);
847
                 if(firstObjIdx == -1 || lastObjIdx == -1){
848
                         System.out.println("Problemas en la LinkedList: 1?="+firstObjIdx+",Ultimo="+lastObjIdx);
849
                 }
850
                 for(int i = firstObjIdx; i <= lastObjIdx; i++){
851
                         DwgObject obj = (DwgObject) dwgObjects.get(i);
852
                         manageBlockEntity(obj, bPoint, 
853
                                                           insPoint, scale, 
854
                                                           rot, dwgObjectsWithoutBlocks);
855
                 }//for
856
        }
857
        
858
        
859
        
860
    /**
861
     * Changes the location of an object extracted from a block. This location will be
862
     * obtained through the insertion parameters from the block and the corresponding
863
     * insert.
864
     * @param entity, the entity extracted from the block.
865
     * @param bPoint, offset for the coordinates of the entity.
866
     * @param insPoint, coordinates of the insertion point for the entity.
867
     * @param scale, scale for the entity.
868
     * @param rot, rotation angle for the entity.
869
     * @param id, a count as a id.
870
     * @param dwgObjectsWithoutBlocks, a object list with the elements extracted from
871
     * the blocks.
872
     */
873
        private void manageBlockEntity2(DwgObject entity, 
874
                                                                        double[] bPoint, 
875
                                                                        Point2D insPoint, 
876
                                                                        double[] scale, 
877
                                                                        double rot, 
878
                                                                        List dwgObjectsWithoutBlocks) {
879
                
880
                if(entity instanceof IDwgBlockMember){
881
                        IDwgBlockMember blockMember = (IDwgBlockMember)entity;
882
                        blockMember.transform2Block(bPoint, insPoint, scale, rot, dwgObjectsWithoutBlocks, this);
883
                }
884
        }
885
        
886
        
887
        /*
888
         * azabala: Esto ahora se hace mientras las entidades dwg
889
         * se van creando, y no en una segunda pasada
890
         * */
891
        /*
892
        public void testDwg3D() {
893
                for (int i=0;i<dwgObjects.size();i++) {
894
                        DwgObject obj = (DwgObject)dwgObjects.get(i);
895
                        
896
                        if(obj instanceof IDwg3DTestable){
897
                                if(((IDwg3DTestable)obj).has3DData())
898
                                        dwg3DFile = true;
899
                                return;
900
                        }
901
                        
902
                        //} else if (obj instanceof DwgLinearDimension) {
903
                        //        z = ((DwgLinearDimension)obj).getElevation();
904
                        //        if (z!=0.0) dwg3DFile = true;         
905
                }//for
906
                dwg3DFile = false;
907
        }
908
        */
909
        
910
        /**
911
         * Add a DWG section offset to the dwgSectionOffsets vector
912
         * 
913
         * @param key Define the DWG section
914
         * @param seek Offset of the section
915
         * @param size Size of the section
916
         */
917
        public void addDwgSectionOffset(String key, int seek, int size) {
918
                DwgSectionOffset dso = new DwgSectionOffset(key, seek, size);
919
                dwgSectionOffsets.add(dso);
920
        }
921
        
922
        /**
923
     * Returns the offset of DWG section given by its key 
924
         * 
925
     * @param key Define the DWG section
926
         * @return int Offset of the section in the DWG file
927
         */
928
        public int getDwgSectionOffset(String key) {
929
                int offset = 0;
930
                for (int i=0; i<dwgSectionOffsets.size(); i++) {
931
                        DwgSectionOffset dso = (DwgSectionOffset)dwgSectionOffsets.get(i);
932
                        String ikey = dso.getKey();
933
                        if (key.equals(ikey)) {
934
                                offset = dso.getSeek();
935
                                break;
936
                        }
937
                }
938
                return offset;
939
        }
940
        
941
        /**
942
         * Add a DWG object offset to the dwgObjectOffsets vector
943
         * 
944
         * @param handle Object handle
945
         * @param offset Offset of the object data in the DWG file
946
         */
947
        public void addDwgObjectOffset(int handle, int offset) {
948
                DwgObjectOffset doo = new DwgObjectOffset(handle, offset);
949
                dwgObjectOffsets.add(doo);
950
        }
951
        
952
        /**
953
         * 
954
         * Add a DWG object to the dwgObject vector
955
         * 
956
         * @param dwgObject DWG object
957
         */
958
        public void addDwgObject(DwgObject dwgObject){
959
                //TODO Ver si puedo inicializar las listas especificas
960
                //(IDwgPolyline, etc) aqu? 
961
                dwgObjects.add(dwgObject);
962
                handle_objects.put(new Integer(dwgObject.getHandle()), dwgObject);
963
                /*
964
                 * TODO Quitar todos estos if-then y sustituirlos por un metodo callbackj
965
                 * 
966
                 * 
967
                 * (dwgObject.init(this), y que cada objeto haga lo que tenga que hacer
968
                 * */
969
                if(dwgObject instanceof DwgLayer){
970
                        this.addDwgLayer((DwgLayer) dwgObject);
971
                }
972
                if(dwgObject instanceof IDwgExtrusionable){
973
                        ((IDwgExtrusionable)dwgObject).applyExtrussion();
974
                }
975
                if(dwgObject instanceof IDwgPolyline){
976
                        dwgPolylines.add(dwgObject);
977
                }
978
                if(dwgObject instanceof IDwg3DTestable){
979
                        if(! dwg3DFile){//if its true, we dont check again
980
                                dwg3DFile = ((IDwg3DTestable)dwgObject).has3DData();
981
                        }
982
                }
983
                
984
                if(dwgObject instanceof DwgBlock){
985
                        DwgBlock block = (DwgBlock) dwgObject;
986
                        names_blocks.put(block.getName(), block);
987
                }
988
                
989
                
990
        }
991
        
992
        /**
993
         * Returns dwgObjects from its insertion order (position
994
         * in the dwg file)
995
         * 
996
         * @param index order in the dwg file
997
         * @return position
998
         * */
999
        public DwgObject getDwgObject(int index){
1000
                return (DwgObject) dwgObjects.get(index);
1001
        }
1002
        
1003
        public DwgObject getDwgObjectFromHandle(int handle){
1004
                return (DwgObject) handle_objects.get(new Integer(handle));
1005
        }
1006
        
1007
        /**
1008
         * Add a DWG class to the dwgClasses vector
1009
         * 
1010
         * @param dwgClass DWG class
1011
         */
1012
        public void addDwgClass(DwgClass dwgClass){
1013
                dwgClasses.add(dwgClass);
1014
        }
1015
        
1016
        public List getDwgClasses(){
1017
                return dwgClasses;
1018
        }
1019
        
1020
    /**
1021
     * @return Returns the dwgObjectOffsets.
1022
     */
1023
    public ArrayList getDwgObjectOffsets() {
1024
        return dwgObjectOffsets;
1025
    }
1026
    /**
1027
     * @return Returns the dwgObjects.
1028
     */
1029
    public LinkedList getDwgObjects() {
1030
        return dwgObjects;
1031
    }
1032
    /**
1033
     * @return Returns the fileName.
1034
     */
1035
    public String getFileName() {
1036
        return fileName;
1037
    }
1038
    /**
1039
     * @return Returns the dwg3DFile.
1040
     */
1041
    public boolean isDwg3DFile() {
1042
        return dwg3DFile;
1043
    }
1044
    /**
1045
     * @param dwg3DFile The dwg3DFile to set.
1046
     */
1047
    public void setDwg3DFile(boolean dwg3DFile) {
1048
        this.dwg3DFile = dwg3DFile;
1049
    }
1050
}