Revision 187

View differences:

org.gvsig.dgn/tags/org.gvsig.dgn-2.0.43/org.gvsig.dgn.provider/src/main/resources/org/gvsig/fmap/dal/store/dgn/DGNParameters.xml
1
<?xml version= "1.0 "?>
2
<definitions>
3
  <version>1.0.0</version>
4
  <classes>
5
    <class name="DGN">
6
      <extends>
7
      	<class namespace="dal" name="ProviderParameters"/>
8
      </extends>
9
      <description>Store the parameters need to open a dgn file</description>
10
      <fields>
11
        
12
        <!-- General -->
13
        <field name="file" type="file" mandatory="true">
14
          <description>dgn file</description>
15
        </field>
16
        <field name="CRS" type="crs" mandatory="true">
17
          <description>The coordinate reference system used in this dgn file</description>
18
        </field>
19
        <field name="LoadMode" label="Load mode" defaultValue="0" type="integer" mandatory="false">
20
          <description>Set the strategy to use for loading DGN elements</description>
21
     	  <availableValues>
22
            <value label="Plain">0</value>
23
            <value label="Group elements (1)">1</value>
24
     	  </availableValues>
25
        </field>
26
        <field name="sortByGeometryType" label="Sort by geometry type" type="Boolean" defaultValue="true" mandatory="false">
27
          <description>If checked sort the rows of table by the geometry type (none,suface,curve,point)</description>
28
        </field>
29
        <field name="force2d" label="Force 2D" type="Boolean" defaultValue="false" mandatory="false">
30
          <description>If checked and DGN has Z dimension create all geometry in 2D and ignore the Zs.</description>
31
        </field>
32
        <field name="Reload" label="Reload" type="Boolean" defaultValue="false" mandatory="false">
33
          <description>Reload an already loaded DGN as a new layer</description>
34
        </field>
35
        <field name="groupby" label="Field for group" type="String" defaultValue="" mandatory="false">
36
          <description>The field name to use for grouping rows</description>
37
        </field>
38
        <field name="GroupGeometriesOperation" label="Group geometries as" type="integer" defaultValue="0" mandatory="false">
39
          <description>If a 'group by' is applied, apply this operation to the resultant geometries</description>
40
     	  <availableValues>
41
            <value label="None, return the agregate">0</value>
42
            <value label="Convexhull">1</value>
43
            <value label="Union">2</value>
44
            <value label="Intersection">3</value>
45
            <value label="Convert to points">4</value>
46
            <value label="Convert to line">5</value>
47
            <value label="Convert to poligon">7</value>
48
            <value label="Convert to poligon and fix it">7</value>
49
     	  </availableValues>
50
        </field>
51

  
52
        <!-- Advanced -->
53
        <field name="ignoreZ" label="Ignore Z" type="Boolean" defaultValue="false" mandatory="false">
54
          <description>If checked and DGN has Z dimension, set all Zs to 0.</description>
55
        </field>
56
        <field name="useZAsElevation" label="Use Z as elevation" type="Boolean" defaultValue="false" mandatory="false" group="Advanced">
57
          <description>If set, use the Z value to fill the field elevation.</description>
58
        </field>
59
        <field name="elevationFactor" label="Elevation factor" type="Double" defaultValue="1" mandatory="false" group="Advanced">
60
          <description>Factor to apply to elevation when is retrived from the Z coordinate.</description>
61
        </field>
62
        <field name="roundElevation" label="Round elevation" type="Boolean" defaultValue="false" mandatory="false" group="Advanced">
63
          <description>If set, round the elevation to a integer value. This only apply when get elevation from the coordinete Z.</description>
64
        </field>
65
        <field name="LinkFilterIndex" label="Link filter index" type="integer" defaultValue="0" mandatory="false" group="Advanced">
66
          <description>If set, return the link with this index</description>
67
        </field>
68
        <field name="LinkFilterType" label="Link filter type" type="integer" defaultValue="" mandatory="false" group="Advanced">
69
          <description>If set, return the link with this type</description>
70
        </field>
71
        <field name="LinkFilterEntity" label="Link filter entity" type="integer" defaultValue="" mandatory="false" group="Advanced">
72
          <description>If set, return the link with this entity</description>
73
        </field>
74
        <field name="LinkFilterMS" label="Link filter MSLink" type="integer" defaultValue="" mandatory="false" group="Advanced">
75
          <description>If set, return the link with this MSLink</description>
76
        </field>
77
        <field name="LinkFilterData" label="Link filter Data" type="string" defaultValue="" mandatory="false" group="Advanced">
78
          <description>This is a regular expresion. If set, return the link that match this regular expresion in the data of link represented in hexadecimal value</description>
79
        </field>
80

  
81
        <!-- Filter -->
82
        <field name="levelFilter" label="Level" group="Filter" type="String" defaultValue="" mandatory="false">
83
          <description>If specified load only elements with this level. Can use regular expresion to specify the filter.</description>
84
        </field>
85
        <field name="colorFilter" label="Color" group="Filter" type="String" defaultValue="" mandatory="false">
86
          <description>If specified load only elements with this color. Can use regular expresion to specify the filter.</description>
87
        </field>
88
        <field name="styleFilter" label="Style" group="Filter" type="String" defaultValue="" mandatory="false">
89
          <description>If specified load only elements with this style. Can use regular expresion to specify the filter.</description>
90
        </field>
91
        <field name="weightFilter" label="Weight" group="Filter" type="String" defaultValue="" mandatory="false">
92
          <description>If specified load only elements with this weight. Can use regular expresion to specify the filter.</description>
93
        </field>
94
        <field name="typeFilter" label="Type" group="Filter" type="String" defaultValue="" mandatory="false">
95
          <description>If specified load only elements with this type</description>
96
        </field>
97
        <field name="stypeFilter" label="SType" group="Filter" type="String" defaultValue="" mandatory="false">
98
          <description>If specified load only elements with this stype</description>
99
        </field>
100
        <field name="groupFilter" label="Group" group="Filter" type="String" defaultValue="" mandatory="false">
101
          <description>If specified load only elements with this group</description>
102
        </field>
103
        <field name="idFilter" label="Id" group="Filter" type="String" defaultValue="" mandatory="false">
104
          <description>If specified load only elements with this id</description>
105
        </field>
106
        <field name="textFilter" label="Text" group="Filter" type="String" defaultValue="" mandatory="false">
107
          <description>If specified load only elements that match this text</description>
108
        </field>
109
        <field name="geomtypeFilter" label="Geometry type" group="Filter" defaultValue="0" type="Integer" mandatory="false">
110
          <description>If specified load only elements with this type of geometry</description>
111
     	  <availableValues>
112
            <value label="All">0</value>
113
            <value label="Points">1</value>
114
            <value label="Lines">2</value>
115
            <value label="Poligons">3</value>
116
     	  </availableValues>
117
        </field>
118
        <field name="skipCorruptGeometries" label="Skip corrupt geometries" group="Filter" type="Boolean" defaultValue="false" mandatory="false">
119
          <description>If specified skip corrupt geometries</description>
120
        </field>
121
        <field name="cropOperationFilter" label="Crop operation" group="Filter" defaultValue="1" type="Integer" mandatory="false">
122
          <description>If specified load only elements with this type of geometry</description>
123
     	  <availableValues>
124
            <value label="None">0</value>
125
            <value label="Contains">1</value>
126
            <value label="Covered by">2</value>
127
            <value label="Covers">3</value>
128
            <value label="Crosses">4</value>
129
            <value label="Disjoint">5</value>
130
            <value label="Intersect">6</value>
131
            <value label="Overlaps">7</value>
132
            <value label="Touches">8</value>
133
            <value label="With in">9</value>
134
     	  </availableValues>
135
        </field>
136
        <field name="cropFilter" label="Crop to" group="Filter" type="Geometry" defaultValue="" mandatory="false">
137
          <description>Crop the result to this value</description>
138
        </field>
139
        
140
                        
141
        <!-- Debug -->
142
        <field name="XMLFile" label="Output XML file" type="file" group="Debug" mandatory="false">
143
          <description>Generate XML file with DGN dump in this file</description>
144
        </field>
145
        <!--
146
        <field name="debugOptions" label="Debug options" type="String" group="Debug" mandatory="false">
147
          <description></description>
148
        </field>
149
        -->
150
        <field name="logErrors" label="log errors" group="Debug" type="Boolean" defaultValue="false" mandatory="false">
151
          <description>If checked the log of errors are enabled</description>
152
        </field>
153

  
154
      </fields>
155
    </class>
156
  </classes>
