望山居

真相本来是一体的,太大了,所以大家给他画了格子,结果把自己困了起来

导航

ObjectARX(CAD)_Step1_1

ObjectARX(CAD) 中的 Helloworld

现在,就可以在我们配置好的ObjectARX项目中, 准备写第一行helloworld代码了

首先创建一个名为helloworld.cpp文件

添加cpp文件 --- 图示
new project win32 wizzard

添加头文件

#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; 
}

posted on 2022-03-22 00:04  穆道  阅读(619)  评论(0)    收藏  举报