Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / DwgFile.java @ 23641

History | View | Annotate | Download (26.2 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.Iterator;
46
import java.util.List;
47
import java.util.Map;
48

    
49
import org.apache.log4j.Logger;
50

    
51
import com.iver.cit.jdwglib.dwg.objects.DwgBlockHeader;
52
import com.iver.cit.jdwglib.dwg.objects.DwgInsert;
53
import com.iver.cit.jdwglib.dwg.objects.DwgLayer;
54
import com.iver.cit.jdwglib.dwg.readers.DwgFileV12Reader;
55
import com.iver.cit.jdwglib.dwg.readers.DwgFileV14Reader;
56
import com.iver.cit.jdwglib.dwg.readers.DwgFileV15Reader;
57
import com.iver.cit.jdwglib.dwg.readers.DwgFileVR2004Reader;
58
import com.iver.cit.jdwglib.dwg.readers.IDwgFileReader;
59

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

    
95
        }
96

    
97
        private static Logger logger = Logger.getLogger(DwgFile.class
98
                        .getName());
99
        /**
100
         * Path and name of the dwg file
101
         * */
102
        private String fileName;
103
        /**
104
         * DWG version of the file (AC1013, AC1018, etc.)
105
         * */
106
        private String dwgVersion;
107

    
108
        /**
109
         * Offsets to the DWG sections
110
         */
111
        private ArrayList dwgSectionOffsets;
112
        /**
113
         * Header vars readed from the HEADER section of the DWG file
114
         * */
115
        private Map headerVars;
116

    
117
        /**
118
         * This list contains what in OpenDWG specification is called
119
         * the object map ( a collection of entries where each entry contains
120
         * the seek of each object, and its size)
121
         * */
122
        private ArrayList dwgObjectOffsets;
123

    
124
        /**
125
         * For each entry in dwgObjectOffsets, we have an instance of
126
         * DwgObject in the dwgObjects collection
127
         *
128
         * */
129
        private List dwgObjects;
130
        private HashMap handle_objects;
131

    
132

    
133
        private ArrayList dwgClasses;
134

    
135

    
136
        /**
137
         * hash map that indexes all DwgLayer objects
138
         * by its handle property
139
         * */
140
        private HashMap layerTable;
141

    
142
        /**
143
         * Specific reader of the DWG file version (12, 13, 14, 2000, etc., each
144
         * version will have an specific reader)
145
         * */
146
        private IDwgFileReader dwgReader;
147
        private boolean dwg3DFile = false;
148
        /**
149
         * Memory mapped byte buffer of the whole DWG file
150
         * */
151
        private ByteBuffer bb;
152

    
153
        /*
154
         * Optimizaciones para evitar leer el fichero completo en cada
155
         * pasada.
156
         * */
157
        /**
158
         * Contains all IDwgPolyline implementations
159
         * */
160
        private List dwgPolylines;
161
        /**
162
         * Contains all INSERT entities of the dwg file
163
         * (these entities must be processed in a second pass)
164
         *
165
         * */
166
        private List insertList;
167

    
168
        private List blockList;
169

    
170

    
171
        /**
172
         * Constructor.
173
         * @param fileName an absolute path to the DWG file
174
         */
175
        public DwgFile(String fileName) {
176
                this.fileName = fileName;
177

    
178
                dwgSectionOffsets = new ArrayList();
179
                dwgObjectOffsets = new ArrayList();
180
                headerVars = new HashMap();
181

    
182
                dwgClasses = new ArrayList();
183

    
184
                dwgObjects = new ArrayList();
185
                handle_objects = new HashMap();
186

    
187
                layerTable = new HashMap();
188

    
189
                dwgPolylines = new ArrayList();
190
                insertList = new ArrayList();
191

    
192
                blockList = new ArrayList();
193

    
194
        }
195

    
196
        public String getDwgVersion() {
197
                return dwgVersion;
198
        }
199

    
200
        /**
201
         * Reads a DWG file and put its objects in the dwgObjects Vector
202
         * This method is version independent
203
         *
204
         * @throws IOException If the file location is wrong
205
         */