157
</definitions>  
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.43/org.gvsig.dgn.provider/src/main/resources/org/gvsig/fmap/dal/store/dgn/DGNMetadata.xml
1
<?xml version="1.0"?>
2
<!--
3
Definitions of metadata fields of a shp file.  
4
 -->
5
<definitions>
6
  <version>1.0.0</version>
7
  <classes>
8
    
9
    <class name="DGN" namespace="Metadata">
10
      <extends>
11
      	<class namespace="Metadata" name="SpatialProvider"/>
12
      </extends>
13
      <description>Metadata of a DGN store</description>
14
      <fields>
15
      </fields>
16
    </class>
17

  
18
  </classes>
19
</definitions>  
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.43/org.gvsig.dgn.provider/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.fmap.dal.store.dgn.DGNLibrary
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.43/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/LegendBuilder.java
1
package org.gvsig.fmap.dal.store.dgn;
2

  
3
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
4
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
5
import org.gvsig.fmap.dal.store.dgn.lib.DGNReader;
6

  
7

  
8
public interface LegendBuilder {
9

  
10
	final public static String DYNMETHOD_BUILDER_NAME = "getLegendBuilder";
11
	final public static String DYNMETHOD_GETLEGEND_NAME = "getLegend";
12
	final public static String DYNMETHOD_GETLABELING_NAME = "getLabeling";
13

  
14
	public LegendBuilder initialize(FeatureStoreProvider store);
15

  
16
	public void begin();
17

  
18
	public void process(FeatureProvider feature, DGNReader dgnReader);
19

  
20
	public void end();
21

  
22
	public Object getLegend();
23
	public Object getLabeling();
24

  
25
}
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.43/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/lib/DGNElemGroup.java
1
/*
2
 * Created on 07-jul-2004
3
 *
4
 * TODO To change the template for this generated file go to
5
 * Window - Preferences - Java - Code Generation - Code and Comments
6
 */
7
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
8
 *
9
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
10
 *
11
 * This program is free software; you can redistribute it and/or
12
 * modify it under the terms of the GNU General Public License
13
 * as published by the Free Software Foundation; either version 2
