2024年3月6日发(作者:)
关于DWG文件解析的研究报告(初稿)
(玄德)
经过对DWG文件的资料整理和对华天软件周云鹏经理的咨询,Autodesk公司一直没有公开DWG文件的存储格式,去年华天软件也开始着手解析该文件,以前一直采用第三方的组件实现。他们采用的是通过ODA数据交换平台对DWG的文件格式进行解析(见图1)。
图1
通过对比分析,目前主流的对DWG文件解析的手段有6种。分别是:
(1) 采用AutoLisp和Visual Lisp进行二次开发。这种方式有点是集成性好,缺点是无法摆脱CAD运行环境。
(2) 采用ADS/ObjectARX实现DWG文件的解析。 ADS/ObjectARX是一个用C语言访问的DWG文件的开发工具,ObjectARX是一个基于C++的类库,而且AutoCAD本身也是ObjectARX创建的CAD软件系统,因此可以采用ObjectARX对DWG文件进行完全访问,但是ObjectARX只能运行在Auto CAD核环境中。
(3) 通过DXF文件解析DWG文件。DXF文件是DWG文件的一种文本形式的等价表示。但是后期通过DXF文件很难完全访问DWG文件的在信息。
(4) 通过COM/ActiveX方式实现对DWG文件的解析。该种方式的进程透明性和位置透明性为不同应用程序进程之间通过网络进行数据通信提供了一种良好的机制,实现双接口的组件既能保证强类型语言应用程序的高效率。这种
方式的缺点是应用程序作为客户端无法独立于AutoCAD这个ActiveX服务器单独运行。
(5) 采用ObjectDBX方式实现。由于AutoCAD所提供的四种访问DWG文件的方法都无法脱离CAD运行平台独立运行。ObjectDBX是一套基于C++的类库。与ObjectARX不同的是ObjectDBX不在依赖AutoCAD平台。只限制于Windows平台和VisioC++开发工具。
(6) 采用OpenDwg Toolkit实现对DWG文件的解析。由于ObjectDBX应用程序只能在Windows平台上采用Visual C++来开发,而网络应用开发环境要比AutoCAD单个软件运行的环境要复杂的多。OpenDwg Toolkit简称ODT。除了其跨平台优势外,对开发者而言ODT不仅是免费的,不需要OpenDBX比较昂贵的授权费用。
AutoCAD软件是我国目前最流行的微机软件包之一,DWG文件为Auto Desk公司推出的图形格式文件,可以理解成由点、线、面等构成的图形数据库。其复杂性主要来自由对象的多样性及属性的复杂性。比如图形、线形、样式的关联。一个DWG图纸文件由图纸信息和各种图元对象组成。分为无图形表示类和有图形表示类。有图形表示类对象以块表方式存放;无图形表示类包括图层、线形。DWG文件容可以分为四个部分:(一)索引部;(二)标题部;(三)实体部;(四)名表部。
(一) 索引部
索引部主要是由Auto CAD的版本信息及各部的首地址、各分表的首地址、长度及个数等信息构成,从DWG文件中的#0000-#0050H。
#00-#13 Char*20 AutoCAD版本信息
#14-#17 int *4 实体部首址
#18-#1F int *4 名表部首址
#1C-#1F int *4 图块定义首址
#20-#23 int *4 图块定义长度
#24-#27 int *4 文件总长度
#28-#2B int *4 常数
1、 图块描述段:
#2C-#2D int *2 图块名长度(25H)
#2E-#2F int *2 图块个数
#30-#31 int *2 标识数
#32-#35 int *2 图块名表首址
2、 层描述段:
#36-#37 int *2 层名长度(25H)
#38-#39 int *2 层的个数
#3A-#3B int *2 标识数
#3C-#3F int *2 层名表首址
3、 字型描述段:
#40-#41 int *2 字型名长度(C2H)
#42-#43 int *2 字型个数
#44-#45 int *2 标识数
#46-#49 int *2 字型名表首址
4、 线形描述段:
#4A-#4B int *2 线型名长度(BBH)
#4C-#4D int *2 线型个数
#4E-#4F int *2 标识数
#50-#53 int *4 线型名表首址
5、 视图描述段:
#54-#55 int *2 视图名长度(5BH)
#56-#57 int *2 视图个数
#58-#59 int *2 标识数
#5A-#5D int *4 视图名表首址
6、 各个地址间的关系:
实体部首址=索引部长度+标题部长度
表部首址=实体部首址+实体部总长度
块实体首址=表部首址+表部总长度
文件总长度=块实体首址+块实体部总长度
(二) 环境部
该部给出了系统变量,属性设置及当前状态等信息,它位于DWG文件的#005E-#03EEH。
#05E-#075 INSBASE real*24
#076-#077 实体个数 int *2
#078-#08F EXTININ real*24
#090-#0A7 EXTMAX real*24
#0A8-#0B7 LIMMIN real*16
#0B8-#0C7 LIMMIX real*16
#0C8-#0DF VIEWCTR real*24
#0E0-#0E7 VIEWSIZE real*8
#0E8-#0E9 SNAPNODE int*2
#0EA-#0F9 SNAPUNIT int*16
#0FA-#109 SNAPBASE real*16
#10A-#111 SNAPANC int *8
#112-#113 SNAPSTYL int *2
#114-#115 SNAPISOPAIR int *2
#116-#117 GRIDNODE int *2
#118-#127 GRIDUNIT int *2
#128-#129 ORTHOMODE int *2
#12A-#12B REGENNODE int *2
#12C-#12D FILEMODE int *2
#12E-#12F QTEXTMODE int *2
#130-#131 DRAGMODE int *2
#132-#139 LTSCALE int *8
#13A-#141 TEXTSIZE real*8
#142-#149 TRACEWID real*8
#14A-#14B CLAYER real*2
#14C-#163
#164-#165 LUNITS int*2
#166-#167 LUPREC int *2
#168-#169 AXISMODE int *2
#16A-#179 AXISUNIT int *16
#17A-#191 SKETCHINC real * 8
#182-#189 FILLETRAD real * 8
#18A-#18B AUNITS int *2
#18C-#18D AUPREC int *2
#18E-#18F
#190-#191 OSMODE int *2
#192-#193 ATTMODE int *2
#194-#1A2 MENU char *15
#1A3-#1AA DIMSCALE real*8
#1AB-#1B2 DIMASZ real*8
#1B3-#1BA DIMEXO real*8
#1BB-#1C2 DIMDLI real*8
#1C3-#1C4 DIMEXE real*8
#1CB-#1D2 DIMTP real*8
#1D3-#1DA DIMTN real*8
#1DB-#1E2 DIMTXT real*8
#1E3-#1EA DIMCEN real*8
#1E8-#1F2 DIMTSZ real*8
#1F3 DIMTOL int *1
#1F4 DIMLIN int *1
#1F5 DIMTIH int *1
#1F6 DIMTOH int *1
#1F7 DIMSE1 int *1
#1F8 DIMSE2 int *1
#1F9 DIMTAD int *1
#1FA-#228
#229-#230 ELEVATION real*8
#234-#238 THICHNESS real*8
#239-#250 VIEWDIR real*24
#251-#2B2 图形显示说明
#2E3-#2E4 BLIPMODE int *2
#2E5-#3EE 备用
(三) 实体部
该部给出了所有图形实体的描述,图形实体又分为简单图形实体和复杂图形实体。简单图形实体是点、直线等基本图形。复杂图形实体指多线段、图块等由基本图形实体所组成的图形。
每一个图形实体都有描述段,他由描述首部和描述容两部分所组成,描述首部的格式是固定的,描述容各不相同。描述首部格式:
(1) LINE实体
标识数为01H,描述段长度为28H。
#00-#07 描述首部
#08-#17 起点坐标值 real *16
#18-#27 终点坐标值 real *16
(2) POINT实体
标识数为02H,描述段长度为18H
#00-#07 描述首部
#08-#17 点的坐标值 real*16
(3) CIRCLE实体
标识数为03H,描述段长度为20H
#00-#07 描述首部
#08-#17 圆心坐标值 real*16
#18-#1F 圆的半径 real*8
(4) SHAPE实体
标识数为04H,描述段长度可变
#00-#07 描述首部
#08-#17 插入坐标值 real*16
#18-#1F 型体高度 real*8
#20 型体号 real*8
#21-#28 插入角度(可省略) real*8
若描述首部中的属性字第0位为1,读值存在,否则缺省值为0
#29 型体文件号(可省) int*1
若描述首部中的属性字第1位为1,读值存在,否则缺省值为0
(5) TEXT实体
标识数为07H,描述段长度可变
#00-#07 描述首部
#08-#17 文字头的坐标值 real*16
#18-#1F 字符高度 real*8
#20-#21 字符串长度 into*2
#22 字符串 char*256
# 字符创旋转角 real*8
(6) ARC实体
标识数为08H,描述段长度为30H
#00-#07 描述首部
#08-#17 圆心坐标值 real*16
#18-#1F 半径 real*8
#20-#27 起始角 real*8
#28-#2F 终止角 real*8
(7) TRACE实体
标识数为09H,描述段长度为48H
#00-#07 描述首部
#08-#17 第一点坐标值 real*16
#18-#1F 第二点坐标值 real*16
#28-#37 第三点坐标值 real*16
#38-#47 第四点坐标值 real*16
(8) SOLID实体
标识数为0BH,描述段长度为48H
#00-#07 描述首部
#08-#17 第一点坐标值 real*16
#18-#1F 第二点坐标值 real*16
#28-#37 第三点坐标值 real*16
#38-#47 第四点坐标值 real*16
(四) 复杂图形实体
在DWG文件中,复杂图形实体指重复图形、图块和多段连线实体,它们都是有不止一个标识数的实体。
(1) 重复图形实体
重复图形指某些简单图形的重复排列,它的描述由三部分组成,开始实体、简单图形实体和结束实体。
(a)开始实体
标识数为06H,描述段长度为08H,格式同描述首部。
(b)结束实体
标识数为07H,描述段长度为1CH。
#00-#07 描述首部
#08-#09 重复行数 int *2
#0A-#0B 重复列数 int*2
#14-#1B 重复行距 real*8
#14-#1B 重复列距 real*8
(2) 实体图块
图块实体就是将某些简单图形实体看作一个整体,他的描述由三部分组成,BLOCK(图块开始)实体,简单图形实体和图块结束实体。
(a) BLOCK实体
标识数为0CH,描述段长度为08H,格式同描述首部
(b)图块结束实体
标识数为0CH,描述段长度为18H。
#00-#07 描述首部
#08-#17 基点坐标值 real*16
(3) POLYLINE实体
多段连线指直线和圆弧所组合的曲线,它的描述也由三部分组成:POLYINE(多段连线)实体、结点实体和结束实体。
(a) POLYLINE实体
标识数为8013H,描述段长度可变
#00-#07 描述首部
#08 状态值(可省) int*1
(若属性字第0位为1,该值存在,否则为0)
数值0,正常;数值1 封闭;数值2 拟合
#09-#10 起始宽度(可省)
#11-#18 终止宽度(可省)
(b) 结点实体
标识数为14H,描述长度可变
#00-#07 描述首部
#08-#17 结点坐标值
#18-#1F 结点起始宽度
#20-#27 结点终止宽度
#28-#2F 凹凸值
#30 结点状态
#31--#38 光滑切线方向
(c) 结束实体
标识数为11H,描述段长度为12H
#00-#07 描述首部
#08-#11 开始实体的首址
(五) 名表部
该部给出了所有有名实体的描述,有名实体具体指图块名、LAYER图层名、字体格式名、型体文件名,线型名和视图名
(1) 图块名
图块名表的首地址存在于DWG文件的#32-#35H中,描述段的长度为25H,其格式为:
#00 标识 int *1
#01-#20 名字 char *32
#21-#24 地址 int *4
(2) 层名
层名表的首地址存于DWG文件的#3C-#3FH中。描述段长度为25H.
在对DWG文件进行解析的过程中需要什么信息就可以在相应的段中寻找。例如你需要得到DWG文件的直线就可以去实体部段里取LINE实体对应的起点坐标和重点坐标属性,构造出自定义直线类,其他类似。
(1) LINE实体
标识数为01H,描述段长度为28H。
#00-#07 描述首部
#08-#17 起点坐标值 real *16
#18-#27 终点坐标值 real *16
图形的大部分信息都在实体部段中,因此读取实体段的容很重要。读取实体段的数据首先要考虑读取数据的存储方式,然后再进行后一步的处理或存入数据文件中。此处用链表结构来存储。各个实体的数据分成两块:公共数据块和特殊数据块。公共数据块存储每个实体都具有特征参数,如所在图层,实体标识,线型名等。特殊数据块存储每个实体特有的数据,如实体LINE,它里面有两个端点的坐标值;实体CIRCLE中有圆心坐标值和半径值等。


发布评论