ZRX开发手册

上传人:飞****9 文档编号:127425348 上传时间:2020-04-02 格式:PDF 页数:58 大小:608.55KB
返回 下载 相关 举报
ZRX开发手册_第1页
第1页 / 共58页
ZRX开发手册_第2页
第2页 / 共58页
ZRX开发手册_第3页
第3页 / 共58页
ZRX开发手册_第4页
第4页 / 共58页
ZRX开发手册_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《ZRX开发手册》由会员分享,可在线阅读,更多相关《ZRX开发手册(58页珍藏版)》请在金锄头文库上搜索。

1、 ZRXSDK for ZWCAD 2010 ZRXSDK for ZWCAD 2010 开发手册 开发手册 中望龙腾软件股份有限公司中望龙腾软件股份有限公司目 录 版本更新说明版本更新说明(2009-7-30至至2009-12-31) :) :.3 版版版版本本本本更更更更新新新新说说说说明明明明版本更新概述:.3 版本更新内容:.3 ZRX 概概 述述.7 Z ZR RX X概概概概 述述述述ZRX简 介.7 开发环境要求.7 功能特性列举.7 ZRX编码特征.8 ZRX开发指南开发指南.10 Z ZR RX X开开开开发发发发指指指指南南南南软件开发包.10 创建一个简单的ZRX.11

2、程序入口和命令定制.19 加载及运行.21 注意事项.21 数据库概述及操作.22 自定义类.26 反应器.29 事务管理.31 文档管理.34 自定义实体OPM.35 MFC扩展UI类.36 可停靠面板(DOCKCONTROLBAR).36 全局函数应用.39 ZRX移植指南移植指南.40 Z ZR RX X移移移移植植植植指指指指南南南南从OBJECTARX 2006 移植到ZRX.40 从OBJECTARX 2007/2008 移植到ZRX.45 针对ARX UI的移植 .47 移植注意事项.48 ZRX常见问题解答常见问题解答.49 Z ZR RX X常常常常见见见见问问问问题题题题解

3、解解解答答答答附录附录A:(ZRX现支持全局函数列举) :现支持全局函数列举) :.52 附附附附录录录录A A: :版版版版版版本本本本本本更更更更更更新新新新新新说说说说说说明明明明明明(2009-7-30 至 2009-12-31): 版本更新概述:版本更新概述: ZRX for ZWCAD 2010 在前一个版本 ZRX for ZWCAD 2009 的基础上, 加强和完善常用反应器功能,新增加对永久反应器的支持;提供了一套兼容事务管理功能的接口;新增加了CZdUiBaseDialog、CZdUiDailog、CZcUiDialog 基本 UI 界面类;新增加了部分全局函数;完善了数据

4、库应用接口,例如 ZcDbDatabase、ZcDbObject、ZcDb2dPolyline 等类,使之比以前版本更稳定更正确;兼容处理 acrxGetApiVersion 函数导出,在移植 ARX 时的过程中不再需要在.def 文件里注释或者删除 acrxGetApiVersion 函数的导出了。 更多详细介绍请参考下一节“版本更新内容” 。 注意 : ZRX for ZWCAD 2010 要求用户使用 ZWCAD 2010 版本的 CAD 平台, 使用 Microsoft Visual C+ 2008 编译环境。 版本更新内容:版本更新内容: 1. 增加及改善的反应器类接口 a 永久反应

5、器 ZcDbObject:erased ZcDbObject:modified ZcDbObject:openedForModify b. 编辑反应器 命令相关 ZcEditorReactor:commandEnded ZcEditorReactor:commandWillStart 数据库相关 ZcEditorReactor:abortSave ZcEditorReactor:beginClose ZcEditorReactor:beginSave ZcEditorReactor:beginDwgOpen ZcEditorReactor:endDwgOpen ZcEditorReactor:

6、databaseConstructed ZcEditorReactor:databaseToBeDestroyed ZcEditorReactor:dwgFileOpened ZcEditorReactor:saveComplete ZcEditorReactor:initialDwgFileOpenComplete 深度克隆相关 ZcEditorReactor:abortDeepClone ZcEditorReactor:beginDeepClone ZcEditorReactor:endDeepClone 插入操作相关 ZcEditorReactor:abortInsert ZcEdito

7、rReactor:beginInsert ZcEditorReactor:endInsert ZcEditorReactor:otherInsert 鼠标事件操作相关 ZcEditorReactor:beginDoubleClick ZcEditorReactor:beginRightClick Wblock 相关 ZcEditorReactor:abortWblock ZcEditorReactor:beginWblock ZcEditorReactor:beginWblockObjects ZcEditorReactor:endWblock ZcEditorReactor:otherWbl

8、ock ZcEditorReactor:wblockNotice XREF 相关 ZcEditorReactor:beginAttach ZcEditorReactor:endAttach ZcEditorReactor:otherAttach 其他 ZcEditorReactor:pickfirstModified b 文档反应器 ZcApDocManagerReactor:documentActivated ZcApDocManagerReactor:documentBecameCurrent ZcApDocManagerReactor:documentCreated ZcApDocMan

9、agerReactor:documentCreateStarted ZcApDocManagerReactor:documentDestroyed ZcApDocManagerReactor:documentToBeActivated ZcApDocManagerReactor:documentToBeDeactivated ZcApDocManagerReactor:documentToBeDestroyed c 数据库反应器 ZcDbDatabaseReactor:objectAppended ZcDbDatabaseReactor:objectErased ZcDbDatabaseRea

10、ctor:objectModified ZcDbDatabaseReactor:objectOpenedForModify d 对象反应器 ZcDbObjectReactor:erased ZcDbObjectReactor:modified ZcDbObjectReactor:openedForModify 2. 增加事务管理功能接口 a 长事务管理类 ZcApLongTransactionManager:checkIn ZcApLongTransactionManager:checkOut ZcDbLongTransaction:addToWorkSet ZcDbLongTransacti

11、on:newWorkSetIterator ZcDbLongTransaction:removeFromWorkSet ZcDbLongTransaction:originBlock ZcDbLongTransaction:originObject ZcDbLongTransaction:workSetHas b 长事务工作集遍历器 ZcDbLongTransWorkSetIterator:start ZcDbLongTransWorkSetIterator:step ZcDbLongTransWorkSetIterator:curObjectIsErased ZcDbLongTransWor

12、kSetIterator:curObjectIsPrimary ZcDbLongTransWorkSetIterator:curObjectIsRemoved ZcDbLongTransWorkSetIterator:done ZcDbLongTransWorkSetIterator:objected c 事务管理类 ZcDbTransactionManager:getAllObjects ZcDbTransactionManager:getObject ZcDbTransactionManager:abortTransaction ZcDbTransactionManager:addNewl

13、yCreatedDBRObject ZcDbTransactionManager: startTransaction d 事务类 ZcTransaction:getAllObjects ZcTransaction:getObject 3. 增加基本 UI 界面类 CZdUiBaseDialog CZdUiDialog CZcUiDialog 上面的 UI 类接口,作为 ZRX 的几个很基本的 UI 对话框类, 实现了 BeginEditorComand、CancelEditorCommand、 CompleteEditorCommand 等功能函数。 在用户与 CAD 交互过程中,将操作焦点从

14、对话框切换到命令行,提供了功能机制。 4. 增加全局函数 zcedSetCurrentVport zcedGetCurViewportObjectId modelToPixel pixelToModel ucsNormalVector ucsXDir ucsYDir zdsw_executeUICommand 5. 部分接口类的完善 a 针对 ZcDbDababase 类部分成员函数功能进行加强和完善 b 增加对 ZcDbBody、ZcDbShape 图形实体类的支持 c 增加对 ZcApDocManager:sendStringToExecuted 接口功能的基本支持, (注意:该接口函数目

15、前只对第二参数 const char* pszExecute 有效) d 增强及完善 ZcDb2dPolyline 图形实体类 e 完善 ZcDbObject 对象基类 6. 兼容处理 acrxGetApiVersion 函数导出 在先前的版本里,将 ARX 程序移植到 ZRX 的工程中,需要手动将工程里 .def 文件里的acrxGetApiVersion 导出函数进行注释或者删除掉, 否则 VC 编译系统会提示 “error LNK2001: unresolved external symbol acrxGetApiVersion”链接错误。该版本针对这个问题做了容错处理,用户在移植的工程

