ZRX开发手册

ZRXSDK for ZWCAD 2010

开发手册

中望龙腾软件股份有限公司

目 录 版本版本更更新新说说明明(2009-7-30至2009-12-31)版本更新说明:................................3 版本更新概述:..................................................................................................................................3 版本更新内容:..................................................................................................................................3 ZR 概 ZRXX 概述ZRX 概 述述.......................................................................................7 ZRX简 介............................................................................................................................................7 开发环境要求......................................................................................................................................7 功能特性列举......................................................................................................................................7 ZRX编码特征......................................................................................................................................8 ZR发ZRXX开开发指指南南.................................................................................10 ZRX开发指南软件开发包........................................................................................................................................10 创建一个简单的ZRX........................................................................................................................11 程序入口和命令定制........................................................................................................................19 加载及运行........................................................................................................................................21 注意事项............................................................................................................................................21 数据库概述及操作............................................................................................................................22 自定义类............................................................................................................................................26 反应器................................................................................................................................................29 事务管理............................................................................................................................................31 文档管理............................................................................................................................................34 自定义实体OPM...............................................................................................................................35 MFC扩展UI类...................................................................................................................................36 可停靠面板(DOCKCONTROLBAR)................................................................................................36 全局函数应用....................................................................................................................................39 ZR植ZRXX移移植指指南南.................................................................................40 ZRX移植指南从OBJECTARX 2006移植到ZRX......................................................................................................40 从OBJECTARX 2007/2008移植到ZRX.............................................................................................45 针对ARX UI的移植..........................................................................................................................47 移植注意事项....................................................................................................................................48 ZR见ZRXX常常见问问题题解解答答.........................................................................49 ZRX常见问题解答附录:附录AA:(ZRX现支持全局函数列举)附录A::......................................52 版版本本更更新新说说明明(2009-7-30至2009-12-31):

版本更新概述:

ZRX for ZWCAD 2010在前一个版本ZRX for ZWCAD 2009的基础上,加强和完善常用反应器功能,新增加对永久反应器的支持;提供了一套兼容事务管理功能的接口;新增加了CZdUiBaseDialog、CZdUiDailog、CZcUiDialog基本UI界面类;新增加了部分全局函数;完善了数据库应用接口,例如ZcDbDatabase、ZcDbObject、ZcDb2dPolyline等类,使之比以前版本更稳定更正确;兼容处理acrxGetApiVersion函数导出,在移植ARX时的过程中不再需要在.def文件里注释或者删除acrxGetApiVersion函数的导出了。更多详细介绍请参考下一节“版本更新内容”。

注意 :ZRX for ZWCAD 2010要求用户使用ZWCAD 2010版本的CAD平台,使用Microsoft Visual C++ 2008 编译环境。

版本更新内容:

1. 增加及改善的反应器类接口 a 永久反应器 ZcDbObject::erased ZcDbObject::modified ZcDbObject::openedForModify b. 编辑反应器 命令相关

ZcEditorReactor::commandEnded ZcEditorReactor::commandWillStart 数据库相关

ZcEditorReactor::abortSave ZcEditorReactor::beginClose ZcEditorReactor::beginSave ZcEditorReactor::beginDwgOpen ZcEditorReactor::endDwgOpen ZcEditorReactor::databaseConstructed ZcEditorReactor::databaseToBeDestroyed ZcEditorReactor::dwgFileOpened ZcEditorReactor::saveComplete

ZcEditorReactor::initialDwgFileOpenComplete 深度克隆相关

ZcEditorReactor::abortDeepClone ZcEditorReactor::beginDeepClone ZcEditorReactor::endDeepClone 插入操作相关

ZcEditorReactor::abortInsert ZcEditorReactor::beginInsert ZcEditorReactor::endInsert ZcEditorReactor::otherInsert 鼠标事件操作相关

ZcEditorReactor::beginDoubleClick ZcEditorReactor::beginRightClick Wblock相关

ZcEditorReactor::abortWblock ZcEditorReactor::beginWblock ZcEditorReactor::beginWblockObjects ZcEditorReactor::endWblock ZcEditorReactor::otherWblock ZcEditorReactor::wblockNotice XREF相关

ZcEditorReactor::beginAttach ZcEditorReactor::endAttach ZcEditorReactor::otherAttach 其他

ZcEditorReactor::pickfirstModified b 文档反应器

ZcApDocManagerReactor::documentActivated ZcApDocManagerReactor::documentBecameCurrent ZcApDocManagerReactor::documentCreated ZcApDocManagerReactor::documentCreateStarted ZcApDocManagerReactor::documentDestroyed ZcApDocManagerReactor::documentToBeActivated ZcApDocManagerReactor::documentToBeDeactivated ZcApDocManagerReactor::documentToBeDestroyed c 数据库反应器

ZcDbDatabaseReactor::objectAppended ZcDbDatabaseReactor::objectErased ZcDbDatabaseReactor::objectModified

ZcDbDatabaseReactor::objectOpenedForModify d 对象反应器

ZcDbObjectReactor::erased ZcDbObjectReactor::modified ZcDbObjectReactor::openedForModify 2. 增加事务管理功能接口 a 长事务管理类

ZcApLongTransactionManager::checkIn ZcApLongTransactionManager::checkOut ZcDbLongTransaction::addToWorkSet ZcDbLongTransaction::newWorkSetIterator ZcDbLongTransaction::removeFromWorkSet ZcDbLongTransaction::originBlock ZcDbLongTransaction::originObject ZcDbLongTransaction::workSetHas b长事务工作集遍历器

ZcDbLongTransWorkSetIterator::start ZcDbLongTransWorkSetIterator::step

ZcDbLongTransWorkSetIterator::curObjectIsErased ZcDbLongTransWorkSetIterator::curObjectIsPrimary ZcDbLongTransWorkSetIterator::curObjectIsRemoved ZcDbLongTransWorkSetIterator::done ZcDbLongTransWorkSetIterator::objected c 事务管理类

