利用Objectarx实现AutoCAD中的字符批量替换(2004-625)_第1页
利用Objectarx实现AutoCAD中的字符批量替换(2004-625)_第2页
利用Objectarx实现AutoCAD中的字符批量替换(2004-625)_第3页
利用Objectarx实现AutoCAD中的字符批量替换(2004-625)_第4页
利用Objectarx实现AutoCAD中的字符批量替换(2004-625)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文章编号: 2004-625利用 ObjectArx 在 AutoCAD 中实现文字批量替换李如忠四川省绵阳市 919 信箱 515 分箱 621900摘要介绍了 ObjectArx 的开发原理,对通过 ObjectArx 编程实现 AutoCAD 中的文字批量替 换的原理进行了详细描述,并给出了主要程序段,实现了 AutoCAD 中的利用长事务处理机 制对外部引用图形进行处理的过程。关键词 ObjectArx AutoCAD 图形 长事务 文字替换Achieve batch replacement function of text in AutoCAD using ObjectArxLi R

2、u-zhongP.O.Box 919-515, Mianyang, Sichuan 621900,CHINAAbstractThe development principle of ObjectArx is introduced, then the method of achieve batch replacement of text in AutoCAD using ObjectArx program is presented in detail. The author designed the application program. The procedure of performing

3、 external reference in AutoCAD using long transaction processing is achieved.Keywords ObjectArx, AutoCAD, drawing, long transaction, replacement of text1 前言AutoCAD 是目前使用最广泛的 CAD 软件, 它具有强大的二维绘图功能。 同时, 它采用 了开放体系结构, 允许用户或二次开发商扩充新的功能和设计各种实用程序。 机械制图中所 采用的标准件、 材料等的标识随着标准的发展而不同, 如在早期的标准中一种结构钢材料标 识为A3,在现在的标

4、准中标识为Q235。制造企业为了处理早期的绘图,统一标识,必须用新的标准替换原来的标准,这就用到文字的查找替换功能。在 AutoCAD 中有文字的查找替 换功能, 但是它只能针对当前打开的图形, 不能对大量的图形进行批量处理。 ObjectArx 2000 是 Autodesk 公司随 AutoCAD2000 推出的新一代功能强大的二次开发工具,本文利用 ObjectArx 开发了在 AutoCAD 中实现对一个目录下的所有 AutoCAD 文件中的文字批量替换 的实用程序。2 ObjectArx 开发原理ObjectArx 是一个面向对象的 C+ 编程环境,它包含一组动态链接库(DLL) ,

5、这些库与AutoCAD 在同一地址空间内运行, 直接利用 AutoCAD 的核心数据库结构和代码。 ObjectArx 程序可以直接调用 AutoCAD 的 API 函数,访问 AutoCAD 的数据库结构、图形系统,以及 几何造型等。 ObjectArx 程序的本质是 Windows DLL 程序,用户可以注册自己的 AutoCAD 命令,这些命令和 AutoCAD 内部命令一样使用,它支持 MFC ,可以利用 MFC 编写功能强 大、具有 Windows 风格的用户图形界面程序。ObjectArx程序文件主要有两部分组成,定义文件(.def)和源程序文件(.cpp)。定义文件必须输出 ac

6、rxEntryPoint 函数。源程序文件中主要定义几个接口函数:acrxEntryPoint 、 addCommand、removeGroup 和实现自己程序功能的函数。acrxEntryPoint 函数是必须要定义的函数, AutoCAD 通过它调入一个 ObjectArx 应用程 序,此函数代替了 C+程序中的main函数,如果用户使用 ObjectArx程序定义了一个新的 AutoCAD 命令, AutoCAD 将使用这个函数同用户定义的新命令建立联系。addCommand 函数主要用来注册一个用户自定义命令, 当用户新注册一个命令时, 也同 时为它指定了一个组名。 在这种情况下, 为

7、了避免用户自定义的命令与原来的命令发生冲突, 应当给组名加上特殊的前缀。 在一个给定组中, 一条命令名必须是唯一的, 而组名也是唯一 的,从而使不同的应用程序可以注册同样的命令,因为不同的组名可以将它们区分开来。removeGroup 函数主要用来删除命令组, 同时组中的所有命令也同时被删除, 也可以用 removeCmd 函数,删除特定组中的命令,而不删除组。用户自定义的函数是实现用户自定义命令功能的函数,根据具体实现的功能来编写。3 在 AutoCAD 中实现文字批量替换的原理在 AutoCAD 中对 dwg 文件进行批量处理, 可以看做对单个文件处理的循环。 单个文件 处理的步骤为:a.

8、 把要处理的 dwg 文件数据库读入到 AutoCAD 中b. 查找该文件中所有文字对象,并把文字对象中的内容与需要替换的文字进行比较, 如果是需要替换的文字,则替换,否则查找下一个文字对象,直到查找完所有的文字对象。c. 把该文件保存。在对单个文件进行处理时需要注意的问题:把 dwg 文件读入到 AutoCAD 中,对 dwg 文件的数据库进行操作相当于在当前数据库 中对外部引用对象进行操作,所有需要使用 AutoCAD 中的长事务机制来支持 AutoCAD 引 用编辑特征。 长事务处理类和函数为应用程序提供了一个方法, 在需要对实体进行编辑时获 得替代的实体, 当操作完成后恢复原实体, 这

9、个操作将原来的对象用编辑对象替代。 具体操 作步骤为:首先打开要处理的的数据库,遍历要处理的对象,把对象ID 添加到一个 ID 数组中,然后获得当前数据库的模型空间块表记录,再获得当前数据库模型空间记录的对象 ID ,创建长事务对象,并把遍历对象后保存的 ID 数组传给长事务对象,获得长事务指针, 对长事务工作集中的对象进行遍历和处理,然后将实体放回原数据库并保存。对 dwg 文件进行批处理的步骤:a. 查找一个目录下的所有文件和子目录b. 如果找到的是文件,并且是 dwg 文件,则对该文件处理,如果是其它文件则放弃, 如果是子目录,则利用递归处理方式,把子目录作为一个新的要查找的目录进行处理