206
        public void read() throws IOException,
207
                                DwgVersionNotSupportedException
208
        {
209
                setDwgVersion();
210
                if (dwgVersion.equalsIgnoreCase("Autocad R2000, R2000i, R2002")) {
211
                        dwgReader = new DwgFileV15Reader();
212
                }else if (dwgVersion.equalsIgnoreCase("Autocad pre-R14")||
213
                                dwgVersion.equalsIgnoreCase("Autocad R14") ||
214
                                dwgVersion.equalsIgnoreCase("Autocad R13")) {
215
                        dwgReader = new DwgFileV14Reader();
216
                }else if (dwgVersion.equalsIgnoreCase("Autocad R2004, R2005, R2006")){
217
                        dwgReader = new DwgFileVR2004Reader();
218
                } else if (dwgVersion.equalsIgnoreCase("Autocad R12")||
219
                                dwgVersion.equalsIgnoreCase("Autocad pre-R13 a") ||
220
                                dwgVersion.equalsIgnoreCase("Autocad pre-R13 b")) {
221

    
222
                        boolean isR13 = true;
223
                        if(dwgVersion.equalsIgnoreCase("Autocad R12"))
224
                                        isR13 = false;
225
                        dwgReader = new DwgFileV12Reader(isR13);
226
                }else {
227
                        DwgVersionNotSupportedException exception =
228
                                new DwgVersionNotSupportedException("Version de DWG no soportada");
229
                        exception.setDwgVersion(dwgVersion);
230
                        throw exception;
231
                }
232
                try{
233
                dwgReader.read(this, bb);
234
                }catch(Throwable t){
235
                        t.printStackTrace();
236
                        throw new IOException("Error leyendo dwg");
237
                }
238
        }
239

    
240
        private void setDwgVersion() throws IOException {
241
                File file = new File(fileName);
242
                FileInputStream fileInputStream = new FileInputStream(file);
243
                FileChannel fileChannel = fileInputStream.getChannel();
244
                long channelSize = fileChannel.size();
245
                bb = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, channelSize);
246
                byte[] versionBytes = {bb.get(0),
247
                                                                bb.get(1),
248
                                                                bb.get(2),
249
                                                                bb.get(3),
250
                                                                bb.get(4),
251
                                                                bb.get(5)};
252
                ByteBuffer versionByteBuffer = ByteBuffer.wrap(versionBytes);
253
                String[] bs = new String[versionByteBuffer.capacity()];
254
                String versionString = "";
255
                for (int i=0; i<versionByteBuffer.capacity(); i++) {
256
                        bs[i] = new String(new byte[]{(byte)(versionByteBuffer.get(i))});
257
                        versionString = versionString + bs[i];
258
                }
259
                String version = (String) acadVersions.get(versionString);
260
                if(version == null)
261
                        version = "Unknown Dwg format";
262
                this.dwgVersion = version;
263
        }
264

    
265
        public void setHeader(String key, Object value){
266
                headerVars.put(key, value);
267
        }
268

    
269
        public Object getHeader(String key){
270
                return headerVars.get(key);
271
        }
272

    
273
        /*
274
         * A DwgLayer is a DWG drawing entity, so all DwgLayer objects are
275
         * saved in dwgObjects collection.
276
         * Instead of iterate over the full collection, is faster check every object
277
         * and save all the DwgLayer instances in their own collection.
278
         *
279
         */
280
        protected void addDwgLayer(DwgLayer dwgLayer){
281
                layerTable.put(new Integer(dwgLayer.getHandle().getOffset()),
282
                                dwgLayer);
283
        }