ZcDbTransactionManager::getAllObjects ZcDbTransactionManager::getObject ZcDbTransactionManager::abortTransaction

ZcDbTransactionManager::addNewlyCreatedDBRObject ZcDbTransactionManager:: startTransaction d 事务类

ZcTransaction::getAllObjects ZcTransaction::getObject

3. 增加基本UI界面类 CZdUiBaseDialog CZdUiDialog CZcUiDialog

上面的UI类接口,作为ZRX的几个很基本的 UI对话框类, 实现了BeginEditorComand、CancelEditorCommand、 CompleteEditorCommand等功能函数。 在用户与CAD交互过程中,

将操作焦点从对话框切换到命令行,提供了功能机制。

4. 增加全局函数 zcedSetCurrentVport zcedGetCurViewportObjectId modelToPixel pixelToModel ucsNormalVector ucsXDir ucsYDir

zdsw_executeUICommand

5. 部分接口类的完善

a 针对ZcDbDababase类部分成员函数功能进行加强和完善 b 增加对ZcDbBody、ZcDbShape图形实体类的支持

c 增加对ZcApDocManager::sendStringToExecuted 接口功能的基本支持,(注意:该接口函

数目前只对第二参数const char* pszExecute有效) d 增强及完善ZcDb2dPolyline图形实体类 e 完善ZcDbObject对象基类

6. 兼容处理acrxGetApiVersion函数导出

在先前的版本里,将ARX程序移植到ZRX的工程中,需要手动将工程里 .def 文件里的acrxGetApiVersion导出函数进行注释或者删除掉,否则VC编译系统会提示“error LNK2001: unresolved external symbol acrxGetApiVersion…”链接错误。该版本针对这个问题做了容错处理,用户在移植的工程中不需要再去修改.def文件了。

>>>更多详细说明请参考《ZRX开发指南》。

ZZR概 述述 RXX 概ZRX简 介

ZRX——ZWCAD Runtime eXtension, 是ZWCAD提供一套面向对象的C++应用程序接口。用户使用这套接口可以开发各种ZWCAD功能应用的程序,包括几何图形的创建、创建自定义类、多文档应用、事件反应通告、对DWG数据库进行操作等。 其次, ZRX在ZWCAD的公开的接口上实现了ARX对应的类和函数,在代码风格和结构上,ZRX完全兼容ARX代码,原ARX程序在几乎不改任何代码的前提下,通过重新编译便可直接移到在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 2010 平台。

功能特性列举

1.常用基本功能,如DWG数据库读写访问,注册命令,获取用户输入点或者字符串等; 2.数据库图形实体, 如ZcDbLine、ZcDbCircle、ZcDbArc等; 3.扩展数据和扩展字典, XData & XDictionary;

4.自定义实体和对象,从ZcDbObject、ZcDbEntity或其它类派生;

5.文档管理功能,提供文档管理器ZcApDocManager ,文档类ZcApDocument等接口; 6.反应器功能,提供数据库反应器,文档反应器,编辑器反应器(包括 命令反应器,鼠标

右键消息等),对象反应器,永久反应器; 7.拖动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 != zcedGetPoint( NULL, \

return;

if (RTNORM != zcedGetPoint( NULL, \

return;

ZcDbLine* pLine = new ZcDbLine(pntStart, pntEnd); ZcDbObjectId eId;

addEntityToDb(eId, pLine); pLine->close();

ARX 程序编码: void drawSimpleLine() { }

AcGePoint3d pntStart; AcGePoint3d pntEnd;

if (RTNORM != acedGetPoint( NULL, \

return;

if (RTNORM != acedGetPoint( NULL, \

return;

AcDbLine* pLine = new AcDbLine(pntStart, pntEnd); AcDbObjectId eId;

addEntityToDb(eId, pLine); pLine->close();

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

ZZR开发 RX发指X开指南南 软件开发包

完成ZRXSDK的安装后,安装程序将在用户指定的位置创建以下的子目录和内容:

arxPort

——兼容ARX代码使用的头文件目录,用户代码如果是以“A”等字母特性打头的ARX编码风格,则需要包括该头文件目录

inc

——ZRX所有头文件目录,“arxPort” 与“inc”头文件目录,用户只需要包含其一

dll

——ZRX dll库目录,该目录下包含ZRX.dll 和 ZXDB.dll,在使用ZRX开发时,需要将该目录下所有的dll文件复制到ZWCAD平台的安装目录下,确保与ZWCAD.exe同目录。

lib

——ZRX lib库目录,该目录下包含ZRX.lib 和 ZXDB.lib

——ZRX 所有在线帮助文档目录,包括《版本更新说明》、《ZRX开发指南》、《ZRX移植指南》、《ZRX常见问题解答》等

docs

samples

——ZRX 提供的示例程序目录,该目录里的示例程序展示了ZRX不同功能特性的使用方法,有:SimpleLine(简单实体)、RasterImage(光栅图像)、DockControlBar(停靠工具条)、 PersistReactor(永久反应器)、DocumentManager(文档管理应用)、ZRX_MISC(综合应用,自定义实体、拖动JIG、反应器、OPM)。 说 明:

1) ZRXSDK开发包可以放置到任何目录下,也可以放置到ZWCAD的安装目录下,保持

ZRXSDK及其子目录的结构不变。

2) 在使用ZRXSDK前,确保ZRX..dll 、ZXDB.dll、PropertyBarRes.dll三个库文件拷贝到

ZWCAD相应的安装目录下, 保持这三个库文件与ZWCAD.EXE在同一路径下。

创建一个简单的ZRX

用户可以使用VC的“新建”来创建一个新的ZRX工程,(如果用户安装了ZrxWizards, 也可以使用ZrxWizards快速创建一个新的ZRX工程), 接下来将讲述,怎样一步一步地去实现一个简单的ZRX程序:

1. 首先建立一个VC++ 2008 MFC扩展DLL工程:

1)打开 Microsoft Visual C++ 2008开发环境,选择“New(新建)”从“File(文件)”菜单,接着选中“Project (项目)”弹出“New Project(新建项目)”对话框。

2)在当前弹出的“New Project(新建项目)”对话框“Templates(模板)”里,选定“MFC DLL”项,并输入需要创建的工程项目名称“SimpleLine”和 工程项目所保存位置“D:\\ZRXSDK\\Samples”,如上图所示意。点击“OK(确定)”后弹出“MFC DLL Wizard(MFC DLL 向导)”对话框。

3)击活“Application Settings(应用程序设置)”属性页,选中“MFC extension DLL (MFC 扩展DLL)”在作为要生成的DLL类型”,确认无误后点击“Finish(完成)”按钮。

2. 接着,进行工程配置:

1)在工程属性对话框的“C/C++-->General(常规)-->Additional Include Directories(附加包含目录)”中增加包含文件路径,如“..\\..\\..\\inc”

2)在工程属性对话框的“Linker(链接器)-->General(常规)-->Additional Library Directories(附加库目录)”中增加库目录.如“..\\..\\..\\lib\\vc9”