14
 * of the License, or (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
24
 *
25
 */
26
package org.gvsig.fmap.dal.store.dgn.lib;
27

  
28
/**
29
 * Clase utilizada para guardar un elemento de tipo Group.
30
 *
31
 * @author FJP
32
 */
33
public class DGNElemGroup extends DGNElemCore {
34
	/*                 typedef struct
35
	   {
36
	   Elm_hdr ehdr; // element header
37
	   Disp_hdr dhdr; // display header
38
	   short file_chars; // no. of chars. in file spec
39
	   char file_spec[65] //file specification
40
	   byte file_num; // file number
41
	   Fb_opts fb_opts; // file builder options mask
42
	   Fd_opts fd_opts; // file displayer options mask
43
	   byte disp_flags[16]; // display flags
44
	   short lev_flags[8][4]; // level on/off flags
45
	   long ref_org[3]; // origin in ref file uors
46
	   double trns_mtrx[9]; // transformation matrix
47
	   double cnvrs_fact; // conversion factor
48
	   Group Data Elements (Type 5)
49
	   long mast_org[3]; // origin in master file uors
50
	   short log_chars; // characters in logical name
51
	   char log_name[22]; // logical name (padded)
52
	   short desc_chars; // characters in description
53
	   char description[42]; /* description (padded)
54
	   short lev_sym_mask; // level symbology enable mask
55
	   short lev_sym[63]; // level symbology descriptor
56
	   long z_delta; // Z-direction delta
57
	   short clip_vertices; // clipping vertices
58
	   Point2d clip_poly[1]; // clipping polygon
59
	   } Ref_file_type5; */
60

  
61
	public DGNPoint origin = new DGNPoint(); /*!< Origin of ellipse */
62
	public double primary_axis;
63

  
64
	//=new double[4];	/*!< Primary axis length */
65
	public double secondary_axis;
66

  
67
	//=new double[4]; /*!< Secondary axis length */
68
	public double rotation; /*!< Counterclockwise rotation in degrees */
69
	public double[] quat = new double[4]; //4
70
	public double startang;
71

  
72
	/*!< Start angle (degrees counterclockwise of primary axis) */
73
	public double sweepang; /*!< Sweep angle (degrees) */
74
        
75
        public DGNElemGroup(DGNReader dgnreader) {
76
            super(dgnreader);
77
        }
78
}
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.43/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/lib/DGNReader.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.store.dgn.lib;
24

  
25
import java.awt.Color;
26
import java.awt.geom.Rectangle2D;
27
import java.io.FileInputStream;
28
import java.io.FileNotFoundException;
29
import java.nio.ByteBuffer;
30
import java.nio.ByteOrder;
31
import java.nio.MappedByteBuffer;
32
import java.nio.channels.FileChannel;
33
import java.text.MessageFormat;
34
import java.util.ArrayList;
35
import java.util.Formatter;
36
import java.util.Iterator;
37
import java.util.LinkedHashMap;
38
import java.util.List;
39
import java.util.Map;
40
import java.util.regex.Pattern;
41

  
42
import org.gvsig.fmap.dal.exception.DataException;
43
import org.gvsig.fmap.dal.exception.ReadException;
44
import org.slf4j.Logger;
45
import org.slf4j.LoggerFactory;
46

  
47
/**
48
 * Clase dedicada a leer del fichero DGN.
49
 *
50
 */
51
public class DGNReader {
52

  
53
    private static Logger logger = LoggerFactory.getLogger(DGNReader.class);
54
    static int[][] abyDefaultPCT = {{255, 255, 255}, {0, 0, 255},
55
    {0, 255, 0}, {255, 0, 0}, {255, 255, 0}, {255, 0, 255},
56
    {255, 127, 0}, {0, 255, 255}, {64, 64, 64},
57
    {192, 192, 192}, {254, 0, 96}, {160, 224, 0},
58
    {0, 254, 160}, {128, 0, 160}, {176, 176, 176},
59
    {0, 240, 240}, {240, 240, 240}, {0, 0, 240}, {0, 240, 0},
60
    {240, 0, 0}, {240, 240, 0}, {240, 0, 240}, {240, 122, 0},
61
    {0, 240, 240}, {240, 240, 240}, {0, 0, 240}, {0, 240, 0},
62
    {240, 0, 0}, {240, 240, 0}, {240, 0, 240}, {240, 122, 0},
63
    {0, 225, 225}, {225, 225, 225}, {0, 0, 225}, {0, 225, 0},
64
    {225, 0, 0}, {225, 225, 0}, {225, 0, 225}, {225, 117, 0},
65
    {0, 225, 225}, {225, 225, 225}, {0, 0, 225}, {0, 225, 0},
66
    {225, 0, 0}, {225, 225, 0}, {225, 0, 225}, {225, 117, 0},
67
    {0, 210, 210}, {210, 210, 210}, {0, 0, 210}, {0, 210, 0},
68
    {210, 0, 0}, {210, 210, 0}, {210, 0, 210}, {210, 112, 0},
69
    {0, 210, 210}, {210, 210, 210}, {0, 0, 210}, {0, 210, 0},
70
    {210, 0, 0}, {210, 210, 0}, {210, 0, 210}, {210, 112, 0},
71
    {0, 195, 195}, {195, 195, 195}, {0, 0, 195}, {0, 195, 0},
72
    {195, 0, 0}, {195, 195, 0}, {195, 0, 195}, {195, 107, 0},
73
    {0, 195, 195}, {195, 195, 195}, {0, 0, 195}, {0, 195, 0},
74
    {195, 0, 0}, {195, 195, 0}, {195, 0, 195}, {195, 107, 0},
75
    {0, 180, 180}, {180, 180, 180}, {0, 0, 180}, {0, 180, 0},
76
    {180, 0, 0}, {180, 180, 0}, {180, 0, 180}, {180, 102, 0},
77
    {0, 180, 180}, {180, 180, 180}, {0, 0, 180}, {0, 180, 0},
78
    {180, 0, 0}, {180, 180, 0}, {180, 0, 180}, {180, 102, 0},
79
    {0, 165, 165}, {165, 165, 165}, {0, 0, 165}, {0, 165, 0},
80
    {165, 0, 0}, {165, 165, 0}, {165, 0, 165}, {165, 97, 0},
81
    {0, 165, 165}, {165, 165, 165}, {0, 0, 165}, {0, 165, 0},
82
    {165, 0, 0}, {165, 165, 0}, {165, 0, 165}, {165, 97, 0},
83
    {0, 150, 150}, {150, 150, 150}, {0, 0, 150}, {0, 150, 0},
84
    {150, 0, 0}, {150, 150, 0}, {150, 0, 150}, {150, 92, 0},
85
    {0, 150, 150}, {150, 150, 150}, {0, 0, 150}, {0, 150, 0},
86
    {150, 0, 0}, {150, 150, 0}, {150, 0, 150}, {150, 92, 0},
87
    {0, 135, 135}, {135, 135, 135}, {0, 0, 135}, {0, 135, 0},
88
    {135, 0, 0}, {135, 135, 0}, {135, 0, 135}, {135, 87, 0},
89
    {0, 135, 135}, {135, 135, 135}, {0, 0, 135}, {0, 135, 0},
90
    {135, 0, 0}, {135, 135, 0}, {135, 0, 135}, {135, 87, 0},
91
    {0, 120, 120}, {120, 120, 120}, {0, 0, 120}, {0, 120, 0},
92
    {120, 0, 0}, {120, 120, 0}, {120, 0, 120}, {120, 82, 0},
93
    {0, 120, 120}, {120, 120, 120}, {0, 0, 120}, {0, 120, 0},
94
    {120, 0, 0}, {120, 120, 0}, {120, 0, 120}, {120, 82, 0},
95
    {0, 105, 105}, {105, 105, 105}, {0, 0, 105}, {0, 105, 0},
96
    {105, 0, 0}, {105, 105, 0}, {105, 0, 105}, {105, 77, 0},
97
    {0, 105, 105}, {105, 105, 105}, {0, 0, 105}, {0, 105, 0},
98
    {105, 0, 0}, {105, 105, 0}, {105, 0, 105}, {105, 77, 0},
99
    {0, 90, 90}, {90, 90, 90}, {0, 0, 90}, {0, 90, 0},
100
    {90, 0, 0}, {90, 90, 0}, {90, 0, 90}, {90, 72, 0},
101
    {0, 90, 90}, {90, 90, 90}, {0, 0, 90}, {0, 90, 0},
102
    {90, 0, 0}, {90, 90, 0}, {90, 0, 90}, {90, 72, 0},
103
    {0, 75, 75}, {75, 75, 75}, {0, 0, 75}, {0, 75, 0},
104
    {75, 0, 0}, {75, 75, 0}, {75, 0, 75}, {75, 67, 0},
105
    {0, 75, 75}, {75, 75, 75}, {0, 0, 75}, {0, 75, 0},
106
    {75, 0, 0}, {75, 75, 0}, {75, 0, 75}, {75, 67, 0},
107
    {0, 60, 60}, {60, 60, 60}, {0, 0, 60}, {0, 60, 0},
108
    {60, 0, 0}, {60, 60, 0}, {60, 0, 60}, {60, 62, 0},
109
    {0, 60, 60}, {60, 60, 60}, {0, 0, 60}, {0, 60, 0},
110
    {60, 0, 0}, {60, 60, 0}, {60, 0, 60}, {60, 62, 0},
111
    {0, 45, 45}, {45, 45, 45}, {0, 0, 45}, {0, 45, 0},
112
    {45, 0, 0}, {45, 45, 0}, {45, 0, 45}, {45, 57, 0},
113
    {0, 45, 45}, {45, 45, 45}, {0, 0, 45}, {0, 45, 0},
114
    {45, 0, 0}, {45, 45, 0}, {45, 0, 45}, {45, 57, 0},
115
    {0, 30, 30}, {30, 30, 30}, {0, 0, 30}, {0, 30, 0},
116
    {30, 0, 0}, {30, 30, 0}, {30, 0, 30}, {30, 52, 0},
117
    {0, 30, 30}, {30, 30, 30}, {0, 0, 30}, {0, 30, 0},
118
    {30, 0, 0}, {30, 30, 0}, {30, 0, 30}, {192, 192, 192},
119
    {28, 0, 100}};
120
    private int LSB;
121
    private FileInputStream fin;
122

  
123
    // private LEDataInputStream input;
124
    private MappedByteBuffer bb;
125
    private int FALSE = 0;
126
    private int TRUE = 1;
127
    private DGNElemCore elemento;
128
    private DGNInfo info; // Contiene el path y otras cosas
129
    private Rectangle2D.Double m_BoundingBox;
130
    private DGNElemColorTable m_colorTable;
131

  
132
    private boolean logErrors = false;
133

  
134
    public DGNReader(String pathFich) throws DataException {
135
        this(pathFich, false);
136
    }
137

  
138
    public DGNReader(String pathFich, boolean logErrors) throws DataException {
139
        this.logErrors = logErrors;
140

  
141
        info = new DGNInfo();
142

  
143
        DGNElemCore elemento = new DGNElemCore(this);
144
        int iArg;
145
        int bReportExtents = 0;
146
        byte[] achRaw = new byte[64];
147
        achRaw[63] = 1;
148

  
149
        double dfSFXMin = 0.0;
150
        double dfSFXMax = 0.0;
151
        double dfSFYMin = 0.0;
152
        double dfSFYMax = 0.0;
153

  
154
        info.fp = pathFich;
155
        info = DGNOpen(info, 0);
156

  
157
        bb.rewind();
158
        DGNSetSpatialFilter(info, dfSFXMin, dfSFYMin, dfSFXMax, dfSFYMax);
159

  
160
        int nLevel;
161
        int nType;
162
        int[] anLevelTypeCount = new int[128 * 64];
163
        int[] anLevelCount = new int[64];
164
        int[] anTypeCount = new int[128];
165
        double[] adfExtents = new double[6];
166
        int[] nCount = new int[1];
167
        nCount[0] = 0;
168

  
169
        DGNGetExtents(info, adfExtents); // extender
170
        logdebug("X Range:" + adfExtents[0] + ", " + adfExtents[3]);
171
        logdebug("Y Range:" + adfExtents[1] + ", " + adfExtents[4]);
172
        logdebug("Z Range:" + adfExtents[2] + ", " + adfExtents[5]);
173

  
174
        m_BoundingBox = new Rectangle2D.Double();
175
        m_BoundingBox.setRect(adfExtents[0], adfExtents[1],
176
                (adfExtents[3] - adfExtents[0]),
177
                (adfExtents[4] - adfExtents[1]));
178

  
179
        /* m_Renderer = new FRenderer(this); */
180
        DGNElementInfo[] pasEI; // =new DGNElementInfo[nCount+1];
181
        pasEI = DGNGetElementIndex(info, nCount);
182

  
183
        logdebug("Total Elements:" + nCount[0]);
184

  
185
        for (int i = 0; i < nCount[0]; i++) {
186
            anLevelTypeCount[(pasEI[i].level * 128) + pasEI[i].type]++;
187
            anLevelCount[pasEI[i].level]++;
188
            anTypeCount[pasEI[i].type]++;
189
        }
190

  
191
        logdebug("Per Type Report");
192
        logdebug("===============");
193

  
194
        for (nType = 0; nType < 128; nType++) {
195
            if (anTypeCount[nType] != 0) {
196
                logdebug("Type:" + DGNTypeToName(nType) + ":"
197
                        + anTypeCount[nType]);
198
            }
199
        }
200

  
201
        logdebug("Per Level Report\n");
202
        logdebug("================\n");
203
        for (nLevel = 0; nLevel < 64; nLevel++) {
204
            if (anLevelCount[nLevel] == 0) {
205
                continue;
206
            }
207
            logdebug("Level " + nLevel + "," + anLevelCount[nLevel] + "elements:");
208
            for (nType = 0; nType < 128; nType++) {
209
                if (anLevelTypeCount[(nLevel * 128) + nType] != 0) {
210
                    logdebug("  Type " + DGNTypeToName(nType)
211
                            + "," + anLevelTypeCount[(nLevel * 128) + nType]);
212
                }
213
            }
214
        }
215

  
216
        bb.rewind();
217
    }
218

  
219
    public boolean is3D() {
220
        return this.info.dimension == 3;
221
    }
222

  
223
    /*
224
     * public Color getColor(int indexColor) { int r,g,b; //
225
     * System.err.println("indexcolor = " + indexColor); // Si no hay tabla de
226
     * colores, interpretamos que todas las cosas son negras if (m_colorTable ==
227
     * null) return new Color(0,0,0);
228
     * 
229
     * r = ByteUtils.getUnsigned(m_colorTable.color_info[indexColor][0]); g =
230
     * ByteUtils.getUnsigned(m_colorTable.color_info[indexColor][1]); b =
231
     * ByteUtils.getUnsigned(m_colorTable.color_info[indexColor][2]);
232
     * 
233
     * if ((r==255) && (g==255) & (b==255)) { r=g=b=0; // El color blanco lo
234
     * devolvemos como negro. }
235
     * 
236
     * return new Color(r,g,b); }
237
     */
238
    /**
239
     * Devuelve la informaci?n del DGN.
240
     *
241
     * @return DGNInfo Informaci?n.
242
     */
243
    public DGNInfo getInfo() {
244
        return info;
245
    }
246

  
247
    /**
248
     * Devuelve el n?mero de elementos.
249
     *
250
     * @return N?mero de elementos.
251
     */
252
    public int getNumEntities() {
253
        return info.element_count;
254
    }
255

  
256
    /**
257
     * Devuelve el rect?ngulo del extent.
258
     *
259
     * @return Rect?ngulo.
260
     */
261
    public Rectangle2D getBoundingBox() {
262
        return m_BoundingBox;
263
    }
264

  
265
    /**
266
     * *********************************************************************
267
     */
268
    /* DGNGotoElement() */
269
    /**
270
     * *********************************************************************
271
     */
272
    /**
273
     * Seek to indicated element. Changes what element will be read on the next
274
     * call to DGNReadElement(). Note that this function requires and index, and
275
     * one will be built if not already available.
276
     *
277
     * @param element_id the element to seek to. These values are sequentially
278
     * ordered starting at zero for the first element.
279
     *
280
     * @return returns TRUE on success or FALSE on failure.
281
     */
282
    public int DGNGotoElement(int element_id) {
283
        DGNBuildIndex(info);
284
        if ((element_id < 0) || (element_id >= info.element_count)) {
285
            return FALSE;
286
        }
287
        bb.position((int) info.element_index[element_id].offset);
288

  
289
        info.next_element_id = element_id;
290
        info.in_complex_group = FALSE;
291
        return TRUE;
292
    }
293

  
294
    private DGNInfo DGNOpen(DGNInfo info, int bUpdate) throws DataException {
295
        int pos = 0;
296
        byte[] abyHeader = new byte[512];
297
        info.next_element_id = 0;
298
        info.got_tcb = FALSE;
299
        info.scale = 1.0;
300
        info.origin_x = 0.0;
301
        info.origin_y = 0.0;
302
        info.origin_z = 0.0;
303
        info.index_built = FALSE;
304
        info.element_count = 0;
305
        info.element_index = null;
306
        info.got_bounds = FALSE;
307

  
308
        try {
309
            fin = new FileInputStream(info.fp);
310

  
311
            FileChannel fc = fin.getChannel();
312

  
313
            long sz = fc.size();
314
            int numReg;
315

  
316
            // Get the file's size and then map it into memory
317
            bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
318
            bb.order(ByteOrder.nativeOrder());
319
            bb.get(abyHeader, pos, abyHeader.length);
320

  
321
            info.ftall = (int) (sz / 16);
322

  
323
            if (bb.order() == ByteOrder.LITTLE_ENDIAN) {
324
                LSB = TRUE;
325
            }
326

  
327
            if (DGNTestOpen(abyHeader, abyHeader.length) != FALSE) {
328
                if (abyHeader[0] == (byte) 0xC8) {
329
                    info.dimension = 3; // 0xC8
330
                } else {
331
                    info.dimension = 2;
332
                }
333

  
334
                info.has_spatial_filter = FALSE;
335
                info.sf_converted_to_uor = FALSE;
336
                info.select_complex_group = FALSE;
337
                info.in_complex_group = FALSE;
338
            }
339
        } catch (FileNotFoundException e) {
340
            throw new org.gvsig.fmap.dal.exception.FileNotFoundException(
341
                    info.fp);
342
        } catch (Exception e) {
343
            throw new ReadException("DGNReader error", e);
344
        }
345

  
346
        return info;
347
    }
348

  
349
    /**
350
     * Comprobaci?n si se puede abrir el fichero.
351
     *
352
     * @param pabyHeader Vector byte con el header.
353
     * @param nByteCount n?mero de bytes.
354
     *
355
     * @return Devuelve un enteor que muestra si no hay errores.
356
     */
357
    private int DGNTestOpen(byte[] pabyHeader, int nByteCount) {
358
        if (nByteCount < 4) {
359
            return TRUE;
360
        }
361

  
362
        // Is it a cell library?
363
        if ((pabyHeader[0] == (byte) 0x08) && (pabyHeader[1] == (byte) 0x05)
364
                && (pabyHeader[2] == (byte) 0x17)
365
                && (pabyHeader[3] == (byte) 0x00)) {
366
            return TRUE;
367
        }
368

  
369
        // Is it not a regular 2D or 3D file?
370
        if (((pabyHeader[0] != (byte) 0x08) && (pabyHeader[0] != (byte) 0xC8))
371
                || (pabyHeader[1] != (byte) 0x09)
372
                || (pabyHeader[2] != (byte) 0xFE)
373
                || (pabyHeader[3] != (byte) 0x02)) {
374
            return FALSE;
375
        }
376

  
377
        return TRUE;
378
    }
379

  
380
    /**
381
     * Lee una fila del elemento.
382
     *
383
     * @param info Informaci?n del DGN.
384
     * @param core Elemento.
385
     *
386
     * @return Devuelve un entero que muestra si se ha calculado correctamente.
387
     */
388
    private int DGNLoadRawElement(DGNInfo info, DGNElemCore core) {
389
        /* -------------------------------------------------------------------- */
390
        /* Read the first four bytes to get the level, type, and word */
391
        /* count. */
392
        /* -------------------------------------------------------------------- */
393

  
394
        // int nType, nWords, nLevel;
395
        int nType = 0;
396
        int nWords = 0;
397
        int nLevel = 0;
398
        int bytesCount = 0;
399

  
400
        try {
401
            // input=new LEDataInputStream(fin);
402
            for (int i = 0; i < 4; i++) {
403
                info.abyElem[i] = bb.get();
404
                if (i == 1) {
405
                    if ((info.abyElem[0] == -1) && (info.abyElem[1] == -1)) {
406
                        return FALSE;
407
                    }
408
                }
409

  
410
                // info.temporal[i]=input.readByte();
411
            }
412

  
413
            nWords = ByteUtils.byteToUnsignedInt(info.abyElem[2])
414
                    + (ByteUtils.byteToUnsignedInt(info.abyElem[3]) * 256);
415
            nType = ByteUtils.byteToUnsignedInt(info.abyElem[1]) & 0x7f;
416
            nLevel = ByteUtils.byteToUnsignedInt(info.abyElem[0]) & 0x3f;
417

  
418
            /*
419
             * ------------------------------------------------------------------
420
             */
421
            /* Read the rest of the element data into the working buffer. */
422
            if (((nWords * 2) + 4) > info.abyElem.length) {
423
                return FALSE;
424
            }
425
            for (; bytesCount < (nWords * 2) && bb.hasRemaining(); bytesCount++) {
426
                info.abyElem[bytesCount + 4] = bb.get();
427
            }
428
            info.ftall = bb.position();
429
        } catch (Exception e) {
430
            logwarn(MessageFormat.format("The DGN file {0} may not be loaded correctly.\n"
431
                    + "Error loading:\n"
432
                    + "nWords = {1}\n"
433
                    + "info.next_element_id {2}\n"
434
                    + "info.abyElem.length =  {3}\n"
435
                    + "bb.position() =  {4}",
436
                    info.fp,
437
                    nWords,
438
                    info.next_element_id,
439
                    info.abyElem.length,
440
                    bb.position()), e);
441

  
442
            return FALSE;
443
        }
444

  
445
        info.nElemBytes = bytesCount + 4;
446
        info.next_element_id++;
447

  
448
        /* -------------------------------------------------------------------- */
449
        /* Return requested info. */
450
        /* -------------------------------------------------------------------- */
451
        core.type = nType;
452

  
453
        core.level = nLevel;
454

  
455
        return TRUE;
456
    }
457

  
458
    /**
459
     * Calcula el filtro espacial al rect?ngulo del elemento.
460
     *
461
     * @param info Informaci?n del DGN.
462
     */
463
    private void DGNSpatialFilterToUOR(DGNInfo info) {
464
        DGNPoint sMin = new DGNPoint();
465
        DGNPoint sMax = new DGNPoint();
466

  
467
        if ((info.sf_converted_to_uor == 1)
468
                || (!(info.has_spatial_filter == 1)) || (!(info.got_tcb == 1))) {
469
            return;
470
        }
471

  
472
        sMin.x = info.sf_min_x_geo;
473
        sMin.y = info.sf_min_y_geo;
474
        sMin.z = 0;
475

  
476
        sMax.x = info.sf_max_x_geo;
477
        sMax.y = info.sf_max_y_geo;
478
        sMax.z = 0;
479

  
480
        DGNInverseTransformPoint(info, sMin);
481
        DGNInverseTransformPoint(info, sMax);
482

  
483
        info.sf_min_x = (long) (sMin.x + 2147483648.0);
484
        info.sf_min_y = (long) (sMin.y + 2147483648.0);
485
        info.sf_max_x = (long) (sMax.x + 2147483648.0);
486
        info.sf_max_y = (long) (sMax.y + 2147483648.0);
487

  
488
        info.sf_converted_to_uor = TRUE;
489
    }
490

  
491
    /**
492
     * Calcula un punto aplicandole la transformaci?n.
493
     *
494
     * @param info Informaci?n del DGN.
495
     * @param punto Punto.
496
     */
497
    private void DGNInverseTransformPoint(DGNInfo info, DGNPoint punto) {
498
        punto.x = (punto.x + info.origin_x) / info.scale;
499
        punto.y = (punto.y + info.origin_y) / info.scale;
500
        punto.z = (punto.z + info.origin_z) / info.scale;
501

  
502
        punto.x = Math.max(-2147483647, Math.min(2147483647, punto.x));
503
        punto.y = Math.max(-2147483647, Math.min(2147483647, punto.y));
504
        punto.z = Math.max(-2147483647, Math.min(2147483647, punto.z));
505
    }
506

  
507
    public DGNElemCore DGNReadElement() {
508
        DGNElemCore elemento = new DGNElemCore(this);
509
        int nType;
510
        int nLevel;
511
        int bInsideFilter;
512

  
513
        /* -------------------------------------------------------------------- */
514
        /* Load the element data into the current buffer. If a spatial */
515
        /* filter is in effect, loop until we get something within our */
516
        /* spatial constraints. */
517
        /* -------------------------------------------------------------------- */
518
        do {
519
            bInsideFilter = TRUE;
520

  
521
            int fin_fichero = DGNLoadRawElement(info, elemento);
522

  
523
            if (fin_fichero == FALSE) {
524
                return null;
525
            }
526

  
527
            if (info.has_spatial_filter != FALSE) {
528
                if (info.sf_converted_to_uor == FALSE) {
529
                    DGNSpatialFilterToUOR(info);
530
                }
531

  
532
                if (DGNGetRawExtents(info, null, elemento) == null) {
533
                    bInsideFilter = TRUE;
534
                } else if ((info.min_x > info.sf_max_x)
535
                        || (info.min_y > info.sf_max_y)
536
                        || (info.max_x < info.sf_min_x)
537
                        || (info.max_y < info.sf_min_y)) {
538
                    bInsideFilter = FALSE;
539
                }
540

  
541
                if ((elemento.type == DGNFileHeader.DGNT_COMPLEX_CHAIN_HEADER)
542
                        || (elemento.type == DGNFileHeader.DGNT_COMPLEX_SHAPE_HEADER)) {
543
                    info.in_complex_group = TRUE;
544
                    info.select_complex_group = bInsideFilter;
545
                } else if ((info.abyElem[0] & (byte) 0x80) != FALSE) {
546
                    if (info.in_complex_group == TRUE) {
547
                        bInsideFilter = info.select_complex_group;
548
                    }
549
                } else {
550
                    info.in_complex_group = FALSE;
551
                }
552
            }
553
        } while (bInsideFilter == FALSE);
554

  
555
        elemento = DGNProcessElement(info, elemento.type, elemento.level);
556

  
557
        return elemento;
558
    }
559

  
560
    /**
561
     * Devuelve los extent de una fila.
562
     *
563
     * @param info Informaci?n del DGN.
564
     * @param pabyRawData Vector de byte.
565
     * @param elemento Elemento.
566
     *
567
     * @return Vector de double.
568
     */
569
    public double[] DGNGetRawExtents(DGNInfo info, byte[] pabyRawData,
570
            DGNElemCore elemento) {
571
        if (pabyRawData == null) {
572
            pabyRawData = info.abyElem;
573
        }
574

  
575
        double[] tempo = new double[6];
576

  
577
        switch (elemento.type) {
578
            case DGNFileHeader.DGNT_LINE:
579
            case DGNFileHeader.DGNT_LINE_STRING:
580
            case DGNFileHeader.DGNT_SHAPE:
581
            case DGNFileHeader.DGNT_CURVE:
582
            case DGNFileHeader.DGNT_BSPLINE:
583
            case DGNFileHeader.DGNT_ELLIPSE:
584
            case DGNFileHeader.DGNT_ARC:
585
            case DGNFileHeader.DGNT_TEXT:
586
            case DGNFileHeader.DGNT_COMPLEX_CHAIN_HEADER:
587
            case DGNFileHeader.DGNT_COMPLEX_SHAPE_HEADER:
588

  
589
                byte[] temp = new byte[4];
590
                System.arraycopy(pabyRawData, 4, temp, 0, 4);
591
                tempo[0] = DGN_INT32(temp); // 4
592

  
593
                System.arraycopy(pabyRawData, 8, temp, 0, 4);
594
                tempo[1] = DGN_INT32(temp);
595

  
596
                System.arraycopy(pabyRawData, 12, temp, 0, 4);
597
                tempo[2] = DGN_INT32(temp);
598

  
599
                System.arraycopy(pabyRawData, 16, temp, 0, 4);
600
                tempo[3] = DGN_INT32(temp);
601

  
602
                System.arraycopy(pabyRawData, 20, temp, 0, 4);
603
                tempo[4] = DGN_INT32(temp);
604

  
605
                System.arraycopy(pabyRawData, 24, temp, 0, 4);
606
                tempo[5] = DGN_INT32(temp);
607

  
608
                return tempo;
609

  
610
            default:
611
                return null;
612
        }
613
    }
614

  
615
    /**
616
     * A partir de un vector de byte devuelve un double.
617
     *
618
     * @param p Vector de byte.
619
     *
620
     * @return double.
621
     */
622
    private double DGN_INT32(byte[] p) {
623
        int x = 256;
624
        int x0;
625
        int x1;
626
        int x2;
627
        int x3;
628
        x0 = p[0];
629
        x1 = p[1];
630
        x2 = p[2];
631
        x3 = p[3];
632

  
633
        if (p[0] < 0) {
634
            x0 = x + p[0];
635
        }
636

  
637
        if (p[1] < 0) {
638
            x1 = x + p[1];
639
        }
640

  
641
        if (p[2] < 0) {
642
            x2 = x + p[2];
643
        }
644

  
645
        if (p[3] < 0) {
646
            x3 = x + p[3];
647
        }
648

  
649
        return (x2 + (x3 * 256) + (x1 * 65536 * 256) + (x0 * 65536));
650
    }
651

  
652
    private DGNElemCore DGNProcessElement(DGNInfo info, int nType, int nLevel) {
653
        DGNElemCore elemento = new DGNElemCore(this);
654

  
655
        switch (nType) {
656
            case DGNFileHeader.DGNT_SHARED_CELL_DEFN:
657
                logdebug("DGNProcessElement (DGNT_SHARED_CELL_DEFN): Type " + DGNTypeToName(nType));
658
                elemento.stype = DGNFileHeader.DGNST_SHARED_CELL_DEFN;
659
                DGNParseCore(info, elemento);
660

  
661
                break;
662

  
663
            case DGNFileHeader.DGNT_CELL_HEADER: {
664
                DGNElemCellHeader psCell = new DGNElemCellHeader(this);
665
                psCell.stype = DGNFileHeader.DGNST_CELL_HEADER;
666
                DGNParseCore(info, psCell);
667
                psCell.totlength = ByteUtils.getUnsigned(info.abyElem[36])
668
                        + (ByteUtils.getUnsigned(info.abyElem[37]) * 256);
669

  
670
                byte[] temp = new byte[psCell.name.length];
671
                System.arraycopy(psCell.name, 0, temp, 0, psCell.name.length);
672
                DGNRad50ToAscii(ByteUtils.byteToUnsignedInt(info.abyElem[38])
673
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[39]) * 256),
674
                        temp);
675

  
676
                System.arraycopy(psCell.name, 3, temp, 0, psCell.name.length - 3);
677

  
678
                DGNRad50ToAscii(ByteUtils.byteToUnsignedInt(info.abyElem[40])
679
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[41]) * 256),
680
                        temp);
681
                psCell.cclass = ByteUtils.byteToUnsignedInt(info.abyElem[42])
682
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[43]) * 256);
683
                psCell.levels[0] = ByteUtils.byteToUnsignedInt(info.abyElem[44])
