プログラムで取得したブロック名が匿名ブロック名「*U0000」「*U0001」…だった場合の対処法

はじめに

AutoCADでプログラムを使用してブロック名を取得する際に、ブロック名が「*U0000」「*U0001」などのように「*U」から始まる名称になることがあります。これは、AutoCADがダイナミックブロックを使用した際に自動的に割り当てる一時的な名前です。本記事では、この問題を回避し、適切なブロック名を取得する方法について解説します。

Autodesk製品を安く使いませんか?

このような問題は、AutoCAD製品を正しく使えばスムーズに解決できるケースが多いです。
特に公式製品では、ダイナミックブロックの扱いがしやすく、作業効率が大幅にアップします。

\いまなら最大20%OFF!/
AutoCADをこれから導入する方や、古いバージョンから乗り換えを考えている方はチャンスです👇

前提条件

・開発言語:C#

・OS:windows11

・開発環境:VisualStudio2022

・Autodesk AutoCAD2023

コード

AutoCADのAPIを使用してブロック名を取得する際に、ダイナミックブロックの場合は実際のブロック定義名を取得する必要があります。以下のコードでは、ブロック名が「*U0000」などの形式の場合に、ダイナミックブロックの親ブロック名を取得するように処理しています。

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace AutoCADBlockNameFix
{
    public class BlockNameRetriever
    {
        [CommandMethod("GETBLOCKNAME")]
        public void GetBlockName()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            PromptSelectionOptions options = new PromptSelectionOptions
            {
                MessageForAdding = "\nブロックを選択してください: "
            };
            
            PromptSelectionResult selectionResult = ed.GetSelection(options);
            if (selectionResult.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nブロックが選択されていません。");
                return;
            }

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                foreach (ObjectId objectId in selectionResult.Value.GetObjectIds())
                {
                    Entity entity = tr.GetObject(objectId, OpenMode.ForRead) as Entity;
                    if (entity is BlockReference blockRef)
                    {
                        string blockName = blockRef.Name;

                        // ダイナミックブロックの場合は、元のブロック名を取得
                        if (blockRef.IsDynamicBlock)
                        {
                            BlockTableRecord btr = tr.GetObject(blockRef.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
                            blockName = btr.Name;
                        }

                        ed.WriteMessage($"\nブロック名: {blockName}");
                    }
                }
                tr.Commit();
            }
        }
    }
}

まとめ

AutoCADのプログラムでブロック名を取得した際に「*U0000」のような名称になるのは、ダイナミックブロックが自動的に割り当てた仮の名前であるためです。適切なブロック名を取得するためには、DynamicBlockTableRecord を参照し、元のブロック定義名を取得する必要があります。本記事のコードを使用することで、ダイナミックブロックの正しい名称を取得し、処理をより適切に行うことができます。

Autodesk製品で設計・エンジニアリングを革新!

AutoCAD、Revit、Fusion 360など、業界最先端のソフトウェアが勢ぞろい。設計・製造・建築のプロジェクトを次のレベルへ!

今ならAutoCAD製品が最大20%OFF!

✅ 実務に導入するメリット:

  • 手動作業の工数が大幅削減
  • ブロック名や図面管理のトラブルも回避
  • 最新バージョンで業務効率がグッと向上!

本記事のような課題に直面している方には、正規のAutoCAD製品の導入がとてもおすすめです。
この機会にチェックしてみてくださいね。