ObjectARX 2025(C++)获取单行/多行文字内容

最近更新于 2024-10-29 15:21

Table of Contents

环境

AutoCAD 机械版 2025
ObjectARX 2025
VS 2022

环境配置参考:https://blog.iyatt.com/?p=16480
自定义类使用方法参考:https://blog.iyatt.com/?p=16635

实现

Test.hpp

#pragma once

class Test
{
public:
    static void init();
    static void unload();

private:
    static void test();
};

Test.cpp

#include "StdAfx.h"
#include "Test.hpp"

void Test::init()
{
    acedRegCmds->addCommand(L"IYATTyxTest", L"yxTest", L"yxTest", ACRX_CMD_MODAL, Test::test);
}

void Test::unload()
{
    acedRegCmds->removeGroup(L"IYATTyxTest");
}

void Test::test()
{
    ads_name ss = { 0, 0 };
    if (acedSSGet(nullptr, nullptr, nullptr, nullptr, ss) != RTNORM)
    {
        acutPrintf(L"未选中对象。\n");
        return;
    }

    Adesk::Int32 length = 0;
    if (acedSSLength(ss, &length) != RTNORM)
    {
        acutPrintf(L"获取选择集长度失败。\n");
        return;
    }

    for (Adesk::Int32 i = 0; i < length; ++i)
    {
        ads_name ent = { 0, 0 };
        acedSSName(ss, i, ent);

        AcDbObjectId objId;
        acdbGetObjectId(objId, ent);

        AcDbObject* pObj = nullptr;
        acdbOpenObject(pObj, objId, AcDb::kForRead);

        if (pObj->isKindOf(AcDbMText::desc())) // 多行文字
        {
            AcDbMText* pMTextObj = AcDbMText::cast(pObj);
            if (pMTextObj)
            {
                ACHAR* text = pMTextObj->text();
                acutPrintf(L"\n多行文本内容:%s\n", text);
            }
        }
        else if (pObj->isKindOf(AcDbText::desc())) // 单行文字
        {
            AcDbText* pTextObj = AcDbText::cast(pObj);
            if (pTextObj)
            {
                AcString text = pTextObj->textString();
                acutPrintf(L"\n单行文本内容:%s\n", text.kACharPtr()); // AcString 字符串对象需要转为 wchar_t*(ACHAR*)显示
            }
        }
        pObj->close();
    }

    acedSSFree(ss);
}

在 CAD 中创建了一个多行文本和单行文本
file

执行 YXTEST 命令进行测试
如果存在控制码(如%%C \Phi,注意 CAD 中会显示为空集\emptyset),单行文本中会得到控制码本身,在多行文本中获取到的是控制码代表的符号,公差会转换为斜杠表示。
file

ObjectARX 2025(C++)获取单行/多行文字内容
Scroll to top