16、中不需要再去修改.def 文件了。 更多详细说明请参考ZRX 开发指南 。 ZZ ZRRRXXX 概概概概概概 述述述述述述 ZRX 简简 介介 ZRXZWCAD Runtime eXtension, 是 ZWCAD 提供一套面向对象的 C+应用程序接口。用户使用这套接口可以开发各种 ZWCAD 功能应用的程序,包括几何图形的创建、创建自定义类、 多文档应用、 事件反应通告、 对 DWG 数据库进行操作等。 其次, ZRX 在 ZWCAD的公开的接口上实现了 ARX 对应的类和函数,在代码风格和结构上,ZRX 完全兼容 ARX代码,原 ARX 程序在几乎不改任何代码的前提下,通过重新编译便可直

17、接移到在 ZWCAD平台上进行运行。这样大大提高开发用户的从 ARX 程序向 ZRX 程序的移植效率,整个代码移植成本几乎为“0” 。 原 ARX 源代码在 ZRX 上编译出来的 DLL 加载到 ZWCAD, 运行时会把ARX的接口调用转接到ZRX.dll动态连接库, 然后ZRX.dll动态库把接口调用转接到ZWCAD。 最终,ZWCAD 就可以把接口调用转接到用户的 ARX 代码中,以达到执行相关的功能命令。 开发环境要求开发环境要求 ZRXSDK for ZWCAD 2010 (以下简称 ZRX),强烈建议用户采用 Microsoft Visual C+ 2008 开发平台 和 ZWCAD

18、 2010 平台。 功能特性列举功能特性列举 1常用基本功能,如 DWG 数据库读写访问,注册命令,获取用户输入点或者字符串等; 2数据库图形实体, 如 ZcDbLine、ZcDbCircle、ZcDbArc 等; 3扩展数据和扩展字典, XData & XDictionary; 4自定义实体和对象,从 ZcDbObject、ZcDbEntity 或其它类派生; 5文档管理功能,提供文档管理器 ZcApDocManager ,文档类 ZcApDocument 等接口; 6反应器功能,提供数据库反应器,文档反应器,编辑器反应器(包括 命令反应器,鼠标右键消息等) ,对象反应器,永久反应器; 7拖

19、动 Jigs,ZcEdJig; 8协议扩展(Protocol Extensions) ; 9几个基本 UI 界面类的支持,CZcUiDialog、CZdUiDailog、CZdUiBaseDialog。 ZRX 编码特征编码特征 ZRX API 主要的特征就是可以同时兼容两套形式的程序编码,既可以兼容自己本身的 ZRX程序编码又可以兼容 ARX 程序编码。例如有下面的两种形式编码,在 ZWCAD 平台上都是可以正常运行的: ZRX 程序编码: void drawSimpleLine() ZcGePoint3d pntStart; ZcGePoint3d pntEnd; if (RTNORM !

20、= zcedGetPoint( NULL, n Input the start point:, asDblArray(pntStart) return; if (RTNORM != zcedGetPoint( NULL, n Input the end point:, asDblArray(pntEnd) ) return; ZcDbLine* pLine = new ZcDbLine(pntStart, pntEnd); ZcDbObjectId eId; addEntityToDb(eId, pLine); pLine-close(); ARX 程序编码: void drawSimpleL

21、ine() AcGePoint3d pntStart; AcGePoint3d pntEnd; if (RTNORM != acedGetPoint( NULL, n Input the start point:, asDblArray(pntStart) return; if (RTNORM != acedGetPoint( NULL, n Input the end point:, asDblArray(pntEnd) ) return; AcDbLine* pLine = new AcDbLine(pntStart, pntEnd); AcDbObjectId eId; addEntit

22、yToDb(eId, pLine); pLine-close(); 以上两种形式的编码,一种是 ZRX 现有本身的代码风格,另一种是 ARX 的代码风格,两者在编码形式都几乎没有太大差别。通过使用 ZRX API 来进行编译链接以上两份代码,结果都能正确地在 ZWCAD 平台上运行。换句话说,ZRX API 实现了针对 ARX 代码的兼容,原 ARX 程序可以快速, “0” 成本地移植到 ZRX 上。ZRX 相当于一个转接口,能够把原来的ARX 源代码,几乎不用修改任何代码,通过在 ZRX 开发环境下重新编译链接生成动态连接库(dll),加载到 ZWCAD 上来运行。作为一个程序开发者,只需要

23、维护同一份代码,就可以在 ObjectARX 上或者 ZRX 上来编译运行代码。 ZZ ZRRRXXX开开开开开开发发发发发发指指指指指指南南南南南南 软件开发包软件开发包 完成 ZRXSDK 的安装后,安装程序将在用户指定的位置创建以下的子目录和内容: arxPort 兼容 ARX 代码使用的头文件目录, 用户代码如果是以 “A” 等字母特性打头的 ARX编码风格,则需要包括该头文件目录 inc ZRX 所有头文件目录, “arxPort” 与“inc”头文件目录,用户只需要包含其一 dll ZRX dll 库目录,该目录下包含 ZRX.dll 和 ZXDB.dll,在使用 ZRX 开发时,

24、需要将该目录下所有的 dll 文件复制到 ZWCAD 平台的安装目录下,确保与 ZWCAD.exe 同目录。 lib ZRX lib 库目录,该目录下包含 ZRX.lib 和 ZXDB.lib docs ZRX 所有在线帮助文档目录,包括版本更新说明 、 ZRX 开发指南 、 ZRX 移植指南 、 ZRX 常见问题解答等 samples ZRX 提供的示例程序目录, 该目录里的示例程序展示了 ZRX 不同功能特性的使用方法, 有: SimpleLine(简单实体)、 RasterImage(光栅图像)、 DockControlBar(停靠工具条)、 PersistReactor(永久反应器)、

25、DocumentManager(文档管理应用)、ZRX_MISC(综合应用,自定义实体、拖动 JIG、反应器、OPM)。 说 明: 1) ZRXSDK 开发包可以放置到任何目录下,也可以放置到 ZWCAD 的安装目录下,保持ZRXSDK 及其子目录的结构不变。 2) 在使用 ZRXSDK 前,确保 ZRX.dll 、ZXDB.dll、PropertyBarRes.dll 三个库文件拷贝到ZWCAD 相应的安装目录下, 保持这三个库文件与 ZWCAD.EXE 在同一路径下。 创建一个简单的创建一个简单的 ZRX 用户可以使用 VC 的“新建”来创建一个新的 ZRX 工程,(如果用户安装了 Zrx

26、Wizards, 也可以使用 ZrxWizards 快速创建一个新的 ZRX 工程), 接下来将讲述, 怎样一步一步地去实现一个简单的 ZRX 程序: 1. 首先建立一个 VC+ 2008 MFC 扩展 DLL 工程: 1)打开 Microsoft Visual C+ 2008 开发环境,选择“New(新建)”从“File(文件)”菜单,接着选中“Project (项目)”弹出“New Project(新建项目)”对话框。 2)在当前弹出的“New Project(新建项目)”对话框“Templates(模板)”里,选定“MFC DLL”项 , 并 输 入 需 要 创 建 的 工 程 项 目

27、名 称 “ SimpleLine ” 和 工 程 项 目 所 保 存 位 置“D:ZRXSDKSamples” , 如上图所示意。 点击 “OK (确定) ” 后弹出 “MFC DLL Wizard (MFC DLL 向导) ”对话框。 3)击活“Application Settings(应用程序设置)”属性页,选中“MFC extension DLL (MFC 扩展 DLL)”在作为要生成的 DLL 类型” ,确认无误后点击“Finish(完成)”按钮。 2. 接着,进行工程配置: 1)在工程属性对话框的“C/C+-General(常规)-Additional Include Directo