284

    
285
        private void printInfoOfAObject (DwgObject entity){
286
                logger.info("index = "+entity.getIndex() + " entity.type = " + entity.type + " entityClassName = "+ entity.getClass().getName());
287
                logger.info("handleCode = "+entity.getHandle().getCode());
288
                logger.info("entityLayerHandle = "+entity.getHandle().getOffset());
289
                if(entity.hasLayerHandle()){
290
                        logger.info("layerHandleCode = "+entity.getLayerHandle().getCode());
291
                        logger.info("layerHandle = "+entity.getLayerHandle().getOffset());
292
                }
293
                if(entity.hasSubEntityHandle()){
294
                        logger.info("subEntityHandleCode = "+entity.getSubEntityHandle().getCode());
295
                        logger.info("subEntityHandle = "+entity.getSubEntityHandle().getOffset());
296
                }
297
                if(entity.hasNextHandle()){
298
                        logger.info("nextHandleCode = "+entity.getNextHandle().getCode());
299
                        logger.info("nextHandle = "+entity.getNextHandle().getOffset());
300
                }
301
                if(entity.hasPreviousHandle()){
302
                        logger.info ("previousHandleCode = "+entity.getPreviousHandle().getCode());
303
                        logger.info ("previousHandle = "+entity.getPreviousHandle().getOffset());
304
                }
305
                if(entity.hasXDicObjHandle()){
306
                        logger.info ("xDicObjHandleCode = "+entity.getXDicObjHandle());
307
                        logger.info ("xDicObjHandle = "+entity.getXDicObjHandle());
308
                }
309
                if(entity.hasReactorsHandles()){
310
                        ArrayList reactorsHandles = entity.getReactorsHandles();
311
                        int size = reactorsHandles.size();
312
                        logger.info ("NUMERO DE reactors = "+size);
313
                        DwgHandleReference hr;
314
                        for(int i=0; i<size; i++){
315
                                hr=(DwgHandleReference)reactorsHandles.get(i);
316
                                logger.info ("reactorHandleCode = "+hr.getCode());
317
                                logger.info (" reactorHandle = "+hr.getOffset());
318
                        }
319
                }
320

    
321
        }
322
        public DwgLayer getDwgLayer(DwgObject entity){
323
                DwgHandleReference handle = entity.getLayerHandle();
324
                if(handle == null){
325
                        return null;
326
                }
327
                int        handleCode = handle.getCode();
328
                int        entityLayerHandle = entity.getLayerHandle().getOffset();
329
                int layerHandle = -1;
330

    
331
                int entityRecord;
332
                DwgObject object;
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
                // FIXME: Esto no esta terminado. Falta considerar los codigo
353
                // 0x2, 0x3, 0x6, 0xA que no han aparecido en los archivos de prueba.
354
                switch(handleCode){
355
                case 0x4:
356
                        if (entity.hasNextHandle()){
357
                                int nextHandleCode = entity.getNextHandle().getCode();
358
                                if (nextHandleCode == 0x5) {
359
                                        layerHandle = entity.getNextHandle().getOffset();
360
                                } else {
361
                                        //TODO: No se han previsto nextHandleCode != 0x5
362
//                                        System.out.println ("DwgFile.getDwgLayer: handleCode "+handleCode+
363
//                                                        " con nextHandleCode "+ nextHandleCode +" no implementado.");
364
                                }
365
                        } else {
366
                                layerHandle = entity.getLayerHandle().getOffset();
367
                        }
368
                        break;
369
                case 0x5:
370
                        layerHandle = entity.getLayerHandle().getOffset();
371
                        break;
372
                case 0x8:
373
                        if (entity.hasNextHandle()){
374
                                int nextHandleCode = entity.getNextHandle().getCode();
375
                                if (nextHandleCode == 0x5) {
376
                                        layerHandle = entity.getNextHandle().getOffset();
377
                                } else {
378
                                        //TODO No se han previsto nextHandleCode != 0x5
379
//                                        System.out.println ("DwgFile.getDwgLayer: handleCode "+handleCode+
380
//                                                        " con nextHandleCode "+ nextHandleCode +" no implementado.");
381
                                }
382
                        } else {
383
                                layerHandle = entity.getHandle().getOffset() - 1;
384
                        }
385
                        break;
386
                case 0xC:
387
                        if (entity.hasNextHandle()){
388
                                int nextHandleCode = entity.getNextHandle().getCode();
389
                                if (nextHandleCode == 0x5) {
390
                                        layerHandle = entity.getNextHandle().getOffset();
391
                                } else {
392
                                        //TODO: No se han previsto nextHandleCode != 0x5
393
//                                        System.out.println ("DwgFile.getDwgLayer: handleCode "+handleCode+
394
//                                                        " con nextHandleCode "+ nextHandleCode +" no implementado.");
395
                                }
396
                        } else {
397
                                layerHandle = entity.getHandle().getOffset() - entity.getLayerHandle().getOffset() + 1;
398
                        }
399
                        break;
400
                default:
401
//                        System.out.println ("DwgFile.getDwgLayer: handleCode "+handleCode+" no implementado. entityLayerHandle="+entityLayerHandle);
402
                }
403

    
404
                if(layerHandle != -1){
405
                        Iterator lyrIterator = layerTable.values().iterator();
406
                        while(lyrIterator.hasNext()){
407
                                DwgLayer lyr = (DwgLayer) lyrIterator.next();
408
                                int lyrHdl = lyr.getHandle().getOffset();
409
                                if (lyrHdl == layerHandle){
410
                                        return lyr;
411
                                }
412
                        }
413
                }
414
//                System.out.println("NO SE HA ENCONTRADO UNA CAPA CON HANDLE " + layerHandle);
415
//                printInfoOfAObject(entity);
416
                return null;
417
        }
418

    
419
        public DwgObject getDwgSuperEntity(DwgObject entity) {
420
                if(entity.hasSubEntityHandle()){
421
                        int handleCode = entity.subEntityHandle.getCode();
422
                        int offset = entity.subEntityHandle.getOffset();
423
                        int handle = -1;
424

    
425
                        DwgObject object;
426

    
427
                        switch(handleCode){
428
                        // TODO: case 0x2:
429
                        // TODO: case 0x3:
430
                        case 0x4:
431
                        case 0x5:
432
                                handle = offset;
433
                                break;
434
                        // TODO: case 0x6:
435
                        case 0x8:
436
                                handle=entity.getHandle().getOffset() - 1;
437
                                break;
438
                        case 0xA:
439
                                handle = entity.getHandle().getOffset() + offset;
440
                                break;
441
                        case 0xC:
442
                                handle = entity.getHandle().getOffset() - offset;
443
                                break;
444
                        default:
445
                                logger.warn ("DwgObject.getDwgSuperEntity: handleCode "+handleCode+" no implementado. offset = "+offset);
446
                        }
447
                        if(handle != -1){
448
                                object = getDwgObjectFromHandle(handle);
449
                                if(object != null)
450
                                        return object;
451
                        }
452
                }
453
                return null;
454
        }
455

    
456
        public String getLayerName(DwgObject entity) {
457
                DwgLayer dwgLayer = getDwgLayer(entity);
458
                if(dwgLayer == null){
459
                        return "";
460
                }else{
461
                        return dwgLayer.getName();
462
                }
463
        }
464

    
465
        /**
466
     * Returns the color of the layer of a DWG object
467
         *
468
     * @param entity DWG object which we want to know its layer color
469
         * @return int Layer color of the DWG object in the Autocad color code
470
         */
471
        public int getColorByLayer(DwgObject entity) {
472
                int colorByLayer;
473
                DwgLayer dwgLyr = getDwgLayer(entity);
474
                if(dwgLyr == null)
475
                        colorByLayer = 0;
476
                else
477
                        colorByLayer = dwgLyr.getColor();
478
                return colorByLayer;
479
        }
480
        /**
481
         * Configure the geometry of the polylines in a DWG file from the vertex list in
482
         * this DWG file. This geometry is given by an array of Points.
483
         * Besides, manage closed polylines and polylines with bulges in a GIS Data model.
484
     * It means that the arcs of the polylines will be done through a set of points and
485
     * a distance between these points.
486
         */
