ダイナミックテキストとマルチテキストの作成と編集|AutoCAD VBAマクロの作成方法

AutoCADには図面にテキストボックスを作成するために[文字記入]コマンドと[マルチテキスト]コマンドが用意されています。AutoCAD VBAでも[文字記入]コマンドで作成されるダイナミックテキストとマルチテキストは別のオブジェクトとして扱われるため、本ページではこれら2つのオブジェクトについて、作成方法や取得方法、編集方法などを解説していきます。

本ページで学べる内容は以下のとおりです。

 TextオブジェクトとMTextオブジェクトについて

 ダイナミックテキストとマルチテキストの作成方法

 既に存在しているダイナミックテキストとマルチテキストの取得方法
ダイナミックテキストとマルチテキストの情報を取得する方法
ダイナミックテキストとマルチテキストの設定を変更する方法
ダイナミックテキストとマルチテキストを削除する方法

Text / MTextオブジェクト

AutoCADにはテキストとしてダイナミックテキストとマルチテキストの2種類のデータが用意されています。ダイナミックテキストは[文字記入](TEXT)コマンドで作成される単一行のテキストで、マルチテキストは[マルチテキスト](MTEXT)コマンドで作成される複数行をサポートしたテキストです。

AutoCAD VBAではこれらテキストがそれぞれ別のオブジェクトとして用意されており、ダイナミックテキストがTextオブジェクトマルチテキストがMTextオブジェクトとなっています。これらのオブジェクトには共通するプロパティ/メソッドが存在しますが、一部のプロパティはそれぞれが独自のものを持っているため、VBAの処理では条件に応じた分岐処理などが必要になる場合があります。

Text / MTextオブジェクトを取得する基本的な方法として「指定のインデックスからテキストを取得」「指定のオブジェクトID / ハンドルからテキストを取得」「テキストを新規作成して取得」「ユーザー選択から取得」の4つがあり、それぞれモデル空間オブジェクト(ThisDrawing.ModelSpace)から下記のコードで取得することができます。既存のテキストを編集したいのか新規でテキストを作成したいのかによって取得方法が異なるため、状況に応じて使い分ける必要があります。

    Dim oText As AcadText
    Dim oMText As AcadMText

    '指定のインデックスからテキストを取得 (※インデックスは0始まり)
    Set oText = ThisDrawing.ModelSpace.Item(0)
    Set oMText = ThisDrawing.ModelSpace.Item(0)

    'オブジェクトID / ハンドルからテキストを取得
    Set oText = ThisDrawing.ObjectIdToObject(xxx)   'xxxにオブジェクトID入力
    Set oText = ThisDrawing.HandleToObject(xxx)     'xxxにハンドル入力
    Set oMText = ThisDrawing.ObjectIdToObject(xxx)
    Set oMText = ThisDrawing.HandleToObject(xxx)
    
    'テキストを新規作成
    Dim arr_dPos(0 To 2) As Double
    Set oText = ThisDrawing.ModelSpace.AddText("Text", arr_dPos, 5)
    Set oMText = ThisDrawing.ModelSpace.AddMText(arr_dPos, 50, "Text")
    Call ThisDrawing.Regen(acActiveViewport) '描画更新

    'ユーザー選択でテキスト取得
    On Error Resume Next
    Call ThisDrawing.Utility.GetEntity(oText, Empty, "テキスト選択")
    Call ThisDrawing.Utility.GetEntity(oMText, Empty, "マルチテキスト選択")
    On Error GoTo 0

上記コードはモデル空間内のテキストを対象としていますが、ペーパー空間内のテキストも同様の方法で取得可能です。両空間の違いについては「ModelSpaceとPaperSpace」を参照ください。
  

テキスト作成

Textオブジェクト作成

ダイナミックテキストを新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddTextメソッドを使って下記のように記載します。

   AddTextメソッド 

Dim oText As AcadText
Set oText= ThisDrawing.ModelSpace.AddText(TextString, InsertionPoint, Height)

引数は作成するテキストの文字列(TextString)と配置位置の座標が入った配列(InsertionPoint)、テキストの高さ(Height)です。これにより、指定した位置に指定の大きさのダイナミックテキストを作成することができ、戻り値(oText)としてAcadTextオブジェクトが取得できます。

下記はアクティブドキュメントのモデル空間にテキストボックス左下座標(10,10)で高さ25のテキストを作成するサンプルコードです。XY平面に配置するためZ座標の値は0としています。

Sub AddText()

    Dim oText As AcadText
    Dim sText As String
    Dim arr_dPos(2) As Double
    Dim dHeight As Double

    'テキスト始点座標の定義
    arr_dPos(0) = 10    'X座標
    arr_dPos(1) = 10    'Y座標
    arr_dPos(2) = 0     'Z座標
    
    'テキスト文字列の定義
    sText = "Text"
    
    'テキスト高さの定義
    dHeight = 25
    
    'テキスト作成
    Set oText = ThisDrawing.ModelSpace.AddText(sText, arr_dPos, dHeight)

    '描画更新
    Call ThisDrawing.Regen(acActiveViewport)
    
End Sub

 
 MTextオブジェクト作成

マルチテキストを新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddMTextメソッドを使って下記のように記載します。

   AddMTextメソッド 

Dim oMText As AcadMText
Set oMText= ThisDrawing.ModelSpace.AddMText(InsertionPoint, Width, Text)

引数はテキスト配置位置の座標が入った配列(InsertionPoint)とテキストの幅(Width)、作成するテキストの文字列(Text)です。これにより、指定した位置に指定の大きさのマルチテキストを作成することができ、戻り値(oMText)としてAcadMTextオブジェクトが取得できます。

下記はアクティブドキュメントのモデル空間にテキストボックス左上座標(10,10)で幅100のマルチテキストを作成するサンプルコードです。XY平面に配置するためZ座標の値は0としています。

Sub AddMText()

    Dim oMText As AcadMText
    Dim sText As String
    Dim arr_dPos(2) As Double
    Dim dWidth As Double

    'テキスト始点座標の定義
    arr_dPos(0) = 10    'X座標
    arr_dPos(1) = 10    'Y座標
    arr_dPos(2) = 0     'Z座標
    
    'テキスト文字列の定義 (改行コード利用可)
    sText = "Text" & vbLf & "Text"
    
    'テキスト幅の定義
    dWidth = 100
    
    'テキスト作成
    Set oMText = ThisDrawing.ModelSpace.AddMText(arr_dPos, dWidth, sText)

    '描画更新
    Call ThisDrawing.Regen(acActiveViewport)
    
End Sub

 

テキスト編集

文字列(値)の取得と変更

テキストの文字列はText / MTextオブジェクトのTextStringプロパティによって定義されています。

    'テキスト文字列取得
    Dim sText As String
    sText = oText.TextString
    
    'テキスト文字列変更
    oText.TextString = "New Text"

マルチテキストは複数行をサポートしているため、MTextオブジェクトのTextStringプロパティにはVBAの改行コード(vbLf)が入力でき、テキストとしてもその部分で改行がなされます。対してダイナミックテキストは単一行テキストであるた、改行コードを入力してもテキストの改行は行われません。

また、マルチテキストは一部の文字だけを太字にしたり、色を変更したりフォントやサイズを変更することができますが、これらの情報は全てこのTextStringプロパティに書式コードとして含まれます。例えば"Text"の"T"部分のみを太字にした際のTextStringプロパティの値は下記のようになります。

 icon-code  MText.TextString 

{\fArial|b1|i0|c0|p34;T}ext

マルチテキストの各文字が持つ書式はすべてTextStringプロパティが持つ書式コードで定義されているため、書式コードのない文字列で上書きすると書式の情報はすべて失われてしまうため注意が必要です。逆に上記のような書式コードを含めた文字列を動的に作成してTextStringプロパティに入力することで、指定の文字の書式を自在に変更することが可能です。
  

フォント(文字スタイル)の取得と変更

テキストのフォントは文字スタイルによって管理されており、VBAにおいて文字スタイルはText / MTextオブジェクトのStyleNameプロパティにより定義されています。このStyleNameの値を取得することで現在設定さてている文字スタイルの取得ができ、変更したい文字スタイルの名称に設定することで任意の文字スタイル、つまりはフォントの変更ができます。

    'フォント(文字スタイル)取得
    Dim sStyleName As String
    sStyleName = oText.StyleName    

    'フォント(文字スタイル)変更
    oText.StyleName = "スタイル1"

StyleNameプロパティで設定可能な文字スタイルは図面内で定義されている文字スタイルのみのため、あらかじめ変更したいフォントを設定した文字スタイルを作成しておく必要があります(存在しない場合エラーが発生)。文字スタイルはAutoCAD VBAではTextStyleオブジェクトとして用意されており、TextStylesコレクションのAddメソッドを使うことで動的に作成することもできます。
 

文字サイズ(高さ)の取得と変更

テキストの文字サイズはText / MTextオブジェクトのHeightプロパティによって定義されています。

    '文字サイズ(高さ)取得
    Dim dHeight As Double
    dHeight = oText.Height
    
    '文字サイズ(高さ)変更
    oText.Height = 30

新規作成されたダイナミックテキストのHeightプロパティは、AddTextメソッドの引数として入力した文字の高さの値がそのまま設定されます。マルチテキストは新規作成時に横幅の設定しかできないため、文字サイズを指定の値にしたい場合は作成後に文字の高さを変える処理が別途必要になります。
 

位置の取得と変更

テキストの位置はText / MTextオブジェクトのInsertionPointプロパティによって定義されています。データの型としては座標が格納された要素数3の配列データのため、インデックスから各要素にアクセスすることで座標値の取得ができます。座標の変更はInsertionPointプロパティの要素に直接アクセスして値を変更することはできないので、配列ごと置き換える必要があります。

    '位置取得
    Dim arr_dPos(2) As Double
    arr_dPos(0) = oText.InsertionPoint(0)   'X座標
    arr_dPos(1) = oText.InsertionPoint(1)   'Y座標
    arr_dPos(2) = oText.InsertionPoint(2)   'Z座標
    
    '位置変更
    arr_dPos(0) = 10 'X座標
    arr_dPos(1) = 10 'Y座標
    arr_dPos(2) = 0  'Z座標
    oText.InsertionPoint = arr_dPos

配列の要素には0にX座標、1にY座標、2にZ座標をWCS(ワールド座標系)基準でそれぞれ格納します。UCS(ユーザー座標系)基準での値にしたい場合は座標変換の計算が必要になります。
 

角度の取得と変更

テキストの角度はText /MTextオブジェクトのRotationプロパティによって定義されています。

    Dim dDegree As Double
    Dim dRadian As Double
    Const PI As Double = 3.14159265358979
    
    '角度取得
    dRadian = oMText.Rotation
    dDegree = (180 / PI) * dRadian
    
    '角度変更
    dDegree = 10
    dRadian = (PI / 180) * dDegree
    oMText.Rotation = dRadian

Rotationプロパティの角度はラジアン単位のため、度単位で角度の取得や設定をしたい場合は、ラジアン⇔度の単位変換の計算を行わなければならないので注意が必要です。
 

 色の取得と変更

オブジェクトの色の取得と編集」ページを参照ください。

 

テキストの削除

Text / MTextオブジェクトはAcadObjectから継承されたオブジェクトのため、AcadObjectがもつDeleteメソッドを使用することができます。Deleteメソッドは実行したオブジェクト自身を削除するためのメソッドで、下記のように記載します。(※[Text] = 削除するText / MTextオブジェクト)

 icon-code  テキストの削除 

Call [Text].Delete

 

まとめ

今回の内容をまとめると以下のとおりです。

 ダイナミックテキストの操作はTextオブジェクトを使う
 マルチテキストの操作はMTextオブジェクトを使う
ダイナミックテキストとマルチテキストの作成方法は微小に違う
ダイナミックテキストとマルチテキストは共通のプロパティが多数存在する

 テキストの位置や値、サイズなどはプロパティを使うことで取得や変更が可能
 テキストの削除はDeleteメソッドを呼び出すだけ 

ダイナミックテキストは単一行かつ書式コードがないということもあり、かなり単純なオブジェクトとなっていますが、マルチテキストは少し複雑なオブジェクトとなっている(その分できることは多い)ので、ダイナミックテキスト→マルチテキストという流れで理解を深めるほうがスムーズにいきます。

本ページではテキストの編集方法としてプロパティ操作を行いましたが、どれもText / Mtext共通のプロパティであるため同じように扱うことができます。本ページには記載していませんが、マルチテキストでは行間やスペース幅、背景色の設定などができ、ダイナミックテキストでは尺度や文字の方向などの設定ができます。これらは各オブジェクトがもつ特有のプロパティとなっています。

 

メインページへ戻る
 

 関連書籍

 Autodesk公式リンク

参考:Text オブジェクト(ActiveX)
   MText オブジェクト(ActiveX)

2024年9月29日AutoCAD,VBA