最近更新于 2024-08-11 11:18
环境
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 };
acedSSGet(nullptr, nullptr, nullptr, nullptr, ss);
Adesk::Int32 length = 0;
acedSSLength(ss, &length);
if (length == 0)
{
acutPrintf(L"没有选中任何对象。\n");
acedSSFree(ss);
return;
}
for (Adesk::Int32 i = 0; i < length; ++i)
{
ads_name name = { 0, 0 };
acedSSName(ss, i, name);
AcDbObjectId objId;
acdbGetObjectId(objId, name);
AcDbEntity* pEntity = nullptr;
if (acdbOpenObject(pEntity, objId, AcDb::kForRead) != Acad::eOk)
{
continue;
}
if (pEntity->isKindOf(AcDbDimension::desc()))
{
AcDbDimension* pDimension = AcDbDimension::cast(pEntity);
acutPrintf(L"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
double measuredValue = 0;
pDimension->measurement(measuredValue);
acutPrintf(L"测量单位:%g\n", measuredValue);
ACHAR* dimText = pDimension->dimensionText();
acutPrintf(L"文字替代:%s\n", dimText);
}
pEntity->close();
}
acedSSFree(ss);
}
ObjectARX 2025(C++)获取尺寸标注内容