28、ries(附加包含目录)”中增加包含文件路径,如“.inc” 2)在工程属性对话框的“Linker(链接器)-General(常规)-Additional Library Directories(附加库目录)”中增加库目录.如“.libvc9” 3) 在工程属性对话框的 Linker(链接器)-Input(输入)-Additional Dependencies(附加依赖项)中增加所依赖的库“ZRX.lib” 4) 在工程属性对话框的“General(常规) - Character Set(字符集)” , 确保选项为“Use Muti-Byte Character Set(使用多字节字符集) ”

29、 5) 在工程属性对话框的“C/C+-Language(语言)- Treat wchart_t as Built-in Type(将wchar_t 视为内置类型)” ,确保选项为“No(否)” 6) 增加包含头文件,在预编译头文件“stdAfx.h”文件末尾处里添加以下代码: #include zrxheaders.h 7)打开新建工程的.def 文件, 增加程序入口函数的导出,代码如下所示: EXPORTS zcrxEntryPoint PRIVATE 3. 为程序装载命令和定义实现函数,可按照如下的方式进行实现: 1) 添加 ZRX 程序入口点函数, 在.cpp 文件里添加如下代码: ex

30、tern C ZcRx:AppRetCode zcrxEntryPoint(ZcRx:AppMsgCode msg, void* pkt) switch (msg) case ZcRx:kInitAppMsg: zcrxDynamicLinker-unlockApplication(pkt); zcrxRegisterAppMDIAware(pkt); initApp(); break; case ZcRx:kUnloadAppMsg: unloadApp(); break; default: break; return ZcRx:kRetOK; 2)添加装载命令代码,相应地添加对应的卸载命令

31、代码,如下所示: void initApp() / register a command with the ZWCAD command mechanism zcedRegCmds-addCommand(SIMPLINE_CMDS, DrawLine, DrawLine, ZCRX_CMD_TRANSPARENT, drawSimpleLine); void unloadApp() / unload commands zcedRegCmds-removeGroup(SIMPLINE_CMDS); 3) 定义命令函数,如下所示: void drawSimpleLine() / define dra

32、wSimpleLine() function and implement it 4. 完成上述步骤后,将整个工程进行编译链接,生成结果程序文件(.dll) 。 说明: 1. 如果使用 ZrxWizards 来创建 ZRX 工程, 上述的大部分步骤可以省掉; 2. 上述过程更详细的可以参考 ZRXSDKSamples目录下示例程序“SimpleLine” 。 程序入口和命令定制程序入口和命令定制 ZRX 提供以下两种应用程序入口的方式, 开发用户可以使用其中任意一种方式对自己的ZRX 应用程序入口进行导出和命令定制: 程序入口方式一:导出入口函数“zcrxEntryPoint” 1) 定义程序入

33、口函数 extern C ZcRx:AppRetCode zcrxEntryPoint(ZcRx:AppMsgCode msg, void* pkt) switch (msg) case ZcRx:kInitAppMsg: zcrxDynamicLinker-unlockApplication(pkt); zcrxRegisterAppMDIAware(pkt); initApp(); break; case ZcRx:kUnloadAppMsg: unloadApp(); break; default: break; return ZcRx:kRetOK; 2)添加装载和卸载函数,创建命令,

34、 void initApp() / register a command with the ZWCAD command mechanism zcedRegCmds-addCommand(SIMPLINE_CMDS, DrawLine, DrawLine, ZCRX_CMD_TRANSPARENT, drawSimpleLine); void unloadApp() / unload commands zcedRegCmds-removeGroup(SIMPLINE_CMDS); 3) 定义命令函数,如下所示: void drawSimpleLine() / define drawSimpleL

35、ine() function and implement it 程序入口方式二:从 ZcRxZrxApp 派生应用类 1)从 ZcRxZrxApp 派生应用程序类 / Application Entry Point class CmdEntryApp : public ZcRxZrxApp public: virtual ZcRx:AppRetCode On_kInitAppMsg (void *pkt) ZcRx:AppRetCode retCode =ZcRxZrxApp:On_kInitAppMsg (pkt) ; / TODO: Add your initialization code

36、 here return (retCode) ; virtual ZcRx:AppRetCode On_kUnloadAppMsg (void *pkt) ZcRx:AppRetCode retCode =ZcRxZrxApp:On_kUnloadAppMsg (pkt) ; / TODO: Unload dependencies here return (retCode) ; virtual void RegisterServerComponents () / Add your code for register server components public: / -Your comma

37、nd function entry static void MyCmdGroupMyCmd(void) / Add your code for command implement here / ; 2)声明应用程序入口点宏 IMPLEMENT_ZRX_ENTRYPOINT(CmdEntryApp) 3)定制命令 / The macro for customize your command ZCED_ZRXCOMMAND_ENTRY_AUTO(CmdEntryApp, MyCmdGroup, MyCmd, MyCmd, ZCRX_CMD_TRANSPARENT, NULL) 加载及运行加载及运行

38、 编译成功的 ZRX 应用程序,可以在 ZWCAD 平台上进行加载并执行: 1. 在命令行上输入“AP” 或“APPLOAD”命令,将编译好的 dll 加载进来; 2. 在命令行输入预先定义的功能命令进行执行。 加载方式可分为手动加载和自动加载: 1、手工加载,启动 ZWCAD(在启动前,确保 ZRX.DLL 已放进 ZWCAD 安装目录,即 ZRX.DLL 与ZWCAD.EXE在同一目录下) ,在ZWCAD命令行输入appload命令,选择要执行的ZRX生成的.dll文件, 并执行加载。 2、自动加载。使用 drxautoload.cfg 文件。在其中添加 ZRX 生成的.dll 文件的名称

39、。ZWCAD启动时自动加载。 注意事项注意事项 1. ZRX 的接口版本与 ObjectARX Version 2008 及以上兼容。有区别的是使用的是多字节MBCS 而不是 UNICODE。 2. 工程配置-C/C+-语言-将 wchar_t 视为内置类型改为“否” 。 3. 在加载自己编译好的 dll 前, 确保 ZRX.DLL 已放进 ZWCAD 安装目录,即 ZRX.DLL 与ZWCAD.EXE 在同一目录下,否则程序加载失败。 数据库概述及操作数据库概述及操作 1) 数据库概述: ZRX 数据库的底层是采用 OpenDWG 的 DWGdirect 模块,在数据库模型上能够很好的兼容

40、DWG 格式,数据库由以下基本结构组成: ? 9 个符号表 (Symbol Table) 块表 (ZcDbBlockTable) 尺寸样式表(ZcDbDimStyleTable) 层表(ZcDbLayerTable) 线型表(ZcDbLinetypeTable) 注册应用表(ZcDbRegAppTable) 文本样式表 (ZcDbTextStyleTable) 用户坐标系统表(ZcDbUCSTable) 视口表(ZcDbViewportTable) 视表(ZcDbViewTable) ? 1 个命名对象字典( Named Object Dictionary) 2) 数据库对象: 任何一个数据库

41、对象 ZcDbObject 有下面三种表现形式: 句柄 (ZcDbHandle) 对象 ID (ZcDbObjectId & zds_name) 对象指针(ZcDbObject *、ZcDbEntity* ) 三者之间可以根据实时需要进行转换得到,例如: ZcDbObjectId objId; zds_name objName; ZcDbObject* pObj = NULL; ZcDbHandle objHand; a. 从 zds_name 转换得到 ZcDbObjectId : zcdbGetObjectId(objId, objName); b. 从 ZcDbObjectId 转换得到

