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

スポンサーリンク

【AutoCAD VBAを掌握する極限の知見】図面単位と精度の罠を断つ!`RealToString` による高精度文字列変換の極意

開発プロジェクトのリーダーである私のもとに、「VBAで自動作図したテキストの寸法や座標の値が、図面設定と一致しない」「環境によって小数点以下の桁数がバラバラになる」という相談が後を絶たない。

素人がやりがちなのは、VBAの標準関数である `CStr` や `Format` を使って数値を直接文字列に変換する愚行だ。
ミリメートル単位のつもりで `1234.5` と出力したら、インチ単位の図面や、建築分野の「フィート・インチ(分数表記)」の図面で大惨事を引き起こした……なんて笑えない話もある。

AutoCADには、図面ごとに「単位系(Linear Units)」や「精度(Precision)」が厳密に定義されている。この図面環境を完全に無視したコードは、実務の現場においては「バグ製造機」でしかない。

今回は、AutoCAD VBAのオブジェクトモデルにおける隠れた重要機能、`AcadDocument.Utility.RealToString` を用いた、図面単位完全準拠の高精度文字列変換テクニックを伝授する。

1. なぜ `CStr` や `Format` では実務で使い物にならないのか?

AutoCADの図面管理において、数値を単なる「実数」として扱ってはならない。それは「単位を持った物理量」だからだ。

例えば、以下のような図面設定の差異を考えてみてほしい。

  • 十進表記 (Decimal): `1250.5` mm
  • 建築表記 (Architectural): `4′-1 1/2″`
  • 工学表記 (Engineering): `4′-1.5″`

VBAの `CStr(1250.5)` は、どのような図面設定であっても問答無用で `”1250.5″` という文字列を返す。これでは、建築分野の図面に放り込んだ瞬間に規格外のゴミデータが完成する。

ここで登場するのが `AcadDocument.Utility.Object`(または `AcadUtility`)のメソッドである `RealToString` だ。このメソッドは、現在の図面(`AcadDocument`)に設定されている単位系と精度をそのまま継承し、人間が読める正しい文字列へと数値を自動変換してくれる。

2. `RealToString` のメソッド仕様を丸裸にする

まずは、このメソッドのシグネチャを正確に把握しよう。

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

  • `Value` (Double): 変換したい実数値(図面単位系での値)。
  • `Unit` (AcApplicationUnits または Ac लेंથUnits 等の定数): 使用する単位形式。
  • `Precision` (Integer): 小数点以下の桁数、あるいは分母の限界値(精度)。

しかし、ここで実務的なアドバイスをしておこう。
引数に図面設定とは異なる単位や精度を強制指定するのは、特別な理由がない限り避けるべきだ。 図面全体の一貫性を保つため、AutoCADのシステム変数(`LUNITS` や `LUPREC`)を動的に読み取り、それをそのまま `RealToString` に渡す設計こそが、保守性の高いプロフェッショナルなアプローチとなる。

3. 【プロダクションコード】実務で即戦力となる堅牢なユーティリティ

ここに示すのは、現場でそのままコピー&ペーストして使える、極めて堅牢なモジュールだ。
図面の現在の単位系(`LUNITS`)と精度(`LUPREC`)を自動取得し、エラーハンドリングを完備した上で `RealToString` を実行する。さらに、取得した文字列をモデル空間の指定座標にマルチテキスト(MText)として配置する実用的なプロシージャである。

Option Explicit

” ==============================================================================
” モジュール名: modDrawingTextUtility
” 概要: 図面の単位・精度設定を完全に反映した高精度文字列変換および作図モジュール
” 開発リーダー推奨: 実務の自動化ツールにおいて、数値を文字化する際は必ずこの層を通すこと。
” ==============================================================================

Public Sub CreateLocalizedDimensionText(ByVal dblValue As Double, ByVal insertionPoint As Variant)
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

On Error GoTo ErrorHandler

