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

最近更新于 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");
}

添加注册和卸载函数调用
file

先随意画了 3 条直线
file

选中 3 条线,执行 SPTEST 命令
file

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

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

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

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

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

目录

打开目录