Revision 33177

View differences:

tags/v2_0_0_Build_2010/libraries/libDXF/src-test/org/gvsig/dxf/AllTests.java
1
package org.gvsig.dxf;
2

  
3
import junit.framework.Test;
4
import junit.framework.TestSuite;
5

  
6
public class AllTests {
7

  
8
	public static Test suite() {
9
		TestSuite suite = new TestSuite("Test for org.cresques.dxf");
10
		//$JUnit-BEGIN$
11

  
12
		//$JUnit-END$
13
		return suite;
14
	}
15

  
16
}
0 17

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

  
26
import java.util.Hashtable;
27

  
28

  
29
/**
30
 * Origen de datos. Unidad, volumen de red, etc.
31
 *
32
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>
33
 */
34
public class DataSource {
35
    private static int counter = 0;
36
    private static Hashtable units = new Hashtable();
37
    String path = null;
38
    String name = null;
39

  
40
    public DataSource(String path, String name) {
41
        this.path = path;
42
        this.name = name;
43
        units.put(name, this);
44
    }
45

  
46
    public String getName() {
47
        return name;
48
    }
49

  
50
    public String getPath() {
51
        return path;
52
    }
53

  
54
    public static DataSource getDSFromName(String name) {
55
        if (name.indexOf("[") >= 0) {
56
            name = name.substring(name.indexOf("[") + 1);
57
        }
58

  
59
        if (name.indexOf("]") >= 0) {
60
            name = name.substring(0, name.indexOf("]"));
61
        }
62

  
63
        DataSource ds = (DataSource) units.get(name);
64

  
65
        return ds;
66
    }
67

  
68
    /**
69
     * Sustituye en el path el nombre de la unidad por su path real.
70
     *
71
     * @param path
72
     * @return
73
     */
74
    public static String normalize(String path) {
75
        if (path.indexOf("[") >= 0) {
76
            DataSource ds = DataSource.getDSFromName(path);
77

  
78
            if (ds == null) {
79
                return null;
80
            }
81

  
82
            path = path.substring(0, path.indexOf("[")) + ds.getPath() +
83
                   path.substring(path.indexOf("]") + 1);
84

  
85
            //System.out.println(path);
86
        }
87

  
88
        return path;
89
    }
90

  
91
    public String toString() {
92
        return "[" + counter + "]";
93
    }
94
}
0 95

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

  
26
import java.awt.geom.AffineTransform;
27
import java.util.Date;
28

  
29
import org.cresques.cts.ICoordTrans;
30
import org.cresques.cts.IProjection;
31
import org.cresques.geo.Projected;
32
import org.cresques.px.Extent;
33
import org.gvsig.dxf.px.IObjList;
34

  
35

  
36
/**
37
 * Ancestro de todos los formatos geogr?ficos
38
 *
39
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>* @author administrador
40
 */
41
public abstract class GeoFile implements Projected, Extent.Has {
42
    IProjection proj = null;
43
    /**
44
     * Extent completo del raster. Este contiene las coordenadas reales tanto
45
     * para un raster rotado como sin rotar. Este extent coincide con requestExtent
46
     * cuando el raster no tiene rotaci?n.
47
     */
48
    protected Extent extent = null;
49
    /**
50
     * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
51
     * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
52
     * pero para un raster rotado ser? igual al extent del raster como si no
53
     * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
54
     * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
55
     * aplicado.
56
     */
57
    protected Extent requestExtent = null;
58
    /**
59
     * Esto corresponde a la transformaci?n del extent de la imagen. Se calcula a partir del extent
60
     * guardado en el fichero .rmf asociado a la imagen.  En caso de que no exista este fichero no habr?
61
     * transformaci?n
62
     */
63
    protected AffineTransform	transformRMF = null;
64
    /**
65
     * Esto corresponde a la transformaci?n del extent de la imagen. Se calcula a partir del extent
66
     * guardado en el fichero .tfw asociado a la imagen o en la cabecera de la misma.
67
     */
68
    protected AffineTransform	transformTFW = null;
69

  
70

  
71
    protected boolean			rmfExists = false;
72
    long fileSize = 0;
73
    protected long bytesReaded = 0;
74
    protected long lineCnt = 0;
75
    String name;
76

  
77
    public GeoFile() {
78
    }
79

  
80
    public GeoFile(IProjection p, String n) {
81
        proj = p;
82
        name = n;
83

  
84
        if (name != null) {
85
            name = DataSource.normalize(name);
86
        }
87
        extent = new Extent();
88
      	transformRMF = new AffineTransform();
89
    	transformTFW = new AffineTransform();
90
    }
91

  
92
    public String getName() {
93
        return name;
94
    }
95

  
96
    public void setName(String n) {
97
        name = n;
98
    }
99

  
100
    public long getFileSize() {
101
        return fileSize;
102
    }
103

  
104
    public void setFileSize(long sz) {
105
        fileSize = sz;
106
    }
107

  
108
    public IProjection getProjection() {
109
        return proj;
110
    }
111

  
112
    public void setProjection(IProjection p) {
113
        proj = p;
114
    }
115

  
116
    abstract public void reProject(ICoordTrans rp);
117

  
118
    /**
119
     * Extent completo del raster. Este contiene las coordenadas reales tanto
120
     * para un raster rotado como sin rotar. Este extent coincide con requestExtent
121
     * cuando el raster no tiene rotaci?n.
122
     * @return Extent
123
     */
124
    public Extent getExtent() {
125
        return extent;
126
    }
127

  
128
    /**
129
     * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
130
     * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
131
     * pero para un raster rotado ser? igual al extent del raster como si no
132
     * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
133
     * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
134
     * aplicado.
135
     * @return Extent
136
     */
137
    public Extent getExtentForRequest() {
138
        return requestExtent;
139
    }
140

  
141
    abstract public GeoFile load() throws Exception;
142

  
143
    abstract public void close();
144

  
145
    abstract public IObjList getObjects();
146

  
147
    /**
148
     * Filtra espacios en blanco. Deja solo uno por
149
     */
150
    public static String filterWS(String buf) {
151
        boolean lastCharWhite = false;
152
        String str = "";
153
        buf = buf.trim();
154

  
155
        for (int i = 0; i < buf.length(); i++) {
156
            char c = buf.charAt(i);
157

  
158
            if (Character.isWhitespace(c)) {
159
                if (lastCharWhite) {
160
                    continue;
161
                }
162

  
163
                lastCharWhite = true;
164
                c = ' ';
165
            } else {
166
                lastCharWhite = false;
167
            }
168

  
169
            str += c;
170
        }
171

  
172
        return str;
173
    }
174

  
175
    protected long getTime() {
176
        return (new Date()).getTime();
177
    }
178
}
0 179

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

  
26

  
27
/**
28
 *
29
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>* @author administrador
30
 */