42、 zds_name: zcdbGetZdsName(objName , objId); c. 从 ZcDbObjectId 以读的方式打开得到 ZcDbObject*: zcdbOpenObject(pObj , objId, ZcDb:kForRead); d. 从 ZcDbObject 中得到 ZcDbObjectId : objId = pObj-objectId(); e. 从 ZcDbObjectId 转换的到 ZcDbHandle: objHand = objId-Handle(); f. 从 ZcDbHandle 转换得到 ZcDbObjectId: ZcDbDatabase *

43、 pDb = zcdbHostApplicationServices()-workingDatabase(); bool bCreateFlag = true; pDb-getZcDbObjectId(objId, bCreateFlag, objHand); 3)访问数据库: 开发用户根据实际应用需要创建、编辑、保存、删除一个数据库,也可以遍历整个数据里的对象,下面就如何添加一个实体到数据库及如何遍历一个数据库进行的代码进行示例: / 添加一个实体到当前数据库的模型空间 bool addEntityToDb(ZcDbObjectId& entId, ZcDbEntity * pEnt) Zc

44、DbDatabase * pDb = zcdbHostApplicationServices()-workingDatabase(); if (!pDb) return false; ZcDbBlockTable* pTbl = NULL; if (Zcad:eOk != pDb-getBlockTable(pTbl, ZcDb:kForRead) ) return false; ZcDbBlockTableRecord* pTblRec = NULL; if (Zcad:eOk != pTbl-getAt(ZCDB_MODEL_SPACE, pTblRec, ZcDb:kForWrite)

45、pTbl-close(); return false; pTbl-close(); if (Zcad:eOk != pTblRec-appendZcDbEntity(entId, pEnt) pTblRec-close(); return false; pTblRec-close(); return true; / 遍历一个数据库模型空间里所有的实体 void iterateThroughDatabase() ZcDbDatabase *pDb = new ZcDbDatabase(Zdesk:kFalse); if(Zcad:eOk != pDb-readDwgFile(_T(c:123.d

46、wg) return; ZcDbBlockTable *pBlkTbl; pDb-getSymbolTable(pBlkTbl, ZcDb:kForRead); if (!pBlkTbl) return; ZcDbBlockTableRecord *pBlkTblRcd; pBlkTbl-getAt(ZCDB_MODEL_SPACE, pBlkTblRcd, ZcDb:kForRead); if (!pBlkTblRcd) pBlkTbl-close(); return; pBlkTbl-close(); ZcDbBlockTableRecordIterator *pIterator; pBl

47、kTblRcd-newIterator(pIterator); if (!pIterator) pBlkTblRcd-close(); return; pBlkTblRcd-close(); ZcDbEntity *pEnt; for (pIterator-start(); !pIterator-done();pIterator-step() pIterator-getEntity(pEnt, ZcDb:kForRead); if (!pEnt) continue; zcutPrintf(The entity class name is: %sn, (pEnt-isA()-name(); pE

48、nt-close(); delete pIterator; delete pDb; 4) 库存实体对象类列举: ZRX 提供了以下数据库常规实体类: ? ZcDbPolyline ? ZcDb2dPolyline ? ZcDb3dPolyline ? ZcDbArc ? ZcDbArcDim ? ZcDbCircle ? ZcDbEllipse ? ZcDbLeader ? ZcDbLine ? ZcDbRay ? ZcDbSpline ? ZcDbXline ? ZcDbPolyFaceMesh ? ZcDbPolygonMesh ? ZcDb2LineAngularDim ? ZcDb3P

49、ointAngularDim ? ZcDbAlignedDim ? ZcDbDiametricDim ? ZcDbOrdinateDim ? ZcDbRadialDim ? ZcDbRadialDimLarge ? ZcDbRotatedDim ? ZcDbBlockReference ? ZcDbMInsertBlock ? ZcDbHatch ? ZcDbFace ? ZcDbFcf ? ZcDbMline ? ZcDbPoint ? ZcDbSolid ? ZcDbTrace ? ZcDb3dSolid ? ZcDbRegion ? ZcDbText ? ZcDbMText ? ZcDb

50、AttributeDefinition ? ZcDbBody ? ZcDbWipeout ? ZcDbViewport ? ZcDbShape 自定义类自定义类 ZRX 提供了一套自定义接口,供用户从 ZcRxObject 类中派生出自己特定的新类,新的类可以是一个标准的 C+派生类,也可以是一个具有 ZRX 运行时类型识别机制的 ZcRxObject 扩展类。最常见的运行时自定义扩展类有:自定义对象和自定义实体。自定义对象通常是从ZcDbObject 派生,自定义实体则从 ZcDbEntity、ZcDbCurve 等实体类中进行派生。两种方式构建出来的自定义类对象,如同其他的数据库常驻对象一

51、样,具有同等的特性,能够存储在数据库里,被数据库统一管理。 为了便于理解,下面将举例讲述如何一步一步定制一个带运行时类型识别机制的自定义实体: 1) 定义新的自定义实体类 class SignEntity : public ZcDbEntity public: ZCRX_DECLARE_MEMBERS(SignEntity) ; protected: static Zdesk:UInt32 kCurrentVersionNumber ; public: SignEntity () ; virtual SignEntity () ; Zdesk:UInt32 SignEntity:kCurren

52、tVersionNumber =1 ; ZCRX_DXF_DEFINE_MEMBERS ( SignEntity, ZcDbEntity, ZcDb:kDHL_CURRENT, ZcDb:kMReleaseCurrent, ZcDbProxyEntity:kNoOperation, SIGNENTITY, SIGNENTITYAPP |Product Desc: A description for your object |Company: Your company name |WEB Address: Your company WEB site address ) SignEntity:Si

53、gnEntity () : ZcDbEntity () m_pntCenter.set(0,0,0); m_dblRadius = 10.00; m_strTextFirst = ZWCAD; m_strTextSecnd = 2010; SignEntity:SignEntity () 2) 声明和定义需要的虚重载函数 /- Dwg Filing protocol virtual Zcad:ErrorStatus dwgOutFields (ZcDbDwgFiler *pFiler) const ; virtual Zcad:ErrorStatus dwgInFields (ZcDbDwgF

54、iler *pFiler) ; /- Graphics protocol virtual Zdesk:Boolean worldDraw (ZcGiWorldDraw *mode) ; /- ZcDbObject protocols /- Dwg Filing protocol Zcad:ErrorStatus SignEntity:dwgOutFields (ZcDbDwgFiler *pFiler) const assertReadEnabled () ; /- Save parent class information first. Zcad:ErrorStatus es =ZcDbEn

55、tity:dwgOutFields (pFiler) ; if ( es != Zcad:eOk ) return (es) ; /- Object version number needs to be saved first if ( (es =pFiler-writeUInt32 (SignEntity:kCurrentVersionNumber) != Zcad:eOk ) return (es) ; /- Output params /. return (pFiler-filerStatus () ; Zcad:ErrorStatus SignEntity:dwgInFields (Z

56、cDbDwgFiler *pFiler) assertWriteEnabled () ; /- Read parent class information first. Zcad:ErrorStatus es =ZcDbEntity:dwgInFields (pFiler) ; if ( es != Zcad:eOk ) return (es) ; /- Object version number needs to be read first Zdesk:UInt32 version =0 ; if ( (es =pFiler-readUInt32 (&version) != Zcad:eOk

57、 ) return (es) ; if ( version SignEntity:kCurrentVersionNumber ) return (Zcad:eMakeMeProxy) ; /- Uncomment the 2 following lines if your current object implementation cannot /- support previous version of that object. /if ( version filerStatus () ; Zdesk:Boolean SignEntity:worldDraw (ZcGiWorldDraw *

58、mode) assertReadEnabled () ; / return Zdesk:kTrue; 3) 注册和注销自定义类,用户可以采用以下任一方法进行自定义实体的注册和注销 a . 使用自动注册宏,在自定义自定类的.h 文件的末尾处添加宏声明如下: #ifdef SIGNENTITY_MODULE ZCDB_REGISTER_OBJECT_ENTRY_AUTO(SignEntity) #endif b . 在程序加载或卸载时注册 / 程序加载时 SignEntity:rxInit(); zcrxBuildClassHierarchy / 程序卸载时 deleteZcRxClass(Sig

59、nEntity:desc(); 注意: 1) ZRX 目前不支持自定义类的虚重载函数 list()、saveAs()、getSubentPathsAtGsMarker()、highlight()、unhighlight()、applyPartialUndo()。 2) 更多详细可以参考 ZRXSDKSample目录下的示例程序 ZRX_MiscSignEntityDb 反应器反应器 所谓反应器, 就是接收 CAD 里各种事件消息的通告机制。 每一个反应器相当于一个接收事件的盒子,将从通告者(当一个事件发生时,发出事件通告的对象)那里接到事件消息传递到相应的通告函数。CAD 平台针对不同类型的事

60、件消息进行区分,分别定义不同类型的事件反应器。 ZWCAD-ZRX 提供了以下几种事件类型的反应器和通告函数: a 永久反应器 ZcDbObject:erased ZcDbObject:modified ZcDbObject:openedForModify b. 编辑反应器 命令相关 ZcEditorReactor:commandEnded ZcEditorReactor:commandWillStart 数据库相关 ZcEditorReactor:abortSave ZcEditorReactor:beginClose ZcEditorReactor:beginSave ZcEditorRe

61、actor:beginDwgOpen ZcEditorReactor:endDwgOpen ZcEditorReactor:databaseConstructed ZcEditorReactor:databaseToBeDestroyed ZcEditorReactor:dwgFileOpened ZcEditorReactor:saveComplete ZcEditorReactor:initialDwgFileOpenComplete 深度克隆相关 ZcEditorReactor:abortDeepClone ZcEditorReactor:beginDeepClone ZcEditorR

62、eactor:endDeepClone 插入操作相关 ZcEditorReactor:abortInsert ZcEditorReactor:beginInsert ZcEditorReactor:endInsert ZcEditorReactor:otherInsert 鼠标事件操作相关 ZcEditorReactor:beginDoubleClick ZcEditorReactor:beginRightClick Wblock 相关 ZcEditorReactor:abortWblock ZcEditorReactor:beginWblock ZcEditorReactor:beginWb

63、lockObjects ZcEditorReactor:endWblock ZcEditorReactor:otherWblock ZcEditorReactor:wblockNotice XREF 相关 ZcEditorReactor:beginAttach ZcEditorReactor:endAttach ZcEditorReactor:otherAttach 其他 ZcEditorReactor:pickfirstModified b 数据库反应器 ZcDbDatabaseReactor:objectAppended ZcDbDatabaseReactor:objectErased Z

64、cDbDatabaseReactor:objectModified ZcDbDatabaseReactor:objectOpenedForModify c 对象反应器 ZcDbObjectReactor:erased ZcDbObjectReactor:modified ZcDbObjectReactor:openedForModify 如何在使用一个反应器? 通常按照以下步骤进行: 1) 继承一个新反应器类从已有的反应器类中,并根据自身需要,重写和实现特定用途的虚通告函数 2) 对反应器进行初始化 3) 添加反应器到对应的通告者的反应器列表 注意事项: 1) 当使用完一个反应器后,需要将反应

65、器进行从通告者的反应器列表里移出,然后删除反应器对象(如果反应器是一个数据库长驻对象,则不用删除) 2) 更多详细的反应器应用请参考 ZRXSDKSample目录下的示例程序 ZRX_MiscSignEntityUi & PersisitReactor 事务管理事务管理 什么是事务?什么是事务? 事务(transaction)是数据库里的一种概念,指作为单个逻辑工作单元执行的一系列操作。 对于 ZRX 来说,就是 ZcDbDatabase 的 ZcDbTransaction。下图是一个应用例子: 以下是示意代码: void drawOlympicLogo() ZcDbTransactionMa