3) 在工程属性对话框的Linker(链接器)-->Input(输入)-->Additional Dependencies(附加依赖

项)中增加所依赖的库“ZRX.lib”

4) 在工程属性对话框的“General(常规) --> Character Set(字符集)”, 确保选项为“Use

Muti-Byte Character Set(使用多字节字符集)”

5) 在工程属性对话框的“C/C++-->Language(语言)--> Treat wchart_t as Built-in Type(将wchar_t视为内置类型)”,确保选项为“No(否)”

6) 增加包含头文件,在预编译头文件“stdAfx.h”文件末尾处里添加以下代码: #include \

7)打开新建工程的.def文件, 增加程序入口函数的导出,代码如下所示: EXPORTS

zcrxEntryPoint

PRIVATE

3. 为程序装载命令和定义实现函数,可按照如下的方式进行实现: 1) 添加ZRX程序入口点函数, 在.cpp文件里添加如下代码:

extern \

zcrxEntryPoint(ZcRx::AppMsgCode msg, void* pkt) {

switch (msg)

}

{

case ZcRx::kInitAppMsg:

zcrxDynamicLinker->unlockApplication(pkt); zcrxRegisterAppMDIAware(pkt); initApp(); break;

case ZcRx::kUnloadAppMsg:

unloadApp(); break;

default: }

return ZcRx::kRetOK;

break;

2)添加装载命令代码,相应地添加对应的卸载命令代码,如下所示:

void initApp() { }

void unloadApp() { }

// unload commands

zcedRegCmds->removeGroup(\

// register a command with the ZWCAD command mechanism zcedRegCmds->addCommand(\

\\

ZCRX_CMD_TRANSPARENT, drawSimpleLine);

3) 定义命令函数,如下所示:

void drawSimpleLine() { }

// define drawSimpleLine() function and implement it …

4. 完成上述步骤后,将整个工程进行编译链接,生成结果程序文件(.dll)。

说明:

1. 如果使用ZrxWizards来创建ZRX工程, 上述的大部分步骤可以省掉;

2. 上述过程更详细的可以参考ZRXSDK\\Samples\\目录下示例程序“SimpleLine” 。

程序入口和命令定制

ZRX提供以下两种应用程序入口的方式, 开发用户可以使用其中任意一种方式对自己的ZRX应用程序入口进行导出和命令定制:

程序入口方式一:导出入口函数“zcrxEntryPoint” 1) 定义程序入口函数

extern \

zcrxEntryPoint(ZcRx::AppMsgCode msg, void* pkt) { }

switch (msg) {

case ZcRx::kInitAppMsg:

zcrxDynamicLinker->unlockApplication(pkt); zcrxRegisterAppMDIAware(pkt); initApp(); break;

case ZcRx::kUnloadAppMsg:

unloadApp(); break;

default: }

return ZcRx::kRetOK;

break;

2)添加装载和卸载函数,创建命令,

void initApp() {

// register a command with the ZWCAD command mechanism zcedRegCmds->addCommand(\

\\

ZCRX_CMD_TRANSPARENT,

}

drawSimpleLine);

void unloadApp() { }

// unload commands

zcedRegCmds->removeGroup(\

3) 定义命令函数,如下所示:

void drawSimpleLine() { }

// define drawSimpleLine() function and implement it …

程序入口方式二:从ZcRxZrxApp派生应用类 1)从ZcRxZrxApp派生应用程序类

// Application Entry Point

class CmdEntryApp : public ZcRxZrxApp { public:

virtual void RegisterServerComponents () {

virtual ZcRx::AppRetCode On_kUnloadAppMsg (void *pkt) { }

ZcRx::AppRetCode retCode =ZcRxZrxApp::On_kUnloadAppMsg (pkt) ; // TODO: Unload dependencies here return (retCode) ;

virtual ZcRx::AppRetCode On_kInitAppMsg (void *pkt) { }

ZcRx::AppRetCode retCode =ZcRxZrxApp::On_kInitAppMsg (pkt) ; // TODO: Add your initialization code here

return (retCode) ;

}

// Add your code for register server components

public: } ;

// -Your command 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)

加载及运行

编译成功的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文件的名称。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模块,在数据库模型上能够很好的兼容DWG格式,数据库由以下基本结构组成: ?? 9个符号表 (Symbol Table)

块表 (ZcDbBlockTable)