31
abstract public class FileFolder {
32
    static String[] supportedFolders = { "zip://" };
33

  
34
    abstract public int count();
35

  
36
    /**
37
     * Analiza un nombre de fichero en formato zip://zipname.zip?file.ext
38
     * @param urlName
39
     */
40
    public static boolean isUrl(String name) {
41
        String str = name.substring(0, 6);
42
        str.toLowerCase();
43

  
44
        for (int i = 0; i < supportedFolders.length; i++)
45
            if (str.compareTo(supportedFolders[i]) == 0) {
46
                return true;
47
            }
48

  
49
        return false;
50
    }
51
}
0 52

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

  
26
import java.io.BufferedReader;
27
import java.io.IOException;
28
import java.text.DecimalFormat;
29
import java.text.DecimalFormatSymbols;
30
import java.util.Locale;
31

  
32

  
33
/**
34
 * Grupo Dxf (code, data). Auxiliar para leer ficheros dxf
35
 *
36
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>
37
 * @author "Michel Michaud" (code from)
38
 */
39
public class DxfGroup {
40
    /*
41
    def get_group(handle):
42
    _code = int(handle.readline())
43
    _dfun = get_data_type(_code)
44
    _data = _dfun(handle.readline())
45
    return (_code, _data)
46
     */
47
    private static final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
48
    private static final DecimalFormat[] decimalFormats = new DecimalFormat[] {
49
                                                              new DecimalFormat("#0",
50
                                                                                dfs),
51
                                                              new DecimalFormat("#0.0",
52
                                                                                dfs),
53
                                                              new DecimalFormat("#0.00",
54
                                                                                dfs),
55
                                                              new DecimalFormat("#0.000",
56
                                                                                dfs),
57
                                                              new DecimalFormat("#0.0000",
58
                                                                                dfs),
59
                                                              new DecimalFormat("#0.00000",
60
                                                                                dfs),
61
                                                              new DecimalFormat("#0.000000",
62
                                                                                dfs),
63
                                                              new DecimalFormat("#0.0000000",
64
                                                                                dfs),
65
                                                              new DecimalFormat("#0.00000000",
66
                                                                                dfs),
67
                                                              new DecimalFormat("#0.000000000",
68
                                                                                dfs),
69
                                                              new DecimalFormat("#0.0000000000",
70
                                                                                dfs),
71
                                                              new DecimalFormat("#0.00000000000",
72
                                                                                dfs),
73
                                                              new DecimalFormat("#0.000000000000",
74
                                                                                dfs)
75
                                                          };
76
    int code;
77
    Object data;
78
    
79
    /**
80
     * Constructor por defecto.
81
     */
82
    public DxfGroup() {
83
        code = -1;
84
        data = null;
85
    }
86
    
87
    /**
88
     * Constructor habitual. Representa una entidad individual dentro del DXF
89
     * @param code, ?ndice del dato dentro del DxfGroup
90
     * @param data, el propio dato que queda almacenado en el DxfGroup
91
     */
92
    public DxfGroup(int code, String data) {
93
        this.code = code;
94
        this.data = data;
95
    }
96
    
97
    /**
98
     * Lee una entidad del DXF y la empaqueta en un DxfGroup.
99
     * @param fi, BufferedReader mediante el cual accedemos al DXF
100
     * @return DxfGroup con la informaci?n procedente del DXF
101
     * @throws NumberFormatException
102
     * @throws IOException
103
     */
104
    public static DxfGroup read(BufferedReader fi)
105
                         throws NumberFormatException, IOException {
106
        DxfGroup grp = null;
107
        String txt = fi.readLine();
108

  
109
        if (txt != null) {
110
            if (!txt.equals("")) {
111
                grp = new DxfGroup();
112
                grp.code = Integer.parseInt(txt.trim());
113
                grp.readData(fi);
114
            } else {
115
                // Se trata de una linea en blanco y no se hace nada.
116
            }
117
        }
118

  
119
        return grp;
120
    }
121
    
122
    /**
123
     * Devuelve el code
124
     * @return
125
     */
126
    public int getCode() {
127
        return code;
128
    }
129
    
130
    /**
131
     * Devuelve data
132
     * @return
133
     */
134
    public Object getData() {
135
        return data;
136
    }
137
    
138
    /**
139
     * Lee un dato individual dentro de un DxfGroup
140
     * @param fi, BufferedReader
141
     * @throws IOException
142
     */
143
    private void readData(BufferedReader fi) throws IOException {
144
        String txt = fi.readLine().trim();
145

  
146
        if ((0 <= code) && (code <= 9)) {
147
            data = txt; //_dfun = string_data
148
        } else if ((10 <= code) && (code <= 59)) {
149
            data = new Double(Double.parseDouble(txt)); //_dfun = float_data
150
        } else if ((60 <= code) && (code <= 79)) {
151
            try {
152
                data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 16-bit int
153
            } catch (java.lang.NumberFormatException e) {
154
                data = new Integer((int) Double.parseDouble(txt));
155
            }
156
        } else if ((90 <= code) && (code <= 99)) {
157
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 32-bit int
158
        } else if (code == 100) {
159
            data = txt; //_dfun = unicode_data
160
        } else if (code == 102) {
161
            // Fran: Comentado para ganar velocidad.
162
            //System.err.println("Dxf: codigo " + code + " no implementado."); //_dfun = unicode_data
163
        } else if (code == 105) {
164
            data = txt;
165
            ; //_dfun = handle_data
166
        } else if ((110 <= code) && (code <= 139)) {
167
            data = new Double(Double.parseDouble(txt)); //_dfun = float_data // not in dxf spec
168
        } else if ((140 <= code) && (code <= 149)) { // says 147 in dxf spec
169
            data = new Double(Double.parseDouble(txt)); //_dfun = float_data
170
        } else if ((170 <= code) && (code <= 179)) { // says 175 in dxf spec
171
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 16-bit int
172
        } else if ((210 <= code) && (code <= 239)) {
173
            data = new Double(Double.parseDouble(txt)); //_dfun = float_data // del TEXT procendente de exportacion de microstation 
174
        } else if ((270 <= code) && (code <= 279)) {
175
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // not in dxf spec
176
        } else if ((280 <= code) && (code <= 289)) {
177
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 8-bit int
178
        } else if ((290 <= code) && (code <= 299)) {
179
            data = new Boolean(Boolean.getBoolean(txt)); //_dfun = bool_data
180
        } else if ((300 <= code) && (code <= 309)) {
181
            data = txt; //_dfun = string_data
182
        } else if ((310 <= code) && (code <= 319)) {
183
            //_dfun = bin_data
184
            //throw new IOException("Dxf: codigo "+code+" no implementado.");
185
        } else if ((320 <= code) && (code <= 329)) {
186
            //_dfun = handle_data
187
            //throw new IOException("Dxf: codigo "+code+" no implementado.");
188
        } else if ((330 <= code) && (code <= 369)) {
189
            // Fran: Comentado para ganar velocidad.
190
            //System.err.println("Dxf: codigo " + code + " no implementado."); //_dfun = hex_data
191
        } else if ((370 <= code) && (code <= 379)) {
192
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 8-bit int
193
        } else if ((380 <= code) && (code <= 389)) {
194
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 8-bit int
195
        } else if ((390 <= code) && (code <= 399)) {
196
            data = txt; //_dfun = handle_data
197
        } else if ((400 <= code) && (code <= 409)) {
198
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 16-bit int
199
        } else if ((410 <= code) && (code <= 419)) {
200
            data = txt; //_dfun = string_data
201
        } else if (code == 999) {
202
            data = txt; //_dfun = string_data // comment
203
        } else if ((1000 <= code) && (code <= 1009)) {
204
            data = txt; //_dfun = string_data
205
        } else if ((1010 <= code) && (code <= 1059)) {
206
            data = new Double(Double.parseDouble(txt)); //_dfun = float_data
207
        } else if ((1060 <= code) && (code <= 1070)) {
208
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data // 16-bit int
209
        } else if (code == 1071) {
210
            data = new Integer(Integer.parseInt(txt)); //_dfun = int_data # 32-bit int
211
        } else {
212
            throw new IOException("DxfReader: c?digo " + code +
213
                                  " desconocido.");
214

  
215
            //raise ValueError, "Unexpected code: %d" % code
216
        }
217

  
218
        //return _dfun
219
    }
220
    
221
    /**
222
     * Permite comparar dos objetos de la clase DxfGroup
223
     * @param c, code
224
     * @param s, data
225
     * @return boolean
226
     */
227
    public boolean equals(int c, String s) {
228
        if ((c == code) && (s.compareTo((String) data) == 0)) {
229
            return true;
230
        }
231

  
232
        return false;
233
    }
234
    
235
    /**
236
     * Devuelve un dato concreto en forma de String tabulado
237
     * @param code
238
     * @return String
239
     */
240
    public static String int34car(int code) {
241
        if (code < 10) {
242
            return "  " + Integer.toString(code);
243
        } else if (code < 100) {
244
            return " " + Integer.toString(code);
245
        } else {
246
            return Integer.toString(code);
247
        }
248
    }
249
    
250
    /**
251
     * Devuelve un dato concreto en forma de String tabulado
252
     * @param value
253
     * @return String
254
     */
255
    public static String int6car(int value) {
256
        String s = "     " + Integer.toString(value);
257

  
258
        return s.substring(s.length() - 6, s.length());
259
    }
260
    
261
    /**
262
     * Convierte a String un dato del DxfGroup
263
     * @param code
264
     * @param value
265
     * @return String
266
     */
267
    public static String toString(int code, String value) {
268
        return int34car(code) + "\r\n" + value + "\r\n";
269
    }
270
    
271
    /**
272
     * Convierte a String un dato del DxfGroup
273
     * @param code
274
     * @param value
275
     * @return String
276
     */
277
    public static String toString(int code, int value) {
278
        return int34car(code) + "\r\n" + int6car(value) + "\r\n";
279
    }
280
    
281
    /**
282
     * Convierte a String un dato del DxfGroup
283
     * @param code
284
     * @param value
285
     * @param decimalPartLength
286
     * @return String
287
     */
288
    public static String toString(int code, float value, int decimalPartLength) {
289
        return int34car(code) + "\r\n" +
290
               decimalFormats[decimalPartLength].format((double) value) +
291
               "\r\n";
292
    }
293
    
294
    /**
295
     * Convierte a String un dato del DxfGroup
296
     * @param code
297
     * @param value
298
     * @param decimalPartLength
299
     * @return String
300
     */
301
    public static String toString(int code, double value, int decimalPartLength) {
302
        return int34car(code) + "\r\n" +
303
               decimalFormats[decimalPartLength].format(value) + "\r\n";
304
    }
305
    
306
    /**
307
     * Convierte a String un dato del DxfGroup
308
     * @param code
309
     * @param value
310
     * @return String
311
     */
312
    public static String toString(int code, Object value) {
313
        if (value instanceof String) {
314
            return toString(code, (String) value);
315
        } else if (value instanceof Integer) {
316
            return toString(code, ((Integer) value).intValue());
317
        } else if (value instanceof Double) {
318
            return toString(code, ((Double) value).floatValue(), 3);
319
        } else if (value instanceof Double) {
320
            return toString(code, ((Double) value).doubleValue(), 6);
321
        } else {
322
            return toString(code, value.toString());
323
        }
324
    }
325
    
326
    /**
327
     * Convierte a String un dato del DxfGroup
328
     */
329
    public String toString() {
330
        return toString(code, data);
331
    }
332

  
333
    /**
334
     * jmorell: Permite rellenar los datos. ?til en la escritura de DXFs.
335
     * @param data The data to set.
336
     */
337
    public void setData(Object data) {
338
        this.data = data;
339
    }
340

  
341
    /**
342
     * jmorell: Permite rellenar los c?digos. ?til en la escritura de DXFs.
343
     * @param code The code to set.
344
     */
345
    public void setCode(int code) {
346
        this.code = code;
347
    }
348
}
0 349

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

  
26
import java.io.IOException;
27
import java.io.InputStream;
28
import java.util.Enumeration;
29
import java.util.zip.ZipEntry;
30
import java.util.zip.ZipFile;
31

  
32

  
33
/**
34
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>* @author administrador
35
 */
