最近更新于 2025-04-06 12:59
环境
AutoCAD 机械版 2025
ObjectARX 2025
VS 2022(ISO C++14)
环境配置参考:https://blog.iyatt.com/?p=16480
自定义类使用方法参考:https://blog.iyatt.com/?p=16635
实现
InsertBlock.hpp
#pragma once
class InsertBlock
{
public:
static void init();
static void unload();
private:
static void drawBlock(AcDbBlockReference* pBlockReference);
static void work();
};
InsertBlock.hpp
#include "StdAfx.h"
#include "InsertBlock.hpp"
void InsertBlock::init()
{
acedRegCmds->addCommand(L"MyTest", L"TestInsertBlock", L"TestInsertBlock", ACRX_CMD_MODAL, InsertBlock::work);
}
void InsertBlock::unload()
{
acedRegCmds->removeGroup(L"MyTest");
}
void InsertBlock::drawBlock(AcDbBlockReference* pBlockReference)
{
AcDbBlockTable* pBlockTable = nullptr;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord* pBlockTableRecord = nullptr;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTableRecord->appendAcDbEntity(pBlockReference);
pBlockTableRecord->close();
pBlockTable->close();
}
void InsertBlock::work()
{
AcString blockName;
if (acedGetString(Adesk::kFalse, L"\n输入图块的名称:", blockName) != RTNORM)
{
return;
}
// 查找输入的块定义是否存在
AcDbBlockTable* pBlockTable = nullptr;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForWrite);
if (!pBlockTable->has(blockName.kACharPtr()))
{
acutPrintf(L"\n当前图纸中未包含指定的块定义!\n");
pBlockTable->close();
return;
}
ads_point pt;
if (acedGetPoint(nullptr, L"\n输入插入点:", pt) != RTNORM)
{
pBlockTable->close();
return;
}
AcGePoint3d insertPt = asPnt3d(pt);
// 获取块定义的 ID
AcDbObjectId blockReferenceId;
pBlockTable->getAt(blockName.kACharPtr(), blockReferenceId);
pBlockTable->close();
AcDbBlockReference* pBlockReference = new AcDbBlockReference(insertPt, blockReferenceId);
InsertBlock::drawBlock(pBlockReference);
pBlockReference->close();
}
执行 TestInsertBlock 命令,输入已有的块定义名称(这里是我图纸文件里已有的定义,没有就自己创建)
可以点击选择插入点
ObjectARX 2025(C++)插入块参照 AcDbBlockReference