66、nager* pTransManager = curDb()-transactionManager(); pTransManager-startTransaction();/事务开始 try /添加五环图层 ZcDbLayer* pLayer = createNewLayer(五环); if (pLayer = NULL | addToDb(pLayer,pTransManager) = false) throw (创建图层失败!); /添加五环 OlympicRings* pOlympicRings = createNewRings(); if (pOlympicRings = NULL |

67、 addToDb(pOlympicRings,pTransManager) = false) throw (创建五环失败!); /添加五环填充 RingsFillHatch* pFillHatch = createNewHatch(pOlympicRings); 绘制奥运五环 添加”五环”图层 添加五个圆环 分别用五种颜色填充圆环 设置圆环和填充的图层为”五环” 单个逻辑工作单元 一系列操作 如左图所示,绘制奥运五环可以看作是一个事务.这个事务包含四个操作。只有当这四个操作全部执行成功,才会提交数据到数据库,如果任何一个操作失败,整个工作单元全部取消,不会对数据库有任何修改。 可谓 “一损俱损

68、,共同进退” if (pFillHatch = NULL | addToDb(pFillHatch,pTransManager) = false) throw (创建五环填充失败!); /设置五环和填充的图层 if (setEntsLayer(pOlympicRings, pFillHatch, pLayer) = false) throw (设置五环和填充的图层失败!); pTransManager-endTransaction();/事务结束,数据入库 catch(ZCHAR *pMessage) zcutPrintf(_T(nError: %sn),pMessage); pTransMa

69、nager-abortTransaction();/事务取消,清除数据 事务机制的特性:事务机制的特性: 除了上述的维护数据库的稳定性和一致性的优点之外, 事务相对于常规的 open-close 机制来说,还有以下特性: 限制少限制少 open-close 机制里,一个对象处于打开状态,就不能再以 forWrite 方式打开。而事务机制里,对象处于打开状态的时候,还可以以 forWrite 方式打开。(open-close 机制的打开调用zcdbOpenZcDbObject 全局函数,事务机制的打开调用 ZcDbTransactionManager:openObject函数) 效率高效率高 因

70、为在每个对象的 open-modify-close 的过程中,会有一系列影响效率的流程执行。这些流程包括: undo 数据的记录与备份; 实体图像的重生成; 和一些通知的发送。 这些流程在 close调用的时候都会执行。 所以如果一个工作单元采用 open-close 机制对上十个甚至上百个对象进行修改的时候,那就会执行同样多次数的上述流程。而采用 transaction 机制,则只会在事务结束的时候执行一次。 更安全更安全 在多个模块, 多个应用程序同时操作一张图纸的情况下, 使用事务机制来打开对象进行修改,就不用担心另外的模块或另外的应用程序已经打开了这个对象。 而 open-close

71、机制在这种情况下是不安全的。 支持实时显示支持实时显示 在事务中进行添加或修改的实体,在事务未结束,数据未入库的情况下,通过以下的函数调用,可以达到实时显示的效果: zctrTransactionManager-queueForGraphicsFlush(); zctrTransactionManager-flushGraphics(); zcedUpdateDisplay(); 使用事务的注意事项:使用事务的注意事项: 与与 open-close 一起使用要注意一起使用要注意 事务可以与 open-close 混合使用,但必须各自配对,不能在 ZcDbTransaction:getObjec

72、t()打开某个对象后,又调用该对象自身的 close()函数关闭。 打开对象要注意打开对象要注意 事务机制虽然可以在对象处于 openForWrite 或 openForRead 的状态下, 调用 getObject()以读或写的方式打开,但是在对象处于 openForNotify 状态下时,是不能用 getObject()以写方式打开的。 嵌套使用要注意嵌套使用要注意 事务可以嵌套使用,即在一个事务中再开始一个事务。但要注意两点: 1. 不能在事务结束或放弃的过程中开始一个事务。 2. 在有嵌套事务的情况下,只有最外层的事务结束的时候,才会提交所有事务的数据。 事务管理功能接口:事务管理功能