487
        public void calculateGisModelDwgPolylines() {
488
                /*
489
                 * In Dwg 12 format, all vertices of a polyline are between polyline entity
490
                 * and endsec entity. Also, polylines dont save any handle of their vertices (first and last).
491
                 *
492
                 * After Dwg 12 version, we have the opposite case: polylines have handles/pointers to their
493
                 * first and last vertices.
494
                 *
495
                 * If dwg file is not V12, we must look for all polyline vertices (and we must to wait until
496
                 * all entities are readed).
497
                 * If dwg file is V12, all polylines already have their vertices.
498
                 * */
499
                if(! (dwgReader instanceof DwgFileV12Reader)){
500
                        for (int i = 0; i < dwgPolylines.size(); i++){
501
                                DwgObject pol = (DwgObject)dwgPolylines.get(i);
502
                                if (pol instanceof IDwgPolyline) {
503
                                        ((IDwgPolyline)pol).calculateGisModel(this);
504
                                }//if
505
                        }//for
506
                }
507
        }
508

    
509
    /**
510
     * Configure the geometry of the polylines in a DWG file from the vertex list in
511
     * this DWG file. This geometry is given by an array of Points
512
     * Besides, manage closed polylines and polylines with bulges in a GIS Data model.
513
     * It means that the arcs of the polylines will be done through a curvature
514
     * parameter called bulge associated with the points of the polyline.
515
     */
516
        //TODO Refactorizar para que solo se aplique a las Polilineas
517

    
518
//        public void calculateCadModelDwgPolylines() {
519
//                for (int i=0;i<dwgObjects.size();i++) {
520
//                        DwgObject pol = (DwgObject)dwgObjects.get(i);
521
//                        if (pol instanceof DwgPolyline2D) {
522
//                                int flags = ((DwgPolyline2D)pol).getFlags();
523
//                                int firstHandle = ((DwgPolyline2D)pol).getFirstVertexHandle().getOffset();
524
//                                int lastHandle = ((DwgPolyline2D)pol).getLastVertexHandle().getOffset();
525
//                                ArrayList pts = new ArrayList();
526
//                                ArrayList bulges = new ArrayList();
527
//                                double[] pt = new double[3];
528
//                                for (int j=0;j<dwgObjects.size();j++) {
529
//                                        DwgObject firstVertex = (DwgObject)dwgObjects.get(j);
530
//                                        if (firstVertex instanceof DwgVertex2D) {
531
//                                                int vertexHandle = firstVertex.getHandle().getOffset();
532
//                                                if (vertexHandle==firstHandle) {
533
//                                                        int k=0;
534
//                                                        while (true) {
535
//                                                                DwgObject vertex = (DwgObject)dwgObjects.get(j+k);
536
//                                                                int vHandle = vertex.getHandle().getOffset();
537
//                                                                if (vertex instanceof DwgVertex2D) {
538
//                                                                        pt = ((DwgVertex2D)vertex).getPoint();
539
//                                                                        pts.add(new Point2D.Double(pt[0], pt[1]));
540
//                                                                        double bulge = ((DwgVertex2D)vertex).getBulge();
541
//                                                                        bulges.add(new Double(bulge));
542
//                                                                        k++;
543
//                                                                        if (vHandle==lastHandle && vertex instanceof DwgVertex2D) {
544
//                                                                                break;
545
//                                                                        }
546
//                                                                } else if (vertex instanceof DwgSeqend) {
547
//                                                                        break;
548
//                                                                }
549
//                                                        }
550
//                                                }
551
//                                        }
552
//                                }
553
//                                if (pts.size()>0) {
554
//                                        /*Point2D[] newPts = new Point2D[pts.size()];
555
//                                        if ((flags & 0x1)==0x1) {
556
//                                                newPts = new Point2D[pts.size()+1];
557
//                                                for (int j=0;j<pts.size();j++) {
558
//                                                        newPts[j] = (Point2D)pts.get(j);
559
//                                                }
560
//                                                newPts[pts.size()] = (Point2D)pts.get(0);
561
//                                                bulges.add(new Double(0));
562
//                                        } else {
563
//                                                for (int j=0;j<pts.size();j++) {
564
//                                                        newPts[j] = (Point2D)pts.get(j);
565
//                                                }
566
//                                        }*/
567
//                                        double[] bs = new double[bulges.size()];
568
//                                        for (int j=0;j<bulges.size();j++) {
569
//                                                bs[j] = ((Double)bulges.get(j)).doubleValue();
570
//                                        }
571
//                                        ((DwgPolyline2D)pol).setBulges(bs);
572
//                                        //Point2D[] points = GisModelCurveCalculator.calculateGisModelBulge(newPts, bs);
573
//                                        Point2D[] points = new Point2D[pts.size()];
574
//                                        for (int j=0;j<pts.size();j++) {
575
//                                            points[j] = (Point2D)pts.get(j);
576
//                                        }
577
//                                        ((DwgPolyline2D)pol).setPts(points);
578
//                                } else {
579
////                                        System.out.println("Encontrada polil?nea sin puntos ...");
580
//                                        // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto
581
//                                        // ocurre es porque existe un error que hay que corregir ...
582
//                                }
583
//                        } else if (pol instanceof DwgPolyline3D) {
584
//                        } else if (pol instanceof DwgLwPolyline && ((DwgLwPolyline)pol).getVertices()!=null) {
585
//                        }
586
//                }
587
//        }
588

    
589
        /*
590
         * TODO Revisar los bloques que son XREF
591
         * */