尺寸样式表(ZcDbDimStyleTable) 层表(ZcDbLayerTable) 线型表(ZcDbLinetypeTable) 注册应用表(ZcDbRegAppTable) 文本样式表 (ZcDbTextStyleTable) 用户坐标系统表(ZcDbUCSTable) 视口表(ZcDbViewportTable) 视表((ZcDbViewTable)

?? 1个命名对象字典( Named Object Dictionary)

2) 数据库对象:

任何一个数据库对象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转换得到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 * pDb = zcdbHostApplicationServices()->workingDatabase(); bool bCreateFlag = true;

pDb->getZcDbObjectId(objId, bCreateFlag, objHand);

3)访问数据库:

开发用户根据实际应用需要创建、编辑、保存、删除一个数据库,也可以遍历整个数据里的对象,下面就如何添加一个实体到数据库及如何遍历一个数据库进行的代码进行示例:

// 添加一个实体到当前数据库的模型空间

bool addEntityToDb(ZcDbObjectId& entId, ZcDbEntity * pEnt) { }

// 遍历一个数据库模型空间里所有的实体 void iterateThroughDatabase()

ZcDbDatabase * 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)) { }

pTbl->close();

if (Zcad::eOk != pTblRec->appendZcDbEntity(entId, pEnt)) { }

pTblRec->close(); return true;

pTblRec->close(); return false; pTbl->close(); return false;

{

ZcDbDatabase *pDb = new ZcDbDatabase(Zdesk::kFalse); if(Zcad::eOk != pDb->readDwgFile(_T(\

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();

ZcDbBlockTableRecordIterator *pIterator; pBlkTblRcd->newIterator(pIterator); if (!pIterator) { }

pBlkTblRcd->close(); ZcDbEntity *pEnt;

for (pIterator->start(); !pIterator->done();pIterator->step()) {

pIterator->getEntity(pEnt, ZcDb::kForRead); if (!pEnt) continue; pBlkTblRcd->close(); return;

pBlkTbl->close(); return;

zcutPrintf(\ }

}

pEnt->close();

delete pIterator; delete pDb;

4) 库存实体对象类列举:

ZRX提供了以下数据库常规实体类: ?? ZcDbPolyline ?? ZcDb2dPolyline ?? ZcDb3dPolyline

?? ZcDbArc ?? ZcDbArcDim ?? ZcDbCircle ?? ZcDbEllipse ?? ZcDbLeader ?? ZcDbLine ?? ZcDbRay ?? ZcDbSpline ?? ZcDbXline ?? ZcDbPolyFaceMesh ?? ZcDbPolygonMesh ?? ZcDb2LineAngularDim ?? ZcDb3PointAngularDim ?? ZcDbAlignedDim ?? ZcDbDiametricDim ?? ZcDbOrdinateDim ?? ZcDbRadialDim ?? ZcDbRadialDimLarge ?? ZcDbRotatedDim ?? ZcDbBlockReference ?? ZcDbMInsertBlock ?? ZcDbHatch ?? ZcDbFace ?? ZcDbFcf ?? ZcDbMline ?? ZcDbPoint ?? ZcDbSolid ?? ZcDbTrace ?? ZcDb3dSolid ?? ZcDbRegion ?? ZcDbText ?? ZcDbMText

?? ZcDbAttributeDefinition ?? ZcDbBody ?? ZcDbWipeout ?? ZcDbViewport ?? ZcDbShape

自定义类

ZRX提供了一套自定义接口,供用户从ZcRxObject 类中派生出自己特定的新类,新的类可以是一个标准的 C++派生类,也可以是一个具有ZRX运行时类型识别机制的 ZcRxObject 扩展类。最常见的运行时自定义扩展类有:自定义对象和自定义实体。自定义对象通常是从ZcDbObject派生,自定义实体则从ZcDbEntity、ZcDbCurve等实体类中进行派生。两种方式构建出来的自定义类对象,如同其他的数据库常驻对象一样,具有同等的特性,能够存储在数据库里,被数据库统一管理。 为了便于理解,下面将举例讲述如何一步一步定制一个带运行时类型识别机制的自定义实体: 1) 定义新的自定义实体类

class SignEntity : public ZcDbEntity { public:

ZCRX_DECLARE_MEMBERS(SignEntity) ;

protected:

static Zdesk::UInt32 kCurrentVersionNumber ;

public: }

Zdesk::UInt32 SignEntity::kCurrentVersionNumber =1 ; ZCRX_DXF_DEFINE_MEMBERS ( )

SignEntity::SignEntity () : ZcDbEntity () {

m_pntCenter.set(0,0,0); m_dblRadius = 10.00; m_strTextFirst = \m_strTextSecnd = \SignEntity, ZcDbEntity,

ZcDb::kDHL_CURRENT, ZcDb::kMReleaseCurrent, ZcDbProxyEntity::kNoOperation, SIGNENTITY, \

\\

\SignEntity () ;

virtual ~SignEntity () ;

}

SignEntity::~SignEntity () { }

2) 声明和定义需要的虚重载函数

//- Dwg Filing protocol

virtual Zcad::ErrorStatus dwgOutFields (ZcDbDwgFiler *pFiler) const ; virtual Zcad::ErrorStatus dwgInFields (ZcDbDwgFiler *pFiler) ;

//- Graphics protocol

virtual Zdesk::Boolean worldDraw (ZcGiWorldDraw *mode) ; //----- ZcDbObject protocols //- Dwg Filing protocol

Zcad::ErrorStatus SignEntity::dwgOutFields (ZcDbDwgFiler *pFiler) const { }

Zcad::ErrorStatus SignEntity::dwgInFields (ZcDbDwgFiler *pFiler) {

assertWriteEnabled () ;

//----- Read parent class information first.

Zcad::ErrorStatus es =ZcDbEntity::dwgInFields (pFiler) ; if ( es != Zcad::eOk )

return (es) ;

return (pFiler->filerStatus ()) ; assertReadEnabled () ;

//----- Save parent class information first.

Zcad::ErrorStatus es =ZcDbEntity::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 //.....

//----- Object version number needs to be read first Zdesk::UInt32 version =0 ;

}

if ( (es =pFiler->readUInt32 (&version)) != Zcad::eOk )

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 < SignEntity::kCurrentVersionNumber ) // return (Zcad::eMakeMeProxy) ; //----- Read params //.....