‘ 1. 図面設定から現在の単位形式と精度を安全に取得
Dim intUnits As Integer
Dim intPrecision As Integer

intUnits = acadDoc.GetVariable(“LUNITS”)
intPrecision = acadDoc.GetVariable(“LUPREC”)

‘ 2. 実務の要:図面設定に準拠した文字列への変換
Dim strConverted As String
strConverted = acadDoc.Utility.RealToString(dblValue, intUnits, intPrecision)

‘ 3. モデル空間への安全な配置(トランザクション的思考)
Dim acadMText As AcadMText
Dim dblPoint(0 To 2) As Double

dblPoint(0) = insertionPoint(0)
dblPoint(1) = insertionPoint(1)
dblPoint(2) = insertionPoint(2)

‘ MTextオブジェクトの生成(幅は一旦0で生成し、自動拡張させる)
Set acadMText = acadDoc.ModelSpace.AddMText(dblPoint, 0.0, strConverted)

‘ 4. プロパティの最適化(必要に応じ文字高さやスタイルを設定)
With acadMText
.Height = 2.5 ‘ 図面標準の文字高さ(必要に応じて変更)
.Update
End With

Exit Sub

ErrorHandler:
‘ ログ出力やイミディエイトウィンドウへの詳細通知
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “RealToString 変換エラー”
Debug.Print “Error #[ ” & Err.Number & ” ] : ” & Err.Source & ” – ” & Err.Description
End Sub

” ——————————————————————————
” 【テスト用実行プロシージャ】
” ——————————————————————————
Public Sub Test_RealToStringExecution()
Dim testPoint(0 To 2) As Double
testPoint(0) = 0#
testPoint(1) = 0#
testPoint(2) = 0#

‘ 例:1234.5678 という生データを渡す
‘ 図面が「小数点2桁・ミリメートル」であれば “1235” または “1234.57”(設定依存)に変換される
Call CreateLocalizedDimensionText(1234.5678, testPoint)
End Sub

4. チーフアーキテクトが教える「現場の罠」と設計上の注意点

このコードをあなたのプロジェクトに組み込むにあたり、以下のアーキテクチャ上のポイントを必ず頭に叩き込んでおいてほしい。

① システム変数依存のリスクヘッジ

`GetVariable(“LUNITS”)` や `GetVariable(“LUPREC”)` は非常に強力だが、図面ファイル(`.dwg`)が破損している場合や、外部参照(Xref)のコンテキストに依存している場合、意図しない値を返すことがある。
そのため、コード内では必ずフォールバック(デフォルト値の準備)を考慮するか、上記のように堅牢なエラーハンドリング(`On Error GoTo`)で囲むこと。

② データベース連携・Excel出力との二面性

もしこのスクリプトが、「AutoCADの図面から数値を読み取り、データベースやExcelに書き出す」という逆のフローを持つ場合は注意が必要だ。

  • 図面上の「表示」のため: 今回紹介した `RealToString` を使い、人間が視認するための文字列にする。
  • 計算・集計のため: `RealToString` を通さず、`Double` 型のままの生データを処理系に渡す。

この境界線を曖昧にすると、「Excel側で文字列のパースエラーが頻発する」「集計結果の合計値が合わない」といった、現場で最も嫌われるタイプの不具合を生むことになる。

5. 総括

AutoCAD VBAにおける真のエンジニアリングとは、「AutoCADが持っているコンテキスト(状態)をどれだけリスペクトし、コードに調和させるか」に尽きる。

`AcadDocument.Utility.RealToString` は、単なるフォーマット関数ではない。AutoCADという巨大なCADエンジンの「単位系・精度の哲学」をコードへ橋渡しするための、極めて重要なインターフェースなのだ。

安易な文字列操作でプログラムを汚すのは今日で終わりにしよう。
図面環境に完全に寄り添う高精度なコードを書き上げ、自動化プロジェクトを成功へと導いてほしい。

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