DWG2000文件格式理解(基于ibopencad类库)

间:20185月8日

DWG2000文件格式理解

基于ibopencad类库

在查阅相关资料后,对于dwg2000格式的认识各有不同,首先是上海同济大学万明民和顾景文在“AutoACD图形格式数据分析中”提出以下结构:

 

而根据opendesign.com(国外对于dwg格式研究比较深入的开源研究机构,比较具有权威性)提出以下结构:

 

但是在实际编码过程中发现,与libopencad类库对于dwg文件格式的读取略有不同,在参照了dxfhttps://www.autodesk.com/techpubs/autocad/acad2000/dxf/)的文件结构后,推测大体结构如下:

首先是索引部分:

通过 ReadSectionLocators(),从0——17号单元为dwg文件的版本号,一般为“AC1015”,然后就是dwg具体内容部分,一般有6个索引位置,其中发现第一个(seeker[0])逻辑位置加上读出的位移偏移恰好等于第二个(seeker[1])逻辑地址,并将这些逻辑地址和偏移保存为seeker[i]

接着就头部部分:

通过ReadHeader( eOptions )进入,利用从索引部分获得的seeker[0]进行文件流读取,开始16个字节为校验信息,第16——20号单元数据为头部的长度,接着就是一系列的读取数据并保存成对应格式,最后的18个字节单元,其中前2个字节单元为CRC校验码,最后16个字节为校验对比信息。

接着是类部部分:

通过ReadClasses( eOptions )进入,与读取头部类似,前16个字节为校验对比信息,接着第16——20号单元数据为类部的长度,接着也是读取文件流并保存成对应数据格式(在此部分是直接保存为CADClass类的实例的属性),最后第17——18号字节也是CRC校验码,最后16个字节为校验对比信息。

接着是对象映射部分

通过CreateFileMap()进入,先读取其中第一部分Object map section 的长度(dSectionSize|个人觉得这里当做数据块个数更好),然后如果这个长度不等于2(也就是最小部分都为2)就进入循环,循环中的dSectionSize作为flag,当读取的字节数除8大于或等于dSectionSize就退出循环,并将最后坐标填入mapObjects,最后再读取CRC校验码,然后再读取下一个部分的长度,知道最后一个部分的dSectionSize等于2为止。对于此部分参考dxf文档应该是记录非实体的信息。

接着为表部部分:

进入过程为ReadTables( eOptions )——》ReadTable( this, CADTables::LayersTable )——》ReadLayersTable( pCADFile, iterAskedTable->second.getAsLong() ),进入以后第一部分(spLayerControl)是通过GetObject( dLayerControlHandle )将图层的句柄返回,再建立CADLayer类的实例。接着就是 BlockRecordModelSpace部分,也是通过GetObject( dCurrentEntHandle, true )获得实例句柄,再通过FillLayer( spEntityObj.get() )将实例对象加入oLayer(即对应图层)中。

未理解部分:

1. 只用到了seeker[0-2],但是后面seek[3-5]的功能未知

2. 在类部里面class number|Proxy capabilities flag or Version|App name| C++ Class Name|DXF Class name| Was a zombie| Is-an-entity flag所代表的具体含义未知

3. 在对象映射部分里面读出的数据是一堆坐标(x,y)具体代表含义未知,

4. main函数建立headerclassCADDictionary类的过程不清楚,以及将对应类的信息再输出的过程不明白

猜你喜欢

转载自blog.csdn.net/caoyang_he/article/details/80259294