利用ObjectARX技术合并dwg文件的软件研制★
2012-08-01侯晓燕鲁先龙
侯晓燕 鲁先龙 崔 强
(中国电力科学研究院,北京 102401)
1 概述
在工程设计中,有很多相似的图,几十个甚至上百个,需要合并到一张图纸上,便于校对和出版。可是AutoCAD没有提供批量自动合并多个dwg文件的功能,只能打开要合并的dwg文件,挨个单独复制粘贴。基于上述需求,开发了一个界面友好、实用可靠、效率高的合并多个dwg文件的软件,使设计后期图纸校对和出版工作趋于简单方便、高效和智能化。
2 软件简介
2.1 软件功能
合并多个dwg文件生成图纸一览图的软件界面如图1所示。用户可以通过浏览文件对话框,批量选择电脑上的任意dwg文件,添加到图纸文件列表中。可以通过操作按钮:上移、下移、删除和清空来调整图纸文件顺序。可以设定生成图纸一览表的参数:每行文件个数、行间距及列间距,并可设置统一缩放比例或统一图纸文件高度。如果要合并的图纸文件高度相差不多,建议选择按统一比例缩放;如果文件高度相差较大,建议选择设置统一文件高度,这样合并出的图纸文件比较美观。
图1 合并多个dwg文件的软件界面
2.2 软件实例
如把6个dwg文件合并生成到一张图纸上,图纸文件高度和宽度不完全一致,设置了图纸统一高度为400 mm,行间距为25 mm,列间距为25 mm。软件根据设置的高度与图纸本身的高度,读取计算出每个图纸的缩放比例,然后将图纸按照各自不同的比例缩放。每个图纸下面标注了该文件的路径,便于用户区分。本软件性能好,可靠性高。经测试,CPU:2.4 GHZ,1 GB内存,AutoCAD 2004,合并100个dwg文件只需2 min。
3 关键技术
3.1 软件开发环境
AutoCAD开放的体系结构使其二次开发功能应用广泛,目前常用的 AutoCAD的二次开发工具有:Visual Lisp,VBA,Object-ARX。ObjectARX是一个以C++语言为基础的面向对象的开发环境和应用程序接口。它本质上是Windows动态链接库(DLL)程序,与AutoCAD共享地址空间,可以直接访问AutoCAD数据库核心数据结构和代码。ObjectARX与其他的AutoCAD二次开发工具相比,速度更快,稳定性更好,运行效率最高,代码可重用性强,而且支持MFC,能简捷高效地实现许多复杂功能。
进行ObjectARX开发需具备两个工具:1)与AutoCAD版本对应的ObjectARX开发包;2)与ObjectARX开发包版本对应的Visual C++版本作为开发工具。本软件为了达到最大兼容性,编程环境为:ObjectARX 2002,VC6.0,支持 AutoCAD 2002。为了兼容更高版本的AutoCAD,需要将代码在其他环境下编译,编译环境见表1。这样可以实现软件兼容 AutoCAD 2002,AutoCAD 2004,AutoCAD 2005,AutoCAD 2006,AutoCAD 2007,AutoCAD 2008,AutoCAD 2009,AutoCAD 2010共8个版本。
表1 软件编译环境
3.2 设置AutoCAD版本
用户需先设置AutoCAD的版本和路径后,才能生成施工图。可以点击图1界面下方的“设置AutoCAD版本”按钮,会弹出设置AutoCAD版本和路径的窗体,如图2所示。
图2 设置AutoCAD版本界面
用户选择版本和路径后,点击图3中“确定”按钮,程序内部处理流程如图3所示,图中的数字代表处理顺序。软件会重写acad.rx和生成fpCAD.lnk文件。acad.rx文件记录了AutoCAD打开时执行的ARX文件,AutoCAD每次打开时都会读取acad.rx文件,执行绘图命令。fpCAD.lnk文件是AutoCAD的快捷方式,指定了起始位置和目标可执行文件,起始位置为当前程序的安装路径,目标可执行文件为用户指定的AutoCAD可执行文件。使用快捷方式可从当前路径下打开AutoCAD,AutoCAD打开时会读取当前路径下的acad.rx,然后执行acad.rx文件中指定的ARX文件。最后ARX文件操作AutoCAD执行绘图命令,生成施工图。
图3 设计AutoCAD版本流程
3.3 程序处理流程
用户点击“生成图纸一览表”按钮之后,程序的处理流程如图4所示。首先保存用户在界面上输入的信息,并修改acad.rx文件,此文件记录了AutoCAD打开时执行的ARX程序。接着,打开AutoCAD,读取 acad.rx,加载ARX程序。ARX程序从入口函数acrxEntryPoint()进入,执行创建的绘图命令。该命令根据读取的用户在界面上输入的信息,循环计算图纸文件的插入位置及缩放比例,接着将文件打开、制作成块、将块插入。最后保存合并生成的施工图。
图4 程序处理流程
3.4 核心代码
本软件的难点是在要合并生成的图纸上插入dwg文件。本软件的处理方法是:打开dwg文件、将其作为块插入、关闭dwg文件。本小节给出了部分核心代码。
3.4.1 打开 dwg文件
打开dwg文件需新建一个空的数据库对象。因为AutoCAD的向下兼容性,AutoCAD低版本打不开高版本的dwg文件,所以需判断是否能打开。
AcDbDatabase*pDwg=new AcDbDatabase
(Adesk::kFalse);
if(Acad::eOk!=pDwg->readDwgFile(blkName))
{acedAlert(_T("图纸文件:")+blkName+_T("无法打开!"));
delete pDwg;
return;}
3.4.2 获取文件图形范围
需获取已打开的图纸文件的高度和宽度,可通过读取左下角坐标和右上角坐标来实现,代码如下:pDwg->updateExt(TRUE);pointleft=pDwg->extmin();pointright=pDwg->extmax();
3.4.3 制作块
本程序将dwg文件做成块时,统一将坐标(0,0,0)作为基点,代码如下:
AcDbObjectId blockId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()-> insert(blockId,blkName+"name",pDwg,Adesk::kFalse);
3.4.4 设置插入块
首先实例AcDbBlockReference对象,然后设置插入块的缩放比例、插入位置和旋转角度。
AcDbBlockReference*pBlkRef=new AcDbBlockReference();
pBlkRef->setBlockTableRecord(blockId);
pBlkRef-> setScaleFactors(AcGeScale3d(s,s,1));
pBlkRef-> setPosition(AcGePoint3d(pt[X]-pointleft.x*s,pt[Y]-pointleft.y*s,0.0))
pBlkRef-> setRotation(0.0);
3.4.5 分解块
分解块便于用户对块内的每个实体根据需要进行修改。ObjectARX提供了AcDbVoidPtrArray指针数组,可以将分解后的块中的所有实体添加到此数组中,然后逐个访问这一集合中所有的实体并添加到块表记录中。
AcDbEntity*pEnt=NULL;
AcDbVoidPtrArray entitySet;
es=pBlkRef->explode(entitySet);
AcDbEntity* ent;
for(int i=0;i< entitySet.length();i++)
{ent=(AcDbEntity*)entitySet.at(i);
AppendEntity(ent);}
4 结语
根据设计工作实际需求,利用ObjectARX技术编制了此软件。实现了自定义设置间距、图纸高度、图纸的比例等,不但使合并生成的图纸整齐美观满足出版需求,而且可以根据不同的需求灵活排列。满足了设计过程中审图时打印缩略图纸的需要,使大幅面绘图仪的效率成倍提高,纸张的利用率也提高了很多。该软件可广泛应用于电力、机械、水利、建筑等工程设计领域,实用性较强。可在Windows XP及以上操作系统使用,可移植性高,并兼容AutoCAD 2002~2010共8个版本。
[1] 于萧榕.基于ObjectARX的标牌曲线文字绘制的研究[J].现代电子技术,2011,34(18):26-28.
[2] 陈海霞,高广德.基于ObjectARX和Visual C++开发工具的格栅参数化设计[J].三峡大学学报,2006,28(1):61-64.
[3] 罗仕庭,漆泰岳,王伟峰.基于ObjectARX的公路隧道衬砌结构计算[J].四川建筑,2008,28(2):42-44.
[4] 马万杰,夏国栋,姜 昆,等.基于ObjectARX的AutoCAD塑料模标准件系统的研究与实现[J].模具技术,2009(2):37-39.
[5] 刘喜平.基于ObjectARX的粗糙度自动标注系统[J].吉林建筑工程学院学报,2011,28(4):64-67.