Revision 1297

View differences:

org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider.legend/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
  <modelVersion>4.0.0</modelVersion>
4
  <artifactId>org.gvsig.dgn.provider.legend</artifactId>
5
  <packaging>jar</packaging>
6
  <name>${project.artifactId}</name>
7
  <description>DAL provider for DGN files</description>
8
  <parent>
9
      <groupId>org.gvsig</groupId>
10
      <artifactId>org.gvsig.dgn</artifactId>
11
      <version>2.0.264</version>
12
  </parent>
13

  
14
  <dependencies>
15

  
16
    <dependency>
17
      <groupId>org.gvsig</groupId>
18
      <artifactId>org.gvsig.dgn.provider</artifactId>
19
      <scope>compile</scope>
20
    </dependency>
21

  
22
    <dependency>
23
      <groupId>commons-io</groupId>
24
      <artifactId>commons-io</artifactId>
25
      <scope>compile</scope>
26
    </dependency>
27

  
28
    <dependency>
29
        <groupId>org.gvsig</groupId>
30
        <artifactId>org.gvsig.tools.lib</artifactId>
31
        <scope>compile</scope>
32
    </dependency>
33
    <dependency>
34
        <groupId>org.gvsig</groupId>
35
        <artifactId>org.gvsig.projection.api</artifactId>
36
        <scope>compile</scope>
37
    </dependency>
38
    <dependency>
39
        <groupId>org.gvsig</groupId>
40
        <artifactId>org.gvsig.fmap.dal.api</artifactId>
41
        <scope>compile</scope>
42
    </dependency>
43
    <dependency>
44
        <groupId>org.gvsig</groupId>
45
        <artifactId>org.gvsig.fmap.dal.spi</artifactId>
46
        <scope>compile</scope>
47
    </dependency>
48
    <dependency>
49
        <groupId>org.gvsig</groupId>
50
        <artifactId>org.gvsig.metadata.lib.basic.api</artifactId>
51
        <scope>compile</scope>
52
    </dependency>
53
    <dependency>
54
        <groupId>org.gvsig</groupId>
55
        <artifactId>org.gvsig.fmap.geometry.api</artifactId>
56
        <scope>compile</scope>
57
    </dependency>
58
    <dependency>
59
        <groupId>org.gvsig</groupId>
60
        <artifactId>org.gvsig.fmap.mapcontext.api</artifactId>
61
        <scope>compile</scope>
62
    </dependency>
63

  
64
    <dependency>
65
        <groupId>org.gvsig</groupId>
66
        <artifactId>org.gvsig.symbology.lib.api</artifactId>
67
        <scope>compile</scope>
68
    </dependency>
69
    <dependency>
70
        <groupId>org.gvsig</groupId>
71
        <artifactId>org.gvsig.timesupport.lib.api</artifactId>
72
        <scope>compile</scope>
73
    </dependency>  
74
    <dependency>
75
      <groupId>org.gvsig</groupId>
76
      <artifactId>org.gvsig.utils</artifactId>
77
      <scope>compile</scope>
78
    </dependency>
79

  
80

  
81
    <!-- TESTS -->
82
    <dependency>
83
      <groupId>org.gvsig</groupId>
84
      <artifactId>org.gvsig.tools.lib</artifactId>
85
      <type>test-jar</type>
86
      <scope>test</scope>
87
    </dependency>
88
    <dependency>
89
      <groupId>org.gvsig</groupId>
90
      <artifactId>org.gvsig.compat.se</artifactId>
91
      <scope>test</scope>
92
    </dependency>
93
    <dependency>
94
      <groupId>org.gvsig</groupId>
95
      <artifactId>org.gvsig.fmap.dal.impl</artifactId>
96
      <scope>test</scope>
97
    </dependency>
98
    <!--
99
    <dependency>
100
      <groupId>org.gvsig</groupId>
101
      <artifactId>org.gvsig.fmap.geometry.generalpath</artifactId>
102
      <scope>test</scope>
103
    </dependency>
104
    -->
105
    <dependency>
106
      <groupId>org.gvsig</groupId>
107
      <artifactId>org.gvsig.projection.cresques.impl</artifactId>
108
      <scope>test</scope>
109
    </dependency>
110
    <dependency>
111
      <groupId>org.gvsig</groupId>