return (pFiler->filerStatus ()) ;

Zdesk::Boolean SignEntity::worldDraw (ZcGiWorldDraw *mode) { }

assertReadEnabled () ; //…

return Zdesk::kTrue;

3) 注册和注销自定义类,用户可以采用以下任一方法进行自定义实体的注册和注销 a . 使用自动注册宏,在自定义自定类的.h文件的末尾处添加宏声明如下:

#ifdef SIGNENTITY_MODULE

ZCDB_REGISTER_OBJECT_ENTRY_AUTO(SignEntity) #endif

b . 在程序加载或卸载时注册

// 程序加载时 SignEntity::rxInit(); zcrxBuildClassHierarchy // 程序卸载时

deleteZcRxClass(SignEntity::desc()); 注意:

1) ZRX目前不支持自定义类的虚重载函数list()、saveAs()、getSubentPathsAtGsMarker()、

highlight()、unhighlight()、applyPartialUndo()。

2) 更多详细可以参考ZRXSDK\\Sample\\目录下的示例程序ZRX_Misc——SignEntityDb

反应器

所谓反应器,就是接收CAD里各种事件消息的通告机制。每一个反应器相当于一个接收事件的盒子,将从通告者(当一个事件发生时,发出事件通告的对象)那里接到事件消息传递到相应的通告函数。CAD平台针对不同类型的事件消息进行区分,分别定义不同类型的事件反应器。 ZWCAD-ZRX提供了以下几种事件类型的反应器和通告函数:

a 永久反应器 ZcDbObject::erased ZcDbObject::modified ZcDbObject::openedForModify b. 编辑反应器 命令相关

ZcEditorReactor::commandEnded ZcEditorReactor::commandWillStart 数据库相关

ZcEditorReactor::abortSave ZcEditorReactor::beginClose ZcEditorReactor::beginSave ZcEditorReactor::beginDwgOpen ZcEditorReactor::endDwgOpen ZcEditorReactor::databaseConstructed ZcEditorReactor::databaseToBeDestroyed ZcEditorReactor::dwgFileOpened ZcEditorReactor::saveComplete

ZcEditorReactor::initialDwgFileOpenComplete 深度克隆相关

ZcEditorReactor::abortDeepClone ZcEditorReactor::beginDeepClone ZcEditorReactor::endDeepClone 插入操作相关

ZcEditorReactor::abortInsert ZcEditorReactor::beginInsert ZcEditorReactor::endInsert ZcEditorReactor::otherInsert 鼠标事件操作相关

ZcEditorReactor::beginDoubleClick ZcEditorReactor::beginRightClick

Wblock相关

ZcEditorReactor::abortWblock ZcEditorReactor::beginWblock ZcEditorReactor::beginWblockObjects ZcEditorReactor::endWblock ZcEditorReactor::otherWblock ZcEditorReactor::wblockNotice XREF相关

ZcEditorReactor::beginAttach ZcEditorReactor::endAttach ZcEditorReactor::otherAttach 其他

ZcEditorReactor::pickfirstModified b 数据库反应器

ZcDbDatabaseReactor::objectAppended ZcDbDatabaseReactor::objectErased ZcDbDatabaseReactor::objectModified ZcDbDatabaseReactor::objectOpenedForModify c 对象反应器

ZcDbObjectReactor::erased ZcDbObjectReactor::modified ZcDbObjectReactor::openedForModify

如何在使用一个反应器? 通常按照以下步骤进行:

1) 继承一个新反应器类从已有的反应器类中,并根据自身需要,重写和实现特定用途的虚

通告函数

2) 对反应器进行初始化

3) 添加反应器到对应的通告者的反应器列表

注意事项:

1) 当使用完一个反应器后,需要将反应器进行从通告者的反应器列表里移出,然后删除反

应器对象(如果反应器是一个数据库长驻对象,则不用删除)

2) 更多详细的反应器应用请参考ZRXSDK\\Sample\\目录下的示例程序ZRX_Misc—

SignEntityUi & PersisitReactor

事务管理

什么是事务?

事务(transaction)是数据库里的一种概念,指作为单个逻辑工作单元执行的一系列操作。 对于ZRX来说,就是ZcDbDatabase的ZcDbTransaction。下图是一个应用例子:

添加”五环”图层 如左图所示,绘制奥运五环可以看作是一个事务.这个事务包含四个操作。只有当这四个操作全部执行成功,才会提交数据到数据库,如果任何一个操作失败,整个工作单元全部取消,不会对数据库有任何修改。可谓“一添加五个圆环 绘制奥运五环 分别用五种颜色填充圆环 设置圆环和填充的图层为”五环” 损俱损,共同进退” 单个逻辑工作单元

以下是示意代码:

void drawOlympicLogo() {

一系列操作

ZcDbTransactionManager* pTransManager = curDb()->transactionManager(); pTransManager->startTransaction();//事务开始 try {

//添加\

ZcDbLayer* pLayer = createNewLayer(\

if (pLayer == NULL || addToDb(pLayer,pTransManager) == false)

throw (\

//添加五环

OlympicRings* pOlympicRings = createNewRings();

if (pOlympicRings == NULL || addToDb(pOlympicRings,pTransManager) == false)

throw (\

//添加五环填充

RingsFillHatch* pFillHatch = createNewHatch(pOlympicRings);

}

}

if (pFillHatch == NULL || addToDb(pFillHatch,pTransManager) == false)

throw (\

//设置五环和填充的图层

if (setEntsLayer(pOlympicRings, pFillHatch, pLayer) == false)

throw (\

pTransManager->endTransaction();//事务结束,数据入库

catch(ZCHAR *pMessage) { }

zcutPrintf(_T(\

pTransManager->abortTransaction();//事务取消,清除数据

事务机制的特性:

除了上述的维护数据库的稳定性和一致性的优点之外,事务相对于常规的open-close机制来说,还有以下特性:

? 限制少

open-close机制里,一个对象处于打开状态,就不能再以forWrite方式打开。而事务机制里,对象处于打开状态的时候,还可以以forWrite方式打开。(open-close机制的打开调用zcdbOpenZcDbObject全局函数,事务机制的打开调用ZcDbTransactionManager::openObject函数)

? 效率高

因为在每个对象的open-modify-close的过程中,会有一系列影响效率的流程执行。这些流程包括:undo数据的记录与备份;实体图像的重生成;和一些通知的发送。这些流程在close调用的时候都会执行。所以如果一个工作单元采用open-close机制对上十个甚至上百个对象进行修改的时候,那就会执行同样多次数的上述流程。而采用transaction机制,则只会在事务结束的时候执行一次。

? 更安全

在多个模块,多个应用程序同时操作一张图纸的情况下,使用事务机制来打开对象进行修改,就不用担心另外的模块或另外的应用程序已经打开了这个对象。而open-close机制在这种情况下是不安全的。

? 支持实时显示

在事务中进行添加或修改的实体,在事务未结束,数据未入库的情况下,通过以下的函数调用,可以达到实时显示的效果:

zctrTransactionManager->queueForGraphicsFlush(); zctrTransactionManager->flushGraphics(); zcedUpdateDisplay();

使用事务的注意事项:

? 与open-close一起使用要注意

事务可以与open-close混合使用,但必须各自配对,不能在ZcDbTransaction::getObject()打开某个对象后,又调用该对象自身的close()函数关闭。

? 打开对象要注意

事务机制虽然可以在对象处于openForWrite或openForRead的状态下,调用getObject()以读或写的方式打开,但是在对象处于openForNotify状态下时,是不能用getObject()以写方式打开的。

? 嵌套使用要注意

事务可以嵌套使用,即在一个事务中再开始一个事务。但要注意两点: 1. 不能在事务结束或放弃的过程中开始一个事务。

2. 在有嵌套事务的情况下,只有最外层的事务结束的时候,才会提交所有事务的数据。

事务管理功能接口:

1) 长事务管理类

ZcApLongTransactionManager::checkIn ZcApLongTransactionManager::checkOut ZcDbLongTransaction::addToWorkSet ZcDbLongTransaction::newWorkSetIterator ZcDbLongTransaction::removeFromWorkSet ZcDbLongTransaction::originBlock ZcDbLongTransaction::originObject ZcDbLongTransaction::workSetHas 2) 长事务工作集遍历器

ZcDbLongTransWorkSetIterator::start ZcDbLongTransWorkSetIterator::step

ZcDbLongTransWorkSetIterator::curObjectIsErased ZcDbLongTransWorkSetIterator::curObjectIsPrimary ZcDbLongTransWorkSetIterator::curObjectIsRemoved ZcDbLongTransWorkSetIterator::done ZcDbLongTransWorkSetIterator::objected 3) 事务管理类

ZcDbTransactionManager::getAllObjects ZcDbTransactionManager::getObject ZcDbTransactionManager::abortTransaction

ZcDbTransactionManager::addNewlyCreatedDBRObject ZcDbTransactionManager:: startTransaction 4) 事务类

ZcTransaction::getAllObjects ZcTransaction::getObject

文档管理

ZWCAD是一个支持多文档(MDI)的应用程序,并提供了一套针对ZWCAD文档管理的应用接口,每一个打开的dwg图形为一个ZcApDocument文档对象,文档管理应用类ZcApDocManager管理所有的ZcApDocumen对象。文档迭代器ZcApDocumentIterator提供一套迭代的方法来遍历当前CAD打开的所有文档。文档反应器ZcApDocManagerReactor用来通告当前文档操作的事件。

1)文档对象类ZcApDocument ZcApDocument::cDoc ZcApDocumen::docTitle ZcApDocument::fileName ZcApDocument::isReadOnly

2)文档管理应用类ZcApDocManager ZcApDocManager::addReactor

ZcApDocManager::appContextNewDocument ZcApDocManager::appContextOpenDocument ZcApDocManager::curDocument ZcApDocManager::document ZcApDocManager::documentCount

ZcApDocManager::newAcApDocumentIterator ZcApDocManager::openDocument ZcApDocManager::removeReactor

3)文档迭代器ZcApDocumentIterator ZcApDocumentIterator::docment ZcApDocumentIterator::done ZcApDocumentIterator::step

4) 文档反应器

ZcApDocManagerReactor::documentActivated ZcApDocManagerReactor::documentBecameCurrent ZcApDocManagerReactor::documentCreated

ZcApDocManagerReactor::documentCreateStarted ZcApDocManagerReactor::documentDestroyed ZcApDocManagerReactor::documentToBeActivated ZcApDocManagerReactor::documentToBeDeactivated ZcApDocManagerReactor::documentToBeDestroyed

代码示例:如何获得到当前ZWCAD打开的所有文档名称?