684
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[45]) * 256);
685
                psCell.levels[1] = ByteUtils.byteToUnsignedInt(info.abyElem[46])
686
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[47]) * 256);
687
                psCell.levels[2] = ByteUtils.byteToUnsignedInt(info.abyElem[48])
688
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[49]) * 256);
689
                psCell.levels[3] = ByteUtils.byteToUnsignedInt(info.abyElem[50])
690
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[51]) * 256);
691
                psCell.color = info.abyElem[35];
692

  
693
                if (info.dimension == 2) {
694
                    byte[] temp1 = new byte[4];
695
                    System.arraycopy(info.abyElem, 52, temp1, 0, 4);
696
                    psCell.rnglow.x = DGN_INT32(temp1);
697
                    System.arraycopy(info.abyElem, 56, temp1, 0, 4);
698
                    psCell.rnglow.y = DGN_INT32(temp);
699
                    System.arraycopy(info.abyElem, 60, temp1, 0, 4);
700
                    psCell.rnghigh.x = DGN_INT32(temp1);
701
                    System.arraycopy(info.abyElem, 64, temp1, 0, 4);
702
                    psCell.rnghigh.y = DGN_INT32(temp1);
703
                    System.arraycopy(info.abyElem, 84, temp1, 0, 4);
704
                    psCell.origin.x = DGN_INT32(temp1);
705
                    System.arraycopy(info.abyElem, 88, temp1, 0, 4);
706
                    psCell.origin.y = DGN_INT32(temp1);
707

  
708
                    {
709
                        double a;
710
                        double b;
711
                        double c;
712
                        double d;
713
                        double a2;
714
                        double c2;
715
                        System.arraycopy(info.abyElem, 68, temp1, 0, 4);
716
                        a = DGN_INT32(temp1);
717
                        System.arraycopy(info.abyElem, 72, temp1, 0, 4);
718
                        b = DGN_INT32(temp1);
719
                        System.arraycopy(info.abyElem, 76, temp1, 0, 4);
720
                        c = DGN_INT32(temp1);
721
                        System.arraycopy(info.abyElem, 80, temp1, 0, 4);
722
                        d = DGN_INT32(temp1);
723
                        a2 = a * a;
724
                        c2 = c * c;
725
                        psCell.xscale = Math.sqrt(a2 + c2) / 214748;
726
                        psCell.yscale = Math.sqrt((b * b) + (d * d)) / 214748;
727
                        psCell.rotation = Math.acos(a / Math.sqrt(a2 + c2));
728

  
729
                        if (b <= 0) {
730
                            psCell.rotation = (psCell.rotation * 180) / Math.PI;
731
                        } else {
732
                            psCell.rotation = 360 - ((psCell.rotation * 180) / Math.PI);
733
                        }
734
                    }
735
                } else {
736
                    byte[] temp1 = new byte[4];
737
                    System.arraycopy(info.abyElem, 52, temp1, 0, 4);
738
                    psCell.rnglow.x = DGN_INT32(temp1);
739
                    System.arraycopy(info.abyElem, 56, temp1, 0, 4);
740
                    psCell.rnglow.y = DGN_INT32(temp1);
741
                    System.arraycopy(info.abyElem, 60, temp1, 0, 4);
742
                    psCell.rnglow.z = DGN_INT32(temp1);
743
                    System.arraycopy(info.abyElem, 64, temp1, 0, 4);
744
                    psCell.rnghigh.x = DGN_INT32(temp1);
745
                    System.arraycopy(info.abyElem, 68, temp1, 0, 4);
746
                    psCell.rnghigh.y = DGN_INT32(temp1);
747
                    System.arraycopy(info.abyElem, 72, temp1, 0, 4);
748
                    psCell.rnghigh.z = DGN_INT32(temp1);
749

  
750
                    System.arraycopy(info.abyElem, 112, temp1, 0, 4);
751
                    psCell.origin.x = DGN_INT32(temp1);
752
                    System.arraycopy(info.abyElem, 116, temp1, 0, 4);
753
                    psCell.origin.y = DGN_INT32(temp1);
754
                    System.arraycopy(info.abyElem, 120, temp1, 0, 4);
755
                    psCell.origin.z = DGN_INT32(temp1);
756
                }
