3.3、注册新命令

这章介绍如何使用AcEd命令机制添加新命令。关于使用acedDefun()函数和acedRegfunc()添加新命令的方式请参考第20章ObjectARX全局工具函数。关于使用AutoLISP的defun函数添加新命令,请参考开发者文档中Visual LISP.部分

命令栈:

AutoCAD中的命令以组的形式存储在命令栈当中。命令栈通过AcEdCommandStack类定义。在每个会话当中都有一个命令栈的实例。这个栈中存储你定义的命令。使用acedRegCmds()宏可以让你访问命令栈。

在你添加一个命令的时候,你需要指定这个命令的组名,一个好的策略是使用你注册的开发者前缀当中组名,这样能够防止你的命令与其他命令冲突。在一个组中的命令名必须是唯一的,组名也必须是唯一的。然而,多个应用程序能够使用同一个命令名,因为他们的组名是不同的,所以能够区分开。

提示:Autodesk支持开发者注册方案,来避免不同应用程序的组名冲突。每一个注册开发者选择一个或者多个注册开发者符号(RDS)专门使用。注册开发者符号是建立ObjectARX程序的必须步骤。了解更多信息,登录http://www.veritest.com/autodesk/main(f).htm .

你通常使用AcEdCommandStack::addCommand()函数一次添加一个命令,而移除命令的时候使用AcEdCommandStack::removeGroup()函数一次移除一组命令。你也可以选择使用AcEdCommandStack::removeCmd()函数来一次移除一个命令。作为退出时清理程序的一部分,你的应用程序需要移除所有注册的命令。

添加命令的函数定义如下:

Acad::ErrorStatus 
addCommand(
    const char* cmdGroupName,
    const char* cmdGlobalName,
    const char* cmdLocalName,
    Adesk::Int32 commandFlags,
    AcRxFunctionPtr functionAddr,
    AcEdUIContext *UIContext = NULL,
    int fcode=-1,
    HINSTANCE hResourceHandle = NULL,
    AcEdCommand** cmdPtrRet = NULL);
cmdGroupName:代表这个命令的组名,如果这个组不存在,他在命令添加之前创建。

cmdGlobalName:代表命令名,这个命令名代表全局的命令名或没有经过省略的命令。(参考下一节的全局和局部命令名)

cmdLocalName :局部命令名。

commandFlags:命令标志,可以是下面的值,ACRX_CMD_TRANSPARENT,ACRX_CMD_MODAL,,ACRX_CMD_USEPICKSET,,和 ACRX_CMD_REDRAW 。关于他们的含义参考下一节中的(透明命令和模态命令)。

functionAddr:函数地址,AutoCAD中响应这个命令时要调用的函数的地址。

UiContext:AcEdUIContext回调类的指针。

fcode:分配给命令的整型代码

cmdPtrRet:这个命令要添加给的AcEdCommand对象的指针的指针。

注意:一定要注意,命令名要添加你注册的RDS前缀来防止你的命令和其他应用程序的命令冲突。比如一个MOVE命令,在一个ASDK前缀的开发者下面应该的命令名是ASDKMOVE。对于你的组名同样要添加前缀。

removeCmd函数和removeGroup函数的定义如下:

virtual Acad::ErrorStatus 
AcEdCommandStack::removeCmd
    (const char* cmdGroupName,
    const char* cmdGlobalName) = 0;

virtual Acad::ErrorStatus
AcEdCommandStack::removeGroup
    (const char* groupName);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值