今天是学习AutoCAD ObjectARX的第三天,三天来一直在看一本叫《AutoCAD ObjectARX 2000 开发技术指南》技术从书,当今天看ObjectARX 2007开发文档的时候,突然感觉自己都已经看过了,虽然都是英文的。汗
,结果两者一样。大汗一把
!现在的出版的书… 竟然书上还写着谁谁著。
ObjectARX应用程序是一个动态链接库,它共享AutoCAD的地址空间并且直接调用AutoCAD函数。
创建一个ObjectARX应用程序通常包括以下几个步骤:
1、 创建实现新命令的自定义类。一般都是从ObjectARX提供的类派生出来的自定义类。
2、 决定我们的ObjectARX应用程序将处理哪一个AutoCAD消息。AutoCAD向ObjectARX应用程序发送各种消息,指出在AutoCAD内发生了特定的事件,我们决定应用程序将对哪一个消息作出响应,并触发哪一个操作。
3、 为AutoCAD提供入口。在ObjectARX2007以上的版本中有一默认的入口定义文件(AcRxDefault.def)不用用户再创建。
4、 实现初始化。在ObjectARX应用程序内,我们需要初始化已创建的任何自定义,并且重建ObjectARX运行时类树;如果要添加命令,必须注册在AutoCAD中的命令。
5、 卸载准备。卸载前必须删除所有自定义类和命令。
注册新命令的方法可以用AcEdCommandStack的addCommand的方法和acedDefun还有acedRegFunc的方法。后两咱们以后再说,主要是addCommand注册命令的方法。
AutoCAD命令是由AcEdCommandStack类定义的,按组存储在命令栈中。一般况下用addCommand函数一次添加一个命令,并用removeGroup函数成组的删除命令,也可以用removeCmd函数一次删除一个命令。作为退出前消除工作的一部分,我们应用程序需要删除它注册的所有命令。
addCommand函数的原型声明为:
Acad::ErrorStatus
addCommand(
const char* cmdGroupName,
const char* cmdGlobalName,
const char* cmdLocalName,
Adesk::Int32 commandFlags,
AcRxPtr Addr,
AcEdUIContext *UIContext = NULL,
int fcode=-1);
其中:
cmdGroupName 需要添加命令的组名(用ASCII表示)。如果组不存在,则会自动在添加命令前创建组。
cmdGlobalName 要添加的命令名(用ASCII表示)。该名字是全局的。
cmdLocalName 要添加的命令名(用ASCII表示)。该名字是本地的。
commandFlags 与命令有关的标记,有效值为: ACRX_CMD_TRANSPARENT, ACRX_CMD_MODAL, ACRX_CMD_USEPICKSET, 和 ACRX_CMD_REDRAW。
Addr 当执行命令时,要执行的函数地址。
UiContext AcEdUIContext回调类的输入指针。
fcode 分配给命令的输入整形码。
removeCmd()函数的原型声明为:
virtual Acad::ErrorStatus
AcEdCommandStack::removeCmd( const char * cmdGroupName, const char * cmdGlobalName) = 0;
removeGroup()函数原型声明为:
virtual Acad::ErrorStatus
AcEdCommandStack:: removeGroup ( const char * cmdGroupName);
对于命令的查找顺序可以用AcEdCommandStack::popGroupToTop()函数放在栈顶,AutoCAD会首先查找这个组。
全局与本地命令名的区别是:全局命令名可以在任何语言环境中使用,而本地命令名是用于非英语版AutoCAD命令名的翻译。
透明与模态命令,我的理解是像对话框一样,非模态与模态的区别。
到此,自己完全可以看着文档做一个例子出来了!享受你的成果吧!