592
        public void blockManagement2(){
593
                Iterator it = null;
594

    
595

    
596
                //dwg v12 blocks already has their entities added
597
                //for the rest of versions, we add block entities to their owner block
598
                if(! (dwgReader instanceof DwgFileV12Reader)){
599
                        //once we have read all dwg entities, we look for all of them
600
                        //that has a superentity that is a block (to fill in the entity list
601
                        //of each block
602
                        it = dwgObjects.iterator();
603
                        int i = 0;
604
                        while(it.hasNext()){
605
                                DwgObject entity = (DwgObject)it.next();
606
                                DwgObject superEnt = getDwgSuperEntity(entity);
607
                                if(superEnt instanceof DwgBlockHeader){
608
                                        DwgBlockHeader blk = (DwgBlockHeader)superEnt;
609
                                        blk.addObject(entity);
610
                                        it.remove();//TODO Creo que esto es lento, mejor
611
                                        //el metodo original (en java solo se duplican las referencias)
612
                                        i++;
613
                                }
614
                        }//while
615
                }//if dwgfilev12
616

    
617
                //after that, we process the INSERTs
618
                it = insertList.iterator();
619
                while(it.hasNext()){
620
                        DwgInsert insert = (DwgInsert) it.next();
621
                        if(insert.isProcessed()){
622
                                //It has been processed nexted to other insert
623
                                continue;
624
                        }
625
                        insert.setProcessed(true);
626
                        double[] p = insert.getInsertionPoint();
627
                        Point2D point = new Point2D.Double(p[0], p[1]);
628
                        double[] scale = insert.getScale();
629
                        double rot = insert.getRotation();
630
                        int blockHandle = insert.getBlockHeaderHandle().getOffset();
631
                        manageInsert2(point, scale,
632
                                        rot, blockHandle,
633
                                        dwgObjects, handle_objects);
634
                }
635

    
636
}
637

    
638

    
639

    
640
        public void manageInsert2(Point2D insPoint, double[] scale,
641
                        double rot, int bHandle,
642
                        List dwgObjectsWithoutBlocks,
643
                        Map handleObjectsWithoutBlocks) {
644

    
645
                DwgObject object = (DwgObject) handle_objects.get(new Integer(bHandle));
646
                if(object == null){
647
                        logger.error("No hemos encontrado el BlockHeader cuyo handle es "+bHandle);
648
                        return;
649
                }else if(! (object instanceof DwgBlockHeader)){
650
                        //Hay un problema con la asignaci?n de handle
651
                        //Un INSERT tiene como handle de Block una entidad que no es block
652
                        logger.error("handle incorrecto." + object.getClass().getName() + " no es un blockheader");
653
                        return;
654
                }
655

    
656
                DwgBlockHeader blockHeader = (DwgBlockHeader)object;
657
                double[] bPoint = blockHeader.getBasePoint();
658
                String bname = blockHeader.getName();
659
                if (bname.startsWith("*"))
660
                        return;
661

    
662
                //TODO Cambiar por List. Done.
663
                List entities = blockHeader.getObjects();
664
                if(entities.size() == 0){
665
                        logger.warn("El bloque "+blockHeader.getName()+" no tiene ninguna entidad");
666
                }
667
                Iterator blkEntIt = entities.iterator();
668
                while(blkEntIt.hasNext()){
669
                        DwgObject obj = (DwgObject) blkEntIt.next();
670
                         manageBlockEntity(obj, bPoint,
671
                                           insPoint, scale,
672
                                           rot, dwgObjectsWithoutBlocks,
673
                                           handleObjectsWithoutBlocks);
674
                }//while
675
        }
676

    
677

    
678
        public int getIndexOf(DwgObject dwgObject){
679
                return dwgObjects.indexOf(dwgObject);
680
        }
681

    
682

    
683

    
684
    /**
685
     * Changes the location of an object extracted from a block. This location will be
686
     * obtained through the insertion parameters from the block and the corresponding
687
     * insert.
688
     * @param entity, the entity extracted from the block.
689
     * @param bPoint, offset for the coordinates of the entity.
690
     * @param insPoint, coordinates of the insertion point for the entity.
691
     * @param scale, scale for the entity.
692
     * @param rot, rotation angle for the entity.
693
     * @param id, a count as a id.
694
     * @param dwgObjectsWithoutBlocks, a object list with the elements extracted from
695
     * the blocks.
696
     */
697
        private void manageBlockEntity(DwgObject entity,
698
                                                                        double[] bPoint,
699
                                                                        Point2D insPoint,
700
                                                                        double[] scale,
701
                                                                        double rot,
702
                                                                        List dwgObjectsWithoutBlocks,
703
                                                                        Map handleObjectsWithoutBlocks) {
704

    
705
                if(entity instanceof IDwgBlockMember){
706
                        IDwgBlockMember blockMember = (IDwgBlockMember)entity;
707
                        blockMember.transform2Block(bPoint, insPoint, scale, rot,
708
                                        dwgObjectsWithoutBlocks,
709
                                        handleObjectsWithoutBlocks,this);
710
                }
711

    
712
        }
713

    
714

    
715
        /**
716
         * Add a DWG section offset to the dwgSectionOffsets vector
717
         *
718
         * @param key Define the DWG section
719
         * @param seek Offset of the section
720
         * @param size Size of the section
721
         */
722
        public void addDwgSectionOffset(String key, int seek, int size) {
723
                DwgSectionOffset dso = new DwgSectionOffset(key, seek, size);
724
                dwgSectionOffsets.add(dso);
725
        }
726

    
727
        /**
728
     * Returns the offset of DWG section given by its key
729
         *
730
     * @param key Define the DWG section
731
         * @return int Offset of the section in the DWG file
732
         */
733
        public int getDwgSectionOffset(String key) {
734
                int offset = 0;
735
                for (int i=0; i<dwgSectionOffsets.size(); i++) {
736
                        DwgSectionOffset dso = (DwgSectionOffset)dwgSectionOffsets.get(i);
737
                        String ikey = dso.getKey();
738
                        if (key.equals(ikey)) {
739
                                offset = dso.getSeek();
740
                                break;
741
                        }
742
                }
743
                return offset;
744
        }
745

    
746
        /**
747
         * Add a DWG object offset to the dwgObjectOffsets vector
748
         *
749
         * @param handle Object handle
750
         * @param offset Offset of the object data in the DWG file
751
         */
752
        public void addDwgObjectOffset(int handle, int offset) {
753
                DwgObjectOffset doo = new DwgObjectOffset(handle, offset);
754
                dwgObjectOffsets.add(doo);
755
        }