36
public class ZipFileFolder extends FileFolder {
37
    String zName = null;
38
    public ZipFile file = null;
39

  
40
    public ZipFileFolder() {
41
        super();
42
    }
43

  
44
    /**
45
     * Constructor.
46
     *
47
     * @param fname
48
     */
49
    public ZipFileFolder(String fName) throws IOException {
50
        fName = DataSource.normalize(fName);
51

  
52
        if (isUrl(fName)) {
53
            zName = getZName(fName);
54
        } else {
55
            zName = fName;
56
        }
57

  
58
        file = new ZipFile(zName);
59
    }
60

  
61
    /**
62
     * Analiza un nombre de fichero en formato zip://zipname.zip?file.ext
63
     * @param urlName
64
     */
65
    public static boolean isUrl(String name) {
66
        String str = name.substring(0, 3);
67
        str.toLowerCase();
68

  
69
        if (str.compareTo("zip") == 0) {
70
            return true;
71
        }
72

  
73
        return false;
74
    }
75

  
76
    private String getZName(String urlName) {
77
        return urlName.substring(6, urlName.indexOf("?"));
78
    }
79

  
80
    private String getFName(String urlName) {
81
        return urlName.substring(urlName.indexOf("?") + 1);
82
    }
83

  
84
    public ZipEntry getZipEntry(String fName) throws IOException {
85
        InputStream is = null;
86

  
87
        if (isUrl(fName)) {
88
            fName = getFName(fName);
89
        }
90

  
91
        return file.getEntry(fName);
92
    }
93

  
94
    public InputStream getInputStream(String fName) throws IOException {
95
        return file.getInputStream(getZipEntry(fName));
96
    }
97

  
98
    public InputStream getInputStream(ZipEntry ze) throws IOException {
99
        return file.getInputStream(ze);
100
    }
101

  
102
    public int count() {
103
        return file.size();
104
    }
105

  
106
    public Enumeration entries() {
107
        return file.entries();
108
    }
109
}
0 110

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

  
26
import java.io.BufferedReader;
27
import java.io.FileReader;
28
import java.io.FileWriter;
29
import java.io.IOException;
30
import java.io.InputStream;
31
import java.io.InputStreamReader;
32
import java.io.Reader;
33
import java.util.Date;
34
import java.util.Hashtable;
35
import java.util.Vector;
36

  
37
import org.cresques.cts.ICoordTrans;
38
import org.cresques.cts.IProjection;
39
import org.cresques.geo.Projected;
40
import org.cresques.px.Extent;
41
import org.gvsig.dxf.px.IObjList;
42
import org.gvsig.dxf.px.dxf.DxfEntityMaker;
43
import org.gvsig.dxf.px.dxf.DxfHeaderManager;
44
import org.gvsig.dxf.px.dxf.DxfHeaderVariables;
45

  
46
/**
47
 * Clase que representa un fichero en formato DXF. Contiene los interfaces y m?todos
48
 * necesarios para acceder a la informaci?n almacenada en su interior.
49
 *
50
 * @author jmorell
51
 */
52
public class DxfFile extends GeoFile {
53

  
54
	private boolean cadFlag = true;
55

  
56
	long lineNr = 0;
57

  
58
	String buf = null;
59

  
60
	BufferedReader fi;
61
	long l = 0;
62
	int count = 0;
63
	DxfGroup grp = null;
64

  
65
	EntityFactory entityMaker = null;
66
	VarSettings headerManager;
67
    private boolean dxf3DFlag;
68

  
69
	/**
70
	 * Crea los objetos en el Modelo correspondiente.
71
	 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>
72
	 */
73
	public interface EntityFactory extends Projected {
74

  
75
		/**
76
         * Permite saber si se est?n a?adiendo elementos a un bloque
77
         * @param booleano que indica si se est?n a?adiendo elementos a un bloque
78
		 */
79
        public void setAddingToBlock(boolean a);
80

  
81
        /**
82
         * Crea una nueva capa partiendo de la informaci?n almacenada en el DXF
83
         * @param DxfGroupVector con informaci?n para la construcci?n de la nueva capa
84
         * @throws Exception
85
         */
86
		public void createLayer(DxfGroupVector v) throws Exception ;
87

  
88
        /**
89
         * Crea una nueva polil?nea partiendo de la informaci?n almacenada en el DXF
90
         * @param DxfGroupVector con informaci?n para la construcci?n de la nueva polil?nea
91
         * @throws Exception
92
         */
93
		public void createPolyline(DxfGroupVector v) throws Exception ;
94

  
95
        /**
96
         * A?ade un v?rtice a la polil?nea que se est? creando
97
         * @param DxfGroupVector con la informaci?n necesaria para la adici?n del v?rtice
98
         * @throws Exception
99
         */
100
		public void addVertex(DxfGroupVector v) throws Exception ;
101

  
102
        /**
103
         * Fin de secuencia
104
         * @throws Exception
105
         */
106
        public void endSeq() throws Exception ;
107

  
108
        /**
109
         * Crea una nueva LwPolyline partiendo de la informaci?n almacenada en el DXF
110
         * @param DxfGroupVector con informaci?n para la construcci?n de la nueva polil?nea
111
         * @throws Exception
112
         */
113
		public void createLwPolyline(DxfGroupVector v) throws Exception ;
114

  
115
        /**
116
         * Crea una nueva l?nea partiendo de la informaci?n almacenada en el DXF
117
         * @param DxfGroupVector con informaci?n para la construcci?n de la nueva l?nea
118
         * @throws Exception
119
         */
120
        public void createLine(DxfGroupVector v) throws Exception ;
121

  
122
        /**
123
         * Crea un nuevo texto partiendo de la informaci?n almacenada en el DXF
124
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo texto
125
         * @throws Exception
126
         */
127
        public void createText(DxfGroupVector v) throws Exception ;
128

  
129
        /**
130
         * Crea un nuevo MText partiendo de la informaci?n almacenada en el DXF
131
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo MText
132
         * @throws Exception
133
         */
134
        public void createMText(DxfGroupVector v) throws Exception ;
135

  
136
        /**
137
         * Crea un nuevo punto partiendo de la informaci?n almacenada en el DXF
138
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo punto
139
         * @throws Exception
140
         */
141
        public void createPoint(DxfGroupVector v) throws Exception ;
142

  
143
        /**
144
         * Crea un nuevo c?rculo partiendo de la informaci?n almacenada en el DXF
145
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo c?rculo
146
         * @throws Exception
147
         */
148
        public void createCircle(DxfGroupVector v) throws Exception ;
149

  
150
        /**
151
         * Crea una nueva elipse partiendo de la informaci?n almacenada en el DXF
152
         * @param DxfGroupVector con informaci?n para la construcci?n de la nueva elipse
153
         * @throws Exception
154
         */
155
        public void createEllipse(DxfGroupVector v) throws Exception ;
156

  
157
        /**
158
         * Crea un nuevo arco partiendo de la informaci?n almacenada en el DXF
159
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo arco
160
         * @throws Exception
161
         */
162
        public void createArc(DxfGroupVector v) throws Exception ;
163

  
164
        /**
165
         * Crea un nuevo punto de inserci?n partiendo de la informaci?n almacenada en el DXF
166
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo punto de inserci?n
167
         * @throws Exception
168
         */
169
        public void createInsert(DxfGroupVector v) throws Exception ;
170

  
171
        /**
172
         * Crea un nuevo s?lido 2D partiendo de la informaci?n almacenada en el DXF
173
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo s?lido
174
         * @throws Exception
175
         */
176
        public void createSolid(DxfGroupVector v) throws Exception ;
177

  
178
        /**
179
         * Crea un nuevo Spline partiendo de la informaci?n almacenada en el DXF
180
         * @param DxfGroupVector con informaci?n para la construcci?n del nuevo Spline
181
         * @throws Exception
182
         */
183
        public void createSpline(DxfGroupVector v) throws Exception ;
184

  
185
        /**
186
         * Construye la definici?n de un nuevo atributo partiendo de la informaci?n almacenada en el DXF
187
         * @param DxfGroupVector con informaci?n para la construcci?n de la definici?n del nuevo atributo
188
         * @throws Exception
189
         */
190
        public void createAttdef(DxfGroupVector v) throws Exception ;
191

  
192
        /**
193
         * Crea un nuevo atributo partiendo de la informaci?n almacenada en el DXF
194
         * @param DxfGroupVector con informaci?n para la creaci?n del nuevo atributo
195
         * @throws Exception
196
         */
197
        public void createAttrib(DxfGroupVector v) throws Exception ;
198

  
199
        /**
200
         * Crea un bloque
201
         * @param DxfGroupVector con informaci?n para la creaci?n del nuevo elemento
202
         * @throws Exception
203
         */
204
        public void createBlock(DxfGroupVector v) throws Exception ;
205

  
206
        /**
207
         * Fin de la definici?n de un bloqe
208
         * @param DxfGroupVector con informaci?n referente al final de un bloque
209
         * @throws Exception
210
         */
211
        public void endBlk(DxfGroupVector v) throws Exception ;
212

  
213
        /**
214
         * Gestiona los bloques que no se han tratado en la primera vuelta
215
         */
216
        void testBlocks();
217

  
218
        /**
219
         * Devuelve el extent
220
         * @return el extent
221
         */
222
        public Extent getExtent();
223

  
224
        /**
225
         * Devuelve la lista de bloques
226
         * @return la lista de bloques
227
         */
228
        public Vector getBlkList();
229

  
230
		/**
231
         * Permite la gesti?n de los atributos almacenados en unn DXF
232
         * @return un Vector con la lista de atributos
233
		 */
234
        public Vector getAttributes();
235

  
236
        /**
237
         * Borra los atributos repetidos
238
         */
239
        public void depureAttributes();
240

  
241
        /**
242
         * Devuelve los objetos almacenados en el DXF
243
         * @return IObjList con los objetos procedentes del DXF
244
         */
245
        public IObjList getObjects();
246

  
247
        /**
248
         * Permite saber si se trata de un fichero DXF en 2D o en 3D
249
         * @return booleano que indica si se trata de un fichero DXF 3D
250
         */
251
        public boolean isDxf3DFile();
252
	};
253

  
254
	/**
255
	 * Establece el estado de las variables propias de un DXF que est?n definidas
256
	 * en la secci?n HEADER. Por ejemplo, la versi?n del DXF.
257
	 * @author jmorell (jose.morell@gmail.com)
258
	 * @version 15-dic-2004
259
	 */
260
	public interface VarSettings {
261

  
262
		/**
263
		 * Establece la versi?n de Autocad en la que fue generado el DXF.
264
		 * @param informaci?n de base
265
		 * @throws Exception
266
		 */
267
		public void setAcadVersion(DxfGroupVector v) throws Exception ;
268

  
269
		/**
270
		 * Devuelve la versi?n de Autocad en la que fue generado el DXF.
271
		 * @return
272
		 */
273
		public String getAcadVersion();
274

  
275
		/**
276
		 * Devuelve el estado de las variables propias de un DXF
277
		 * @return
278
		 */
279
		public DxfHeaderVariables getDxfHeaderVars();
280
        public boolean isWritedDxf3D();
281
        public void loadMinZFromHeader(double d);
282
        public void loadMaxZFromHeader(double d);
283
	};
284

  
285
    /**
286
     * Constructor de la clase
287
     * @param proj, la proyecci?n cartogr?fica
288
     * @param name, el path absoluto hasta el fichero DXF
289
     * @param maker, el interface que permite la construcci?n de las entidades procedentes del DXF
290
     */
291
	public DxfFile(IProjection proj, String name, EntityFactory maker) {
292
		super(proj, name);
293
		entityMaker = maker;
294
		headerManager = new DxfHeaderManager();
295
	}
296

  
297
    /**
298
     * Constructor de la clase que adem?s incorpora la capacidad de leer una porci?n del HEADER
299
     * @param proj, la proyecci?n cartogr?fica
300
     * @param name, el path absoluto hasta el fichero DXF
301
     * @param maker, el interface que permite la construcci?n de las entidades procedentes del DXF
302
     * @param dxfVars, el interface que permite la lectura del HEADER de un DXF
303
     */
304
    public DxfFile(IProjection proj, String name, EntityFactory maker, VarSettings dxfVars) {
305
		super(proj, name);
306
		entityMaker = maker;
307
		headerManager = dxfVars;
308
	}
309

  
310
	/**
311
	 * Carga un fichero en formato DXF
312
	 * @throws Exception
313
	 */
314
	public GeoFile load() throws Exception {
315
		System.out.println("Dxf: Cargando " + name + " ...");
316
		if (ZipFileFolder.isUrl(name)) {
317
			ZipFileFolder zFolder = new ZipFileFolder(name);
318
			InputStream is = zFolder.getInputStream(name);
319
			return load(new InputStreamReader(is));
320
		} else
321
			return load(new FileReader(name));
322

  
323
	}
324

  
325
    /**
326
     * Carga un fichero en formato DXF tomando un Reader como par?metro
327
     * @param fr, Reader que se le pasa como par?metro
328
     * @return devuelve un objeto GeoFile, padre de DxfFile
329
     * @throws Exception
330
     * @throws Exception
331
     */
332
	public GeoFile load(Reader fr) throws Exception {
333
		System.out.println("Dxf: Cargando '"+name+"' ...");
334
		fi = new BufferedReader(fr);
335
		while ((grp = readGrp()) != null) {
336
			l+=2;
337

  
338
			if (grp.equals(0, "EOF"))		break;
339
			if (grp.equals(0, "SECTION"))
340
				readSection();
341
		}
342
		fi.close();
343
		extent.add(entityMaker.getExtent());
344
		System.out.println("Dxf: '"+name+"' cargado. ("+l+" l?neas).");
345
		this.lineNr = l;
346
		return this;
347
	}
348

  
349
    /**
350
     * El fichero DXF se divide en grupos. Este m?todo permite leer cada grupo individualmente
351
     * @return devuelve la informaci?n del DXF en forma de objetos de la clase DxfGroup
352
     * @throws NumberFormatException
353
     * @throws IOException
354
     */
355
	private DxfGroup readGrp() throws NumberFormatException, IOException {
356
		DxfGroup g = DxfGroup.read(fi);
357
		if (g != null) l += 2;
358
		/*if (g.code == 8)
359
			if (((String) g.data).length() < 1) {
360
				System.err.println("a que un layer no puede ser ''?");
361
				System.exit(1);
362
			}*/
363
		return g;
364
	}
365

  
366
    /**
367
     * El fichero DXF se divide en varias secciones. Este m?todo se encarga de leer cada
368
     * una de ellas
369
     * @throws NumberFormatException
370
     * @throws Exception
371
     */
372
	private void readSection() throws NumberFormatException, Exception {
373
		while (true) {
374
			grp = readGrp(); System.out.print("-1:"+grp);
375
			if (grp.code == 2)
376
				if (((String) grp.data).compareTo("HEADER") == 0)
377
					readHeader();
378
				else if (((String) grp.data).compareTo("CLASSES") == 0)
379
					readAnySection();
380
				else if (((String) grp.data).compareTo("TABLES") == 0)
381
					readTables();
382
				else if (((String) grp.data).compareTo("BLOCKS") == 0)
383
					readBlocks();
384
				else if (((String) grp.data).compareTo("ENTITIES") == 0)
385
					readEntities();
386
				else if (((String) grp.data).compareTo("OBJECTS") == 0)
387
					readAnySection();
388
				else {
389
					System.out.println("DxfRead: Seccion "+grp.data);
390
					readAnySection();
391
				}
392
			else
393
				System.err.println("Dxf: Codigo/Seccion desconocidos" + grp);
394
			if (grp.equals(0, "EOF")) break;
395
			if (grp.equals(0, "ENDSEC")) break;
396
		}
397
	}
398

  
399
    /**
400
     * Habilita la lectura de la secci?n de TABLES
401
     * @throws NumberFormatException
402
     * @throws Exception
403
     */
404
	private void readTables() throws NumberFormatException, Exception {
405
		System.out.println("Dxf: Seccion TABLAS, linea "+ l+ "grp ="+ grp);
406
		int layerCnt = 0;
407
		String tableAct = "NONAME";
408

  
409
		Hashtable tables = new Hashtable();
410
		Vector table = new Vector();
411
		DxfGroupVector v = new DxfGroupVector();
412

  
413
		grp = readGrp();// System.out.print("0:"+grp);
414
		while (true) {
415
			if (grp.code == 0) {
416
				String data = (String) grp.getData();
417
				if (data.compareTo("ENDSEC") == 0 || data.compareTo("EOF") == 0)
418
					break;
419
				else if (data.compareTo("ENDTAB") == 0) {
420
					tables.put(tableAct, table);
421
					table = new Vector();
422
					grp = readGrp();// System.out.print("1:"+grp);
423

  
424
					/**/if (tableAct.compareTo("LAYER") == 0 && v.size()>0) {
425
						entityMaker.createLayer(v);
426
						System.out.println("Dxf: Layer "+v.getDataAsString(2));
427
						layerCnt++;
428
						v.clear();
429
					}/**/
430
					continue;
431
				} else {
432
					if (table.size()==1) {
433
						tableAct = v.getDataAsString(2);
434
						System.out.println("Dxf: Tabla "+tableAct);
435
					} else
436
						if (tableAct.compareTo("LAYER") == 0 && v.size()>0) {
437
							entityMaker.createLayer(v);
438
							System.out.println("Dxf: Layer "+v.getDataAsString(2));
439
							layerCnt++;
440
						}
441

  
442
					v.clear();
443
					v.add(grp);
444
				}
445
				while (true) {
446
					grp = readGrp();// System.out.print("2:"+grp);
447
					if (grp.code == 0)	break;
448
					v.add(grp);
449
				}
450
				table.add(v);
451
			} else {
452
				System.err.println("Dxf: Error de secuencia");
453
				grp = readGrp(); //System.out.print("3:"+grp);
454
			}
455
		}
456
		System.out.println("Dxf: Seccion TABLAS: " + layerCnt + " Capas. ");
457
	}
458

  
459
    /**
460
     * M?todo de lectura de secci?n por defecto. Se utiliza mientras se realiza la
461
     * implementaci?n correspondiente
462
     * @throws NumberFormatException
463
     * @throws IOException
464
     */
465
	private void readAnySection() throws NumberFormatException, IOException {
466
		System.out.println("Dxf: Seccion '"+((String) grp.getData())+"', linea "+ l);
467
		while (true) {
468
			grp = readGrp();
469
			if (grp.equals(0, "ENDSEC")) break;
470
			else if (grp.equals(0, "EOF")) break;
471
		}
472
	}
473

  
474
	/**
475
	 * Primera aproximaci?n a la implementaci?n de la lectura del HEADER. En principio
476
	 * interesa que se lea la versi?n del DXF.
477
	 * Para implementar esta parte del lector se ha optado por incluir el m?todo
478
	 * setAcadVersion en el interface EntityFactory. A lo mejor conviene implementar
479
	 * un nuevo interface VarSettings.
480
	 * @throws NumberFormatException
481
	 * @throws Exception
482
	 */
483
	private void readHeader() throws NumberFormatException, Exception {
484
		System.out.println("Dxf: Seccion HEADER, linea "+ l);
485
		int variableCnt = 0;
486
		int cntVeces = 0;
487
		DxfGroupVector v = new DxfGroupVector();
488
		grp = readGrp();
489
		while (true) {
490
			if (grp.equals(0, "EOF")) {
491
				break;
492
			}
493
			else if (grp.code==9 || grp.code==0) {
494
				if (v.size() > 0) {
495
					String lastVariable = (String) ((DxfGroup) v.get(0)).data;
496
					//System.out.println(lastVariable);
497
					if (lastVariable.compareTo("$ACADVER") == 0) {
498
						//System.out.println("Aqui llega.");
499
						headerManager.setAcadVersion(v);
500
					} else if (lastVariable.compareTo("$EXTMIN") == 0) {
501
						if(v.hasCode(3))
502
							headerManager.loadMinZFromHeader(((Double)((DxfGroup) v.get(3)).data).doubleValue());
503
                    } else if (lastVariable.compareTo("$EXTMAX") == 0) {
504
                    	if(v.hasCode(3))
505
                    		headerManager.loadMaxZFromHeader(((Double)((DxfGroup) v.get(3)).data).doubleValue());
506
                    } else if (lastVariable.compareTo("ENDSEC") == 0) {
507
                        //System.out.println("Llega al ENDSEC.");
508
                        break;
509
					} /*else
510
						System.err.println("Dxf: Variable "+lastVariable+" desconocida.");*/
511
				}
512
				v.clear();
513
				v.add(grp);
514
				while (true) {
515
					grp = readGrp();
516
					if (grp.code == 9 || grp.code==0)	break;
517
					v.add(grp);
518
				}
519
				variableCnt++;
520
			}
521
			cntVeces++;
522
		}
523
		System.out.println("Dxf: Seccion HEADER, " + variableCnt + " variables, "+ cntVeces + " veces.");
524
		//System.out.println("Seccion HEADER, linea "+ l+ " (SALGO)");
525
		System.out.println("readHeader: ACAD Version: " + headerManager.getDxfHeaderVars().getAcadVersion());
526
	}
527

  
528
    /**
529
     * Permite leer la secci?n ENTITIES del DXF, donde se encuentran las entidades
530
     * geom?tricas del DXF que no aparecen dentro de ning?n bloque
531
     * @throws NumberFormatException
532
     * @throws Exception
533
     */
534
	private void readEntities() throws NumberFormatException, Exception {
535
		System.out.println("Dxf: Seccion ENTITIES, linea "+ l);
536
		int entityCnt = 0;
537
		int cntVeces = 0;
538
		DxfGroupVector v = new DxfGroupVector();
539
		grp = readGrp();
540
		while (true) {
541
			if (grp.equals(0, "EOF")) break;
542
			else if (grp.code == 0) {
543
				if (v.size() > 0) {
544
					String lastEntity = (String) ((DxfGroup) v.get(0)).data;
545
					if (lastEntity.compareTo("POLYLINE") == 0) {
546
						entityMaker.createPolyline(v);
547
					} else if (lastEntity.compareTo("VERTEX") == 0) {
548
						entityMaker.addVertex(v);
549
					} else if (lastEntity.compareTo("SEQEND") == 0) {
550
						entityMaker.endSeq();
551
					} else if (lastEntity.compareTo("LWPOLYLINE") == 0) {
552
						entityMaker.createLwPolyline(v);
553
					} else if (lastEntity.compareTo("LINE") == 0) {
554
						entityMaker.createLine(v);
555
					} else if (lastEntity.compareTo("TEXT") == 0) {
556
						entityMaker.createText(v);
557
					} else if (lastEntity.compareTo("MTEXT") == 0) {
558
						entityMaker.createMText(v);
559
					} else if (lastEntity.compareTo("POINT") == 0) {
560
						entityMaker.createPoint(v);
561
					} else if (lastEntity.compareTo("CIRCLE") == 0) {
562
						entityMaker.createCircle(v);
563
					} else if (lastEntity.compareTo("ELLIPSE") == 0) {
564
						entityMaker.createEllipse(v);
565
					} else if (lastEntity.compareTo("ARC") == 0) {
566
						entityMaker.createArc(v);
567
					} else if (lastEntity.compareTo("INSERT") == 0) {
568
						entityMaker.createInsert(v);
569
					} else if (lastEntity.compareTo("SOLID") == 0) {
570
						entityMaker.createSolid(v);
571
					} else if (lastEntity.compareTo("SPLINE") == 0) {
572
						entityMaker.createSpline(v);
573
					} else if (lastEntity.compareTo("ATTRIB") == 0) {
574
						entityMaker.createAttrib(v);
575
					} else if (lastEntity.compareTo("ENDSEC") == 0) {
576
						break;
577
					} else
578
						System.err.println("Dxf: Entidad "+lastEntity+" desconocida.");
579
				}
580
				v.clear();
581
				v.add(grp);
582
				while (true) {
583
					grp = readGrp();
584
					if (grp.code == 0)	break;
585
					v.add(grp);
586
				}
587
				entityCnt++;
588
			}
589
			cntVeces++;
590
		}
591
		System.out.println("Dxf: Seccion ENTITIES, " + entityCnt + " entidades, "+ cntVeces + " veces.");
592
		//System.out.println("Seccion ENTITIES, linea "+ l+ " (SALGO)");
593
	}
594

  
595
    /**
596
     * Permite la secci?n BLOCKS del DXF, donde se encuentran las definiciones de los
597
     * bloques que componen el DXF
598
     * @throws NumberFormatException
599
     * @throws Exception
600
     */
601
	private void readBlocks() throws NumberFormatException, Exception {
602
		System.out.println("Dxf: Seccion BLOCKS, linea "+ l);
603
		int blkCnt = 0;
604
		int cntVeces = 0;
605
		DxfGroupVector v = new DxfGroupVector();
606
		grp = readGrp();
607
		while (true) {
608
			if (grp.equals(0, "EOF")) break;
609
			else if (grp.code == 0) {
610
				if (v.size() > 0) {
611
					String lastEntity = (String) ((DxfGroup) v.get(0)).data;
612
					if (lastEntity.compareTo("BLOCK") == 0) {
613
						//System.out.println("readBlocks(): Empezamos a leer un bloque");
614
						entityMaker.createBlock(v);
615
					} else if (lastEntity.compareTo("POLYLINE") == 0) {
616
						//System.out.println("readBlocks(): A?adimos una polilinea al bloque");
617
						entityMaker.createPolyline(v);
618
					} else if (lastEntity.compareTo("VERTEX") == 0) {
619
						//System.out.println("readBlocks(): A?adimos un vertice a la polilinea");
620
						entityMaker.addVertex(v);
621
					} else if (lastEntity.compareTo("SEQEND") == 0) {
622
						//System.out.println("readBlocks(): Cerramos una polilinea");
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff