オブジェクトの色の取得と編集|AutoCAD VBAマクロの作成方法
AutoCAD VBAで色の取得/編集を行うにはAcCmColorオブジェクトを利用する必要があります。本ページではこのTrueColorオブジェクトを使って図形や寸法、テキスト、ハッチング等(いわゆるデータベース常駐図形)の色を取得したり指定の色に変更したりする方法を解説していきます。
本ページで学べる内容は以下のとおりです。
AcCmColorオブジェクトについて
オブジェクトの色の取得方法
オブジェクトの色の変更方法
AcCmColorオブジェクト
AcCmColorオブジェクトは色を付けたいオブジェクトのTrueColorプロパティより取得します。
TrueColorプロパティを持つオブジェクト要素は「AcadEntity型」に包含されている(これを継承という)すべてのオブジェクトです。これはモデル空間[ModelSpace]やレイアウト空間[PaperSpace]に作成することのできるすべての図形であり、線分や円をはじめとした図形形状だけでなく寸法線やテキスト、ハッチングなどがこれに含まれます。またAcadEntity型には含まれていませんがグループや画層(レイヤー)もTrueColorプロパティを持つオブジェクトのため色の取得や変更が可能です。
AcCmColorオブジェクトを取得するにはTrueColorプロパティを使って下記のように記載します。
[Object]には色を操作するAcadEntity型から継承されるオブジェクトが入った変数を入力します。
Dim oColor As AcadAcCmColor
Set oColor =[Object].TrueColor
これで[Object]が持つ色情報のオブジェクトであるoColorの取得ができます。あとはこのoColorが持つプロパティ/メソッドを利用することで[Object]の色の操作を行うことが可能になります。
AcCmColorオブジェクトには色情報や色の継承情報(ByLayer,ByBlock等)も含まれているため、オブジェクト1のAcCmColorを取得しそれをそのままオブジェクト2のTrueColorにセットすることで、オブジェクト1と全く同じ色の情報をオブジェクト2に適用することもできます。
色を取得する
色の取得にはAcCmColorオブジェクトのRed,Green,Blueプロパティを使い下記のように記載します。
Debug.Print oColor.Red ‘赤成分
Debug.Print oColor.Green ‘緑成分
Debug.Print oColor.Blue ‘青成分
各プロパティそれぞれ赤成分、緑成分、青成分の値(0~255)をLong型で取得することができます。
これらのプロパティはすべて読み取り専用のため値の変更はできません。
サンプルコード
下記はアクティブドキュメントのモデル空間内にあるすべてのAcadEntityオブジェクトのRGB値を取得してイミディエイトウィンドウに出力するためのサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub main() Dim mdlSpace As AcadModelSpace Dim oEntity As AcadEntity Dim oColor As AcadAcCmColor Dim lR As Long Dim lG As Long Dim lB As Long 'アクティブドキュメントのModelSpace取得 Set mdlSpace = ThisDrawing.ModelSpace 'アクティブドキュメントのモデル空間内の要素ループ For Each oEntity In mdlSpace 'オブジェクトのRGB値を取得 Set oColor = oEntity.TrueColor lR = oColor.Red lG = oColor.Green lB = oColor.Blue '結果を出力 Debug.Print "RGB=(" & lR & "," & lG & "," & lB & ")" Next End Sub |
色を変更する
色の変更にはAcCmColorオブジェクトのSetRGBメソッドを使い下記のように記載します。
Call oColor.SetRGB(lR, lG, lB)
[Object].TrueColor = oColor
lR, lG, lBにはそれぞれ変更したい色のRGB成分(0~255)を入力します。
SetRGBメソッド実行後は色を設定したAcCmColorオブジェクトを再度オブジェクトのTrueColorに入力することで[Object]の色を変更することができます。(※これを行わないと色の変更が適用されない)
また、色の変更を画面に反映するためには画面を再作図(再描画)させる必要があります。
VBAコードで明示的に再作図を行うにはDocumentオブジェクトの「Regen」メソッドを使います。Regenメソッドの引数を「acActiveViewport」にすれば アクティブなビューポートのみを、「acAllViewports」にすればドキュメント上のすべてのビューポートを再作図させることができます。(※再作図自体は手動でもAutoCAD内で何らかの画面操作が行われれば自動的に行われます)
サンプルコード
下記はアクティブドキュメントのモデル空間内にあるすべてのAcadEntityオブジェクトを赤色にするためのサンプルコードです。RGB値を書き換えることで指定色に一括変更することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub main() Dim mdlSpace As AcadModelSpace Dim oEntity As AcadEntity Dim oColor As AcadAcCmColor 'アクティブドキュメントのModelSpace取得 Set mdlSpace = ThisDrawing.ModelSpace 'アクティブドキュメントのモデル空間内の要素ループ For Each oEntity In mdlSpace 'オブジェクトのRGB値を変更 Set oColor = oEntity.TrueColor Call oColor.SetRGB(255, 0, 0) oEntity.TrueColor = oColor Next '再作図(描画更新) Call ThisDrawing.Regen(acActiveViewport) End Sub |
まとめ
今回の内容をまとめると以下のとおりです。
オブジェクトの色の操作はAcCmColorオブジェクトを使う
色の取得はAcCmColorオブジェクトのRed,Green,Blueプロパティで取得可能
色の変更はAcCmColorオブジェクトのSetRGBメソッドで変更可能
本ページでは上記の通り、色の取得と変更の方法としてそれぞれ1通りの方法しか説明していませんが、AcCmColorオブジェクトの他のプロパティ/メソッドを利用することでも色の取得や変更は可能です。ここで紹介した方法はあくまでも一手法ではありますが、RGB値をもとに色情報を操作するため最も汎用性がある手法となっています。初めのうちは色の取得、変更方法として上記内容さえ覚えておけば基本的には困らないはずです。