// (C) Copyright 2002-2012 by Autodesk, Inc. // // Permission to use, copy, modify, and distribute this software in // object code form for any purpose and without fee is hereby granted, // provided that the above copyright notice appears in all copies and // that both that copyright notice and the limited warranty and // restricted rights notice below appear in all supporting // documentation. // // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE // UNINTERRUPTED OR ERROR FREE. // // Use, duplication, or disclosure by the U.S. Government is subject to // restrictions set forth in FAR 52.227-19 (Commercial Computer // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. // //----------------------------------------------------------------------------- //----- acrxEntryPoint.cpp //----------------------------------------------------------------------------- #include "StdAfx.h" #include "resource.h" //----------------------------------------------------------------------------- #define szRDS _RXST("ASDK") //----------------------------------------------------------------------------- //----- ObjectARX EntryPoint class CArxProject1App : public AcRxArxApp { public: CArxProject1App () : 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 return (retCode) ; } virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) { // TODO: Add your code here // You *must* call On_kUnloadAppMsg here AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ; // TODO: Unload dependencies here return (retCode) ; } virtual void RegisterServerComponents () { } // The ACED_ARXCOMMAND_ENTRY_AUTO macro can be applied to any static member // function of the CArxProject1App class. // The function should take no arguments and return nothing. // // NOTE: ACED_ARXCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid and // have arguments to define context and command mechanism. // ACED_ARXCOMMAND_ENTRY_AUTO(classname, group, globCmd, locCmd, cmdFlags, UIContext) // ACED_ARXCOMMAND_ENTRYBYID_AUTO(classname, group, globCmd, locCmdId, cmdFlags, UIContext) // only differs that it creates a localized name using a string in the resource file // locCmdId - resource ID for localized command // Modal Command with localized name // ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ASDKMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL) static void ASDKMyGroupMyCommand () { // Put your command code here } // Modal Command with pickfirst selection // ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ASDKMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET) static void ASDKMyGroupMyPickFirst () { ads_name result ; int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ; if ( iRet == RTNORM ) { // There are selected entities // Put your command using pickfirst set code here } else { // There are no selected entities // Put your command code here } } // Application Session Command with localized name // ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ASDKMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION) static void ASDKMyGroupMySessionCmd () { // Put your command code here } static void AAAMyGroupMyCommand () { // Put your command code here ads_point p1, p2; p1[X] = 0.0; p1[Y] = 0.0; p1[Z] = 0.0; p2[X] = 0.0; p2[Y] = 10.0; p2[Z] = 0.0; double ang = ads_angle(p1, p2); acutPrintf(TEXT("HELLOWORLD!")); } // The ACED_ADSFUNCTION_ENTRY_AUTO / ACED_ADSCOMMAND_ENTRY_AUTO macros can be applied to any static member // function of the CArxProject1App class. // The function may or may not take arguments and have to return RTNORM, RTERROR, RTCAN, RTFAIL, RTREJ to AutoCAD, but use // acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal to return // a value to the Lisp interpreter. // // NOTE: ACED_ADSFUNCTION_ENTRY_AUTO / ACED_ADSCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid. //- ACED_ADSFUNCTION_ENTRY_AUTO(classname, name, regFunc) - this example //- ACED_ADSSYMBOL_ENTRYBYID_AUTO(classname, name, nameId, regFunc) - only differs that it creates a localized name using a string in the resource file //- ACED_ADSCOMMAND_ENTRY_AUTO(classname, name, regFunc) - a Lisp command (prefix C:) //- ACED_ADSCOMMAND_ENTRYBYID_AUTO(classname, name, nameId, regFunc) - only differs that it creates a localized name using a string in the resource file // Lisp Function is similar to ARX Command but it creates a lisp // callable function. Many return types are supported not just string // or integer. // ACED_ADSFUNCTION_ENTRY_AUTO(CArxProject1App, MyLispFunction, false) static int ads_MyLispFunction () { //struct resbuf *args =acedGetArgs () ; // Put your command code here //acutRelRb (args) ; // Return a value to the AutoCAD Lisp Interpreter // acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal return (RTNORM) ; } } ; //----------------------------------------------------------------------------- IMPLEMENT_ARX_ENTRYPOINT(CArxProject1App) ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ASDKMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL) ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ASDKMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL) ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ASDKMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL) ACED_ADSSYMBOL_ENTRY_AUTO(CArxProject1App, MyLispFunction, false) 如何给AAAMyGroupMyCommand注册一个命令
时间: 2025-05-27 21:54:46 浏览: 16
<think>好的,用户的问题是关于如何在AutoCAD的ObjectARX插件中给AAAMyGroupMyCommand注册一个命令。我需要仔细分析提供的代码,找出正确的方法。首先,我注意到用户提供的代码中已经有一些命令注册的例子,比如ASDKMyGroupMyCommand和ASDKMyGroupMyPickFirst。这些命令都是通过ACED_ARXCOMMAND_ENTRY_AUTO宏来注册的。例如:ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App,ASDKMyGroup, MyCommand,MyCommandLocal,ACRX_CMD_MODAL,NULL)这个宏的参数结构应该是:类名、命令组、全局命令名、本地化命令名、命令标志和上下文。用户需要将AAAMyGroupMyCommand以类似的方式注册。
查看代码中的AAAMyGroupMyCommand函数,它是一个静态成员函数,但没有对应的注册宏。因此,问题在于缺少这个宏的调用。正确的做法是使用ACED_ARXCOMMAND_ENTRY_AUTO宏来注册该命令。接下来,我需要确定如何正确使用这个宏。根据已有的例子,正确的格式应该是:ACED_ARXCOMMAND_ENTRY_AUTO(类名,命令组,全局命令名,本地化名称,标志,上下文)
在用户的例子中,类名是CArxProject1App,命令组可能是AAAMyGroup,全局命令名是MyCommand,对应的本地化名称可能需要用户自己定义或者使用现有的资源ID。不过,用户提供的代码中似乎没有定义对应的本地化字符串资源,可能需要假设用户已经处理了这部分,或者使用默认值。因此,正确的注册代码应该是在文件的最后部分,与现有的ACED_ARXCOMMAND_ENTRY_AUTO宏一起添加:ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App,AAAMyGroup, MyCommand,MyCommandLocal,ACRX_CMD_MODAL,NULL)这里假设"MyCommandLocal"是资源文件中定义的本地化字符串ID,用户需要确保该资源存在,否则可能需要调整参数。如果用户没有本地化需求,可能需要使用另一个宏版本,比如ACED_ARXCOMMAND_ENTRYBYID_AUTO来指定资源ID,但根据现有代码的结构,使用ACED_ARXCOMMAND_ENTRY_AUTO是合适的。
另外,检查代码中是否已经有相关的资源定义,比如在resource.h中是否有ID对应的字符串,如果没有,用户可能需要添加相应的资源条目,或者使用默认的非本地化名称。总结步骤:在代码的IMPLEMENT_ARX_ENTRYPOINT之后,添加对应的注册宏,确保命令组、全局命令名和本地化名称正确,并处理资源问题。</think>要在ObjectARX中为`AAAMyGroupMyCommand`注册命令,需要使用`ACED_ARXCOMMAND_ENTRY_AUTO`宏。以下是修改后的关键代码部分:
```cpp
// 在类声明后添加命令注册宏(一般在文件末尾的ENTRYPOINT之后)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, AAAMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)
// 在资源文件(.rc)中添加字符串定义(假设使用字符串ID 30000)
STRINGTABLE
BEGIN
IDS_MYCOMMANDLOCAL "MyCommand"
END
```
**代码解释:**
1. `ACED_ARXCOMMAND_ENTRY_AUTO`宏参数说明:
- 类名:`CArxProject1App`
- 命令组:`AAAMyGroup`(AutoCAD中的命令前缀)
- 全局命令名:`MyCommand`(LISP调用时的命令名)
- 本地化名称:`MyCommandLocal`(资源文件中定义的本地化字符串ID)
- 标志:`ACRX_CMD_MODAL`(模态命令)
- 上下文:`NULL`(默认上下文)
2. 资源字符串定义:
- 需要在资源文件中添加对应ID的本地化字符串,否则会使用默认名称
**完整修改步骤:**
1. 在cpp文件末尾的`IMPLEMENT_ARX_ENTRYPOINT`后添加注册宏
2. 在resource.h中定义新的字符串ID(如`IDS_MYCOMMANDLOCAL`)
3. 在.rc资源文件中添加对应字符串
阅读全文
相关推荐


















