最近更新于 2026-03-10 00:00
环境
- AutoCAD Mechanical 2026
- ObjectArx 2026
- VS 2022
环境搭建参考:https://blog.iyatt.com/?p=21187
实现
SelectionProcessor.hpp
#pragma once
class SelectionProcessor
{
public:
static void init();
static void spTest();
static void unload();
};
SelectionProcessor.cpp
#include "stdafx.h"
#include "SelectionProcessor.hpp"
void SelectionProcessor::init()
{
// ACRX_CMD_USEPICKSET 这个参数表示命令会使用当前的拾取集
acedRegCmds->addCommand(L"IYATTyxTest", L"SPTEST", L"SPTEST", ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, SelectionProcessor::spTest);
}
void SelectionProcessor::spTest()
{
ads_name ss;
Adesk::Int32 length = 0;
// 获取当前的拾取集,I 就是 Implied Selection 隐式选择
if (acedSSGet(L"I", nullptr, nullptr, nullptr, ss) == RTNORM)
{
// 清除预选集的高亮状态
acedSSSetFirst(nullptr, nullptr);
// 获取选择集长度
acedSSLength(ss, &length);
acutPrintf(L"\n预选集包含 %d 个对象。", length);
}
else
{
if (acedSSGet(nullptr, nullptr, nullptr, nullptr, ss) == RTNORM)
{
// 获取选择集长度
acedSSLength(ss, &length);
acutPrintf(L"\n选择集包含 %d 个对象。", length);
}
else
{
acutPrintf(L"\n未选择任何对象。");
return;
}
}
acedSSFree(ss);
}
void SelectionProcessor::unload()
{
acedRegCmds->removeGroup(L"IYATTyxTest");
}
添加注册和卸载函数调用

先随意画了 3 条直线

选中 3 条线,执行 SPTEST 命令

直接读取到已经选择的 3 个实体

不选择的情况下执行 SPTEST 命令

再手动选择 3 个线条,可以看到提示,是和预选执行的不同分支

执行 SPTEST 不选择任何对象并确认

ObjectARX 2026(C++)隐式选择获取命令执行前已选中的实体
