最近更新于 2024-10-29 15:21
环境
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 中创建了一个多行文本和单行文本
执行 YXTEST 命令进行测试
如果存在控制码(如%%C \Phi
,注意 CAD 中会显示为空集\emptyset
),单行文本中会得到控制码本身,在多行文本中获取到的是控制码代表的符号,公差会转换为斜杠表示。
ObjectARX 2025(C++)获取单行/多行文字内容