AutoCAD二次开发:ObjectArx下的两种命令注册方式
共有两种方式,都是基于向导方式创建:
一:使用ACED_ARXCOMMAND_ENTRY_AUTO宏定义
1、创建一个ArxDefCommand的Arx项目,目录结构如下
2、编辑注册命令调用的函数
#include <tchar.h> // 打印时引用了宏“_T”
class CArxDefCommandApp : public AcRxArxApp {
public:
CArxDefCommandApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {}
virtual void RegisterServerComponents () {}
// Modal Command with localized name
// ACED_ARXCOMMAND_ENTRY_AUTO(CArxDefCommandApp, ADSKMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL)
// 注册命令对应的函数命名:组名+命令名
static void ADSKMyGrouphello () {
// Put your command code here
acutPrintf(_T("hello, method 1")); // CAD打印函数
}
}
3、在宏区域完成命令的注册
ACED_ARXCOMMAND_ENTRY_AUTO(CArxDefCommandApp, // 项目名
ADSKMyGroup, // 组名
hello1, // 命令名
你好, // 命令名2
ACRX_CMD_MODAL, // 命令参数
NULL) // 调用函数,为空时即为根据名字匹配的void ADSKMyGrouphello ()
4、生成解决方案,加载完成后输入命令,成功
二:使用acedRegCmds宏定义
1、首先定义功能函数
// 单独定义功能函数
void show() {
acutPrintf(L"hello,method 2");
}
2、在InitApp 中注册命令
//----- ObjectARX EntryPoint
class CArxDefCommandApp : public AcRxArxApp {
public:
CArxDefCommandApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
// TODO: Add your initialization code here
// 注册命令处
// acedRegCmds类:Register command 封装注册命令:连接命令与函数
/* ---addCommand函数:
命令组名(cad按照命令组==>命令==>函数查找并执行命令)
命令名
命令别名
参数:见代码下面的表
函数名:可以以此为入口进入自己封装的类库,show函数,最顶上
*/
acedRegCmds->addCommand(_T("ADSK"), _T("hello2"), _T("你好2"),
ACRX_CMD_MODAL, show);
return (retCode) ;
}
}
3、生成解决方案,加载完成后输入命令,成功
三、addCommand 命令常见参数
ACRX_CMD_MODAL | 其他命令执行期间该命令不可执行 |
ACRX_CMD_TRANSPARENT | 其他命令执行期间该命令可执行,但ads_sssetfirst()不可使用 |
ACRX_CMD_USEPICKSET | 命令可以得到、设置pickfirst集,但命令结束后就销毁 |
ACRX_CMD_REDRAW | 和ACRX_CMD_USEPICKSET标志位一样,实体会重新绘制 |
ACRX_CMD_NOPERSPECTIVE | 命令不能使用在当前视口为正交模式时 |
ACRX_CMD_SESSION | 多文档命令,使用该命令时必须锁定文档,因其操作非当前文档,否则块表打不开 |
ACRX_CMD_NOTILEMODE | 命令不能使用在模型空间中 |
ACRX_CMD_NOPAPERSPACE | 命令不能使用在图纸空间中 |
ACRX_CMD_UNDEFINED | 命令调用必须加命令组名 |
ACRX_CMD_DEFUN | 命令使用在lisp中 |
ACRX_CMD_NOHISTORY | 命令不会保存在最近使用命令列表中 |
ACRX_CMD_NO_UNDO_MARKER | 命令不设置undo标志 |
参考:https://blog.csdn.net/chucksun0426/category_11145990.html
2301_80452935: 添加def后生成lib,至少编译通过
2301_80452935: 不用,确实生成lib
2301_79238785: 注意:楼主写的代码没打main函数
eliene_: 特别好的教程 感谢楼主
charlinezs: 窗口不显示啊