757

  
758
                DGNTransformPoint(info, psCell.rnglow);
759
                DGNTransformPoint(info, psCell.rnghigh);
760
                DGNTransformPoint(info, psCell.origin);
761
                elemento = psCell;
762
            }
763

  
764
            break;
765

  
766
            case DGNFileHeader.DGNT_CELL_LIBRARY: {
767
                logdebug("DGNProcessElement (DGNT_CELL_LIBRARY): Type " + DGNTypeToName(nType));
768

  
769
                DGNElemCellLibrary psCell = new DGNElemCellLibrary(this);
770
                int iWord;
771
                psCell.stype = DGNFileHeader.DGNST_CELL_LIBRARY;
772
                DGNParseCore(info, psCell);
773

  
774
                byte[] temp = new byte[psCell.name.length];
775
                System.arraycopy(psCell.name, 0, temp, 0, psCell.name.length);
776
                DGNRad50ToAscii(ByteUtils.byteToUnsignedInt(info.abyElem[32])
777
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[33]) * 256),
778
                        temp);
779
                System.arraycopy(psCell.name, 3, temp, 0, psCell.name.length);
780
                DGNRad50ToAscii(ByteUtils.byteToUnsignedInt(info.abyElem[34])
781
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[35]) * 256),
782
                        temp);
