Statistics
| Revision:

root / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / readers / objreaders / v2004 / AbstractDwg2004Reader.java @ 23942

History | View | Annotate | Download (9.13 KB)

1
/*
2
 * Created on 25-ene-2007
3
 *
4
 * gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
5
 *
6
 * Copyright (C) 2004 IVER T.I. 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
 *  Generalitat Valenciana
25
 *   Conselleria d'Infraestructures i Transport
26
 *   Av. Blasco Ib��ez, 50
27
 *   46010 VALENCIA
28
 *   SPAIN
29
 *
30
 *      +34 963862235
31
 *   gvsig@gva.es
32
 *      www.gvsig.gva.es
33
 *
34
 *    or
35
 *
36
 *   IVER T.I. S.A
37
 *   Salamanca 50
38
 *   46005 Valencia
39
 *   Spain
40
 *
41
 *   +34 963163400
42
 *   dac@iver.es
43
 */
44
/* CVS MESSAGES:
45
*
46
* $Id: AbstractDwg15Reader.java,v 1.1.2.2 2007/03/21 19:49:16 azabala Exp $
47
* $Log: AbstractDwg15Reader.java,v $
48
* Revision 1.1.2.2  2007/03/21 19:49:16  azabala
49
* implementation of dwg 12, 13, 14.
50
*
51
* Revision 1.1  2007/01/25 20:05:58  azabala
52
* start of implementation of specific versions' object readers
53
*
54
*
55
*/
56
package com.iver.cit.jdwglib.dwg.readers.objreaders.v2004;
57

    
58
import java.util.ArrayList;
59

    
60
import org.apache.log4j.Logger;
61

    
62
import com.iver.cit.jdwglib.dwg.CorruptedDwgEntityException;
63
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
64
import com.iver.cit.jdwglib.dwg.DwgObject;
65
import com.iver.cit.jdwglib.dwg.DwgUtil;
66
import com.iver.cit.jdwglib.dwg.objects.DwgArc;
67
import com.iver.cit.jdwglib.dwg.objects.DwgAttrib;
68
import com.iver.cit.jdwglib.dwg.objects.DwgBlock;
69
import com.iver.cit.jdwglib.dwg.objects.DwgCircle;
70
import com.iver.cit.jdwglib.dwg.objects.DwgEllipse;
71
import com.iver.cit.jdwglib.dwg.objects.DwgEndblk;
72
import com.iver.cit.jdwglib.dwg.objects.DwgInsert;
73
import com.iver.cit.jdwglib.dwg.objects.DwgLine;
74
import com.iver.cit.jdwglib.dwg.objects.DwgLwPolyline;
75
import com.iver.cit.jdwglib.dwg.objects.DwgMText;
76
import com.iver.cit.jdwglib.dwg.objects.DwgPoint;
77
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline3D;
78
import com.iver.cit.jdwglib.dwg.objects.DwgSeqend;
79
import com.iver.cit.jdwglib.dwg.objects.DwgSpline;
80
import com.iver.cit.jdwglib.dwg.objects.DwgText;
81
import com.iver.cit.jdwglib.dwg.objects.DwgVertex3D;
82
import com.iver.cit.jdwglib.dwg.objects.DwgAttdef;
83
import com.iver.cit.jdwglib.dwg.objects.DwgSolid;
84
import com.iver.cit.jdwglib.dwg.readers.DwgFileVR2004Reader;
85
import com.iver.cit.jdwglib.dwg.readers.IDwgFileReader;
86
import com.iver.cit.jdwglib.dwg.readers.IDwgObjectReader;
87

    
88
public abstract class AbstractDwg2004Reader implements IDwgObjectReader{
89

    
90
        private static Logger logger = Logger.getLogger(AbstractDwg2004Reader.class.getName());
91

    
92
        /**
93
         * Reads the header of a dwg object2004
94
         * */
95
        public int readObjectHeader(int[] data, int offset, DwgObject dwgObject) throws RuntimeException, CorruptedDwgEntityException{
96
                int bitPos = offset;
97

    
98

    
99
                Integer mode = (Integer) DwgUtil.getBits(data, 2, bitPos);
100
                bitPos = bitPos + 2;
101
                dwgObject.setMode(mode.intValue());
102

    
103

    
104
//                ArrayList v = DwgUtil.getBitShort(data, bitPos);
105
                ArrayList v = DwgUtil.getBitLong(data, bitPos); //Según especificaciones
106
                bitPos = ((Integer) v.get(0)).intValue();
107
                int rnum = ((Integer) v.get(1)).intValue();
108
                dwgObject.setNumReactors(rnum);
109

    
110
                //FIXME: ¿Por qué hace esto? Si entra en cualquiera de las condiciones
111
                // se perdería un bit.
112
                // ¿Es correcto o, tal vez están equivocadas las especificaciones en este punto?
113
                // Vale, en otro punto de las especificaciones dice "Only entities have this flag"
114
                if(dwgObject instanceof DwgLine) dwgObject.setXDicObjFlag(true);
115
                else if(dwgObject instanceof DwgPoint) dwgObject.setXDicObjFlag(true);
116
                else if(dwgObject instanceof DwgCircle) dwgObject.setXDicObjFlag(true);
117
                else if(dwgObject instanceof DwgArc) dwgObject.setXDicObjFlag(true);
118
                else if(dwgObject instanceof DwgLwPolyline) dwgObject.setXDicObjFlag(true);
119
                else if(dwgObject instanceof DwgEllipse) dwgObject.setXDicObjFlag(true);
120
                else if(dwgObject instanceof DwgMText) dwgObject.setXDicObjFlag(true);
121
                else if(dwgObject instanceof DwgText) dwgObject.setXDicObjFlag(true);
122
                else if(dwgObject instanceof DwgBlock) dwgObject.setXDicObjFlag(true);
123
                else if(dwgObject instanceof DwgEndblk) dwgObject.setXDicObjFlag(true);
124
                else if(dwgObject instanceof DwgPolyline3D) dwgObject.setXDicObjFlag(true);
125
                else if(dwgObject instanceof DwgVertex3D) dwgObject.setXDicObjFlag(true);
126
                else if(dwgObject instanceof DwgSeqend) dwgObject.setXDicObjFlag(true);
127
                else if(dwgObject instanceof DwgInsert) dwgObject.setXDicObjFlag(true);
128
                else if(dwgObject instanceof DwgAttrib) dwgObject.setXDicObjFlag(true);
129
                else if(dwgObject instanceof DwgSpline) dwgObject.setXDicObjFlag(true);
130
                else if(dwgObject instanceof DwgAttdef) dwgObject.setXDicObjFlag(true);
131
                else if(dwgObject instanceof DwgSolid) dwgObject.setXDicObjFlag(true);
132
                else {
133
                        v = DwgUtil.testBit(data, bitPos);
134
                        bitPos = ((Integer)v.get(0)).intValue();
135
                        boolean XdicFlag = ((Boolean) v.get(1)).booleanValue();
136
                        dwgObject.setXDicObjFlag(XdicFlag);
137
                }
138
                v = DwgUtil.testBit(data, bitPos);
139
                bitPos = ((Integer) v.get(0)).intValue();
140
                boolean nolinks = ((Boolean) v.get(1)).booleanValue();
141
                dwgObject.setNoLinks(nolinks);
142

    
143
//                Segun las especificaciones, en R2004+ el color se debe leer como un
144
//                CMC, sin embargo aquí no parece que sea así
145
//                v = DwgUtil.getCmColor(data, bitPos, dwgObject.getVersion());
146
                v = DwgUtil.getBitShort(data, bitPos);
147
                bitPos = ((Integer) v.get(0)).intValue();
148
                int color = ((Integer) v.get(1)).intValue();
149
                dwgObject.setColor(color);
150

    
151
                v = DwgUtil.getBitDouble(data, bitPos);
152
                bitPos = ((Integer) v.get(0)).intValue();
153
                float ltscale = ((Double) v.get(1)).floatValue();
154

    
155
                Integer ltflag = (Integer) DwgUtil.getBits(data, 2, bitPos);
156
                /*
157
                 * 00: bylayer;
158
                 * 01: byblock;
159
                 * 10: continuous;
160
                 * 11: linetype handlen present at end of object
161
                 */
162
                bitPos = bitPos + 2;
163

    
164
                Integer psflag = (Integer) DwgUtil.getBits(data, 2, bitPos);
165
                /*
166
                 * 00: bylayer;
167
                 * 01: byblock;
168
                 * 10: continuous;
169
                 * 11: linetype handlen present at end of object
170
                 */
171
                bitPos = bitPos + 2;
172

    
173
                v = DwgUtil.getBitShort(data, bitPos);
174
                bitPos = ((Integer) v.get(0)).intValue();
175
                int invis = ((Integer) v.get(1)).intValue();
176

    
177
                v = DwgUtil.getRawChar(data, bitPos);
178
                bitPos = ((Integer) v.get(0)).intValue();
179
                int weight = ((Integer) v.get(1)).intValue();
180

    
181
                return bitPos;
182
        }
183

    
184
        /**
185
         * Reads the tailer of a dwg object2004
186
         * */
187
        public int readObjectTailer(int[] data, int offset, DwgObject dwgObject) throws RuntimeException, CorruptedDwgEntityException{
188
                int bitPos = offset;
189
                /*
190
                 * Subentity ref handle. Esto se aplica sobre VERTEX, ATTRIB, SEQEND
191
                 */
192
                if (dwgObject.getMode() == 0x0) {
193
                        DwgHandleReference subEntityHandle = new DwgHandleReference();
194
                        bitPos = subEntityHandle.read(data, bitPos);
195
                        dwgObject.setSubEntityHandle(subEntityHandle);
196
//                } else {
197
//                        logger.warn("entMode != 0 : "+dwgObject.getMode()+ " " + dwgObject.getClass().getName());
198
                }
199

    
200
                /*
201
                 * Reactors handles TODO No se están usando para setear nada en
202
                 * DwgObject
203
                 */
204
                DwgHandleReference reactorHandle;
205
                for (int i = 0; i < dwgObject.getNumReactors(); i++) {
206
                        reactorHandle = new DwgHandleReference();
207
                        bitPos = reactorHandle.read(data, bitPos);
208
                        dwgObject.addReactorHandle(reactorHandle);
209
                }
210

    
211
                /*
212
                 * XDICOBJHANDLE
213
                 */
214
                if(dwgObject.isXDicObjFlag()!= true){
215
                        DwgHandleReference xDicObjHandle = new DwgHandleReference();
216
                        bitPos = xDicObjHandle.read(data, bitPos);
217
                        dwgObject.setXDicObjHandle(xDicObjHandle);
218
                }
219

    
220
                if (!dwgObject.isNoLinks()) {
221

    
222
                        DwgHandleReference previousHandle = new DwgHandleReference();
223
                        bitPos = previousHandle.read(data, bitPos);
224
                        dwgObject.setPreviousHandle(previousHandle);
225

    
226
                        DwgHandleReference nextHandle = new DwgHandleReference();
227
                        bitPos = nextHandle.read(data, bitPos);
228
                        dwgObject.setNextHandle(nextHandle);
229

    
230
                }
231

    
232

    
233
                /*
234
                 * Layer Handle code
235
                 */
236

    
237
                DwgHandleReference handle = new DwgHandleReference();
238
                bitPos = handle.read(data, bitPos);
239
                dwgObject.setLayerHandle(handle);
240

    
241

    
242

    
243
                if (dwgObject.getLinetypeFlags() == 0x3) {
244
                        DwgHandleReference lineTypeHandle = new DwgHandleReference();
245
                        bitPos = lineTypeHandle.read(data, bitPos);
246
                        dwgObject.setLineTypeHandle(lineTypeHandle);
247

    
248
                }
249

    
250
                if (dwgObject.getPlotstyleFlags() == 0x3) {
251
                        DwgHandleReference plotStyleHandle = new DwgHandleReference();
252
                        bitPos = plotStyleHandle.read(data, bitPos);
253
                        dwgObject.setPlotStyleHandle(plotStyleHandle);
254
                }
255
                return bitPos;
256
        }
257

    
258
        protected IDwgFileReader headTailReader;
259
        public void setFileReader(IDwgFileReader headTailReader) {
260
                if( ! (headTailReader instanceof DwgFileVR2004Reader))
261
                        throw new RuntimeException("Tratando de leer entidad de DWG 2004 con"+
262
                                        headTailReader.getClass().getName());
263
                this.headTailReader = headTailReader;
264
        }
265
}
266