112
      <artifactId>org.gvsig.timesupport.lib.impl</artifactId>
113
      <scope>test</scope>
114
    </dependency>   
115

  
116

  
117
  </dependencies>
118

  
119
</project>
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider.legend/src/main/java/org/gvsig/fmap/dal/store/dgn/legend/DGNLegendLibrary.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2008 IVER T.I. S.A.   {{Task}}
26
*/
27

  
28
/**
29
 *
30
 */
31
package org.gvsig.fmap.dal.store.dgn.legend;
32

  
33
import org.gvsig.fmap.dal.DALLibrary;
34
import org.gvsig.fmap.dal.store.dgn.DGNLibrary;
35
import org.gvsig.fmap.dal.store.dgn.DGNStoreProvider;
36
import org.gvsig.metadata.MetadataLibrary;
37
import org.gvsig.metadata.MetadataLocator;
38
import org.gvsig.tools.dynobject.DynClass;
39
import org.gvsig.tools.library.AbstractLibrary;
40
import org.gvsig.tools.library.LibraryException;
41

  
42
/**
43
 * @author jmvivo
44
 *
45
 */
46
public class DGNLegendLibrary extends AbstractLibrary {
47

  
48
    @Override
49
    public void doRegistration() {
50
        registerAsServiceOf(DALLibrary.class);
51
        require(DGNLibrary.class);
52
        require(MetadataLibrary.class);
53
    }
54

  
55
	@Override
56
	protected void doInitialize() throws LibraryException {
57
	}
58

  
59
	@Override
60
	protected void doPostInitialize() throws LibraryException {
61
		DynClass metadataDefinition = (DynClass) MetadataLocator.getMetadataManager()
62
			.getDefinition(DGNStoreProvider.METADATA_DEFINITION_NAME);
63
		DGNGetLegendBuilder.register(metadataDefinition);
64
		DGNGetLegend.register(metadataDefinition);
65
		DGNGetLabeling.register(metadataDefinition);
66
	}
67
}
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider.legend/src/main/java/org/gvsig/fmap/dal/store/dgn/legend/DGNGetLegendBuilder.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2008 IVER T.I. S.A.   {{Task}}
26
*/
27

  
28
package org.gvsig.fmap.dal.store.dgn.legend;
29

  
30
import org.gvsig.fmap.dal.store.dgn.LegendBuilder;
31
import org.gvsig.tools.ToolsLocator;
32
import org.gvsig.tools.dynobject.AbstractDynMethod;
33
import org.gvsig.tools.dynobject.DynClass;
34
import org.gvsig.tools.dynobject.DynObject;
35
import org.gvsig.tools.dynobject.DynObjectManager;
36
import org.gvsig.tools.dynobject.exception.DynMethodException;
37
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
38

  
39
public class DGNGetLegendBuilder extends AbstractDynMethod {
40
	private static int code = DynObjectManager.NULLCODE;
41

  
42
	static void register(DynClass DGNDynClass) {
43
		if (code != DynObjectManager.NULLCODE) {
44
			return;
45
		}
46
		code = ToolsLocator.getDynObjectManager().registerDynMethod(
47
			DGNDynClass, 
48
			new DGNGetLegendBuilder()
49
		);
50

  
51
	}
52
	
53
        public DGNGetLegendBuilder() {
54
            super(LegendBuilder.DYNMETHOD_BUILDER_NAME,"DGN LegendBuilder creator");
55
        }
56
        
57
        @Override
58
	public int getCode() throws DynMethodNotSupportedException {
59
		return code;
60
	}
61

  
62
        @Override
63
	public Object invoke(DynObject self, Object[] args)
64
			throws DynMethodException {
65
		return new DGNLegendBuilder();
66
	}
67

  
68
}
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider.legend/src/main/java/org/gvsig/fmap/dal/store/dgn/legend/DGNLegendBuilder.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2008 IVER T.I. S.A.   {{Task}}
26
*/
27

  
28
package org.gvsig.fmap.dal.store.dgn.legend;
29

  
30
import java.awt.Color;
31

  
32
import org.gvsig.fmap.dal.DataTypes;
33
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
34
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
35
import org.gvsig.fmap.dal.store.dgn.DGNStoreProvider;
36
import org.gvsig.fmap.dal.store.dgn.LegendBuilder;
37
import org.gvsig.fmap.dal.store.dgn.lib.DGNReader;
38
import org.gvsig.fmap.geom.Geometry;
39
import org.gvsig.fmap.mapcontext.MapContextLocator;
40
import org.gvsig.fmap.mapcontext.MapContextManager;
41
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorialUniqueValueLegend;
42
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
43
import org.gvsig.symbology.SymbologyLocator;
44
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.styling.IAttrInTableLabelingStrategy;
45
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.IFillSymbol;
46
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
47
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
48

  
49
public class DGNLegendBuilder implements LegendBuilder {
50

  
51
	private MapContextManager mapContextManager = MapContextLocator
52
			.getMapContextManager();
53

  
54
	private IVectorialUniqueValueLegend defaultLegend = null;
55
	private IAttrInTableLabelingStrategy labelingStragegy = null;
56

  
57
	public void begin() {
58
		// Nothing to do
59
	}
60

  
61
	public void end() {
62
		// Nothing to do
63
	}
64

  
65
	public Object getLegend() {
66
		return defaultLegend;
67
	}
68

  
69
	public LegendBuilder initialize(FeatureStoreProvider store) {
70
		defaultLegend = (IVectorialUniqueValueLegend) mapContextManager.createLegend(
71
						IVectorialUniqueValueLegend.LEGEND_NAME);
72
		defaultLegend.setShapeType(Geometry.TYPES.GEOMETRY);
73
		defaultLegend
74
				.setClassifyingFieldNames(new String[] { DGNStoreProvider.NAME_FIELD_COLOR });
75
		defaultLegend.setClassifyingFieldTypes(new int[] { DataTypes.INT });
76

  
77
		ISymbol myDefaultSymbol =
78
				mapContextManager.getSymbolManager()
79
				.createSymbol(Geometry.TYPES.GEOMETRY);
80

  
81
		defaultLegend.setDefaultSymbol(myDefaultSymbol);
82

  
83
		labelingStragegy = SymbologyLocator.getSymbologyManager().createAttrInTableLabelingStrategy();
84
		labelingStragegy.setTextField(DGNStoreProvider.NAME_FIELD_TEXT);
85
		labelingStragegy
86
				.setRotationField(DGNStoreProvider.NAME_FIELD_ROTATIONTEXT);
87
		labelingStragegy.setHeightField(DGNStoreProvider.NAME_FIELD_HEIGHTTEXT);
88
		labelingStragegy.setUnit(1); // MapContext.NAMES[1] (meters)
89
		return this;
90
	}
91

  
92
	public void process(FeatureProvider feature, DGNReader dgnReader) {
93
		Integer clave = (Integer) feature.get("Color");
94
		if (clave == null) {
95
			return;
96
		}
97

  
98
		defaultLegend.useDefaultSymbol(false);
99
		if (defaultLegend.getSymbolByValue(clave) == null) {
100
			ISymbol theSymbol;
101
			Color color = dgnReader.DGNLookupColor(clave.intValue());
102
                        if( color == null ) {
103
                            color = Color.BLACK;
104
                        }
105
			theSymbol = mapContextManager.getSymbolManager().createSymbol(
106
					Geometry.TYPES.GEOMETRY, color);
107

  
108
			theSymbol.setDescription(clave.toString());
109

  
110
			if (theSymbol instanceof IMarkerSymbol) {
111
				((IMarkerSymbol) theSymbol).setSize(1);
112
			}
113

  
114
			if (theSymbol instanceof ILineSymbol) {
115
				ILineSymbol lineSymbol = (ILineSymbol) theSymbol;
116
				lineSymbol.setLineWidth(1);
117
				lineSymbol.setLineColor(color);
118
			}
119

  
120
			if (theSymbol instanceof IFillSymbol) {
121
				IFillSymbol fillSymbol = (IFillSymbol) theSymbol;
122
				fillSymbol.getOutline().setLineColor(color);
123
				fillSymbol.getOutline().setLineWidth(1);
124
				fillSymbol.setFillColor(null);
125
			}
126
			if (theSymbol != null) {
127
				defaultLegend.addSymbol(clave, theSymbol);
128
			}
129
		}
130
        defaultLegend.useDefaultSymbol(true);
131
	}
132

  
133
	public Object getLabeling() {
134
		return labelingStragegy;
135
	}
136

  
137

  
138
}
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider.legend/src/main/java/org/gvsig/fmap/dal/store/dgn/legend/DGNGetLabeling.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2008 IVER T.I. S.A.   {{Task}}
26
*/
27

  
28
package org.gvsig.fmap.dal.store.dgn.legend;
29

  
30
import org.gvsig.fmap.dal.exception.OpenException;
31
import org.gvsig.fmap.dal.store.dgn.DGNStoreProvider;
32
import org.gvsig.fmap.dal.store.dgn.LegendBuilder;
33
import org.gvsig.tools.ToolsLocator;
34
import org.gvsig.tools.dynobject.AbstractDynMethod;
35
import org.gvsig.tools.dynobject.DynClass;
36
import org.gvsig.tools.dynobject.DynObject;
37
import org.gvsig.tools.dynobject.DynObjectManager;
38
import org.gvsig.tools.dynobject.exception.DynMethodException;
39
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
40

  
41
public class DGNGetLabeling extends AbstractDynMethod {
42
	private static int code = DynObjectManager.NULLCODE;
43

  
44
	static void register(DynClass DGNDynClass) {
45
		if (code != DynObjectManager.NULLCODE) {
46
			return;
47
		}
48
		code = ToolsLocator.getDynObjectManager().registerDynMethod(
49
			DGNDynClass, 
50
			new DGNGetLabeling()
51
		);
52

  
53
	}
54
        
55
        public DGNGetLabeling() {
56
            super(LegendBuilder.DYNMETHOD_GETLABELING_NAME,"DGN Labeling");
57
        }
58
        
59
        @Override
60
	public int getCode() throws DynMethodNotSupportedException {
61
		return code;
62
	}
63

  
64
        @Override
65
	public Object invoke(DynObject self, Object[] args)
66
			throws DynMethodException {
67
		try {
68
			return ((DGNStoreProvider) self).getLabeling();
69
		} catch (OpenException e) {
70
			//FIXME
71
			throw new RuntimeException(e);
72
		}
73
	}
74

  
75
}
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider.legend/src/main/java/org/gvsig/fmap/dal/store/dgn/legend/DGNGetLegend.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2008 IVER T.I. S.A.   {{Task}}
26
*/
27

  
28
package org.gvsig.fmap.dal.store.dgn.legend;
29

  
30
import org.gvsig.fmap.dal.exception.OpenException;
31
import org.gvsig.fmap.dal.store.dgn.DGNStoreProvider;
32
import org.gvsig.fmap.dal.store.dgn.LegendBuilder;
33
import org.gvsig.tools.ToolsLocator;
34
import org.gvsig.tools.dynobject.AbstractDynMethod;
35
import org.gvsig.tools.dynobject.DynClass;
36
import org.gvsig.tools.dynobject.DynObject;
37
import org.gvsig.tools.dynobject.DynObjectManager;
38
import org.gvsig.tools.dynobject.exception.DynMethodException;
39
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
40

  
41
public class DGNGetLegend extends AbstractDynMethod {
42
	private static int code = DynObjectManager.NULLCODE;
43

  
44
	static void register(DynClass DGNDynClass) {
45
		if (code != DynObjectManager.NULLCODE) {
46
			return;
47
		}
48
		code = ToolsLocator.getDynObjectManager().registerDynMethod(
49
			DGNDynClass, 
50
			new DGNGetLegend()
51
		);
52

  
53
	}
54
        
55
        public DGNGetLegend() {
56
            super(LegendBuilder.DYNMETHOD_GETLEGEND_NAME,"DGN Legend");
57
        }
58
        
59
        @Override
60
	public int getCode() throws DynMethodNotSupportedException {
61
		return code;
62
	}
63

  
64
        @Override
65
	public Object invoke(DynObject self, Object[] args)
66
			throws DynMethodException {
67
		try {
68
			return ((DGNStoreProvider) self).getLegend();
69
		} catch (OpenException e) {
70
			throw new RuntimeException(e);
71
		}
72
	}
73

  
74
}
0 75

  
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/org.gvsig.dgn.provider/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.fmap.dal.store.dgn.DGNLibrary
2
org.gvsig.fmap.dal.store.dgn.legend.DGNLegendLibrary
org.gvsig.dgn/tags/org.gvsig.dgn-2.0.264/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.264/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.264/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.264/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);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff