最近更新于 2025-04-04 23:22
环境
AutoCAD 机械版 2025
ObjectARX 2025
VS 2022(ISO C++14)
环境配置参考:https://blog.iyatt.com/?p=16480
自定义类使用方法参考:https://blog.iyatt.com/?p=16635
实现
Hatch.hpp
#pragma once
class Hatch
{
public:
static void init();
static void unload();
private:
static void drawHatch(AcDbHatch* pHatch);
static void work();
};
Hatch.cpp
#include "stdafx.h"
#include "Hatch.hpp"
void Hatch::init()
{
acedRegCmds->addCommand(L"TEST", L"TestHatch", L"TestHatch", ACRX_CMD_MODAL, Hatch::work);
}
void Hatch::unload()
{
acedRegCmds->removeGroup(L"TEST");
}
void Hatch::drawHatch(AcDbHatch* pHatch)
{
AcDbBlockTable* pBlockTable = nullptr;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord* pBlockTableRecord = nullptr;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTableRecord->appendAcDbEntity(pHatch);
pBlockTableRecord->close();
pBlockTable->close();
}
void Hatch::work()
{
// 提示用户输入边界
AcDbObjectIdArray objIds;
ads_name ss;
if (acedSSGet(nullptr, nullptr, nullptr, nullptr, ss) != RTNORM)
{
return;
}
Adesk::Int32 length;
acedSSLength(ss, &length);
for (Adesk::Int32 i = 0; i < length; ++i)
{
ads_name ent;
acedSSName(ss, i, ent);
AcDbObjectId objId;
acdbGetObjectId(objId, ent);
objIds.append(objId);
}
acedSSFree(ss);
// 填充平面
AcGeVector3d normal(0, 0, 1); // xy 平面
AcDbHatch* pHatch = new AcDbHatch();
pHatch->setNormal(normal);
pHatch->setElevation(0); // xy平面上的高度,即 Z 轴
// 填充与被填充区域保持关联
pHatch->setAssociative(true);
// 填充图案
pHatch->setPattern(AcDbHatch::kPreDefined, L"SOLID");
// 填充边界
pHatch->appendLoop(AcDbHatch::kExternal, objIds);
// 显示填充
pHatch->evaluateHatch();
// 添加到模型空间
Hatch::drawHatch(pHatch);
pHatch->close();
}
绘制一个封闭图形
执行 TESTHATCH 命令,然后框选绘制的封闭图形,回车执行填充
ObjectARX 2025(C++)绘制填充 Hatch