783
                psCell.properties = info.abyElem[38] + (info.abyElem[39] * 256);
784
                psCell.dispsymb = ByteUtils.byteToUnsignedInt(info.abyElem[40])
785
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[41]) * 256);
786
                psCell.cclass = ByteUtils.byteToUnsignedInt(info.abyElem[42])
787
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[43]) * 256);
788
                psCell.levels[0] = ByteUtils.byteToUnsignedInt(info.abyElem[44])
789
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[45]) * 256);
790
                psCell.levels[1] = ByteUtils.byteToUnsignedInt(info.abyElem[46])
791
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[47]) * 256);
792
                psCell.levels[2] = ByteUtils.byteToUnsignedInt(info.abyElem[48])
793
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[49]) * 256);
794
                psCell.levels[3] = ByteUtils.byteToUnsignedInt(info.abyElem[50])
795
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[51]) * 256);
796
                psCell.numwords = ByteUtils.byteToUnsignedInt(info.abyElem[36])
797
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[37]) * 256);
798

  
799
                for (iWord = 0; iWord < 9; iWord++) {
800
                    int iOffset = 52 + (iWord * 2);
801
                    System.arraycopy(psCell.name, iWord * 3, temp, 0,
802
                            psCell.description.length);
803
                    DGNRad50ToAscii(
804
                            ByteUtils.byteToUnsignedInt(info.abyElem[iOffset])
805
                            + (ByteUtils
806
                            .byteToUnsignedInt(info.abyElem[iOffset + 1]) * 256),
807
                            temp);
808
                }
809

  
810
                elemento = psCell;
811
            }
812

  
813
            break;
814

  
815
            case DGNFileHeader.DGNT_LINE: {
816
                DGNElemMultiPoint psLine = new DGNElemMultiPoint(this);
817
                psLine.stype = DGNFileHeader.DGNST_MULTIPOINT;
818
                DGNParseCore(info, psLine);
819
                psLine.num_vertices = 2;
820
                psLine.vertices = new DGNPoint[psLine.num_vertices];
821

  
822
                if (info.dimension == 2) {
823
                    byte[] temp1 = new byte[4];
824
                    System.arraycopy(info.abyElem, 36, temp1, 0, 4);
825
                    psLine.vertices[0] = new DGNPoint();
826
                    psLine.vertices[0].x = DGN_INT32(temp1);
827
                    System.arraycopy(info.abyElem, 40, temp1, 0, 4);
828
                    psLine.vertices[0].y = DGN_INT32(temp1);
829
                    System.arraycopy(info.abyElem, 44, temp1, 0, 4);
830
                    psLine.vertices[1] = new DGNPoint();
831
                    psLine.vertices[1].x = DGN_INT32(temp1);
832
                    System.arraycopy(info.abyElem, 48, temp1, 0, 4);
833
                    psLine.vertices[1].y = DGN_INT32(temp1);
834
                } else {
835
                    byte[] temp1 = new byte[4];
836
                    System.arraycopy(info.abyElem, 36, temp1, 0, 4);
837
                    psLine.vertices[0] = new DGNPoint();
838
                    psLine.vertices[0].x = DGN_INT32(temp1);
839
                    System.arraycopy(info.abyElem, 40, temp1, 0, 4);
840
                    psLine.vertices[0].y = DGN_INT32(temp1);
841
                    System.arraycopy(info.abyElem, 44, temp1, 0, 4);
842
                    psLine.vertices[0].z = DGN_INT32(temp1);
843
                    System.arraycopy(info.abyElem, 48, temp1, 0, 4);
844
                    psLine.vertices[1] = new DGNPoint();
845
                    psLine.vertices[1].x = DGN_INT32(temp1);
846
                    System.arraycopy(info.abyElem, 52, temp1, 0, 4);
847
                    psLine.vertices[1].y = DGN_INT32(temp1);
848
                    System.arraycopy(info.abyElem, 56, temp1, 0, 4);
849
                    psLine.vertices[1].z = DGN_INT32(temp1);
850
                }
851

  
852
                DGNTransformPoint(info, psLine.vertices[0]);
853
                DGNTransformPoint(info, psLine.vertices[1]);
854
                elemento = psLine;
855
            }
