ObjectARX(CAD)_Step1_1
ObjectARX(CAD) 中的 Helloworld
现在,就可以在我们配置好的ObjectARX项目中, 准备写第一行helloworld代码了
首先创建一个名为helloworld.cpp文件
添加cpp文件 --- 图示
添加头文件
#include "stdafx.h"
#include "tchar.h"
#include <aced.h> // 主要负责接入AutoCAD编辑器专用服务
#include <rxregsvc.h> // acrxXXX的一些工具函数
申明方法
void initApp(); // 当应用程序加载的时候, AutoCAD 会调用这部分代码
void unloadApp(); // 当应用程序卸载的时候, AutoCAD 会调用这部分代码
void helloWorld(); // 业务代码
实现方法
首先我们来实现 initApp() 函数, 有关AcEdCommandStack类的AcedRecmds宏和addCommand()方法的详细信息,请参阅ObjectARX联机帮助文件。
acedRegCmds->addCommand("CMD_GROUP", "GLOBAL_CMD_NAME", "LOCAL_CMD_NAME", ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, func1);
第一个参数是命令所在的组名(在本例中, 它只有一个命令)
第二个参数是全局/未翻译的命令名
第三个参数是同一个命令的本地/翻译名称
第四个参数是命令标志(在这里我们定义了一个透明命令, 这意味着可以在另一个命令处于活动状态时调用该命令)
第五个参数是指向我们命令调用函数的指针, C++中是方法函数的方法名)
/*
* 此函数用于向AutoCAD命令机制注册新命令
* 这个新的命令会作为一个附加入口(additional entry point)加入到我们的程序中
*/
void initApp()
{
// register a command with the AutoCAD command mechanism
acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
_T("Hello"),
_T("Bonjour"),
ACRX_CMD_TRANSPARENT,
helloWorld);
}
接下来我们实现 unloadApp() 函数。此函数将删除我们的命令组,这也将删除我们的命令。由于在AutoCAD中注册的命令会成为应用程序的附加入口点,因此在卸载应用程序时删除它们是绝对必要的;
void unloadApp()
{
acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));
}
接下来我们实现 helloWorld() 函数;acutPrintf()相当于重定向到AutoCAD命令行的C printf函数;
void helloWorld()
{
acutPrintf(_T("\nHello World!"));
}
目前位置, 我们已经完成了最基础的部分, 接下来我们要实现一个ObjcetARX程序最重要的函数;
所有的ObjectARX程序都有一个主要的入口: acrxEntryPoint() 函数, AutoCAD 会调用该函数来给我们的应用程序传递数据;
TIPS: ObjectARX 程序是一个 DLL(动态链接库) 因此是没有 main() 函数作为程序入口
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
第一个参数是名为msg的AcRx类的数据成员,它表示从ObjectARX内核(ObjectARX kernel)发送到应用程序的消息。
第二个参数是传递给不同函数(例如锁定和解锁函数)的数据的不透明句柄(该数据根据AutoCAD传递的消息而变化)。
默认情况下,应用程序是锁定的,这意味着一旦加载就无法卸载。由于我们的应用程序非常简单(它不定义AutoCAD和其他应用程序引用的对象,除了我们的命令),我们可以安全地解锁应用程序,使其不可加载,前提是我们先删除命令,这是在unloadApp()函数中实现的。
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(pkt);
acrxRegisterAppMDIAware(pkt); // 默认情况下,ObjectARX应用程序不支持`MDI`。应用程序需要使用`acrxRegisterAppMDIAware()`全局函数将自己显式注册为`MDI感知`。
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
default:
break;
}
return AcRx::kRetOK;
}
最后,我们需要导出acrxEntryPoint()函数,以便AutoCAD可以访问它。有几种方法可以做到这一点。其中之一包括创建定义(.def)文件
创建 .def 文件
在项目中添加一个新项, 名为ArxProject 的 Def文件
将以下信息添加到新文件中。所有ObjectARX应用程序必须导出至少两个函数:
-
acrxEntryPoint
-
acrxGetApiVersion
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
至此, 我们的项目已准备就绪。如果你正确地遵循了教程,你应该会得到0个错误和0个警告。
注意:rxapi可能会出现链接器警告LNK4099。lib和acedapi。在构建过程中使用lib库。您可以放心地忽略这些警告。
加载步骤01。在AutoCAD中单击arx并键入“hello”以运行命令。
ObjectARX程序的加载和调试
完整代码
helloworld.cpp 完整代码
#include "stdafx.h"
#include <aced.h>
#include <rxregsvc.h>
void initApp(); // 定义方法
void unloadApp(); // 定义方法
void helloWorld(); // 定义方法
void initApp()
{
// register a command with the AutoCAD command mechanism
acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
_T("Hello"),
_T("Bonjour"),
ACRX_CMD_TRANSPARENT,
helloWorld);
}
void unloadApp()
{
acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));
}
void helloWorld()
{
acutPrintf(_T("\nHello World!"));
}
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(pkt);
acrxRegisterAppMDIAware(pkt);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
default:
break;
}
return AcRx::kRetOK;
}
浙公网安备 33010602011771号