73、接口: 1) 长事务管理类 ZcApLongTransactionManager:checkIn ZcApLongTransactionManager:checkOut ZcDbLongTransaction:addToWorkSet ZcDbLongTransaction:newWorkSetIterator ZcDbLongTransaction:removeFromWorkSet ZcDbLongTransaction:originBlock ZcDbLongTransaction:originObject ZcDbLongTransaction:workSetHas 2) 长事务工作集

74、遍历器 ZcDbLongTransWorkSetIterator:start ZcDbLongTransWorkSetIterator:step ZcDbLongTransWorkSetIterator:curObjectIsErased ZcDbLongTransWorkSetIterator:curObjectIsPrimary ZcDbLongTransWorkSetIterator:curObjectIsRemoved ZcDbLongTransWorkSetIterator:done ZcDbLongTransWorkSetIterator:objected 3) 事务管理类 ZcD

75、bTransactionManager:getAllObjects ZcDbTransactionManager:getObject ZcDbTransactionManager:abortTransaction ZcDbTransactionManager:addNewlyCreatedDBRObject ZcDbTransactionManager: startTransaction 4) 事务类 ZcTransaction:getAllObjects ZcTransaction:getObject 文档管理文档管理 ZWCAD 是一个支持多文档(MDI)的应用程序,并提供了一套针对 ZW

76、CAD 文档管理的应用接口,每一个打开的 dwg 图形为一个 ZcApDocument 文档对象,文档管理应用类ZcApDocManager 管理所有的 ZcApDocumen 对象。文档迭代器 ZcApDocumentIterator 提供一套迭代的方法来遍历当前 CAD 打开的所有文档。文档反应器 ZcApDocManagerReactor 用来通告当前文档操作的事件。 1)文档对象类 ZcApDocument ZcApDocument:cDoc ZcApDocumen:docTitle ZcApDocument:fileName ZcApDocument:isReadOnly 2)文档管

77、理应用类 ZcApDocManager ZcApDocManager:addReactor ZcApDocManager:appContextNewDocument ZcApDocManager:appContextOpenDocument ZcApDocManager:curDocument ZcApDocManager:document ZcApDocManager:documentCount ZcApDocManager:newAcApDocumentIterator ZcApDocManager:openDocument ZcApDocManager:removeReactor 3)文

78、档迭代器 ZcApDocumentIterator ZcApDocumentIterator:docment ZcApDocumentIterator:done ZcApDocumentIterator:step 4) 文档反应器 ZcApDocManagerReactor:documentActivated ZcApDocManagerReactor:documentBecameCurrent ZcApDocManagerReactor:documentCreated ZcApDocManagerReactor:documentCreateStarted ZcApDocManagerReac

79、tor:documentDestroyed ZcApDocManagerReactor:documentToBeActivated ZcApDocManagerReactor:documentToBeDeactivated ZcApDocManagerReactor:documentToBeDestroyed 代码示例:如何获得到当前 ZWCAD 打开的所有文档名称? void listDocuments() ZcDbDatabase* pDb = zcdbHostApplicationServices()-workingDatabase(); ZcApDocument* pCurDoc =

80、zcDocManager-document(pDb); const char * strCurTitle = pCurDoc-docTitle(); zcutPrintf(n The current document title is: %s, strCurTitle); ZcApDocumentIterator* pDocIter; pDocIter = zcDocManager-newZcApDocumentIterator(); zcutPrintf(n- List all open documents:); ZcApDocument* pDoc = NULL; int nIndex =

81、 1; for ( ; !pDocIter-done(); pDocIter-step() pDoc = pDocIter-document(); const char * strTitle = pDoc-docTitle(); const char * strFileName = pDoc-fileName(); zcutPrintf(n %d: The file title = %s; The file name = %s, nIndex, strTitle, strFileName); nIndex+; delete pDocIter; 提示:文档管理类的接口的详细使用可以参考 ZRXS

82、DKSample目录下的示例程序DocumentManager 自定义实体自定义实体 OPM 什么是自定义实体什么是自定义实体 OPM? 针对自定义实体类型, 用户可自行定义和扩展该实体的属性, 根据具体需要对自定义实体的特性定义和分类。支持多种数据类型的属性,包括:字符串、整型、浮点、变体等。支持多个实体属性集合的交集。 自定义实体自定义实体 OPM 特性:特性: 1) 显示自定义属性的名称 2) 显示基本属性(颜色,图层,线型等) 3) 显示自定义实体自定义的属性 4) 分类显示自定义实体属性 5) 编辑修改自定义实体属性(支持多个实体属性交集的编辑) OPM 使用注意事项:使用注意事项:

83、 1) 目前所支持的自定义实体属性栏的显示还不全面,从实体类型而言,仅支持从IZcadEntity 派生的自定义实体; 2) 所 支 持 的OPM接 口 仅 限 于 数 据 层 面 ( 如IOPMPropertyExpander ,IOPMPropertyExtension) ,暂不支持与界面相关的接口(如 IPerPropertyDisplay) 。 提示:自定义实体 OPM 的使用可参考 ZRXSDKSample目录下的示例程序 ZRX_Misc MFC 扩展扩展 UI 类类 ZRX 支持用户使用 MFC 来扩展开发自己的应用程序。 例如在 ZRX 应用程序上使用 MFC 创建 CDial

84、og、CButton、CComboBox、CEdit 等控件。同样, ZRX 提供了几个基本的 UI 接口类供二次开发使用: CZdUiBaseDialog继承于 CDialog,提供基本对话框窗口功能 CZdUiDailog继承于 CZdUiBaseDialog,提供窗口尺寸变化和永久数据的存储功能 CZcUiDialog继承于 CZdUiDailog,扩展和完整 CZdUiDailog 类的功能 可停靠面板(可停靠面板(DockControlBar) ZWCAD 可停靠面板功能主要使用全局接口函数 zdsw_excuteUICommand, 把特定功能的回调函数转接到 ZWCAD 主 UI

85、 线程上执行。因此,在应用该功能前,需要事先完成特性功能的回调函数。 全局接口函数说明:全局接口函数说明: UINT zdsw_excuteUICommand( UICOMMANDPROC pfnUICMDProc, /用户定义回调函数指针 LPVOID pParam /用户自定义参数 ); 参 数: pfnUICMDProc用户自定义函数指针,用户必须把创建、修改、显示界面元素的代码写在该函数内。 pParam用户自定义参数,该参数用户可由用户根据需要自由传值,最终会作为指针pfnUICMDProc 所指向的函数的输入参数。 返回值: 如果 pfnUICMDProc 为空或调用过程发生错误,

86、返回值为-1,否则返回 pfnUICMDProc 所指向回调函数执行的结果状态。 回调函数定义说明:回调函数定义说明: 可停靠面板定义的回调函数格式如下: UINT CallBackFunc(LPVOID pParam) UINT CallBackFunc(LPVOID pParam) /To Do: return -1; 代码示例:代码示例: / 定义可停靠窗口功能类,并实现 class CSCRMenu : public CDialogBar DECLARE_DYNAMIC(CSCRMenu) public: CSCRMenu(); virtual CSCRMenu(); virtual

87、void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler); public: BOOL ScreenMenu(); CListCtrl m_EntityInfoList; protected: CComboBox m_LayerComboBox; protected: void InitDCEditButton(); void InitLayerComboBox(); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnBtnMessagebox(); afx_msg

88、 void OnBtnLine(); afx_msg LRESULT OnInitDialog(WPARAM wParam, LPARAM lParam); afx_msg void OnBtnDCEdit(); afx_msg void OnBtnGetObjInfo(); afx_msg void OnBtnCloseupLayer(); ; /定义用户自定义回调函数: UINT CreateScreenMenu(LPVOID pParam) if(pParam) return (CSCRMenu*)pParam)-ScreenMenu(); return -1; / 转接功能函数到ZWC