void listDocuments() {

ZcDbDatabase* pDb = zcdbHostApplicationServices()->workingDatabase(); ZcApDocument* pCurDoc = zcDocManager->document(pDb); const char * strCurTitle = pCurDoc->docTitle();

zcutPrintf(\ZcApDocumentIterator* pDocIter;

pDocIter = zcDocManager->newZcApDocumentIterator(); zcutPrintf(\ZcApDocument* pDoc = NULL; int nIndex = 1;

for ( ; !pDocIter->done(); pDocIter->step()) {

pDoc = pDocIter->document();

const char * strTitle = pDoc->docTitle(); const char * strFileName = pDoc->fileName();

zcutPrintf(\

nIndex, strTitle, strFileName); }

}

delete pDocIter;

nIndex++;

提示:文档管理类的接口的详细使用可以参考ZRXSDK\\Sample\\目录下的示例程序DocumentManager

自定义实体OPM

什么是自定义实体OPM?

针对自定义实体类型,用户可自行定义和扩展该实体的属性,根据具体需要对自定义实体的特性定义和分类。支持多种数据类型的属性,包括:字符串、整型、浮点、变体等。支持多个实体属性集合的交集。

自定义实体OPM特性:

1) 显示自定义属性的名称

2) 显示基本属性(颜色,图层,线型等) 3) 显示自定义实体自定义的属性 4) 分类显示自定义实体属性

5) 编辑修改自定义实体属性(支持多个实体属性交集的编辑)

OPM使用注意事项:

1) 目前所支持的自定义实体属性栏的显示还不全面,从实体类型而言,仅支持从

IZcadEntity派生的自定义实体;

2) 所支持的OPM接口仅限于数据层面(如IOPMPropertyExpander,

IOPMPropertyExtension),暂不支持与界面相关的接口(如IPerPropertyDisplay)。

提示:自定义实体OPM的使用可参考ZRXSDK\\Sample\\目录下的示例程序ZRX_Misc

MFC扩展UI类

ZRX支持用户使用MFC来扩展开发自己的应用程序。例如在ZRX应用程序上使用MFC创建CDialog、CButton、CComboBox、CEdit等控件。同样, ZRX提供了几个基本的UI接口类供二次开发使用:

CZdUiBaseDialog——继承于CDialog,提供基本对话框窗口功能

CZdUiDailog——继承于CZdUiBaseDialog,提供窗口尺寸变化和永久数据的存储功能 CZcUiDialog——继承于CZdUiDailog,扩展和完整CZdUiDailog类的功能

可停靠面板(DockControlBar)

ZWCAD可停靠面板功能主要使用全局接口函数zdsw_excuteUICommand, 把特定功能的回调函数转接到ZWCAD主UI线程上执行。因此,在应用该功能前,需要事先完成特性功能的回调函数。

全局接口函数说明:

UINT zdsw_excuteUICommand(

UICOMMANDPROC pfnUICMDProc, //用户定义回调函数指针 LPVOID pParam );

参 数:

pfnUICMDProc——用户自定义函数指针,用户必须把创建、修改、显示界面元素的代码写在该函数内。

pParam——用户自定义参数,该参数用户可由用户根据需要自由传值,最终会作为指针pfnUICMDProc所指向的函数的输入参数。 返回值:

如果pfnUICMDProc为空或调用过程发生错误,返回值为-1,否则返回pfnUICMDProc所指向回调函数执行的结果状态。

//用户自定义参数

回调函数定义说明:

可停靠面板定义的回调函数格式如下:

UINT CallBackFunc(LPVOID pParam) {

//To Do: }

return -1;

代码示例:

// 定义可停靠窗口功能类,并实现 class CSCRMenu : public CDialogBar {

DECLARE_DYNAMIC(CSCRMenu)

public:

CSCRMenu();

virtual ~CSCRMenu();

virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);

public:

protected:

CComboBox m_LayerComboBox; BOOL ScreenMenu();

CListCtrl m_EntityInfoList;

protected:

void InitDCEditButton(); void InitLayerComboBox();

protected:

DECLARE_MESSAGE_MAP()

public: };

//定义用户自定义回调函数:

UINT CreateScreenMenu(LPVOID pParam) { }

// 转接功能函数到ZWCAD主UI线程上执行 void CreatSCRMenu() { }

zdsw_executeUICommand(CreateScreenMenu, &m_SCRMenu); if(pParam) { }

return -1;

return ((CSCRMenu*)pParam)->ScreenMenu(); afx_msg void OnBtnMessagebox(); afx_msg void OnBtnLine();

afx_msg LRESULT OnInitDialog(WPARAM wParam, LPARAM lParam); afx_msg void OnBtnDCEdit(); afx_msg void OnBtnGetObjInfo(); afx_msg void OnBtnCloseupLayer();

注意事项:

1)创建界面的所有元素必须在特定函数内实现,并以该函数指针作为输入参数,通过使用全局接口函数zdsw_ExecuteUICommand调用来达到功能上的实现,切记不能直接在ZRX命令里创建用户界面;

2)在用户消息响应代码里,需要修改图纸数据的操作时,必须调用zcedPostCommand发送ZRX命令名以触发ZRX命令函数的方式进行。由于从发送ZRX命令名到执行ZRX命令不是即时的,所以调用zcedPostCommand之后不宜编写其它逻辑代码。

3) 调用此接口创建用户界面的二次开发应用程序必须为MFC扩展DLL,否则无法正常创

建用户界面。

全局函数应用

ZRX除了提供了一些应用功能类接口,同时也提供了各种应用的全局函数,限于章节,不在此一一阐述,详细请参见 《附录A:》。

ZZR移植 RX植指X移指南南 本指南主要讲述,如何从原在AutoCAD上运行的ObjectARX的应用程序移植到ZWCAD上,并且能够正常、正确地运行。在前面《ZRX介绍》章节里,我们已经介绍了ZRX在代码上已经作到能够很好地兼容ARX代码,因此在ARX程序在向ZRX移植时,几乎不用修改用户代码,通过修改工程配置,重新编译链接,便可以转接到ZWCAD上来运行,以下是针对不同版本间移植的步骤。

从ObjectARX 2006移植到ZRX

移植的步骤:

1)首先用Visual Studio 2008打开该工程,按提示信息提示将原工程升级为vc9工程。 2)在工程属性对话框的C/C++-->General(常规)-->Additional(附加包含目录)中,修改头文件包含路径为ZRXSDK\\arxport的对应的目录,删掉原先的头文件包含路径。例如头文件包含路径为“C:\\ZRXSDK\\ arxport”。

3) 在工程属性对话框的Linker(链接器)-->Input(输入)-->Additional Dependencies(附加依赖

项)中,增加所依赖的库ZRX.lib,并同时去掉原先的依赖项。

3) 在工程属性对话框的Linker(链接器)-->General(常规)-->Additional Dependencies(附加库

目录)中,修改库文件包含路径为ZRXSDK\\lib\\vc9的对应的目录,删掉原先的库文件包含路径。例如库文件包含路径为“C:\\ZRXSDK\\ lib\\vc9”。

4) 在工程属性对话框的Linker(链接器)-->General(常规)-->Output File(输出文件)的后缀改

为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移植到ZRX

从ObjectARX 2007/2008 的移植的步骤和ObjectARX 2006基本上一样,在此不在重复叙述。但还是存在两点不同的地方需要注意下:

1) 在工程属性对话框的“General(常规) --> Inherited Propjet Property Sheets(继承的项目属性

表)”, 确保选项为“空”

2) 在工程属性对话框的Linker(链接器)-->Input(输入)-->Module Definition File(模块定义文件), 如果使用了ObjectARX\\Inc的“AcRxDefault.def”文件, 需要进行清空。或者在自己应用程序里增加相应的.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 CAcUiEdit

——CfileDialog ——CEdit

AcCStdioFile ——CstdioFile CAcUiListCtrl ——ClistCtrl

CNavListCtrl ——ClistCtrl CAdUiListBox CAcUiListBox CAcUiTab CNavFilter

——CList ——Clist ——CtabCtrl ——CStringArray ——CtypedPtrArray ——CTypedPtrArray ——CStatic ——CHeaderCtrl ——CcomboBox

CNavDataArray CNavFilterArray CAdUiGroupCtrl CAdUiHeaderCtrl CAdUiComboBox

移植注意事项

4. ZRXSDK 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++-->Language(语言)--> Treat wchart_t as Built-in Type(将

wchar_t视为内置类型)”确保选项为“否”。

ZZR常见 RX见问X常问题题解解答答 说明:以下的问题解答针对ARX代码形式的ZRX程序同样有效:

[0001] 为什么使用了命令宏ZCED_ZRXCOMMAND_ENTRY_AUTO(appClassName, cmdGroupName, globCmd, locCmd, cmdflags, UIContext), 其中命令名“locCmd”这个命令在ZWCAD里不能识别?

解答:这个问题跟ZWCAD的命令名机制有关系,目前ZWCAD只能做到识别一个命令名globCmd, locCmd命令暂时还不支持, 诸多不便请谅解!

[0002] 为什么zcedPostCommandPrompt、zcedAddDropTarget,zcedRemoveDropTarge等全局函数在编译链接提示无法识别的外部函数?

解答:直接在调用该函数的cpp文件里Include \

[0003 ] 为什么 ZcDbDictionary::newIterator : function does not take 1 arguments ? **Code sample:

ZcDbDictionary *pGroupDict = NULL;

pDb->getGroupDictionary(pGroupDict,ZcDb::kForRead); ZcDbDictionaryIterator

解答:ZRX是以Object ARX 2008里的API类为基准,在Object ARX 2006 里的该函数AcDbDictionary::newIterator(AcRx::kDictCollated)带一个参数, 在Object ARX 2008 里不带参数。该问题在使用上不受影响。

[0004] 为什么我的工程在编译链接的时候,VC开发平台提示无法解析的外部符号\STR@_com_util@@YGPA_WPBD@Z) ?

解答: 这个问题可以通过改工程设置解决

ConfigurationProperties->C/C->LanguageTreatwchar_tasBuilt-inType=No 注意:#progma comment(lib, \

[0005] 为什么需要将ZRX的工程配置->C/C++->语言->将wchar_t视为内置类型改为“否”,或者将wchar_t视为内置类型有什么作用?

*pDictIter2

=

pGroupDict->newIterator(ZcRx::kDictCollated);// Complie error!

解答: 将wchar_t视为内置类型有什么作用?编译器可以对wchar_t做类型检查,否则wchar_t只是一个简单的typedef.CInPlaceEdit&operator=(constCInPlaceEdit&a){}你申明了返回类型,却没有在实现中提供返回值,是不对的。如果不希望这个函数被调用,可以不加{}

[0006] 为什么我的工程在编译链接时产生以下错误?

“*** error LNK2001: unresolved external symbol acrxGetApiVersion *** fatal 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->resval.rstring时,在使用ads_relrb函数对resbuf进行内存释放时,引起死机问题?

解答: ZRX resbuf 在使用resbuf.resval.rstring时, 需要先分配一块内存空间,然后再通过

strcpy函数将值赋给resbuf.resval.rstring,这样就不会释放resbuf时引起死机问题。代码

示例如下:

[0008] 为什么使用了#include , 代码引用方式如std::map Var等,工程在编译链接时产生如下错误?

“error LNK2001: unresolved external symbol “__declspec(dllexport) public:__thiscall std::basic_string, calss std::allocator >……”

解答: 原因是工程在链接时找不到“msvcprtd.lib”库文件,在工程配置里里增加依赖库项“ msvcprtd.lib”即可。

struct resbuf* result; result = zds_newrb(RTSTR);

result->resval.rstring = new ACHAR[64]; strcpy(result->resval.rstring, \zds_relrb(result);

联系客服:779662525#qq.com(#替换为@)