AutoCAD VBAを掌握する:`RealToString`による「図面整合性」の極致
AutoCADのAPIを扱う上で、最も軽視され、かつ最も設計者の品格を問われるのが「数値の文字列化」だ。
単に `Format()` 関数や `Round()` を使って数値を丸め込んでいる諸君、それはシステムエンジニアとしての敗北である。AutoCADにはAutoCADの流儀がある。なぜなら、図面は「図面単位設定(LUPREC)」という、その図面が持つ固有の文脈(コンテキスト)の中で完結しなければならないからだ。
本稿では、`Utility.RealToString` を極め、システム間連携やレガシー保守においても揺るがない、プロフェッショナルな実装技術を伝授する。
—
なぜ `Format()` では不十分なのか
VBA標準の `Format` 関数は、あくまで「言語仕様」上の文字列変換に過ぎない。しかし、AutoCADにおける数値は常に「図面の精度」という制約下にある。
例えば、LUPREC(単位精度)が3位に設定されている図面で、計算結果が `10.12345` となった場合、図面上の表記は `10.123` であるべきだ。ここで `Format` を使い、個別に丸めルールをハードコーディングすれば、図面の単位設定を変更した瞬間に「数値表記の不整合」というシステム上の汚点が発生する。
`RealToString` は、AutoCADのシステム変数と同期した「図面言語」を扱うための唯一の正解である。
—
実践:`RealToString` 徹底活用コード
以下のコードは、単なる変換ではなく、現在の図面のLUPREC(精度)を動的に取得し、文字列化するプロフェッショナルな実装だ。
‘ @brief 現在の図面単位精度に合わせて数値を安全に文字列化する
‘ @param Value 変換対象の数値
‘ @return 精度が適用された文字列
Public Function GetDocumentFormattedString(ByVal Value As Double) As String
Dim doc As AcadDocument
Dim util As AcadUtility
Dim precision As Integer
Set doc = Application.ActiveDocument
Set util = doc.Utility
‘ LUPREC(図面単位の精度)をシステム変数から取得
‘ 0〜8の範囲外のリスクを考慮し、安全側で処理する
precision = doc.GetVariable(“LUPREC”)
‘ acDecimal(1) は十進数表記を意味する
‘ このメソッドは、AutoCAD内部の丸めロジックを忠実に再現する
GetDocumentFormattedString = util.RealToString(Value, acDecimal, precision)
‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Set util = Nothing
Set doc = Nothing
End Function
—
伝説のエンジニアが教える「極限の知見」
1. メモリ管理とオブジェクトのライフサイクル
VBAのメモリリークは、`AcadDocument` や `AcadUtility` への参照を放置することから始まる。特に、大規模なループ処理の中で `ActiveDocument` を何度も叩くのは自殺行為だ。常にオブジェクトへの参照を局所変数に保持し、処理の最後には `Nothing` を代入する。この「儀式」を怠る者は、大規模な自動化システムを構築する資格がない。
2. Windows APIと連携する際の罠
もし、この変換後の文字列をWindows API(例えば `SendMessage` による外部アプリへのデータ送出)に渡す場合、注意が必要だ。`RealToString` が返す文字列には、特定の条件下で制御コードや特殊なスペースが含まれることがある。
外部システムへ渡す際は、必ず `Trim()` で余計な空白を除去し、必要であれば `StrConv` で半角変換を行う。API連携の境界線(境界条件)は、最もバグが混入しやすい箇所である。
3. レガシー保守における「防衛的プログラミング」
レガシーシステムでは、LUPRECが異常な値(負数や範囲外)になっている図面に遭遇することがある。`RealToString` の `Precision` 引数には、必ず `0` 以上 `8` 以下の制約を設けるべきだ。
‘ 防衛的アプローチの例
If precision < 0 Or precision > 8 Then precision = 4
—
結びに:真の自動化エンジニアへ
AutoCAD VBAは、現代の言語から見ればレガシーかもしれない。だが、図面の生成という「物理的な制約を伴うデータ出力」において、これほど直接的にCADのコアへ干渉できるツールは他にない。
`RealToString` を使いこなすということは、AutoCADという巨大なソフトウェアの「呼吸」を理解するということだ。システム変数と同期し、図面の整合性を担保する。その矜持を忘れない限り、君の書くコードは、何年経っても色褪せない価値を持ち続けるだろう。
次は、`AcadTable` オブジェクトへの書き込み速度を極限まで引き上げる手法について解説する。期待して待て。
