DWG 2004 格式解析系列(八) DataSection(3) AcDb:AcDbObjects

AcDb:AcDbObject section存储着整个dwg文件中的所有对象,包括object和entity。
通常,这个section一般会由多个page组成。通过(二)中的方法可以容易地得到section data,并且藉由Object map根据object的handle定位到编码的数据,最后,根据object的类型解码得到具体的object。

在我们得到的data中,前4个字节(CA 0D 00 00)含义未明。

00000000   CA 0D 00 00 17 00 8D 01   0C 00 40 6A 41 48 04 3A 
00000010   C4 40 28 24 40 BE A4 40   C2 24 06 23 E6 3A 5F 83 
00000020   73 71 00 DD 04 0C 40 47   EA 90 8B 54 01 50 04 30 
00000030   A8 01 34 01 BC 01 90 01   94 01 B0 01 7C 01 4C 01 

对该例,其object map如下,可以验证,对象的起始地址从4开始:

Object Map
(212 objs)
**************
No.	    Handle	   Offset
1	        1	        4
2	        2	      77A
3	        3	      791
4	        5	      7A2
5	        6	      7B8
6	        7	      7C5
7	        8	      7D0
...

一般地,handle为1的对象是BLOCK CONTROL,handle为2的对象是LAYER CONTROL。
要解码对象,我们必须要知道对象是如何编码的,即他们的基本排布结构。这里,贴出一个我整理的dwg对象的布局图(截止到R2018版)。其中的part6是与object/entity相关的各种参数,part8和part10分别是object和entity相关的各种handle,其余部分都是通用的。
在这里插入图片描述

从R2007开始,object的字符串从ansi编码转为ucs-2编码,并且把散布于各处的字符串统一归集到对象尾部的handle stream前,称为string stream,所有解码过程中要读取的字符串都要从这个stream中读取。因此,在解码时,我们要根据object头部的size信息计算出string stream和handle stream的位置。由于string stream的最后的那个标志位在handle stream的正上方,所以string stream位置的计算要依赖handle stream的计算。
handle stream位置的计算,分为2000-2007版和2007之后的版本两种方式(这里不考虑R13/14),因为,他们存储的size信息不同。两种stream和各种size表示的范围,我都在图上标明了,可以很清晰地看出如何计算其位置。
有了handle stream的位置,再根据其正上方的string stream标志位,采用与计算section的string stream相同的方法,即可得到string stream的位置。

取handle为2的LAYER CONTROL的数据(地址范围[77A,790]),做一个解码示例。
数据片段:

00000760   7B 63 96 C4 81 94 44 3F   54 88 0B 00 15 01 40 75 
00000770   63 5A 00 00 87 4A 22 1F   B6 B0 12 00 65 0C 80 40 
00000780   A8 40 C8 06 40 25 C4 22   04 40 2C 84 40 62 3F E0 
00000790   A2 0C 00 35 0D 00 40 EA   40 88 04 22 24 40 7B 3F 
000007A0   44 7C 11 00 5D 0E 00 41   6A 40 C8 04 22 C4 40 7B 

解码结果:

Object(LAYER_CONTROL)
handle: 0.1.2
owner: 4.0.0
xdic missing flag: 0
xdicobjhandle: 3.2.12E
num reactors: 0
entries: 3
1), 2.1.10
2), 2.2.164
3), 2.2.311

解码图示:
在这里插入图片描述

本节所述的object的解码,是解读dwg文件中戏份最多的,也是我们最关心的部分。关于所有object的解码规范,可以参考ODA的文档。

对DWG文件的解析,基本上差不多了,这里就暂时告一段落。当然,还有其他section以及很多细节没有提及(比如COLOR,我以前专门写过几篇文章,在本系列里就没有解释),以后再考虑是否补充吧。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值