development of

Tieghaに関する備忘録とおまけ

AutodeskHelpのMCPサーバー

Autodesk社がAutodeskHelpのMCPサーバーを公開して1か月ほど経ちましたので、ちょこっと検証してみた感想になります。

■現在利用できるMCP サーバーは?

現在Autodesk社によって開発され、一般に公開されているMCPサーバー

  • Autodesk Help MCP サーバー
  • Revit 2027 MCP サーバー (ローカル MCP サーバーなので別途インストールすることが必要?)
  • Fusion MCP サーバー
  • Fusion Data MCP サーバー など…

■Autodesk Help MCP サーバーの利用方法

利用方法について公式のデベロッパー向けブログでは以下の様に案内されている。

  • Autodesk社がテスト・サポートしているAIエージェント
    • Cursor
    • Claude Desktop

ただ、今回の検証では上記のようなAIエージェントは使用せず、OpenAIのResponses APIを使用している。 (既存のAIエージェントを介しての利用ではなく、AIサービスからの利用を想定している感じ)

var client = new ResponsesClient("API KEY");
List<ResponseItem> inputItems = new List<ResponseItem>();
var userMessage = ResponseItem.CreateUserMessageItem("ユーザープロンプト");
inputItems.Add(userMessage);
// オプションを作成
var responseOption = new CreateResponseOptions("gpt-5.4-2026-03-05", inputItems);
// ツールを追加
responseOption.Tools.Add(AutodeskProductHelp());
ResponseResult  response = await client.CreateResponseAsync(responseOption);
private static McpTool AutodeskProductHelp()
{
    var mcpTool = new McpTool(
        serverLabel: "autodesk-product-help", 
        serverUri: new Uri("https://developer.api.autodesk.com/knowledge/public/v1/mcp"));
    mcpTool.ServerDescription = "オートデスク製品のオンライン ヘルプ";
    mcpTool.ToolCallApprovalPolicy = new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval);
    return mcpTool;
}

■検証結果

Autodesk Assistant でも同じユーザープロンプトを入力し、回答結果を比較してみた。

ユーザープロンプト①

Autodesk Help MCP サーバーがサポートしている製品は?
  • Autodesk Assistant
  Autodesk Help MCPサーバーがサポートしている製品は非常に多岐にわたります。主要な製品カテゴリーをご紹介します:

  ## **設計・CAD製品**

  - **AutoCAD** (ACD) - 2021-2027
  - **AutoCAD LT** (ACDLT) - 2021-2027
  - **AutoCAD for Mac** (ACDMAC) - 2021-2027
  - **AutoCAD Architecture** (ARCHDESK) - 2021-2027
  - **AutoCAD Electrical** (ACAD_E) - 2021-2027
  - **AutoCAD MEP** (BLDSYS) - 2021-2027
  - **AutoCAD Mechanical** (AMECH_PP) - 2021-2027
  - **AutoCAD Map 3D** (MAP) - 2021-2027
  - **AutoCAD Plant 3D** (PLNT3D) - 2021-2027

  ## **BIM・建築製品**

  - **Revit** (RVT) - 2021-2027
  - **Revit LT** (RVTLT) - 2021-2027
  - **Civil 3D** (CIV3D) - 2021-2027
  - **Advance Steel** (ADSTPR) - 2021-2027

  ## **3D・アニメーション製品**

  - **3ds Max** (3DSMAX) - 2021-2027
  - **Maya** (MAYA) - 2022-2027
  - **Maya Unlimited** (MAYAUL) - 2022-2027
  - **MotionBuilder** (MOBPRO) - 2022-2027
  - **Mudbox** (MBXPRO) - 2018-2027

  ## **製造・エンジニアリング製品**

  - **Inventor** (INVNTOR) - 2021-2027
  - **Inventor Professional** (INVPROSA) - 2021-2027
  - **Inventor Nastran** (NINCAD) - 2021-2027
  - **PowerMill** (PWRMS) - 2021-2027
  - **PowerShape** (PWRSS) - 2021-2027
  - **PowerInspect** (PWRIS) - 2021-2027
  - **FeatureCAM** (FCAMS) - 2021-2027

  ## **シミュレーション・解析製品**

  - **Autodesk CFD** (SCFD) - 2021-2027
  - **Robot Structural Analysis Professional** (RSAPRO) - 2021-2027
  - **Moldflow Adviser Ultimate** (MFAA) - 2021-2027
  - **Moldflow Insight** (MFIA) - 2021-2027

  ## **クラウド・コラボレーション製品**

  - **Fusion** (FSN)
  - **BIM 360** 関連製品
  - **Construction Cloud** 関連製品

  ## **その他の専門製品**

  - **Arnold** (ARNOL) - 2023-2026
  - **ReCap Pro** (RECAP) - 2018-2026
  - **Navisworks Freedom** (NAVFREE) - 2024-2027
  - **Vault Professional** (VLTM) - 2024-2027

  合計で**200以上の製品**がサポートされており、それぞれに複数のリリースバージョンが含まれています。各製品には製品コード(例:ACD、RVT、3DSMAX)とサポートされているリリースコード(年度)が設定されています。
  • Responses API + MCPサーバー

  Autodesk Help MCP サーバーがサポートしている製品は多数あります。  
  取得できた製品カタログには、たとえば以下が含まれています。

  - AutoCAD
  - AutoCAD LT
  - AutoCAD for Mac
  - AutoCAD Architecture
  - AutoCAD Electrical
  - AutoCAD Mechanical
  - AutoCAD Plant 3D
  - Civil 3D
  - Revit
  - Revit LT
  - Inventor
  - Inventor Professional
  - Fusion
  - Maya
  - 3ds Max
  - Navisworks Manage
  - Navisworks Simulate
  - ReCap Pro
  - InfraWorks
  - Vault Professional
  - Robot Structural Analysis Professional
  - DWG TrueView
  - Moldflow Insight
  - MotionBuilder
  - Mudbox
  - Arnold
  - Autodesk Access
  - Desktop Connector
  - BIM Collaborate
  - Docs for AEC Collection
  - Takeoff
  - Forma
  - Flow Production Tracking

  ほかにも、コレクション製品、クラウド製品、拡張機能、旧製品を含めて非常に多くの製品が登録されています。

  補足:

  - カタログには重複している製品名も一部含まれています。
  - 製品ごとに `product_code` と、対応している `release_code` がある場合があります。

  必要なら次にできます。

  1. サポート製品を一覧で全部出す  
  2. `product_name / product_code / release_code` 付きで表にする  
  3. AutoCAD系、Revit系、Fusion系のようにカテゴリ別に整理する

  必要なら、次の返答で「全製品一覧」を見やすく整形して出します。

ユーザープロンプト②

異尺度対応オブジェクトの仕組みを説明して
  • Autodesk Assistant
  異尺度対応オブジェクトの仕組みについて説明いたします。

  ## 異尺度対応オブジェクトとは

  異尺度対応オブジェクトは、AutoCADの注釈機能の一つで、**選択した注釈尺度に従って自動的にサイズが変化する**オブジェクトです。これにより、異なる尺度のビューポートでも一貫したサイズで注釈を表示できます。

  ## 主な特徴

  ### 1. **自動スケール調整**

  - 現在の図面の注釈尺度やレイアウトビューポート尺度に基づいて、オブジェクトのサイズが自動的に調整されます
  - 図面全体で一貫したサイズを維持できます

  ### 2. **対象オブジェクト**

  異尺度対応にできる主なオブジェクト:

  - `マルチテキスト(MTEXT)`
  - `文字(TEXT)`
  - `寸法`
  - `マルチ引出線`
  - `ブロック`

  ### 3. **尺度表現の管理**

  - 各注釈尺度に対して異なる位置を割り当てることができます
  - 複数の尺度表現を持つことが可能です

  ## 設定と操作

  ### **異尺度対応の有効/無効**

  - **プロパティパレット**(`Ctrl+1`)で`異尺度対応`プロパティを`はい/いいえ`で切り替え
  - `ANNOAUTOSCALE`システム変数で自動スケール機能を制御

  ### **尺度表現の調整**

  - `ANNORESET`コマンド:すべての尺度表現の位置を現在の尺度表現の位置にリセット
  - 注釈リボンの`尺度を追加/削除`で尺度リストを管理

  ## 注意点

  ### **移動操作**

  - **グリップでの移動は避ける**:現在の尺度表現のみが移動され、他の尺度表現がずれる可能性があります
  - **`MOVE`コマンドを使用**:すべての尺度表現が一緒に移動されます

  ### **一括変更**

  - `SELECTSIMILAR`(類似オブジェクト選択)や`QSELECT`(クイック選択)を使用して、複数の異尺度対応オブジェクトを一度に選択・変更できます

  異尺度対応オブジェクトは、特に複数の尺度を扱う図面において、注釈の管理を効率化する重要な機能です。

  Sources:

  - [異尺度対応オブジェクトを AutoCAD でグローバルに非異尺度対応にする方法](https://www.autodesk.com/jp/support/technical/article/caas/sfdcarticles/sfdcarticles/JPN/AutoCAD-How-to-make-annotative-objects-non-annotative-globally.html)
  - [AutoCAD 製品で注釈尺度を変更すると異尺度対応オブジェクトが移動する](https://www.autodesk.com/jp/support/technical/article/caas/sfdcarticles/sfdcarticles/JPN/Annotative-block-moves-when-annotation-scale-changed.html)
  - [注釈オブジェクトは、異尺度対応尺度を変更せずに尺度が変更されます](https://www.autodesk.com/jp/support/technical/article/caas/sfdcarticles/sfdcarticles/JPN/Annotation-objects-change-scale-without-making-changes-to-the-annotative-scale.html)
  • Responses API + MCPサーバー
  AutoCAD の**異尺度対応オブジェクト**は、  
  **「注釈をどの尺度のビューポートでも、紙の上では同じ見やすさで表示するための仕組み」**です。

  ## まず結論

  普通の文字や寸法は、縮尺が違うと大きすぎたり小さすぎたりします。  
  異尺度対応オブジェクトを使うと、AutoCAD が**尺度ごとの表示表現を持たせて**、  
  **現在の注釈尺度に合うものだけを表示**します。

  ---

  ## 何を解決する仕組みか

  たとえば同じモデルを、

  - 1:50 のビューポート
  - 1:100 のビューポート
  - 1:200 のビューポート

  で見せたいとします。

  通常の注釈だと、1つの文字高さでは全部にちょうどよくなりません。  
  そこで異尺度対応を使うと、**モデル空間に1つの注釈を置きつつ、複数尺度に対応**できます。

  ---

  ## 仕組みの核心

  異尺度対応オブジェクトには、**1つ以上の注釈尺度**が割り当てられます。  
  各尺度に対して AutoCAD は、そのオブジェクトの**尺度表現**を持ちます。

  ### つまり

  1つの文字や寸法でも内部的には

  - 1:50 用の表示
  - 1:100 用の表示
  - 1:200 用の表示

  のような対応を持てます。

  そして、今見ている場所の**注釈尺度**や**ビューポート尺度**に応じて、

  - 一致する尺度表現があれば表示
  - 一致しなければ非表示

  になります。

  ---

  ## どう見えるのか

  たとえば文字高さを「紙面上で 2.5mm」にしたい場合、

  - 1:50 ではモデル空間では大きめ
  - 1:100 ではその2倍
  - 1:200 ではさらに大きく

  というように、**モデル上の実サイズは変わる**のに、  
  印刷した紙では**同じ 2.5mm に見える**よう AutoCAD が調整します。

  ---

  ## 重要な構成要素

  ### 1. 注釈尺度

  現在作業中の尺度です。  
  新しく作る異尺度対応オブジェクトには、通常この尺度が割り当てられます。

  ### 2. 異尺度対応スタイル

  文字スタイル、寸法スタイル、マルチ引出線スタイルなどに  
  「異尺度対応」を設定できます。  
  これにより、そのスタイルで作る注釈が異尺度対応になります。

  ### 3. 尺度表現

  同じオブジェクトが持つ、尺度ごとの表示情報です。  
  位置やサイズの表現が尺度別に管理されます。

  ---

  ## 対応できる主なオブジェクト

  AutoCAD ヘルプでは主に次が対象です。

  - 文字(単一行文字、マルチテキスト)
  - 寸法
  - マルチ引出線
  - ハッチング
  - ブロックと属性
  - 幾何公差

  ---

  ## モデル空間とレイアウトでの動き

  ### モデル空間

  現在の**注釈尺度**に合う表現が表示されます。

  ### レイアウトのビューポート

  そのビューポートの尺度に対応する注釈尺度の表現が表示されます。  
  そのため、同じモデル上の注釈でも、ビューポートごとに適切な大きさで見えます。

  ---

  ## 具体例

  1つの注記テキストに

  - 1:50
  - 1:100

  の注釈尺度を割り当てたとします。

  すると:

  - 1:50 のビューポートでは 1:50 用表現が表示
  - 1:100 のビューポートでは 1:100 用表現が表示
  - 1:200 のビューポートでは、1:200 が割り当てられていなければ通常は表示されない

  という動きになります。

  ---

  ## 従来方法との違い

  異尺度対応を使わない昔ながらの運用では、

  - 尺度ごとに別レイヤーへ注釈を作る
  - ビューポートごとにレイヤーフリーズで切り替える

  といった管理が必要でした。

  異尺度対応では、  
  **1つの注釈オブジェクトに複数尺度を持たせる**ため、  
  レイヤー管理がかなり簡単になります。

  ---

  ## メリット

  - 複数縮尺の図面で注釈を再作成しなくてよい
  - 印刷時の文字・寸法の見た目をそろえやすい
  - レイヤー分けによる手動管理を減らせる
  - 同じモデルを複数尺度で使う図面に向いている

  ---

  ## 注意点

  - 対応する注釈尺度が割り当てられていないと、そのビューポートでは表示されない
  - 自動で尺度を追加しすぎると、図面が重くなったり管理が煩雑になる
  - 尺度ごとに位置表現がずれることがあり、必要に応じて調整やリセットが必要

  ---

  ## 一言でいうと

  異尺度対応オブジェクトは、  
  **「モデル空間に置いた注釈を、複数の表示尺度に合わせて自動的に拡大縮小・表示切替する仕組み」**です。

  必要なら次に、

  - **初心者向けに図付きイメージで説明**
  - **通常注釈との違いを表で整理**
  - **AutoCAD での設定手順(文字・寸法・マルチ引出線)**

  のどれかで続けて説明できます。

■乾燥

技術的にはオプションのツールに Autodesk Help MCP サーバー を追加するだけなので簡単に利用することが可能で、 これまでAutodeskが積み上げてきたサポート向けのドキュメントを簡単に活用した回答が作成されていた。

特に、異尺度対応オブジェクトの仕組みの説明に関しては、異尺度対応の概念からAutoCAD上での扱いまでをわかりやすく説明されていて、ヘルプドキュメントを確認するよりも理解しやすい内容であると感じている。

AutoCAD 2027 の Autodesk Assistant に新しく組み込まれた機能の一部も、ローカル MCP サーバー 経由で取得した情報から回答を生成や、ハイライト表示などの製品の操作などを実行しており、現在は内部認証の有無などによって安易に公開できない状況であると思わえるが、今後はAPI経由での利用方法が公開されることを期待している。

IJCAD Electricalで生成AIを活用してみる

IJCAD には電気設計向けの IJCAD Electrical という製品が存在しています。

生成AIを活用できるかどうかを検証の際に、カスタマイズコマンドをいくつか作成しました。

github.com

IJCAD Electricalを導入するにあたって、古い図面を良い感じに再利用できるように、 図面内の図形やイメージなどの内容をAIが判断し、シンボルの置換や新規作成など実行するコマンドになります。

また、IJCAD Electricalにはカタログという部品や機材の情報をデータベースとして管理する機能があり、 既存の図面の部品表の情報を収集して、インポート可能なファイルに変換するコマンドもあります。

生成AIをAutoCAD(互換CAD)で活用するには?

AutoCAD2025や.NET8版IJCAD向けのAI活用コマンド

github.com

どちらの製品もコマンド入力ウインドウ機能を持っているので、AIとのやり取りはそこで行う。

AI側の応答が完了するまでの間もコマンド入力が実行できてしまうのはご愛嬌ということで…

AutoCADやIJCADのような古くから存在してるアプリケーションでも、 やりようによっては色々活用できる可能性は有ると思います。

追記:

生成AIにAutoLISPを作成させて操作するといったアプローチは既に色々試されているみたいですね。

生成AIをAutoCAD(互換CAD)で活用するには? 考察編

ChatGPTをOpenAIが公開してから数年がたち、MetaのLLaMAやGoogleのGeminiなどの大規模言語モデルが続々と登場し、 チャットボットに留まらず画像や音楽の生成、映像の生成まで気軽に?できるようになってきた今日、 私自身も仕事上でMicrosoftのCopilotやGitHub Copilotを活用したり、私生活でもChatGPTを使ってみたりと生活に浸透しつつあります。

Autodeskも兼ねてより機械学習を活用した製品展開を進めてきていて、ジェネレーティブデザインはそれなりに大々的に発表され、 AutoCADにもAIによる自動化の機能や、次期製品では生成AIを組み込んだ補助機能なども検討されているようです。

国内の企業でも生成AI使用して生産性の向上を図ったり、展開するサービスに生成AIを組み込んでみたりと色々活用の幅が広がってる中、 タイトル通り、AutoCADやDWG互換CADの2次元図面とカスタマイズ領域でも何かしら活用できないかを考えてみたり...

とりあえずGPTモデルを使用する前提で考えてみたところ、

  • 指定した場所の図面を分析し、指定した型番や品番、規格名の要素を現在の図面に追加する
  • ラスタライズされてしまった図面の内容を認識させ、エンティティを作成する
  • 文字や音声入力された内容から、コマンドの起動や入力操作を補助をする

この3つがそれとなく実現可能そうだと思うに至った。

指定した場所の図面を分析し、指定した型番や品番、規格名の要素を現在の図面に追加する

これについてはAIの事例を調べている途中で、近い機能が図面管理システムなどに搭載されていて、 図面内の文字情報をAIが判断し、必要な情報入力が自動で行われるとのことです。

事例:lp.zume-n.com

CAD上でも、図面内で参照されているブロック名や図枠などに含まれる文字オブジェクトの内容、 部品表などの内容を一旦テキストにまとめ、AIに指定した内容を一致するまたは近いものを判断させ、 現在の図面内にブロックや外部参照として追加することが出来るようになると、作業効率の向上に繋がりそうです。

ラスタライズされてしまった図面の内容を認識させ、エンティティを作成する

GPTモデルでの画像の認識能力の向上については目を見張るものがあり、 スキャンした紙の図面の内容を判断させて、図面内に含まれる図形情報をリストアップさせた後、 APIで図形を図面内に作成することで、紙の図面のデジタル化を推進出来るだろう。

スキャンした画像から図面を復元させる、所謂ベクトル変換については、 AutoCAD Raster Designや紙図面をCAD変換として色々なソフトウェアが存在していて、 高精度の変換には、膨大な図面データやノウハウの蓄積によって実現させているが、 生成AIの登場によって簡単に、より自然な図面への変換が手軽にできる可能性を感じている。

文字や音声入力された内容から、コマンドの起動や入力操作を補助をする

AutoCADや各互換CADの特徴として、コマンドラインベースの操作があり、 グラフィカルなインターフェースだけでなく、コマンドの実行をキーボードで直接入力し、 対話形式でオプションの選択やの図形の作図の操作が効率的に進めることが可能です。

生成AIの対話能力と強力なプロンプト生成能力を利用することで、 ○○したい、や△△を用意してという入力で、コマンドを実行と可能とするマクロを生成し、 CAD上でマクロを実行させることで、ユーザーが直接操作せずとも図面の作図が可能になるかも。

とりあえず試してみる

長々と生成AI自体についてや、活用事例を探していった中で、 上記の中では、最後の コマンドの起動や入力操作を補助をする が手軽そうで、 得られる結果は派手ではないが、それとなくAutoCADらしい活用方法だと私個人が感じました。

なのでとりあえず手始めに、ChatGPTを始めとしたいくつかのAIツールを使用して、 どの程度コマンドを実行できるか試してみて、結果を次回の記事に書き綴っていこうと思います。

【ODA】ペーパー空間の印刷マージンを点線にする

AutoCADなどのペーパー空間には印刷マージンを点線で表示していますが、単純にペーパー空間のビューを作成しても直線で表示されてしまいます。 この枠を点線にする方法について見当違いな部分をひたすら調査して時間がとられてしまったが、実際にはとても簡単な方法で変更できたのでそれについてのメモを残しておきます。 f:id:tknmt:20191210111057j:plain

当初はレイアウトの設定値でこの枠線を点線に変更しているのかと思い、ビュー周りやドキュメント周りを調査していましたが、実際にはOdDbLayoutPaperPEクラスを使用してOdDbLayoutクラスの表示を拡張しているだけでした。

OdDbLayoutPaperPEを継承したクラスを作成し、drawMarginsメソッド内で直線ではなく点線になるように描画の処理を行い、addXメソッドでOdDbLayoutクラスを拡張することで、ペーパー空間の印刷マージンの枠線が点線で表示されました。

f:id:tknmt:20191210111751j:plain

【ODA】OdaMfcAppでアンチエイリアスを有効にする

ODAライブラリにサンプルとして含まれているOdaMfcAppアプリケーションでロードした図面を、 WinDirectX.txvを使用してビューをDirectXで描画させる際にアンチエイリアスを有効にする方法。

ODAライブラリのサンプルを参考にしてDWGのビューを作成するサンプルを作成してみたが、 OdGsDeviceのプロパティをいくら調整しても、線分や円などエンティティの描画に対してアンチエイリアを有効にできなかったので、 WinDirectX.txvモジュール自体に手を入れてみたら無事アンチエイリアスを有効にできたのでその方法を忘れないためにメモ。

  1. WinDireccXプロジェクトを開く
  2. ExGsDirectXDevice.cppのコードを表示させる
  3. IDirect3DDeviceのインスタンス作成後にSetRenderState関数でD3DRS_ANTIALIASEDLINEENABLEを有効にする

ただ、どうやらWinDirectX.txvはDirectX9を使用しているようなので、このモジュールを一から作り直したほうが良さそうな気もしない…

【AutoCAD Mechanical】全ての部品表を取得する

全ての部品表を取得するには

図面内に存在する全ての部品表を取得するには、AcmBOMManager::getAllBomTables メソッドを使用します。
このメソッドを使用すると、図面内のすべての部品表のオブジェクトIDを取得できます。

サンプルコード

void GetAllBom()
{
    AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();

    AcDbObjectIdArray bomIds;

    // 全ての部品表のObjectIdを取得
    acmBomMgr->getAllBomTables(bomIds);

    for each (AcDbObjectId bomId in bomIds)
    {
        CMapStringToString valueMap;
        CString bomName;

        // 部品表のデータを取得
        acmBomMgr->getBomData(bomId, bomName, valueMap);
        acutPrintf(_T("\n部品表 [%s] の対象は、"), (LPCTSTR)bomName);

        bool isStructuralyExpanded;
        bool isUsingAssmPath;
        CString structSeparator;
        AcDbObjectIdArray assocLayoutIds;
        AcDbObjectId targetId;

        // 部品表のプロパティを取得
        acmBomMgr->getBomProperties(
            bomId,
            isStructuralyExpanded,
            isUsingAssmPath,
            structSeparator,
            assocLayoutIds,
            targetId);

        AcDbObject *obj;

        // 部品表の対象オブジェクトを取得
        acdbOpenAcDbObject(obj, targetId, AcDb::kForRead);

        // 対象オブジェクトが何なのか確認
        if (obj->isKindOf(AcDbBlockReference::desc()))
        {
            // ブロック参照の場合

            AcDbBlockReference *insert = AcDbBlockReference::cast(obj);
            AcDbObjectId blockId = insert->blockTableRecord();
            AcDbBlockTableRecord *block;
            acdbOpenObject(block, blockId, AcDb::kForRead);
            ACHAR *name;
            block->getName(name);
            acutPrintf(_T("図面枠 [%s] です。"), name);
            block->close();
        }
        else if (obj->isKindOf(AcDbBlockTableRecord::desc()))
        {
            // ブロックテーブルレコードの場合

            AcDbBlockTableRecord *block = AcDbBlockTableRecord::cast(obj);
            ACHAR *name;
            block->getName(name);
            if (acdbSymUtil()->isBlockModelSpaceName(name))
            {
                acutPrintf(_T("図面全体です。"));
            }
            else
            {
                acutPrintf(_T("不明のオブジェクトです。"));
            }
        }
        else
        {
            // その他のオブジェクトの場合

            CString cmpdef = _T("ACAMCOMPDEF");
            // オブジェクトのDXF名を確認
            if (cmpdef.Compare(obj->isA()->dxfName()) == 0)
            {
                // DXF名がコンポーネント定義の場合はストラクチャと判断しています
                acutPrintf(_T("ストラクチャです。"));
            }
            else
            {
                acutPrintf(_T("不明のオブジェクトです。"));
            }
        }
        obj->close();
    }
}

※サンプルコードの補足

サンプルコードでは図面全体の部品表、図面枠の部品表、ストラクチャの部品表かどうかをチェックしていて、ブロック参照を対象としている部品表は図面枠の部品表、モデル空間のブロックテーブルレコードを対象としている部品表は図面全体の部品表、その他のオブジェクトの中で "ACAMCOMPDEF" という DXF 名をもつオブジェクトの場合はストラクチャと判断しています。