【入門編】【実務中級】AcadDocument.Utility.RealToStringを用いた「図面単位」から「文字列」への高精度な変換テクニック – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、「いよいよ本格的なVBAを書くぞ」というワクワク感を持っている頃ではないでしょうか。

今回は、実務で必ず直面する「数値から文字列への変換」、それも図面が持つ単位設定をパーフェクトに反映させる極意についてお話しします。

ここをクリアすれば、図面上の寸法や座標をプログラムで自在に操る基礎が完全に身につきますよ。さあ、一緒に扉を開けましょう!

なぜ `CStr` や `Str` ではダメなのか?(実務の現場で起きる悲劇)

VBAで数値を文字列に変換するとき、普段なら `CStr(123.45)` や `Str(123.45)` を使いますよね。
しかし、AutoCAD VBAの世界でこれをやってしまうと、手痛いしっぺ返しを喰らいます。

例えば、建築図面で「インチ・分数表記」や「測量用の高精度な十進表記」を使っているとしましょう。図面設定では「小数点以下4桁まで表示する」となっているのに、普通の `CStr` を使ってしまうと、末尾の「0」が勝手に消えたり、予期せぬ小数点区切りになったりして、図面としての規矩(きく)を逸脱した不格好な文字が生成されてしまいます。

「図面の設定(UNITSコマンドで決まること)を無視して文字列化するな!」
これが、AutoCADのAPIが私たちに突きつけている厳格なルールです。

ここで登場するのが、今回主役である `AcadDocument.Utility.RealToString` メソッドです。

`RealToString` とは何か?(オブジェクトの構造を知る)

まずは、このメソッドがどこに属しているかを確認しましょう。

AcadApplication
└─ AcadDocument (現在の図面)
└─ Utility (ユーティリティ機能の宝庫)
└─ RealToString (今回使う変換メソッド)

`Utility` オブジェクトは、ユーザーとの対話(画面上の点を取得するなど)だけでなく、今回のような「図面のルールに基づいたデータ変換」という非常に重要な役割も持っています。

`RealToString` の文法

RetVal = object.RealToString(Real, Unit, Precision)

  • `Real` (Double型): 変換したい数値(長さや座標など)
  • `Unit` (AcUnits定数): 図面の単位形式(十進、建築、工学など)
  • `Precision` (Integer型): 精度(小数点以下の桁数、または分数の分母など)

……おや? 「UnitやPrecisionを毎回指定しないといけないの?」と思いましたか?
ここに、実務で使えるスマートなテクニックがあります。

【実践】図面設定を自動追従させるプロのコード

毎回手動で単位や精度を指定するのは、図面が変わったときに破綻する「ハードコーディング」の悪しき習慣です。
現在の図面(Document)が持っているシステム変数(`LUNITS` と `LUPREC`)を自動で読み取り、それをそのまま `RealToString` に放り込むのが、プロのエンジニアのやり方です。

以下のコードをVBAエディタ(VBE)に貼り付けて実行してみてください。

Sub ConvertRealToDrawingString()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument

‘ 1. テスト用の数値(例:123.456789 ミリ、あるいはインチ)
valToConvert As Double
valToConvert = 123.456789

‘ 2. 現在の図面の単位設定(LUNITS)と精度設定(LUPREC)をシステム変数から取得
Dim currentUnit As Integer
Dim currentPrecision As Integer

currentUnit = acadDoc.GetVariable(“LUNITS”)
currentPrecision = acadDoc.GetVariable(“LUPREC”)

‘ 3. 図面の設定を完全に反映させて文字列に変換!
Dim convertedStr As String
convertedStr = acadDoc.Utility.RealToString(valToConvert, currentUnit, currentPrecision)

‘ 4. 結果をイミディエイトウィンドウに表示して確認
Debug.Print “変換前: ” & valToConvert
Debug.Print “変換後(図面設定準拠): ” & convertedStr

‘ おまけ:図面上のモデル空間に文字(MText)として配置してみる
Dim insertionPoint(0 To 2) As Double
insertionPoint(0) = 0: insertionPoint(1) = 0: insertionPoint(2) = 0

Dim textHeight As Double
textHeight = 5.0 ‘ 文字高さの指定

Dim mTextObj As AcadMText
Set mTextObj = acadDoc.ModelSpace.AddMText(insertionPoint, textHeight, convertedStr)

MsgBox “図面の単位設定を反映した文字列「 ” & convertedStr & ” 」を配置しました!”, vbInformation
End Sub

このコードの美しいポイント

1. 環境適応能力の高さ
`GetVariable(“LUNITS”)` と `GetVariable(“LUPREC”)` を使っているため、このマクロは「ミリメートル単位の機械図面」でも「インチ・分数単位の建築図面」でも、図面側の設定変更に一切怯むことなく、正しい文字列を生成します。
2. CADのライフサイクルに順応
`ThisDrawing.Application.ActiveDocument` を明示的に取得することで、複数図面が開かれているマルチドキュメント環境(MDI)でも暴走しない堅牢な設計になっています。

陥りやすいエラーと回避の心得

初学者がこの `RealToString` を使う際、よくハマる罠がいくつかあります。ここで先回りしてクリアしておきましょう。

トラブル1:`Precision` に “-1” を入れてエラーになる

  • 原因

システム変数 `LUPREC`(精度)の値は、建築・分数表示(`LUNITS = 4` や `5`)のときに「1/16」などを表す特殊な値になることがあります。しかし、自分で適当な負の数や範囲外の数字を入れると実行時エラーになります。

  • 対策

先ほどのコードのように、必ず `GetVariable(“LUPREC”)` から生きた値を取得して渡すようにしてください。

トラブル2:文字列なのに計算に使おうとして型ミスマッチ

  • 原因

`RealToString` は文字通り String型 を返します。そのため、返ってきた結果に対してさらに四則演算を行おうとすると「型が一致しません」エラーになります。

  • 対策

計算はすべて `Double` 型の数値の世界で行い、「画面に表示する」「文字オブジェクトにする」という最終出力の直前のステップでのみ この変換を行ってください。これがパフォーマンスと保守性を保つ鉄則です。

ここをクリアすれば、AutoCAD VBAの基本はバッチリです!

お疲れ様でした!
今回は `AcadDocument.Utility.RealToString` を用いた、図面単位に忠実な高精度文字列変換のテクニックを解説しました。

一見すると地味なメソッドに見えますが、「図面が持つコンテキスト(文脈)をコードが正しくリスペクトしているか」という、プログラミングにおいて最も大切な哲学が詰まった機能です。

ここをマスターしたあなたなら、単なるお絵描きマクロを超えた、実務で本当に信頼されるプロフェッショナルな図面自動化ツールを作ることができます。

自信を持って、次のステップへ進んでいきましょう!質問があればいつでもエンジニア仲間として答えますよ。

タイトルとURLをコピーしました