ObjectARX 2025(C++)获取尺寸标注内容

最近更新于 2024-08-11 11:18

Table of Contents

环境

AutoCAD 机械版 2025
ObjectARX 2025
VS 2022

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

分析

查看尺寸标注的属性里的文字栏里的“测量单位”和“文字替代”
纯尺寸标注里,测量单位里的数值就是标注的尺寸
file

当标注里添加了符号或者公差之类的,“文字替代”里就有对应的控制码内容了
file

file

file

当存在自行添加的符号或者公差之类的时候,添加的东西会出现在文字替代里,显示的内容就不是测量单位了,而是文字替代的内容。可以在文字替代中看到<>,这对括号代表着测量单位的数值,在标注上显示的时候会自动替换成测量单位的数值,这个数值是实体驱动的,实体的尺寸变化,数值会跟随变化。

实现

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);
}

file

ObjectARX 2025(C++)获取尺寸标注内容
Scroll to top