89、AD主UI线程上执行 void CreatSCRMenu() zdsw_executeUICommand(CreateScreenMenu, &m_SCRMenu); 注意事项:注意事项: 1)创建界面的所有元素必须在特定函数内实现,并以该函数指针作为输入参数,通过使用全局接口函数 zdsw_ExecuteUICommand 调用来达到功能上的实现, 切记不能直接在 ZRX 命令里创建用户界面; 2)在用户消息响应代码里,需要修改图纸数据的操作时,必须调用 zcedPostCommand 发送ZRX 命令名以触发 ZRX 命令函数的方式进行。 由于从发送 ZRX 命令名到执行 ZRX 命令不是

90、即时的,所以调用 zcedPostCommand 之后不宜编写其它逻辑代码。 3) 调用此接口创建用户界面的二次开发应用程序必须为 MFC 扩展 DLL,否则无法正常创建用户界面。 全局函数应用全局函数应用 ZRX 除了提供了一些应用功能类接口,同时也提供了各种应用的全局函数,限于章节,不在此一一阐述,详细请参见 附录 A: 。 ZZ ZRRRXXX移移移移移移植植植植植植指指指指指指南南南南南南 本指南主要讲述,如何从原在 AutoCAD 上运行的 ObjectARX 的应用程序移植到 ZWCAD上,并且能够正常、正确地运行。在前面ZRX 介绍章节里,我们已经介绍了 ZRX 在代码上已经作到

91、能够很好地兼容 ARX 代码,因此在 ARX 程序在向 ZRX 移植时,几乎不用修改用户代码,通过修改工程配置,重新编译链接,便可以转接到 ZWCAD 上来运行,以下是针对不同版本间移植的步骤。 从从 ObjectARX 2006 移植到移植到 ZRX 移植的步骤: 1)首先用 Visual Studio 2008 打开该工程,按提示信息提示将原工程升级为 vc9 工程。 2)在工程属性对话框的 C/C+-General(常规)-Additional(附加包含目录)中,修改头文件包含路径为 ZRXSDKarxport 的对应的目录,删掉原先的头文件包含路径。例如头文件包含路径为“C:ZRXSD

92、K arxport” 。 3) 在工程属性对话框的 Linker(链接器)-Input(输入)-Additional Dependencies(附加依赖项)中,增加所依赖的库 ZRX.lib,并同时去掉原先的依赖项。 3) 在工程属性对话框的 Linker(链接器)-General(常规)-Additional Dependencies(附加库目录)中,修改库文件包含路径为 ZRXSDKlibvc9 的对应的目录,删掉原先的库文件包含路径。例如库文件包含路径为“C:ZRXSDK libvc9” 。 4) 在工程属性对话框的 Linker(链接器)-General(常规)-Output File

93、(输出文件)的后缀改为 dll. 5) 在工程属性对话框的“General(常规) - Character Set(字符集)” , 确保选项为“Use Muti-Byte Character Set(使用多字节字符集) ” 7) 在工程属性对话框的“C/C+-Language(语言)- Treat wchart_t as Built-in Type(将wchar_t 视为内置类型)” ,确保选项为“No(否)” 8)确保上述过程准备无误,编译程序,生成可以执行的 dll 文件 9)使用“APPLOAD”命令,加载编译成功的 dll,并执行命令 从从 ObjectARX 2007/2008 移植

94、到移植到 ZRX 从 ObjectARX 2007/2008 的移植的步骤和 ObjectARX 2006 基本上一样, 在此不在重复叙述。但还是存在两点不同的地方需要注意下: 1) 在工程属性对话框的 “General(常规) - Inherited Propjet Property Sheets(继承的项目属性表)” , 确保选项为“空” 2) 在工程属性对话框的 Linker(链接器)-Input(输入)-Module Definition File(模块定义文件), 如果使用了 ObjectARXInc 的“AcRxDefault.def”文件, 需要进行清空。或者在自己应用程序里增加

95、相应的.def 文件 针对针对 ARX UI 的移植的移植 目前, ZRX 还没有提供和 ARX UI 一样的功能接口。如果用户程序使用了大量的 ARX UI接口,在移植 ARX 程序时,可以将 ARX UI 接口暂替换为微软 MFC 的 UI 的方式。通过调用微软 MFC UI 功能达到用户交互目的,以下是将 ARX UI 替换 MFC 类的对应关系: CAcUiSelectButton CButton CAcUiBitmapButton CBitmapButton AcFile CFile CAcUiFileDialog CfileDialog CAcUiEdit CEdit AcCStd

96、ioFile CstdioFile CAcUiListCtrl ClistCtrl CNavListCtrl ClistCtrl CAdUiListBox CList CAcUiListBox Clist CAcUiTab CtabCtrl CNavFilter CStringArray CNavDataArray CtypedPtrArray CNavFilterArray CTypedPtrArray CAdUiGroupCtrl CStatic CAdUiHeaderCtrl CHeaderCtrl CAdUiComboBox CcomboBox 移植注意事项移植注意事项 4. ZRXS

97、DK for ZWCAD 2010 采用 Microsoft Visual C+ 2008 编译环境,在移植时如果被移植的是低版本的工程文件,需要进行升级转换; 5. ZRXSDK for ZWCAD 2010 兼容 ObjectARX 2008 及以下版本; 6. ZRXSDK for ZWCAD 2010 目前只支持使用的多字节 MBCS,而不支持 UNICODE,在工程属性配置对话框的“General(常规) - Character Set(字符集)” , 确保选项为“Use Muti-Byte Character Set(使用多字节字符集) ” ; 7. 工程属性配置对话框的“C/C+

98、-Language(语言)- Treat wchart_t as Built-in Type(将wchar_t 视为内置类型)”确保选项为“否” 。 ZZ ZRRRXXX常常常常常常见见见见见见问问问问问问题题题题题题解解解解解解答答答答答答 说明:以下的问题解答针对ARX代码形式的ZRX程序同样有效: 0001 为什么使用了命令宏ZCED_ZRXCOMMAND_ENTRY_AUTO(appClassName, cmdGroupName, globCmd, locCmd, cmdflags, UIContext), 其中命令名“locCmd”这个命令在ZWCAD里不能识别? 解答: 这个问题跟

99、ZWCAD的命令名机制有关系, 目前ZWCAD只能做到识别一个命令名globCmd, locCmd命令暂时还不支持, 诸多不便请谅解! 0002 为什么 zcedPostCommandPrompt、zcedAddDropTarget,zcedRemoveDropTarge 等全局函数在编译链接提示无法识别的外部函数? 解答:直接在调用该函数的 cpp 文件里 Include zced.h 头文件即可。 0003 为什么 ZcDbDictionary:newIterator : function does not take 1 arguments ? *Code sample: ZcDbDict

100、ionary *pGroupDict = NULL; pDb-getGroupDictionary(pGroupDict,ZcDb:kForRead); ZcDbDictionaryIterator *pDictIter2 = pGroupDict-newIterator(ZcRx:kDictCollated);/ Complie error! 解答:ZRX是以Object ARX 2008里的API类为基准,在Object ARX 2006 里的该函数AcDbDictionary:newIterator(AcRx:kDictCollated)带一个参数, 在Object ARX 2008 里

101、不带参数。该问题在使用上不受影响。 0004 为什么我的工程在编译链接的时候,VC开发平台提示无法解析的外部符号wchar_t*_stdcall_com_util:ConvertStringToBSTR(charconst*)(?ConvertStringToBSTR_com_utilYGPA_WPBDZ) ? 解答: 这个问题可以通过改工程设置解决 ConfigurationProperties-C/C-LanguageTreatwchar_tasBuilt-inType=No 注意:#progma comment(lib, comsupp.lib); 0005 为什么需要将ZRX的工程配置

102、-C/C+-语言-将wchar_t视为内置类型改为“否” ,或者将wchar_t视为内置类型有什么作用? 解答: 将wchar_t视为内置类型有什么作用?编译器可以对wchar_t做类型检查,否则wchar_t只是一个简单的typedef.CInPlaceEdit&operator=(constCInPlaceEdit&a)你申明了返回类型,却没有在实现中提供返回值,是不对的。如果不希望这个函数被调用,可以不加 0006 为什么我的工程在编译链接时产生以下错误? “* error LNK2001: unresolved external symbol acrxGetApiVersion * f

103、atal error LNK1120: 1 unresolved externals * fatal error LNK1141: failure during build of exports file” 解答: 打开工程的.def文件, 直接将输出接口“acrxGetApiVersion”注释掉! 因为ZRX目前没有提供对该接口的输出。 如: “EXPORTS acrxEntryPoint PRIVATE ;acrxGetApiVersion PRIVATE” 注意: 在 ZRXSDK for ZWCAD 2010 里该问题已经作了容错处理 0007 ZRX 在使用 resbuf-resv

104、al.rstring 时,在使用 ads_relrb 函数对 resbuf 进行内存释放时,引起死机问题? 解答: ZRX resbuf 在使用 resbuf.resval.rstring 时, 需要先分配一块内存空间,然后再通过strcpy 函数将值赋给 resbuf.resval.rstring,这样就不会释放 resbuf 时引起死机问题。代码示例如下: struct resbuf* result; result = zds_newrb(RTSTR); result-resval.rstring = new ACHAR64; strcpy(result-resval.rstring, a

105、bc); zds_relrb(result); 0008 为什么使用了#include , 代码引用方式如std:map Var等,工程在编译链接时产生如下错误? “error LNK2001: unresolved external symbol “_declspec(dllexport) public:_thiscall std:basic_stringchar, struct std:char_traits, calss std:allocator ” 解答: 原因是工程在链接时找不到“msvcprtd.lib”库文件,在工程配置里里增加依赖库项“ msvcprtd.lib”即可。 00

106、09 在使用resbuf链表结构类型时,使用了malloc对字符串分配内存,在调用zcutRelRb释放时有内存报错?全局函数zcutRelRb实际调用的是MFC方式的delete进行内存释放,例如出错代码编写形式如下: Struct resbuf* pRb; char strText10 = “ZRXSDK”; pRb = zcutNewRb(ZcDb:kDxfRegAppName); pRb-resval.rstring = (char*)malloc(strlen(strText)+1); zcutRelRb(pRb); / 内存报错! 解答: 内存分配和释放不匹配造成,可以通过以下方式

107、解决: 1) 在源文件的开始位置增加以下代码(如果工程不支持 MFC) : #define _AFXDLL #include 2)将 malloc 修改为 new 方式 Struct resbuf* pRb; char strText10 = “ZRXSDK”; pRb = zcutNewRb(ZcDb:kDxfRegAppName); /pRb-resval.rstring = (char*)malloc(strlen(strText)+1); pRb-resval.rstring = new char(strlen(strText)+1); zcutRelRb(pRb); / 内存释放OK

108、! 附附附附附附录录录录录录AAA: : :(ZRX 现支持全局函数列举): zcapLongTransactionManagerPtr zcdbAlloc zcdbAngToF zcdbAngToS zcdbDictAdd zcdbDictNext zcdbDictRemove zcdbDictRename zcdbDictSearch zcdbDisplayPreviewFromDwg zcdbDisToF zcdbEcs2Ucs zcdbEcs2Wcs zcdbEntDel zcdbEntGet zcdbEntGetX zcdbEntLast zcdbEntMake zcdbEntMak

109、eX zcdbEntMod zcdbEntNext zcdbEntUpd zcdbFree zcdbGetAdsName zcdbGetObjectId zcdbGetReservedString zcdbHandEnt zcdbInters zcdbIsPersistentReactor zcdbNamedObjDict zcdbOpenzcdbEntity zcdbOpenzcdbObject zcdbOpenObject zcdbPersistentReactorObjectId zcdbRawAngToF zcdbRawAngToS zcdbRealloc zcdbRegApp zcd

110、bRToS zcdbSNValid zcdbTblNext zcdbTblObjName zcdbTblSearch zcdbUcsMatrix zcdbWcs2Ecs zcdbWcs2Ucs fromZcDbTextStyle zcedAlert zcedZrxLoad zcedZrxLoaded zcedArxUnload zcedCmd zcedCommand zcedDefun zcedDragGen zcedEntSel zcedFindFile zcedGetAngle zcedGetAppName zcedGetArgs zcedGetCfg zcedGetCName zcedG

111、etCorner zcedGetCurrentSelectionSet zcedGetCurViewportObjectId zcedGetDist zcedGetEnv zcedGetFileD zcedGetFileNavDialog zcedGetFunCode zcedGetInput zcedGetInt zcedGetKword zcedGetOrient zcedGetPoint zcedGetReal zcedGetRGB zcedGetString zcedGetSym zcedGetVar zcedGraphScr zcedGrDraw zcedGrRead zcedGrT

112、ext zcedGrVecs zcedHelp zcedInitGet zcedInvoke zcedMenuCmd zcedNEntSel zcedNEntSelP zcedOsnap zcedPrompt zcedPutSym zcedRedraw zcedRegFunc zcedRegisterFilterWinMsg zcedRemoveFilterWinMsg zcedRetInt zcedRetList zcedRetName zcedRetNil zcedRetPoint zcedRetReal zcedRetStr zcedRetT zcedRetVal zcedRetVoid

113、 zcedSetCfg zcedSetEnv zcedSetFunHelp zcedSetVar zcedSetView zcedSSAdd zcedSSDel zcedSSFree zcedSSGet zcedSSGetFirst zcedSSLength zcedSSMemb zcedSSName zcedSSNameX zcedSSSetFirst zcedTablet zcedTextBox zcedTextScr zcedTrans zcedUndef zcedUpdate zcedUsrBrk zcedVports zcedXformSS zcrx_abort zcrxLoadMo

114、dule zcrxRegisterAppMDIAware zcrxRegisterService zcrxSysRegistry zcrxUnlockApplication deleteZcRxClass newZcRxClass zcutAngle zcutBuildList zcutCvUnit zcutDelBuffer zcutDelString zcutDistance zcutIsAlNum zcutIsAlpha zcutIsCntrl zcutIsDigit zcutIsGraph zcutIsLower zcutIsPrint zcutIsPunct zcutIsUpper

115、zcutIsXDigit zcutNewBuffer zcutNewRb zcutNewString zcutPolar zcutPrintf zcutRelRb zcutSplitString zcutSPrintf zcutToLower zcutToUpper zcutUpdString zcutWcMatch delString newString updString zcad_msize zcad_strdup zcad_calloc zcad_free zcad_malloc zcad_realloc zcadErrorStatusText zcByteSwap zcDocMana

116、gerPtr ZcFStream_curLocale ZcFStream_wideToMulti zcReadAnsiCharFromCFile zcReadCIFFromCFile zcReadUtf16CharFromCFile zcReadUtf8CharFromCFile zcWriteWCharToCFile c4ObjIdGreaterThanOrEqual c4ObjIdIsEqualTo c4ObjIdIsGreaterThan c4ObjIdIsLessThan c4ObjIdLessThanOrEqual c4ObjIdNotEqualTo c5ObjIdGreaterTh

117、anOrEqual c5ObjIdIsEqualTo c5ObjIdIsGreaterThan c5ObjIdIsLessThan c5ObjIdLessThanOrEqual curDoc modelToPixel pixelToModel rxInit ucsNormalVector ucsXDir ucsYDir zdsw_executeUICommand zdsw_zcadMainWnd zdsw_zcadDocWnd zds_action_tile zds_add_list zds_client_data_tile zds_dimensions_tile zds_done_dialo

118、g zds_done_positioned_dialog zds_end_image zds_end_list zds_fill_image zds_get_attr zds_get_attr_string zds_get_tile zds_load_dialog zds_mode_tile zds_new_dialog zds_new_positioned_dialog zds_set_tile zds_slide_image zds_start_dialog zds_start_image zds_start_list zds_term_dialog zds_unload_dialog zds_vector_image

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号