856

  
857
            break;
858

  
859
            case DGNFileHeader.DGNT_LINE_STRING:
860
            case DGNFileHeader.DGNT_SHAPE: // regular
861
            case DGNFileHeader.DGNT_CURVE: // mal
862
            case DGNFileHeader.DGNT_BSPLINE: // aceptable
863
            {
864
                DGNElemMultiPoint psLine = new DGNElemMultiPoint(this);
865
                int i;
866
                int count;
867
                int pntsize = info.dimension * 4;
868

  
869
                count = ByteUtils.byteToUnsignedInt(info.abyElem[36])
870
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[37]) * 256);
871
                psLine.stype = DGNFileHeader.DGNST_MULTIPOINT;
872
                DGNParseCore(info, psLine);
873

  
874
                if (info.nElemBytes < (38 + (count * pntsize))) {
875
                    logdebug("Error en los vertices de multipunto");
876
                    count = (info.nElemBytes - 38) / pntsize;
877
                    return null;
878
                }
879

  
880
                psLine.num_vertices = count;
881
                psLine.vertices = new DGNPoint[psLine.num_vertices];
882

  
883
                for (i = 0; i < psLine.num_vertices; i++) {
884
                    byte[] temp1 = new byte[4];
885
                    System.arraycopy(info.abyElem, 38 + (i * pntsize), temp1, 0, 4);
886
                    psLine.vertices[i] = new DGNPoint();
887
                    psLine.vertices[i].x = DGN_INT32(temp1);
888
                    System.arraycopy(info.abyElem, 42 + (i * pntsize), temp1, 0, 4);
889
                    psLine.vertices[i].y = DGN_INT32(temp1);
890

  
891
                    if (info.dimension == 3) {
892
                        System.arraycopy(info.abyElem, 46 + (i * pntsize), temp1,
893
                                0, 4);
894
                        psLine.vertices[i].z = DGN_INT32(temp1);
895
                    }
896

  
897
                    DGNTransformPoint(info, psLine.vertices[i]);
898
                }
899

  
900
                elemento = psLine;
901
            }
902

  
903
            break;
904

  
905
            case DGNFileHeader.DGNT_GROUP_DATA:
906
                if (nLevel == DGNFileHeader.DGN_GDL_COLOR_TABLE) {
907
                    elemento = DGNParseColorTable(info);
908
                } else {
909
                    elemento.stype = DGNFileHeader.DGNST_CORE;
910
                    DGNParseCore(info, elemento);
911
                }
912
                break;
913

  
914
            case DGNFileHeader.DGNT_ELLIPSE: {
915
                DGNElemArc psEllipse = new DGNElemArc(this);
916

  
917
                psEllipse.stype = DGNFileHeader.DGNST_ARC;
918
                DGNParseCore(info, psEllipse);
919

  
920
                int[] fin = new int[1];
921
                fin[0] = 0;
922

  
923
                byte[] temp1 = new byte[8];
924
                System.arraycopy(info.abyElem, 36, temp1, 0, 8);
925

  
926
                fin[0] = 0;
927
                psEllipse.primary_axis = DGNParseIEEE(temp1);
928

  
929
                psEllipse.primary_axis *= info.scale;
930
                System.arraycopy(info.abyElem, 44, temp1, 0, 8);
931
                fin[0] = 0;
932

  
933
                psEllipse.secondary_axis = DGNParseIEEE(temp1);
934
                psEllipse.secondary_axis *= info.scale;
935

  
936
                if (info.dimension == 2) {
937
                    System.arraycopy(info.abyElem, 52, temp1, 0, 4);
938
                    psEllipse.rotation = DGN_INT32(temp1);
939
                    psEllipse.rotation = psEllipse.rotation / 360000.0;
940
                    System.arraycopy(info.abyElem, 56, temp1, 0, 8);
941
                    fin[0] = 0;
942

  
943
                    psEllipse.origin.x = DGNParseIEEE(temp1);
944
                    System.arraycopy(info.abyElem, 64, temp1, 0, 8);
945
                    fin[0] = 0;
946

  
947
                    psEllipse.origin.y = DGNParseIEEE(temp1);
948
                } else {
949
                    // leave quaternion for later
950
                    System.arraycopy(info.abyElem, 68, temp1, 0, 8);
951
                    fin[0] = 0;
952
                    psEllipse.origin.x = DGNParseIEEE(temp1);
953

  
954
                    System.arraycopy(info.abyElem, 76, temp1, 0, 8);
955
                    fin[0] = 0;
956
                    psEllipse.origin.y = DGNParseIEEE(temp1);
957

  
958
                    System.arraycopy(info.abyElem, 84, temp1, 0, 8);
959
                    fin[0] = 0;
960
                    psEllipse.origin.z = DGNParseIEEE(temp1);
961

  
962
                    System.arraycopy(info.abyElem, 52, temp1, 0, 4);
963
                    psEllipse.quat[0] = DGN_INT32(temp1);
964
                    System.arraycopy(info.abyElem, 56, temp1, 0, 4);
965
                    psEllipse.quat[1] = DGN_INT32(temp1);
966
                    System.arraycopy(info.abyElem, 60, temp1, 0, 4);
967
                    psEllipse.quat[2] = DGN_INT32(temp1);
968
                    System.arraycopy(info.abyElem, 64, temp1, 0, 4);
969
                    psEllipse.quat[3] = DGN_INT32(temp1);
970
                }
971

  
972
                DGNTransformPoint(info, (psEllipse.origin));
973

  
974
                psEllipse.startang = 0.0;
975
                psEllipse.sweepang = 360.0;
976
                elemento = psEllipse;
977
            }
978

  
979
            break;
980

  
981
            case DGNFileHeader.DGNT_ARC: {
982
                DGNElemArc psEllipse = new DGNElemArc(this);
983
                double nSweepVal;
984

  
985
                psEllipse.stype = DGNFileHeader.DGNST_ARC;
986
                DGNParseCore(info, psEllipse);
987

  
988
                int[] fin = new int[1];
989
                fin[0] = 0;
990

  
991
                byte[] temp1 = new byte[8];
992
                System.arraycopy(info.abyElem, 36, temp1, 0, 4);
993
                psEllipse.startang = DGN_INT32(temp1);
994
                psEllipse.startang = psEllipse.startang / 360000.0;
995

  
996
                if ((info.abyElem[41] & (byte) 0x80) != FALSE) {
997
                    info.abyElem[41] &= (byte) 0x7f;
998
                    System.arraycopy(info.abyElem, 40, temp1, 0, 4);
999
                    nSweepVal = -1 * DGN_INT32(temp1);
1000
                } else {
1001
                    System.arraycopy(info.abyElem, 40, temp1, 0, 4);
1002
                    nSweepVal = DGN_INT32(temp1);
1003
                }
1004

  
1005
                if (nSweepVal == 0) {
1006
                    psEllipse.sweepang = 360.0;
1007
                } else {
1008
                    psEllipse.sweepang = nSweepVal / 360000.0;
1009
                }
1010

  
1011
                System.arraycopy(info.abyElem, 44, temp1, 0, 8);
1012
                fin[0] = 0;
1013
                psEllipse.primary_axis = DGNParseIEEE(temp1);
1014

  
1015
                psEllipse.primary_axis *= info.scale;
1016
                System.arraycopy(info.abyElem, 52, temp1, 0, 8);
1017
                fin[0] = 0;
1018
                psEllipse.secondary_axis = DGNParseIEEE(temp1);
1019

  
1020
                psEllipse.secondary_axis *= info.scale;
1021

  
1022
                if (info.dimension == 2) {
1023
                    System.arraycopy(info.abyElem, 60, temp1, 0, 4);
1024
                    psEllipse.rotation = DGN_INT32(temp1);
1025
                    psEllipse.rotation = psEllipse.rotation / 360000.0;
1026
                    System.arraycopy(info.abyElem, 64, temp1, 0, 8);
1027
                    fin[0] = 0;
1028
                    psEllipse.origin.x = DGNParseIEEE(temp1);
1029

  
1030
                    System.arraycopy(info.abyElem, 72, temp1, 0, 8);
1031
                    fin[0] = 0;
1032
                    psEllipse.origin.y = DGNParseIEEE(temp1);
1033
                } else {
1034
                    // for now we don't try to handle quaternion
1035
                    psEllipse.rotation = 0;
1036
                    System.arraycopy(info.abyElem, 76, temp1, 0, 8);
1037
                    fin[0] = 0;
1038

  
1039
                    psEllipse.origin.x = DGNParseIEEE(temp1);
1040
                    System.arraycopy(info.abyElem, 84, temp1, 0, 8);
1041
                    fin[0] = 0;
1042

  
1043
                    psEllipse.origin.y = DGNParseIEEE(temp1);
1044
                    System.arraycopy(info.abyElem, 92, temp1, 0, 8);
1045
                    fin[0] = 0;
1046

  
1047
                    psEllipse.origin.z = DGNParseIEEE(temp1);
1048
                    System.arraycopy(info.abyElem, 60, temp1, 0, 4);
1049
                    psEllipse.quat[0] = DGN_INT32(temp1);
1050
                    System.arraycopy(info.abyElem, 64, temp1, 0, 4);
1051
                    psEllipse.quat[1] = DGN_INT32(temp1);
1052
                    System.arraycopy(info.abyElem, 68, temp1, 0, 4);
1053
                    psEllipse.quat[2] = DGN_INT32(temp1);
1054
                    System.arraycopy(info.abyElem, 72, temp1, 0, 4);
1055
                    psEllipse.quat[3] = DGN_INT32(temp1);
1056
                }
1057

  
1058
                DGNTransformPoint(info, (psEllipse.origin));
1059
                elemento = psEllipse;
1060
            }
