ObjectARX 2025(C++)实现将颜色、线型和线宽改为 ByLayer

最近更新于 2024-09-02 22:53

Table of Contents

需求

我这边在做机加工工艺设计的时候,经常需要根据客户提供的三维模型导出 AutoCAD 工程图来编制,用 SolidWorks 导出的图纸线条的颜色、线型和线宽都是特定值,而不是 ByLayer(跟随图层)。我在编制工艺的时候会对加工面、非加工面、剖面填充等使用我自己定义的图层,但是必须要把各项属性改成 ByLayer 才能让外观跟随图层显示,这样我自定义的图层才有实际作用。只是每次都要手动分三次设置这三种属性还是显得麻烦,因此想要做一个扩展程序实现一次性完成修改。

环境

AutoCAD 机械版 2025
ObjectARX 2025
VS 2022

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

实现

项目地址:https://github.com/IYATT-yx/ChangePropertiesToByLayer

ChangePropertiesToByLayer.hpp

#pragma once

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

private:
    static void change();
};

ChangePropertiesToByLayer.cpp

#include "StdAfx.h"
#include "ChangePropertiesToByLayer.hpp"

void ChangePropertiesToByLayer::init()
{
    // 注册命令 CPTBL(change properties to ByLayer)
    acedRegCmds->addCommand(L"IYATTyxTools", L"CPTBL", L"CPTBL", ACRX_CMD_MODAL, ChangePropertiesToByLayer::change);
}

void ChangePropertiesToByLayer::unload()
{
    acedRegCmds->removeGroup(L"IYATTyxTools");
}

void ChangePropertiesToByLayer::change()
{
    acutPrintf(L"功能:修改选中对象的颜色、线型、线宽为 ByLayer,修改线型比例为 1。");
    ads_name ss = { 0, 0 }; // 选择集
    int ret = acedSSGet(nullptr, nullptr, nullptr, nullptr, ss); // 获取用户选择的对象集
    if (ret != RTNORM)
    {
        acutPrintf(L"\n没有选中任何对象。");
        return;
    }

    Adesk::Int32 length = 0; // 选择集长度
    acedSSLength(ss, &length); // 获取选择集的长度

    for (Adesk::Int32 i = 0; i < length; ++i) // 遍历选择集
    {
        ads_name name = { 0, 0 }; // 对象名
        acedSSName(ss, i, name); // 获取选择集中的第 i 个对象名

        AcDbObjectId objId; // 对象ID
        acdbGetObjectId(objId, name); // 获取对象 ID

        AcDbObject* pObj = nullptr; // 对象指针
        acdbOpenAcDbObject(pObj, objId, AcDb::kForWrite); // 以写权限打开对象

        AcDbEntity* pEntity = AcDbEntity::cast(pObj); // 强制转换为实体对象
        if (pEntity != nullptr)
        {
            pEntity->setColorIndex(256);  // 颜色设置为 ByLayer
            pEntity->setLinetype(L"ByLayer"); // 线型设置为 ByLayer
            pEntity->setLinetypeScale(1.0);  // 可选,默认线型比例
            pEntity->setLineWeight(AcDb::kLnWtByLayer); // 线宽设置为 ByLayer

            pEntity->downgradeOpen(); // 将对象改为只读模式
        }
        pObj->close(); // 关闭对象
    }

    acedSSFree(ss); // 释放选择集
    acutPrintf(L"选中对象已修改属性为 ByLayer。");
}

演示:
绘制了三条直线,都修改了颜色、线型和线宽,其中一条还修改了线型比例
file

执行 CPTBL 命令,选择图上的对象,确认命令修改
file
file
file
file

ObjectARX 2025(C++)实现将颜色、线型和线宽改为 ByLayer
Scroll to top