ObjectARX 2025(C++)插入块参照 AcDbBlockReference

最近更新于 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 命令,输入已有的块定义名称(这里是我图纸文件里已有的定义,没有就自己创建)
file

可以点击选择插入点
file

file

ObjectARX 2025(C++)插入块参照 AcDbBlockReference
Scroll to top

目录

打开目录