1061

  
1062
            break;
1063

  
1064
            case DGNFileHeader.DGNT_TEXT: {
1065
                DGNElemText psText = new DGNElemText(this);
1066
                int num_chars;
1067
                int text_off;
1068

  
1069
                if (info.dimension == 2) {
1070
                    num_chars = ByteUtils.byteToUnsignedInt(info.abyElem[58]);
1071
                } else {
1072
                    num_chars = ByteUtils.byteToUnsignedInt(info.abyElem[74]);
1073
                }
1074

  
1075
                psText.stype = DGNFileHeader.DGNST_TEXT;
1076
                DGNParseCore(info, psText);
1077

  
1078
                psText.font_id = ByteUtils.byteToUnsignedInt(info.abyElem[36]);
1079
                psText.justification = ByteUtils
1080
                        .byteToUnsignedInt(info.abyElem[37]);
1081

  
1082
                byte[] temp1 = new byte[8];
1083
                System.arraycopy(info.abyElem, 38, temp1, 0, 4);
1084
                psText.length_mult = (DGN_INT32(temp1) * info.scale * 6.0) / 1000.0;
1085
                System.arraycopy(info.abyElem, 42, temp1, 0, 4);
1086
                psText.height_raw = DGN_INT32(temp1);
1087
                psText.height_mult = (psText.height_raw * info.scale * 6.0) / 1000.0;
1088

  
1089
                int[] fin = new int[1];
1090
                fin[0] = 0;
1091

  
1092
                if (info.dimension == 2) {
1093
                    System.arraycopy(info.abyElem, 46, temp1, 0, 4);
1094
                    psText.rotation = DGN_INT32(temp1);
1095
                    psText.rotation = psText.rotation / 360000.0;
1096
                    System.arraycopy(info.abyElem, 50, temp1, 0, 4);
1097
                    psText.origin.x = DGN_INT32(temp1);
1098
                    System.arraycopy(info.abyElem, 54, temp1, 0, 4);
1099
                    psText.origin.y = DGN_INT32(temp1);
1100
                    text_off = 60;
1101
                } else {
1102
                    /* leave quaternion for later */
1103
                    System.arraycopy(info.abyElem, 62, temp1, 0, 4);
1104
                    psText.origin.x = DGN_INT32(temp1);
1105
                    System.arraycopy(info.abyElem, 66, temp1, 0, 4);
1106
                    psText.origin.y = DGN_INT32(temp1);
1107
                    System.arraycopy(info.abyElem, 70, temp1, 0, 4);
1108
                    psText.origin.z = DGN_INT32(temp1);
1109
                    text_off = 76;
1110
                }
1111

  
1112
                DGNTransformPoint(info, (psText.origin));
1113

  
1114
                // TODO: AQUI FALTA METER ALGO PARA SOPORTAR TEXTOS MULTYBYTE
1115
                byte[] temp = new byte[num_chars];
1116
                System.arraycopy(info.abyElem, text_off, temp, 0, num_chars);
1117

  
1118
                String strAux = null;
1119

  
1120
                try {
1121
                    psText.string = new String(temp, "ISO-8859-1");
1122
                } catch (Exception e) {
1123
                    logwarn("Can't create java string from byte array (" + dumpBuffer(temp) + ").", e);
1124
                }
1125

  
1126
                elemento = psText;
1127
            }
1128

  
1129
            break;
1130

  
1131
            case DGNFileHeader.DGNT_TCB:
1132
                if (info.got_tcb == FALSE) {
1133
                    elemento = DGNParseTCB(info);
1134
                    elemento.level = nLevel;
1135
                    elemento.type = nType;
1136
                }
1137
                break;
1138

  
1139
            case DGNFileHeader.DGNT_COMPLEX_CHAIN_HEADER:
1140
            case DGNFileHeader.DGNT_COMPLEX_SHAPE_HEADER: {
1141
                DGNElemComplexHeader psHdr = new DGNElemComplexHeader(this);
1142

  
1143
                psHdr.stype = DGNFileHeader.DGNST_COMPLEX_HEADER;
1144
                DGNParseCore(info, psHdr);
1145

  
1146
                psHdr.totlength = ByteUtils.byteToUnsignedInt(info.abyElem[36])
1147
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[37]) * 256);
1148
                psHdr.numelems = ByteUtils.byteToUnsignedInt(info.abyElem[38])
1149
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[39]) * 256);
1150
                elemento = psHdr;
1151
            }
1152

  
1153
            break;
1154

  
1155
            case DGNFileHeader.DGNT_TAG_VALUE: {
1156
                DGNElemTagValue psTag = new DGNElemTagValue(this);
1157

  
1158
                psTag.stype = DGNFileHeader.DGNST_TAG_VALUE;
1159
                DGNParseCore(info, psTag);
1160

  
1161
                int[] fin = new int[1];
1162
                fin[0] = 0;
1163

  
1164
                byte[] temp1 = new byte[8];
1165
                psTag.tagType = ByteUtils.byteToUnsignedInt(info.abyElem[74])
1166
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[75]) * 256);
1167
                System.arraycopy(info.abyElem, 68, temp1, 0, 4);
1168
                fin[0] = 0;
1169
                psTag.tagSet = ByteUtils.bytesToInt(temp1, fin);
1170

  
1171
                psTag.tagSet = CPL_LSBWORD32(psTag.tagSet);
1172
                psTag.tagIndex = ByteUtils.byteToUnsignedInt(info.abyElem[72])
1173
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[73]) * 256);
1174
                psTag.tagLength = ByteUtils.byteToUnsignedInt(info.abyElem[150])
1175
                        + (ByteUtils.byteToUnsignedInt(info.abyElem[151]) * 256);
1176

  
1177
                if (psTag.tagType == 1) {
1178
                    byte[] temp = new byte[info.abyElem.length - 154];
1179
                    System.arraycopy(info.abyElem, 4, temp1, 0, // 154
1180
                            4); // info.abyElem.length - 154
1181
                    fin[0] = 0;
1182
                    psTag.tagValue.string = ByteUtils.bytesToString(temp1, fin).toCharArray();
1183
                } else if (psTag.tagType == 3) {
1184
                    byte[] temp = new byte[4];
1185
                    System.arraycopy(info.abyElem, 154, temp1, 0, 4);
1186
                    fin[0] = 0;
1187
                    psTag.tagValue.integer = ByteUtils.bytesToInt(temp1, fin);
1188

  
1189
                    psTag.tagValue.integer = CPL_LSBWORD32((int) psTag.tagValue.integer);
1190
                } else if (psTag.tagType == 4) {
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff