【テクニカル・上級編】【実務中級】AcadDocument.Utility.DistanceToRealによる「単位混在入力」の解析:建築表記(フィート・インチ)を数値に変換する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:`DistanceToReal`が解き明かす「単位混在入力」の魔術

AutoCADのAPIを語る際、多くのエンジニアは`AcadObject`のプロパティ操作に終始する。だが、真のアーキテクトが注目するのは、ユーザーとシステムを繋ぐ「曖昧なインターフェース」の解釈だ。

建築現場や海外とのプロジェクトで頻出する「フィート・インチ」混在表記。これを泥臭い文字列操作でパースしようとするのは、素人のやることだ。AutoCADには、OSのロケールや図面の単位設定を飲み込み、一瞬で純粋な浮動小数点(Double)へと昇華させる「魔法の関数」が隠されている。

それが `AcadUtility.DistanceToReal` だ。

1. なぜ「自作のパース関数」が死を招くのか

「1′ 6″」を解析するために`Split`関数を多用し、正規表現で泥沼に嵌る開発者を幾度となく見てきた。それは保守性の欠如だけでなく、AutoCAD独自の「単位入力のグローバルな仕様」を無視している点で致命的だ。

`DistanceToReal` を使うべき最大の理由は、AutoCAD自身の「単位解釈アルゴリズム」を直接叩ける点にある。これにより、以下のようなリスクを完全に回避できる。

  • ロケールの壁: ユーザーがOS設定でカンマ区切りをどう扱おうが、AutoCADの内部エンジンが正しい値を算出する。
  • 単位系の一貫性: 現在の図面で設定されている`LUNITS`(線形単位の種類)に依存した解析が可能。

2. 究極の変換実装:`DistanceToReal` の実戦投入

以下に、実務でそのまま組み込める堅牢な変換ルーチンを示す。ここで重要なのは、単なる変換ではなく「エラーハンドリングの徹底」と「オブジェクトの寿命管理」だ。

‘ @brief ユーザー入力文字列をAutoCADの単位系に基づきDouble値に変換する
‘ @param inputStr 変換対象の文字列(例: “1’6″” や “100.5”)
‘ @return 変換後のDouble値(失敗時は-1.0を返す)
Public Function ConvertToInternalUnit(ByVal inputStr As String) As Double
Dim util As AcadUtility
Set util = ThisDrawing.Utility

‘ acArchitectural (4): 建築単位
‘ acDecimal (2): 十進数単位
‘ 状況に応じて現在の単位設定を流動的に変えるべきだが、ここでは固定例
Const UnitMode As Integer = 4

On Error GoTo ErrorHandler

‘ DistanceToRealの真髄は、AutoCADの入力解釈エンジンをそのまま呼び出せること
‘ 第三引数で入力文字列を実数へキャストする
ConvertToInternalUnit = util.DistanceToReal(inputStr, UnitMode)

‘ オブジェクトの明示的解放(VBAでは推奨されるアーキテクチャの作法)
Set util = Nothing
Exit Function

ErrorHandler:
‘ ユーザーが不正な値を入力した際のログ出力と安全な終了
Debug.Print “変換失敗: ” & inputStr & ” は解釈不能なフォーマットです。”
Set util = Nothing
ConvertToInternalUnit = -1.0
End Function

3. シニアエンジニアが意識すべき「メモリとパフォーマンス」

オブジェクトのライフサイクル

VBAの`ThisDrawing`や`Utility`プロパティは、内部でCOMオブジェクトを頻繁に生成・破棄する可能性がある。高頻度で呼び出されるループ処理内でこれらを何度も取得するのは悪手だ。必ずモジュールレベルの変数、あるいはループの外で一度だけインスタンスを保持せよ。

Windows APIによる「入力の強制」

もし、コマンドライン入力ではなく、フォーム上のTextBoxに単位入力を強制させたいのであれば、`GetSystemMetrics`や`SendMessage`を駆使したHookingも検討すべきだ。しかし、まずはAutoCADの`Utility.GetString`を駆使し、コマンドラインの「単位入力の流儀」にユーザーを合わせるのが、最も堅牢なシステム連携である。

4. レガシー環境における保守の極意

このアーキテクチャの真価は、将来的な「国際化」にある。
もし将来、図面単位がメートル法からフィート・インチへ切り替わったとしても、`UnitMode`の定数値を変更するだけで、あなたのシステムは対応可能だ。

  • ハードコーディングを排除せよ: `UnitMode`を定数ではなく、`ThisDrawing.GetVariable(“LUNITS”)`から動的に取得するように書き換えることで、コードは「図面に合わせて自ら最適化する自律的な存在」へと進化する。

結論:技術の深淵へ

AutoCAD VBAはレガシーではない。強力なAPIが提供する「解釈の深さ」を正しく理解し、それを利用する術を知るエンジニアにとって、これは依然として最強の自動化ツールだ。

`DistanceToReal`を単なる文字列変換関数と呼ぶのは、フェラーリを買い物籠と呼ぶのに等しい。AutoCADが持つ数万行のC++エンジンを、VBAから呼び出す特権階級の特権を行使せよ。

次回のテーマでは、この変換結果を`AcadObject`の座標系にどうマッピングし、浮動小数点の丸め誤差を回避するか、その「極限の数学的アプローチ」について解説しよう。

魂を込めろ。コードは、あなたの思考そのものだ。

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