




已阅读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 ObjectArx Li Ru zhong P O Box 919 515 Mianyang Sichuan 621900 CHINA Abstract The 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 external reference in AutoCAD using long transaction processing is achieved Keywords ObjectArx AutoCAD drawing long transaction replacement of text 1 前言前言 AutoCAD 是目前使用最广泛的 CAD 软件 它具有强大的二维绘图功能 同时 它采 用了开放体系结构 允许用户或二次开发商扩充新的功能和设计各种实用程序 机械制图 中所采用的标准件 材料等的标识随着标准的发展而不同 如在早期的标准中一种结构钢 材料标识为 A3 在现在的标准中标识为 Q235 制造企业为了处理早期的绘图 统一标识 必须用新的标准替换原来的标准 这就用到文字的查找替换功能 在 AutoCAD 中有文字 的查找替换功能 但是它只能针对当前打开的图形 不能对大量的图形进行批量处理 ObjectArx 2000 是 Autodesk 公司随 AutoCAD2000 推出的新一代功能强大的二次开发工具 本文利用 ObjectArx 开发了在 AutoCAD 中实现对一个目录下的所有 AutoCAD 文件中的文 字批量替换的实用程序 2 ObjectArx 开发原理开发原理 ObjectArx 是一个面向对象的 C 编程环境 它包含一组动态链接库 DLL 这些库与 AutoCAD 在同一地址空间内运行 直接利用 AutoCAD 的核心数据库结构和代码 ObjectArx 程序可以直接调用 AutoCAD 的 API 函数 访问 AutoCAD 的数据库结构 图形 系统 以及几何造型等 ObjectArx 程序的本质是 Windows DLL 程序 用户可以注册自己 的 AutoCAD 命令 这些命令和 AutoCAD 内部命令一样使用 它支持 MFC 可以利用 MFC 编写功能强大 具有 Windows 风格的用户图形界面程序 ObjectArx 程序文件主要有两部分组成 定义文件 def 和源程序文件 cpp 定义文件 必须输出 acrxEntryPoint 函数 2 源程序文件中主要定义几个接口函数 acrxEntryPoint addCommand removeGroup 和 实现自己程序功能的函数 acrxEntryPoint 函数是必须要定义的函数 AutoCAD 通过它调入一个 ObjectArx 应用程 序 此函数代替了 C 程序中的 main 函数 如果用户使用 ObjectArx 程序定义了一个新的 AutoCAD 命令 AutoCAD 将使用这个函数同用户定义的新命令建立联系 addCommand 函数主要用来注册一个用户自定义命令 当用户新注册一个命令时 也 同时为它指定了一个组名 在这种情况下 为了避免用户自定义的命令与原来的命令发生 冲突 应当给组名加上特殊的前缀 在一个给定组中 一条命令名必须是唯一的 而组名 也是唯一的 从而使不同的应用程序可以注册同样的命令 因为不同的组名可以将它们区 分开来 removeGroup 函数主要用来删除命令组 同时组中的所有命令也同时被删除 也可以 用 removeCmd 函数 删除特定组中的命令 而不删除组 用户自定义的函数是实现用户自定义命令功能的函数 根据具体实现的功能来编写 3 在在 AutoCAD 中实现文字批量替换的原理中实现文字批量替换的原理 在 AutoCAD 中对 dwg 文件进行批量处理 可以看做对单个文件处理的循环 单个文 件处理的步骤为 a 把要处理的 dwg 文件数据库读入到 AutoCAD 中 b 查找该文件中所有文字对象 并把文字对象中的内容与需要替换的文字进行比较 如果是需要替换的文字 则替换 否则查找下一个文字对象 直到查找完所有的文字对象 c 把该文件保存 在对单个文件进行处理时需要注意的问题 把 dwg 文件读入到 AutoCAD 中 对 dwg 文件的数据库进行操作相当于在当前数据库 中对外部引用对象进行操作 所有需要使用 AutoCAD 中的长事务机制来支持 AutoCAD 引 用编辑特征 长事务处理类和函数为应用程序提供了一个方法 在需要对实体进行编辑时 获得替代的实体 当操作完成后恢复原实体 这个操作将原来的对象用编辑对象替代 具 体操作步骤为 首先打开要处理的的数据库 遍历要处理的对象 把对象 ID 添加到一个 ID 数组中 然后获得当前数据库的模型空间块表记录 再获得当前数据库模型空间记录的 对象 ID 创建长事务对象 并把遍历对象后保存的 ID 数组传给长事务对象 获得长事务 指针 对长事务工作集中的对象进行遍历和处理 然后将实体放回原数据库并保存 对 dwg 文件进行批处理的步骤 a 查找一个目录下的所有文件和子目录 b 如果找到的是文件 并且是 dwg 文件 则对该文件处理 如果是其它文件则放弃 如果是子目录 则利用递归处理方式 把子目录作为一个新的要查找的目录进行处理 4 编程实现编程实现 4 1 对单个文件进行处理的函数对单个文件进行处理的函数 void FileEdit char filename int AcDbDatabase pDb CString temp 新建数据库 打开要处理的文件 3 pDb new AcDbDatabase Adesk kFalse 如果打开失败或用户已经打开了此图形 则报错后返回 if pDb readDwgFile filename Acad eOk acutPrintf nSorry 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 创建一个遍历器 AcDbBlockTableRecordIterator pIter pOtherMsBtr newIterator pIter 创建一个对象ID数组 AcDbObjectIdArray objIdArray 对模型空间块表记录进行遍历 for pIter start pIter done pIter step 获得实体 AcDbEntity pEntity pIter getEntity pEntity AcDb kForRead 对实体进行判断 如果是多行文字对象 并且内容中包含要查找的 文字 将实体的对象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 AcDbText pEntity textString if temp Find findstr 0 objIdArray append pEntity objectId 关闭实体 pEntity close delete pIter 4 pOtherMsBtr close 如果图形中没有文字对象 则释放数据库指针 返回 if objIdArray isEmpty delete pDb pDb NULL return 获得当前数据库和当前数据库块表 AcDbBlockTable pThisBlockTable acdbHostApplicationServices workingDatabase getSymbolTable pThisBlockTable AcDb kForRead 获得当前数据库模型空间块表记录 AcDbBlockTableRecord pThisMsBtr pThisBlockTable getAt ACDB MODEL SPACE pThisMsBtr AcDb kForWrite pThisBlockTable close 获得当前数据库模型空间记录的对象ID AcDbObjectId id pThisMsBtr objectId pThisMsBtr close 创建长事务 将从外部数据库中获得外部对象 AcDbIdMapping errorMap acapLongTransactionManagerPtr checkOut transId objIdArray id errorMap AcDbObject pObj 打开对象成功 if acdbOpenObject pObj transId AcDb kForRead Acad eOk 获得长事务指针 AcDbLongTransaction pLongTrans AcDbLongTransaction cast pObj if pLongTrans NULL 获得工作集遍历器 AcDbLongTransWorkSetIterator pWorkSetIter pLongTrans newWorkSetIterator pWorkSetIter 对工作集中实体进行遍历 替换其中的文字 for pWorkSetIter start pWorkSetIter done pWorkSetIter step AcDbEntity pEntity acdbOpenAcDbEntity pEntity pWorkSetIter objectId AcDb kForWrite 如果是多行文字对象 进行替换 if pEntity isKindOf AcDbMText desc temp Format AcDbMText pEntity contents temp Replace findstr replacestr AcDbMText pEntity setContents temp GetBuffer 100 5 如果是单行文字 进行替换 if pEntity isKindOf AcDbText desc temp Format AcDbText 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 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 查找要处理的目录下的全部文件和子目录 while res res ff FindNextFile 如果找到的是隐藏文件或系统文件或点目录 则返回 if ff IsHidden ff IsSystem ff IsDots continue if ff IsDirectory 如果是子目录 则将子目录名作为参数 进行递归 调用函数本身 if m IncludeSubDir Replace ff GetFilePath 6 if ff IsDirectory 如果是文件 则检查是否是后缀为dwg的文件 FullName ff GetFilePath FullName MakeLower if FullName Find dwg 0 如果是dwg文件 则进行替换操作 acutPrintf n nFile Name is s n FullName GetBuffer 100 FileEdit FullName GetBuffer 100 errornum m FindStr GetBuffer 100 m R eplaceStr GetBuffer 100 5 程序的使用程序的使用 5 1 程序的加载和运行程序的加载和运行 加载程序时 在 AutoCAD 中运行 appload 命令或选择加载 应用程序菜单 然后运行自定义 的命令 mfind 出现如图 1 的对 话框 选择要处理的目录 输入 要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论