756

    
757
        /**
758
         *
759
         * Add a DWG object to the dwgObject vector
760
         *
761
         * @param dwgObject DWG object
762
         */
763
        public void addDwgObject(DwgObject dwgObject){
764
                //TODO Ver si puedo inicializar las listas especificas
765
                //(IDwgPolyline, etc) aqu?
766
                dwgObjects.add(dwgObject);
767
                /*
768
                 * TODO Quitar todos estos if-then y sustituirlos por un metodo callback
769
                 *
770
                 *
771
                 * (dwgObject.init(this), y que cada objeto haga lo que tenga que hacer
772
                 * */
773
                if(dwgObject instanceof DwgLayer){
774
                        this.addDwgLayer((DwgLayer) dwgObject);
775
                }
776

    
777
                //Probamos a no aplicar las extrusiones
778

    
779
                if(dwgObject instanceof IDwgExtrusionable){
780
                        ((IDwgExtrusionable)dwgObject).applyExtrussion();
781

    
782
                }
783

    
784
                if(dwgObject instanceof IDwgPolyline){
785
                        dwgPolylines.add(dwgObject);
786
                }
787
                if(dwgObject instanceof IDwg3DTestable){
788
                        if(!isDwg3DFile()){//if its true, we dont check again
789
                                setDwg3DFile(((IDwg3DTestable)dwgObject).has3DData());
790
                        }
791
                }
792
                if(dwgObject instanceof DwgInsert){
793
                        insertList.add(dwgObject);
794
                }
795

    
796
                if(dwgObject instanceof DwgBlockHeader){
797
                        blockList.add(dwgObject);
798
                }
799
                handle_objects.put(new Integer(dwgObject.getHandle().getOffset()), dwgObject);
800

    
801

    
802
        }
803

    
804
        /**
805
         * Returns dwgObjects from its insertion order (position
806
         * in the dwg file)
807
         *
808
         * @param index order in the dwg file
809
         * @return position
810
         * */
811
        public DwgObject getDwgObject(int index){
812
                return (DwgObject) dwgObjects.get(index);
813
        }
814

    
815
        public DwgObject getDwgObjectFromHandle(int handle){
816
                return (DwgObject) handle_objects.get(new Integer(handle));
817
        }
818

    
819
        /**
820
         * Add a DWG class to the dwgClasses vector
821
         *
822
         * @param dwgClass DWG class
823
         */
824
        public void addDwgClass(DwgClass dwgClass){
825
                dwgClasses.add(dwgClass);
826
        }
827

    
828
        /**
829
         * Add a DWG class to the dwgClasses vector
830
         *
831
         * @param dwgClass DWG class
832
         */
833
        public void addDwgClass(DwgClass2004 dwgClass){
834
                dwgClasses.add(dwgClass);
835
        }
836

    
837

    
838
        public void printClasses(){
839
                logger.info("#### CLASSES ####");
840
                for(int i = 0; i < dwgClasses.size(); i++){
841
                        DwgClass clazz = (DwgClass) dwgClasses.get(i);
842
                        logger.info(clazz.toString());
843
                }
844
                logger.info("#############");
845
        }
846

    
847
        public List getDwgClasses(){
848
                return dwgClasses;
849
        }
850

    
851
    /**
852
     * @return Returns the dwgObjectOffsets.
853
     */
854
    public ArrayList getDwgObjectOffsets() {
855
        return dwgObjectOffsets;
856
    }
857
    /**
858
     * @return Returns the dwgObjects.
859
     */
860
    public List getDwgObjects() {
861
        return dwgObjects;
862
    }
863
    /**
864
     * @return Returns the fileName.
865
     */
866
    public String getFileName() {
867
        return fileName;
868
    }
869
    /**
870
     * @return Returns the dwg3DFile.
871
     */
872
    public boolean isDwg3DFile() {
873
        return dwg3DFile;
874
    }
875
    /**
876
     * @param dwg3DFile The dwg3DFile to set.
877
     */
878
    public void setDwg3DFile(boolean dwg3DFile) {
879
        this.dwg3DFile = dwg3DFile;
880
    }
881
}