最近更新于 2024-09-02 22:53
需求
我这边在做机加工工艺设计的时候,经常需要根据客户提供的三维模型导出 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。");
}
演示:
绘制了三条直线,都修改了颜色、线型和线宽,其中一条还修改了线型比例
执行 CPTBL 命令,选择图上的对象,确认命令修改
ObjectARX 2025(C++)实现将颜色、线型和线宽改为 ByLayer