引出線とマルチ引出線の作成と編集|AutoCAD VBAマクロの作成方法
AutoCADには図面に引出線を作成するために[クイック引出線]コマンドと[引出線]コマンドが用意されています。AutoCAD VBAでも[クイック引出線]コマンドで作成される引出線と[マルチ引出線]コマンドで作成されるマルチ引出線は別のオブジェクトとして扱われるため、本ページではこれら2つのオブジェクトについて、作成方法や取得方法、編集方法などを解説していきます。
本ページで学べる内容は以下のとおりです。
LeaderオブジェクトとMLeaderオブジェクトについて
引出線とマルチ引出線の作成方法
既に存在している引出線とマルチ引出線の取得方法
引出線とマルチ引出線の情報を取得する方法
引出線とマルチ引出線の設定を変更する方法
引出線とマルチ引出線を削除する方法
Leader / MLeaderオブジェクト
AutoCADには引出線として通常の引出線とマルチ引出線の2種類のデータが用意されています。引出線は[クイック引出線](QLEADER)コマンドで作成される引出線で、マルチ引出線は[マルチ引出線](MLEADER)コマンドで作成される引出線です。これらの違いはAutoDesk公式にも記載されている通りで、マルチ引出線のほうが新しく作られたオブジェクトであり現在推奨されている引出線となります。
AutoCAD VBAではこれら引出線がそれぞれ別のオブジェクトとして用意されており、通常の引出線がLeaderオブジェクト、マルチ引出線がMLeaderオブジェクトとなっています。これらのオブジェクトには共通するプロパティ/メソッドが存在しますが、一部のプロパティはそれぞれが独自のものを持っているため、VBAの処理では条件に応じた分岐処理などが必要になる場合があります。
マルチ引出線は引出線とテキストが一体化されたオブジェクト(上画像左)ですが、通常の引出線は引出線とテキストが別々になっているオブジェクト(上画像右)となっています。そのため、マルチテキストはMLeaderオブジェクトから直接テキストの値にアクセスできるのに対し、通常の引出線は自身に紐づくマルチテキスト(MTextオブジェクト)を経由してアクセスする必要があります。
Leader / MLeaderオブジェクトを取得する基本的な方法として「指定のインデックスから引出線を取得」「指定のオブジェクトID / ハンドルから引出線を取得」「引出線を新規作成して取得」「ユーザー選択から取得」の4つがあり、それぞれモデル空間オブジェクト(ThisDrawing.ModelSpace)から下記のコードで取得することができます。既存の引出線を編集したいのか新規で引出線を作成したいのかによって取得方法が異なるため、状況に応じて使い分ける必要があります。
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 28 |
Dim oLeader As AcadLeader Dim oMLeader As AcadMLeader '指定のインデックスからテキストを取得 (※インデックスは0始まり) Set oLeader = ThisDrawing.ModelSpace.Item(0) Set oMLeader = ThisDrawing.ModelSpace.Item(0) 'オブジェクトID / ハンドルからテキストを取得 Set oLeader = ThisDrawing.ObjectIdToObject(xxx) 'xxxにオブジェクトID入力 Set oLeader = ThisDrawing.HandleToObject(xxx) 'xxxにハンドル入力 Set oMLeader = ThisDrawing.ObjectIdToObject(xxx) Set oMLeader = ThisDrawing.HandleToObject(xxx) '引出線を新規作成 Dim arr_dPoints(0 To 5) As Double arr_dPoints(0) = 0: arr_dPoints(1) = 0: arr_dPoints(2) = 0 arr_dPoints(3) = 1: arr_dPoints(4) = 1: arr_dPoints(5) = 0 Set oLeader = ThisDrawing.ModelSpace.AddLeader(arr_dPoints, Nothing, acLineNoArrow) Set oMLeader = ThisDrawing.ModelSpace.AddMLeader(arr_dPoints, 0) Call ThisDrawing.Regen(acActiveViewport) '描画更新 'ユーザー選択で引出線取得 On Error Resume Next Call ThisDrawing.Utility.GetEntity(oLeader, Empty, "引出線選択") Call ThisDrawing.Utility.GetEntity(oMLeader, Empty, "マルチ引出線選択") On Error GoTo 0 |
上記コードはモデル空間内のテキストを対象としていますが、ペーパー空間内のテキストも同様の方法で取得可能です。両空間の違いについては「ModelSpaceとPaperSpace」を参照ください。
引出線作成
Leaderオブジェクト作成
引出線を新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddLeaderメソッドを使って下記のように記載します。
Dim oLeader As AcadLeader
Set oLeader= ThisDrawing.ModelSpace.AddLeader(PointsArray, Annotation, Type)
引数は作成するマルチ引出線の頂点の座標が入った配列(PointsArray)と引出線と紐づけるオブジェクト(Annotation)、引出線のタイプ(Type)です。これにより、指定した位置に引出線を作成することができ、戻り値(oLeader)としてAcadLeaderオブジェクトが取得できます。
前述の通り、通常の引出線は引出線とテキストが別のオブジェクトとなります。引出線に対してテキストを設定したい場合は予めMTextオブジェクトを作成しておきAnnotationに入力することで紐づける(アタッチする)ことができます。オブジェクトとの紐づけを行わない場合はNothingを入力します。
下記はアクティブドキュメントのモデル空間に引出線とそれに紐づくマルチテキストを作成するサンプルコードです。引出線とマルチテキストを紐づけているため引出線の最後の頂点の座標はマルチテキストの座標に合わせて自動で定義されます。(そのため3点目の頂点の座標はすべて0としている)
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 28 29 30 31 32 33 |
Sub CreateLeader() Dim oLeader As AcadLeader Dim oMText As AcadMText Dim arr_dPoints(0 To 8) As Double Dim arr_dPos(0 To 2) As Double 'テキスト位置の定義 arr_dPos(0) = 30 '┐ arr_dPos(1) = 20 '├ X,Y,Z座標 arr_dPos(2) = 0 '┘ 'テキスト作成 Set oMText = ThisDrawing.ModelSpace.AddMText(arr_dPos, 10, "Text") '引出線の頂点の定義 arr_dPoints(0) = 0 '┐ arr_dPoints(1) = 0 '├ 1点目のX,Y,Z座標 arr_dPoints(2) = 0 '┘ arr_dPoints(3) = 10 '┐ arr_dPoints(4) = 10 '├ 2点目のX,Y,Z座標 arr_dPoints(5) = 0 '┘ arr_dPoints(6) = 0 '┐ arr_dPoints(7) = 0 '├ 3点目のX,Y,Z座標 (※テキストにアタッチする場合はテキスト位置に合わせて自動で定義される) arr_dPoints(8) = 0 '┘ '引出線作成 Set oLeader = ThisDrawing.ModelSpace.AddLeader(arr_dPoints, oMText, acLineWithArrow) '描画更新 Call ThisDrawing.Regen(acActiveViewport) End Sub |
MLeaderオブジェクト作成
マルチ引出線を新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddMLeaderメソッドを使って下記のように記載します。
Dim oMLeader As AcadMLeader
Set oMLeader= ThisDrawing.ModelSpace.AddMLeader(pointsArray, leaderLineIndex)
引数は作成する引出線の頂点の座標が入った配列(pointsArray)とマルチ引出線クラスタの入力インデックス(leaderLineIndex)です。これにより、指定した位置に引出線を作成することができ、戻り値(oMLeader)としてAcadMLeaderオブジェクトが取得できます。
マルチ引出線クラスタとは”引出線の集まり”のことです。下画像のように1つのMLeaderオブジェクトから複数の引出線が出ている場合に、各引出線が所属するグループ(下画像の場合は赤か青)のことをクラスタといいます。このうち、赤色のクラスタと指示したい場合はクラスタのインデックス(0始まり)で指定することができます。これにより指定のクラスタを対象とした処理が行えるようになります。
AddMLeaderメソッドではマルチ引出線が新規作成されるためクラスタはインデックス「0」のみ新規作成されます。そのため、leaderLineIndexに「99」などのテキトーな数値を入れたとしても、作成される引出線はインデックス「0」のクラスタに属します。
下記はアクティブドキュメントのモデル空間にマルチ引出線を作成するサンプルコードです。マルチ引出線は通常の引出線とは違いテキストも一体化されたオブジェクトであるため、テキストの文字列にアクセスするためのTextStringプロパティが用意されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub CreateMLeader() Dim oMLeader As AcadMLeader Dim arr_dPoints(0 To 8) As Double 'マルチ引出線の頂点の定義 arr_dPoints(0) = 0 '┐ arr_dPoints(1) = 0 '├ 1点目のX,Y,Z座標 arr_dPoints(2) = 0 '┘ arr_dPoints(3) = 10 '┐ arr_dPoints(4) = 10 '├ 2点目のX,Y,Z座標 arr_dPoints(5) = 0 '┘ arr_dPoints(6) = 30 '┐ arr_dPoints(7) = 20 '├ 3点目のX,Y,Z座標 arr_dPoints(8) = 0 '┘ 'マルチ引出線作成 Set oMLeader = ThisDrawing.ModelSpace.AddMLeader(arr_dPoints, 0) oMLeader.TextString = "Text" '描画更新 Call ThisDrawing.Regen(acActiveViewport) End Sub |
引出線編集
矢印の取得と変更
引出線の矢印の種類はLeader / MLeaderオブジェクトのArrowheadTypeプロパティ、矢印サイズはLeader / MLeaderオブジェクトのArrowheadSizeプロパティによってそれぞれ定義されています。
1 2 3 4 5 6 7 8 9 10 11 |
'矢印の種類/サイズ取得 Dim lType As AcDimArrowheadType Dim dSize As Double lType = oMLeader.ArrowheadType dSize = oMLeader.ArrowheadSize '矢印の種類/サイズ変更 oMLeader.ArrowheadType = acArrowDot oMLeader.ArrowheadSize = 1.5 |
矢印の種類はAcDimArrowheadType列挙型で定義されており、列挙型の各要素が各矢印に対応しています。各要素値がどの矢印を表しているかは公式ヘルプから確認することができます。
矢印サイズは単純にDouble型で取得/変更が可能なArrowheadSizeプロパティで定義されています。
引出線テキストの取得と変更
マルチ引出線のテキスト文字列はTextStringプロパティによって定義されています。
1 2 3 4 5 6 7 8 |
'引出線テキスト文字列取得 Dim sText As String sText = oMLeader.TextString '引出線テキスト文字列変更 oMLeader.TextString = "New Text" |
マルチ引出線は引出線とテキストが同じオブジェクト扱いのため、MLeaderオブジェクトから直接テキストの文字列にアクセスすることができますが、通常の引出線は引出線とテキストが別オブジェクトであるため下記コードのようにMTextオブジェクトを経由する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
'引出線にアタッチされているマルチテキスト取得 Dim oMText As AcadMText Set oMText = oLeader.Annotation '引出線テキスト文字列取得 Dim sText As String sText = oMText.TextString '引出線テキスト文字列変更 oMText.TextString = "New Text" |
Leaderオブジェクトからそれに紐づくMTextオブジェクトを取得するには、LeaderオブジェクトのAnnotationプロパティを使います。引出線を新規作成する際にAddLeaderメソッドの第2引数として入力される値はこのAnnotationプロパティに設定されます。
引出線の頂点座標の取得と変更
マルチ引出線の任意の引出線の頂点座標を取得するにはMLeaderオブジェクトのGetLeaderLineVerticesメソッド、設定するにはSetLeaderLineVerticesメソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 |
'引出線の座標取得 Dim arr_vCoord As Variant arr_vCoord = oMLeader.GetLeaderLineVertices(0) '1つ目の引出線座標 '引出線の座標変更 arr_vCoord(0) = 5 '┐ arr_vCoord(1) = 5 '├ 矢先点のX,Y,Z座標 arr_vCoord(2) = 0 '┘ Call oMLeader.SetLeaderLineVertices(0, arr_vCoord) Call oMLeader.Update |
それぞれのメソッドには、複数ある引出線のうちどの引出線に対して頂点座標の取得/設定を行うかを指定するための”引出線インデックス”を入力します。基本的には作成された順に「0」から順にインデックスが設定されていきます。これらメソッドで取り扱う座標は配列となっており「0~2」の要素が矢先点の座標、「3~5」の要素が矢先点の次にある頂点の座標…というような考えになっています。
通常の引出線はマルチ引出線とは違い1つのオブジェクトから複数の引出線を作成することができないため、引出線インデックスの概念が存在しません。通常の引出線の頂点の座標はLeaderオブジェクトのCoordinateプロパティによって定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 |
'引出線の座標取得 Dim arr_vCoord As Variant arr_vCoord = oLeader.Coordinate(0) '矢先点座標 '引出線の座標変更 arr_vCoord(0) = 5 '┐ arr_vCoord(1) = 5 '├ 矢先点のX,Y,Z座標 arr_vCoord(2) = 0 '┘ oLeader.Coordinate(0) = arr_vCoord Call oLeader.Update |
Coordinateプロパティは引数として指定した”頂点インデックス”が示す頂点のX,Y,Z座標を取得/設定することができます。頂点インデックスは引出線の矢先点を始点として「0」から順に割り振られます。
AutoCAD VBAのプロパティに対して配列の設定をする処理はかなり不安定な挙動をしており、新たに配列を用意(Dim arr(0 to 2) As Variantのように)して座標を設定しようとするとエラーでAutoCADが強制終了されてしまう場合があります。頂点座標を新たな値に設定したい場合は上記コードのように、既存の座標をVariant型で受け取って値を上書きしたものを再設定する方法が安定した動きになります。
引出線の追加と削除 (マルチ引出線のみ)
既存のマルチ引出線に対して新たな引出線を追加するにはMLeaderオブジェクトのAddLeaderLineメソッドを使い、指定の引出線を削除するにはRemoveLeaderLineメソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Dim lIndex As Long '引出線追加 Dim arr_dPoints(0 To 5) As Double arr_dPoints(0) = 0 '┐ arr_dPoints(1) = 0 '├ 1点目のX,Y,Z座標 arr_dPoints(2) = 0 '┘ arr_dPoints(3) = 10 '┐ arr_dPoints(4) = 10 '├ 2点目のX,Y,Z座標 arr_dPoints(5) = 0 '┘ lIndex = oMLeader.AddLeaderLine(0, arr_dPoints) oMLeader.Update '引出線削除 Call oMLeader.RemoveLeaderLine(lIndex) oMLeader.Update |
AddLeaderLineメソッドの第1引数には追加する引出線クラスタのインデックス、第2引数には追加する引出線の頂点座標が入った配列をそれぞれ入力します。これにより新規で引出線が作成され、戻り値として作成された引出線のインデックスを取得することができます。
RemoveLeaderLineメソッドは削除したい引出線のインデックスを入力するれば、そのインデックスの引出線のみが削除できます。戻り値は特にありません。
色の取得と変更
「オブジェクトの色の取得と編集」ページを参照ください。
引出線の削除
Leader/MLeaderオブジェクトはAcadObjectから継承されたオブジェクトのため、AcadObjectがもつDeleteメソッドを使用することができます。Deleteメソッドは実行したオブジェクト自身を削除するためのメソッドで下記のように記載します。(※[Leader] = 削除するLeader/MLeaderオブジェクト)
Call [Leader].Delete
Deleteメソッドは引出線全体の削除が行われます。1つのマルチ引出線に存在する複数の引出線から指定の引出線のみを削除したい場合は、前項のRemoveLeaderLineメソッドを参照ください。
まとめ
今回の内容をまとめると以下のとおりです。
通常の引出線の操作はLeaderオブジェクトを使う
マルチ引出線の操作はMLeaderオブジェクトを使う
マルチ引出線のほうが新たに追加されたオブジェクトのため推奨されている
通常の引出線とマルチ引出線はほぼ別のオブジェクトと考えたほうが良い
マルチ引出線には引出線の集まりであるクラスタという概念が存在する
マルチ引出線には複数の引出線から1つを指定するためにインデックスの概念が存在する
引出線はLeader/MLeaderのプロパティ/メソッドを使うことで基本的には操作が可能
引出線(オブジェクト)の削除はDeleteメソッドを呼び出すだけ
マルチ引出線は通常の引出線に比べできることが非常に多くなっています。そのためMLeaderオブジェクトはLeaderオブジェクトよりもプロパティとメソッドが多く用意され、引出線クラスタや引出線インデックスの考えなども加わり複雑なオブジェクトとなっています。
本ページに記載されていない内容として引出線の線種や線幅、参照線の長さなどを取得/変更することも可能です。量は多いですが公式のヘルプにこれらオブジェクトのプロパティとメソッドは記載されているのでヘルプを読み込むことで何ができるか知ることができるので一読することをおすすめします。