1 基本思路

曾经写过vba和vb的cad开发,惊叹于那个chm文档(AutoCAD ActiveX 和 VBA 参考(明经翻译版))文件结构化做的非常好,查询非常方便,比如绘制一个直线,命令,参数,获取直线的长度等属性,也就是每个命令对应输入参数、方法和属性(现在只有method了吗?没有property了吗?),明白了一个就全都明白了,剩下的就是查手册。C++亦如此吧,安装arx后本地的帮助文件:

官方在线的:
https://help.autodesk.com/view/OARX/2026/CHS/?guid=OARX-RefGuide-AcDb3dPolyline__AcDb3dPolyline_AcDb__Poly3dType_AcGePoint3dArray__Adesk__Boolean

2 框架思路

AutoCAD ObjectARX 二次开发(2020版)–4,使用ARX向导创建CAD二次开发项目(编程框架)–
手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导。
在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序。
本节的程序的需求是,接收CAD用户的输入。
首先,打开VS2017,新建项目
在左边的树形目录里依次选择Visual C++ --> Autodesk
然后在窗口中间选择 ARX/DBX Project For AutoCAD 2020
点击确定

这里可能遇到一些状况导致点击确定后无法进入下一步,
有可能是本教程开头介绍的部件没有完全安装,或者安装过程中路径选择错误,或者安装向导的时候没有使用管理员权限导致的。
如果前面的准备工作一切就绪,那么确定后会弹出这样的窗口来

窗口第一行可输入的内容是注册开发人员符号(RDS),
如果你有的话,就输入你的符号,
如果你不知道这是什么的话,请忽略,这个不影响我们开发程序,只是个标识符。
其它选项我们暂时不需要,可以直接点击完成(Finish)。
当你看到这个场景的时候,恭喜你,编程模板(框架)已经准备好了,我们要写自己的业务和逻辑进去了。

因为ARX开发的方式是,将自己的函数注册给库,指定调用命令就完成了。
CAD加载我们的程序后,用你事先指定的命令,就可以调用对应的函数了。
重点来了,在创建我们自己的函数之前,我们先学习模板里预留给我们的函数。
acrxEntryPoint.cpp 77行左右,你应该能看到这个函数

static void ADSKMyGroupMyCommand () {
    // Put your command code here
}

这就是一个可以被注册为CAD指令的函数。
函数名其实是两部分组成的,前半段为ADSKMyGroup,后半段为MyCommand
前半段的意义类似于名字空间,默认是你的RDS符号+MyGroup,实际上可以是任何合法的字符
后半段才是真正的函数名,是你想给函数取的名字。
比如你可以取一个函数名为 static void CloudTestInput(){ }
请注意,修辞是static,返回值是void,参数为空,都是固定的,不能变。
虽然现在函数内部是空的,没有关系,最后一步再来写函数内容,先看文件最下面,找到这一句

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ADSKMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)

这是将函数注册为CAD指令的方法。
一共有6个参数。
参数1:程序标识符,使用默认值
参数2:注册函数的前半段名字,也就是刚才说的名字空间
参数3:注册函数的后半段名字,真正意义的函数名
参数3:CAD指令。这是你创建的CAD指令,当在CAD中输入这条指令时就会调用对应的函数。
参数4:模式,暂时使用默认值。
参数5:默认NULL
生成程序,会得到一个后缀为ARX的文件,这就是我们的CAD插件。不过现在这个插件没有任何功能。
我们现在来写函数内容,让这个插件拥有接收用户输入的功能。
注意,ARX要求生成过程中0警告0错误,哪怕有一个警告也会阻止生成成功。
所以,拿出强迫症精神,做ARX开发,一个警告都不能有。
我们给刚才的函数内部添加如下内容:

static void ADSKMyGroupMyCommand() {

    wchar_t temp[32];
    wmemset(temp, 0, 32);

    acutPrintf(_T("这是我的第一个ARX插件\n"));       //输出
    acedGetString(0,_T("请问你的名字是:"),temp);   //输入
    acutPrintf(_T("你好,%s\n"),temp);     //输出
}

简介一下acedGetString函数,这是接受输入的函数,有很多重载方式,当前使用的方式有三个参数。
参数1:若为0,空格和回车都会使字符串输入结束,若非0,空格不会使字符串输入结束,需要回车才会结束。
参数2:输出字符串的部分
参数3,接收字符串的缓存
生成新的ARX吧,然后依照第三节的内容加载ARX并且执行这条指令。
指令是你自己创建的,本例中为 MyCommandLocal
执行效果如下:

你可以依照上面的格式,自己在acrxEntryPoint.cpp文件的类中添加新的函数
然后添加一条新的注册指令。
就像这样

    static void BIMCloudHello() {

        wchar_t temp[32];
        wmemset(temp, 0, 32);

        acutPrintf(_T("这是我的第一个ARX插件\n"));       //输出
        acedGetString(0,_T("请问你的名字是:"),temp);   //输入
        acutPrintf(_T("你好,%s\n"),temp);         //输出
    }

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, BIMCloud, Hello, myhello, ACRX_CMD_MODAL, NULL)
然后在CAD中执行myhello指令,就可以调用这个函数了。记得,新函数要添加在acrxEntryPoint文件的类当中,作为一个类成员函数。
你应该已经注意到,整个过程中没有添加任何头文件,
因为创建模板的时候,ARX向导已经帮我们添加好了,所以非常方便,直接就可以写业务逻辑了。
但是你用到Unicode字符的话,就需要自己添加
#include "tchar.h"
本文来自博客园,作者:-Cloud-,转载请注明原文链接:https://www.cnblogs.com/TheRedHouse/p/11995966.html

3 框架和代码

使用C++语言进行CAD二次开发,以AutoCAD为例,通常需要利用AutoCAD提供的API(如ObjectARX或ObjectARX.NET)。以下是一个简化的例子,描述如何开发一个插件,用于自动生成一个标准的圆柱体模型。

步骤1: 准备工作

安装AutoCAD和AutoCAD的开发环境(例如,ObjectARX SDK)。
配置开发环境,以便可以使用ObjectARX SDK中的库和头文件。
步骤2: 创建项目

在你的C++开发环境中创建一个新的ObjectARX项目。
引入必要的AutoCAD头文件和库文件。
步骤3: 编写代码

下面是一个简化的C++代码示例,用于在AutoCAD中创建一个圆柱体:

#include "aced.h"
#include "AcDb.h"
#include "AcGi.h"
#include "AcPl.h"
#include "AcPlCylinder.h"
// 命令类定义
class CreateCylinderCommand : public AcEdCommand
{
    public:
    virtual void beginCommand(void)
    {
        // 命令开始时调用的代码(如果有)
    }
    virtual Acad::ErrorStatus command(void)
    {
        // 定义圆柱体的参数
        double height = 10.0; // 高度
        double radius = 5.0; // 半径
        // 创建一个圆柱体实体
        AcPlCylinder cyl(AcGePoint3d(0, 0, 0), radius, height);
        // 转换为AutoCAD的数据库表示
        AcDbCylinder *pDbCylinder = AcDbCylinder::create();
        pDbCylinder->setCenter(cyl.center());
        pDbCylinder->setRadius(cyl.radius());
        pDbCylinder->setHeight(cyl.height());
        // 开始一个事务来添加圆柱体到数据库
        AcDbTransactionManager* pTransMgr = acDbTransMgr;
        AcDbTransaction* pTrans = pTransMgr->startTransaction();
        AcDbBlockTableRecordPtr pBlkTblRcd;
        acdbOpenObject(pBlkTblRcd, ACDB_MODEL_SPACE, AcDb::kForWrite);
        // 将圆柱体添加到模型空间
        pBlkTblRcd->appendAcDbEntity(pDbCylinder, Adesk::kTrue);
        // 提交事务
        pTrans->commit();
        // 清理
        pDbCylinder->close();
        return Acad::eOk;
    }
    // 其他必要的方法(如endCommand等)
};
// 命令工厂函数
static void createCylinder()
{
    CreateCylinderCommand cmd;
    cmd.startCommand();
    cmd.command();
}
// AutoCAD命令入口
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
    switch (msg)
    {
        case kInitAppMsg:
            acrxDynamicLinker->unlockApplication(appId);
            acrxDynamicLinker->registerAppMDIAware(appId);
            break;
        case kUnloadAppMsg:
            // 清理代码(如果有)
            break;
            default:
            break;
    }
    return AcRx::kRetOK;
}

// 命令注册
extern "C" void acedRegCmds()
{
    acedRegCmds->addCommand(_T("MYCOMMANDS"), _T("CREATECYLINDER"), _T("CC"), ACRX_CMD_MODAL,     createCylinder);
}

步骤4: 编译和链接

编译你的C++项目,生成一个ObjectARX库文件(例如,.arx或.dbx)。
确保你的库文件与AutoCAD兼容,并可以在AutoCAD中加载。
步骤5: 在AutoCAD中加载和运行插件

在AutoCAD中,使用NETLOAD或APPLOAD命令加载你的ObjectARX库文件。
在AutoCAD命令行中输入CREATECYLINDER或CC来运行你的命令,并生成圆柱体。
请注意,上述代码是一个简化的示例,仅用于说明基本概念。在实际开发中,你可能需要处理更多的细节和错误情况,并确保代码与AutoCAD的不同版本兼容。此外,AutoCAD的API可能会随着版本的更新而发生变化,因此建议查阅最新的AutoCAD开发文档以获取准确的信息。
————————————————
版权声明:本文为CSDN博主「科学的发展-只不过是读大自然写的代码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xie__jin__cheng/article/details/140827162

4 .cpp和.h文件区别

https://blog.csdn.net/weixin_44115575/article/details/137040409

官方资源

  1. Autodesk Developer Network (ADN)
  2. ObjectARX SDK 帮助文档
    • 安装ObjectARX SDK后,本地会有完整的帮助文档( .chm 格式)
    • 包含API参考、教程和示例代码
  3. AutoCAD .NET API 文档

社区和论坛

  1. Autodesk Community Forums
  2. CAD Forum

书籍

  1. 《ObjectARX开发基础与实例》 - 国内经典的ObjectARX入门书籍
  2. 《AutoCAD ObjectARX 2012 开发基础与实例教程》 - 较新版本的教程

代码示例

ObjectARX SDK安装包中包含大量示例项目,位于 samples 目录,涵盖了各种AutoCAD功能的实现方式,是学习的最佳实践参考。

作者:秦晓川  创建时间:2026-06-19 09:22
最后编辑:秦晓川  更新时间:2026-06-20 21:28
上一篇:
下一篇: