DWG 2004 格式解析系列(一)引言

        终于下定决心,把我对dwg格式的理解整理成文字。

        对dwg格式的认识,可以追溯到200x年开发一款图形编辑软件的时候。除了软件本身提供的编辑功能外,也需要从外部引入矢量图形。大家都知道Autocad在国内的普及程度,因此读入dwg中的图形就是首要的需求。也许有人会说dxf不是很方便吗,干嘛非要从不公开格式的dwg中引入呢?的确,dxf是公开的格式,稍有编程能力的人都能自己解析,但是,你要使用者每次都从dwg转换到dxf,也是一件烦人的事。如果能直接读入dwg,岂不是更方便。

        当时采用OpenDWG提供的免费版本的库(并非源码),但它也只能支持到2000版的DWG(已经是彼时最高版本了)。时间到了201x年,dwg版本也升级了数次,要读取高版本的DWG,都需要先存成2000的格式,这又回到了转存dxf的模式。于是我在网上搜索关于DWG格式的文章或者解析DWG的开源代码。关于DWG格式“最权威”的当属OpenDWG(现改名叫ODA)的一个公开文档(OpenDesign_Specification_for_.dwg_files),尽管当中有一些BUG。然后又找到Felipe Castro使用C语言开发的开源库libdwg以及目前Rodrigo Rodrigues等人托管在github上的开源工具包libreDwg,libreDwg是在libDwg基础上的进一步扩充,能够读写DWG/DXF。非常感谢Felipe Castro的开创性贡献,通过读他的代码并参考ODA的文档,使我逐渐对DWG的格式有了较为明晰的认识。在libDwg的基础上,我曾经改编成C++代码,奈何当时对DWG的认识还很模糊,以至于各种块定义中的图形都当成ModalSpace中的图形读入了,可想而知那有多乱。但是,libDwg/libreDwg使用的C语言,我不太能接受,特别是libreDwg,把读写DWG,DXF,JSON都夹杂在一起,以及各种内存管理我也不太放心。于是,我决定彻底研究一下DWG的格式,用C++再造一遍轮子。至于为什么选择了AutoCAD2004版,那是因为,从2004开始,后续版本的DWG都是以2004格式为蓝本稍加补充(其中2007在文件存储上有点特别)。所以,弄懂2004的格式,高版本的DWG基本就无压力了。而2000版及以前的R13/R14现在看都是古董级别的存在,我选择暂时忽略它们。

       我用C++编写的解析DWG文件的代码当中,一些基础性的代码(如位流的读取,数据段的解压等)取自libDwg/libreDwg并做了适当调整,用C++的方式组织了一批类,使得读取流程更加清晰,不似原库那么凌乱。整个结构性的代码(解码文件结构)其实并不多,代码量最大的地方在于解析各类OBJECT/ENTITY,然而通过宏的方式,这部分代码的编写又变得像是在堆砖头,就是有些枯燥。目前,总体流程已经跑通,并测试了2006,2007,2010,2013以及2018版的DWG部分内容的读取(如BLOCK_CONTROL, LTYPE_CONTROL, LAYER_CONTROL, BLOCK, LAYER, LINE, ARC, LWPOLYLINE, TEXT, MTEXT, INSERT等对象/实体)。

       再次感谢ODA以及Felipe Castro,Rodrigo Rodrigues等人的无私奉献。

       计划按照以下顺序完成该系列:

        1,文件结构

        2,位编码

        3,object/entity

        4,实例

// 假装是代码
// 不然,你说我的文章质量不好。
// 有你这样的吗?
// 委屈...

if (你想了解如何解析dwg)
{
    就跟我一起学习吧();
}

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值