10、。4 编程实现4.1 对单个文件进行处理的函数void FileEdit(char * filename,int & errornum,char * findstr,char * replacestr)AcDbObjectId transId;AcDbDatabase* pDb;CString temp;/新建数据库,打开要处理的文件pDb = new AcDbDatabase(Adesk:kFalse);/如果打开失败或用户已经打开了此图形,则报错后返回if (pDb->readDwgFile(filename) != Acad:eOk)acutPrintf("nSo

11、rry, that drawing is probably already open."); return;/获得这个图形文件数据库的块表AcDbBlockTable *pBlockTable; pDb->getSymbolTable(pBlockTable, AcDb:kForRead);/获得模型空间块表记录AcDbBlockTableRecord *pOtherMsBtr; pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr, AcDb:kForRead); pBlockTable->close();/创建一个遍历

12、器AcDbBlockTableRecordIterator *pIter; pOtherMsBtr->newIterator(pIter);/创建一个对象 ID 数组AcDbObjectIdArray objIdArray;/对模型空间块表记录进行遍历for (pIter->start(); !pIter->done(); pIter->step()/获得实体AcDbEntity *pEntity;pIter->getEntity(pEntity, AcDb:kForRead);/对实体进行判断 ,如果是多行文字对象,并且内容中包含要查找的 /文字,将实体的对象

13、ID 添加到数组中if (pEntity->isKindOf(AcDbMText:desc()temp.Format("%s",(AcDbMText *)pEntity)->contents(); if(temp.Find(findstr)>=0)objIdArray.append(pEntity->objectId();ID 添加到数 /如果是单行文字对象,并且内容中包含要查找的文字,将实体的对象 组中if (pEntity->isKindOf(AcDbText:desc() temp.Format("%s",(AcDbT

14、ext *)pEntity)->textString(); if(temp.Find(findstr)>=0)objIdArray.append(pEntity->objectId();/关闭实体 pEntity->close();delete pIter; pOtherMsBtr->close();/如果图形中没有文字对象,则释放数据库指针,返回if (objIdArray.isEmpty()delete pDb;pDb = NULL;return;/获得当前数据库和当前数据库块表AcDbBlockTable *pThisBlockTable; acdbHost

15、ApplicationServices()->workingDatabase()->getSymbolTable(pThisBlockTable, AcDb:kForRead); /获得当前数据库模型空间块表记录AcDbBlockTableRecord *pThisMsBtr; pThisBlockTable->getAt(ACDB_MODEL_SPACE, pThisMsBtr, AcDb:kForWrite); pThisBlockTable->close();/获得当前数据库模型空间记录的对象 IDAcDbObjectId id = pThisMsBtr->

16、objectId(); pThisMsBtr->close();/创建长事务,将从外部数据库中获得外部对象AcDbIdMapping errorMap; acapLongTransactionManagerPtr()->checkOut(transId, objIdArray, id, errorMap); AcDbObject* pObj;/打开对象成功if (acdbOpenObject(pObj, transId, AcDb:kForRead) = Acad:eOk)/获得长事务指针AcDbLongTransaction* pLongTrans = AcDbLongTrans

17、action:cast(pObj);if (pLongTrans != NULL)/获得工作集遍历器AcDbLongTransWorkSetIterator* pWorkSetIter; pLongTrans->newWorkSetIterator(pWorkSetIter);/对工作集中实体进行遍历,替换其中的文字for (pWorkSetIter->start(); !pWorkSetIter->done(); pWorkSetIter->step()AcDbEntity *pEntity;acdbOpenAcDbEntity(pEntity, pWorkSetIt

18、er->objectId(), AcDb:kForWrite); /如果是多行文字对象,进行替换 if(pEntity->isKindOf(AcDbMText:desc()temp.Format(AcDbMText *)pEntity)->contents(); temp.Replace(findstr,replacestr);(AcDbMText *)pEntity)->setContents(temp.GetBuffer(100);/如果是单行文字,进行替换if(pEntity->isKindOf(AcDbText:desc()temp.Format(AcDb

19、Text *)pEntity)->textString(); temp.Replace(findstr,replacestr);(AcDbText *)pEntity)->setTextString(temp.GetBuffer(100); pEntity->close();delete pWorkSetIter;pObj->close();/将实体放回原数据库 acapLongTransactionManagerPtr()->checkIn(transId, errorMap);/保存原数据库,关闭数据库和删除此对象pDb->saveAs(filename

20、);delete pDb;pDb = NULL;4.2 批量文字替换处理函数void MyfindandreplaceDlg:Replace(CString Directory)int errornum;CString FullName,temp;CFileFind ff;CString szDir =Directory;/ 拷贝要处理的目录名if(szDir.Right(1) != "")szDir += ""szDir += "*.*"BOOL res = ff.FindFile(szDir);/ 查找要处理的目录下的全部文件和子

21、目录 while(res)res = ff.FindNextFile();/如果找到的是隐藏文件或系统文件或点目录,则返回 if(ff.IsHidden()|ff.IsSystem()|ff.IsDots()continue;if(ff.IsDirectory()/ 如果是子目录/则将子目录名作为参数,进行递归,调用函数本身 if(m_IncludeSubDir)Replace(ff.GetFilePath();if(!ff.IsDirectory() /如果是文件,则检查是否是后缀为dwg的文件FullName=ff.GetFilePath();FullName.MakeLower();if

22、(FullName.Fi nd(".dwg")>=0)/如果是dwg文件,则进行替换操作acutPri ntf("nnFile Name is %sn" ,FullName.GetBuffer(100);FileEdit(FullName.GetBuffer(100),errornum,m_Fi ndStr.GetBuffer(100),m_R eplaceStr.GetBuffer(100);|目 昌|i°辽芒自口 o2|口痛虽二|眩层 ""ZIIL5程序的使用理1已討州严瓯-1 a a rn忙图1程序界面Figure 1 P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论