こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して、生成されたコードをただ眺めるだけの時期はもう卒業です。今日からあなたを、AutoCADの内部構造を意のままに操る「真のエンジニア」へと引き上げましょう。
今回は、AutoCAD VBAのオブジェクトモデルにおける最重要かつ最も強力な奥義の一つ、`AcadApplication.GetInterfaceObject` を使った TrueColor(RGB・ブックカラー)の完全制御を解説します。
ここをクリアすれば、色管理の自動化において、もう怖いものはありませんよ。一緒にしっかりとマスターしていきましょう!
—
1. なぜ「ACI(インデックスカラー)」の限界を超える必要があるのか?
AutoCADで図面を描いているとき、線や文字の色を指定する方法として、私たちは長年「ACI(AutoCAD Color Index:色番号1〜255)」を使ってきました。
‘ 従来のインデックスカラー指定(赤色)
myLine.Color = 1
手動で図面を描く分にはこれでも十分ですが、業務自動化(VBA)の現場では、致命的な壁にぶつかります。
- 「企業のコーポレートカラーである厳密なRGB値(例: RGB(12, 45, 90))で線を引きたい」
- 「DICやPANTONEといった、印刷業界標準のカスタムカラーブックの色を指定したい」
インデックスカラーはたった255色のパレットにすぎません。無限の色空間を表現する現代の設計現場において、これでは役不足ですよね。
そこで登場するのが、`AcCmColor` オブジェクトです。
—
2. 黒魔術ではない! `GetInterfaceObject` の正体
「おいおい、いきなり変なメソッドが出てきたぞ……」と思いましたか?安心してください。優しく紐解いていきます。
通常、VBAで図形やレイヤを作るときは `ThisDrawing.ModelSpace.AddLine` のように、すでに用意されているオブジェクトを操作しますよね。しかし、「色」や「Hatch(ハッチングのパターン)」などの細かな設定用オブジェクトは、図面の中に単体で存在していません。
そこで使うのが、AutoCADのアプリケーション本体(`AcadApplication`)に直接お願いして、「作業台の上には置いてないんだけど、その特殊なパーツ(COMオブジェクト)を裏から一つ貸してくれよ!」と頼み込む魔法のメソッド、それが `GetInterfaceObject` です。
概念図:メモリ上の生成フロー
[AcadApplication] (大元)
│
├─► .GetInterfaceObject(“Autodesk.AcCmColor.24”)
│ │
│ ▼
│ 【孤立した精密カラーパーツ (AcCmColor)】
│ ・RGB値の設定 (.SetRGB r, g, b)
│ ・ブックカラーの設定 (.ColorBookName / .ColorName)
│ │
│ ▼
└─► [AcadEntity (Line / Circle 等)] にドッキング!
この「一度メモリ上で単体作成し、後から実体に割り当てる」というライフサイクルの概念こそが、上級エンジニアへの第一歩なのです。
—
3. 実践! RGB値によるTrueColorの完全制御コード
百聞は一見に如かず。実際に、指定したRGB値を持つ線分を自動生成するコードを見てみましょう。
開発環境(VBE)の標準モジュールに、そのままコピペして実行してみてください。
Sub CreateTrueColorLine()
Dim acadApp As AcadApplication
Dim lineObj As AcadLine
Dim startPoint(0 To 2) As Double
Dim endPoint(0 To 2) As Double
‘ 1. AutoCADアプリケーションのインスタンスを取得
‘ ※VBAからは ThisDrawing.Application でも取得可能です
Set acadApp = ThisDrawing.Application
‘ 2. 線の始点と終点を定義
startPoint(0) = 0#: startPoint(1) = 0#: startPoint(2) = 0#
endPoint(0) = 100#: endPoint(1) = 100#: endPoint(2) = 0#
‘ ModelSpaceに通常の線分を作成
Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
‘ ==========================================================
‘ 3. ここが本日のメイン! GetInterfaceObject による色制御
‘ ==========================================================
Dim trueColor As AcadAcCmColor
‘ バージョンに応じたProgIDを指定(AutoCAD 2024/2025等では “.24” または “.25” を使用)
‘ ※バージョン差異を吸収するため、エラーハンドリングを入れるか最新のものを指定します
Set trueColor = acadApp.GetInterfaceObject(“Autodesk.AcCmColor.24”)
If trueColor Is Nothing Then
MsgBox “TrueColorオブジェクトの生成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 4. RGB値(赤: 255, 緑: 100, 青: 0 の鮮やかなオレンジ)を設定
trueColor.SetRGB 255, 100, 0
‘ 5. 作成した線分オブジェクトの TrueColor プロパティに適用!
lineObj.TrueColor = trueColor
‘ 6. 画面を更新して変更を反映
acadApp.Update
MsgBox “RGB(255, 100, 0) の線分を作成しました!”, vbInformation, “成功”
End Sub
コードの解説とポイント
- `Autodesk.AcCmColor.24` という文字列(ProgID)を指定して、AutoCADのカラー管理モジュールをメモリ上に呼び出しています(※AutoCADのバージョン、例えば2025なら `.25` のように末尾の数字が変わることがありますが、基本的には現在の環境に合わせて調整します)。
- `trueColor.SetRGB` で、24ビットフルカラーの直感的な色指定を行っています。
- 最後に `lineObj.TrueColor = trueColor` と代入することで、図形の色が瞬時に書き換わります。
—
4. さらに踏み込む:カスタムカラーブック(DIC/PANTONE)の自動適用
実務では、単なるRGBだけでなく「特定のカラーブック(DICカラーガイドなど)の色番号を指定して図面を描け」という強烈な要求が飛んできたりします。
実は、`AcCmColor` はRGBだけでなく、カラーブックの名称と色名(または色番号)を指定することも可能です。
以下のコードは、カラーブック名と色を指定する応用スニペットです。
Sub ApplyColorBook()
Dim acadApp As AcadApplication
Dim circleObj As AcadCircle
Dim center(0 To 2) As Double
Set acadApp = ThisDrawing.Application
‘ 円を作成
center(0) = 50#: center(1) = 50#: center(2) = 0#
Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, 25#)
‘ カラーオブジェクトを取得
Dim trueColor As AcadAcCmColor
Set trueColor = acadApp.GetInterfaceObject(“Autodesk.AcCmColor.24”)
‘ カラーブックと色の指定(例: PANTONE等の標準ブック)
‘ ※お使いの環境にインストールされているカラーブック名に書き換えてください
With trueColor
.ColorBookName = “PANTONE(R) solid coated”
.ColorName = “PANTONE Yellow 012 C”
End With
‘ 円に適用
circleObj.TrueColor = trueColor
acadApp.Update
MsgBox “カラーブックの色を適用しました!”, vbInformation
End Sub
(※注意:指定するカラーブック名や色名は、お使いのPCのAutoCADマテリアルフォルダに実物が存在している必要があります。存在しない名前を指定すると実行時エラーになりますのでご注意を!)
—
5. 陥りやすい罠とエラー回避の知見(エンジニアの心得)
現場でこのコードを実装する際、多くの開発者がハマる「罠」がいくつかあります。プロの知見としてシェアしておきますね。
1. メモリリークとオブジェクトの解放
`GetInterfaceObject` で生成したCOMオブジェクトは、VBAの裏側でC++のメモリを専有しています。巨大なループ処理の中で何万回も `GetInterfaceObject` を呼び出し、そのまま放置するとメモリリーク(メモリ肥大化・クラッシュ)の原因になります。
- 対策: ループ内で生成するのではなく、ループの外側で1つだけインスタンスを生成し、ループ内では `SetRGB` の値だけを書き換えて使い回すのが、プロの高速化テクニックです。
2. ProgIDのバージョン違いによるエラー
AutoCADのバージョン(2021, 2022, 2023, 2024, 2025…)によって、COMコンポーネントのバージョンサフィックス(`.24` や `.25` 部分)が変わります。
汎用的なツールを作る場合は、エラーハンドリング(`On Error Resume Next` など)を適切に挟むか、動的にバージョンを吸収する仕組みを検討しましょう。
—
まとめ
今回は `AcadApplication.GetInterfaceObject` を用いた `AcCmColor` の操作について解説しました。
- インデックスカラー(ACI)の縛りから脱却し、無限のRGBやカラーブックをプログラムから制御できる。
- COMインターフェースを直接呼び出すライフサイクルの概念を理解できた。
- ループ処理におけるパフォーマンスの注意点に気づけた。
ここをクリアしたあなたなら、単なる「マクロの延長」ではなく、「堅牢で実用的なCAD自動化システム」を構築する実力が確実についています。
明日からの設計業務の効率化に、ぜひこの知見を役立ててください。それでは、また次の高度な自動化の世界でお会いしましょう!
