【入門編】【実務中級者向け】DXF保存時の「精度(小数点桁数)」を動的に変更し、基板設計やCAM連携に最適なファイルを出力する – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の知見】DXF出力の「精度」を支配せよ:CAM連携を成功させるプロフェッショナルVBA術

こんにちは。現場の自動化を支えるアーキテクトの皆さん。
マクロの記録機能を使って「とりあえず動くもの」を作る段階から、一歩踏み出そうとしているあなたを、今日は心から歓迎します。

「マクロの記録」は素晴らしい第一歩です。しかし、実務の、それも基板設計や精密加工(CAM)といった「0.001mmの誤差が命取りになる現場」では、単なる操作の記録だけでは通用しません。

なぜなら、AutoCADの出力(SaveAs)は、単なる「保存ボタンの代行」ではないからです。出力されるDXFの数値精度は、その瞬間のAutoCADの「システム変数の状態」に強く依存します。

今日は、DXF保存時の小数点桁数を動的に制御し、後続の製造工程で「読み取りエラー」や「位置ズレ」を発生させない、プロフェッショナルな実装手法を伝授しましょう。ここをクリアすれば、あなたのVBAは「便利なツール」から「信頼されるシステム」へと進化します。

1. なぜ、DXFの「精度」が問題になるのか?

多くの初学者が陥る罠があります。それは、「図面上で正しく見えているから、出力も正しいはずだ」という思い込みです。

DXFファイルは、中身をテキストエディタで覗けばわかる通り、座標がテキストデータとして書き出されます。
もし、AutoCADのシステム変数が「小数点以下2桁」の設定になっていたとしたら、たとえ図面上の座標が `10.12345` であっても、DXFには `10.12` と書き出されてしまうことがあります。

これが基板設計(PCB)の現場に持ち込まれるとどうなるか?

  • ビア(穴)の位置が数ミクロンずれる
  • 配線パターンが不連続になる
  • CAMソフトが「不正な座標」としてエラーを吐く

こうしたトラブルを防ぐには、「保存する直前に、プログラム側で精度(LUPREC等)を強制的に書き換え、保存後に元に戻す」という、環境制御の思考が必要なのです。

2. 制御の鍵を握る「システム変数」

AutoCADには、アプリケーション全体の挙動を決定する「システム変数」が存在します。今回のテーマで操作すべきは主に以下の変数です。

  • `LUPREC` (Linear Unit Precision): 線形単位の精度を制御します。これを変更することで、出力される数値の桁数を制御できます。
  • `DIMZIN`: ゼロの表示方法を制御します。CAMソフトによっては、先頭や末尾のゼロの有無でパースエラーを起こすことがあるため、併せて制御するのがプロの作法です。

これらを「書き換える」→「保存する」→「元に戻す」というライフサイクル管理が、コードの肝となります。

3. 実装:精度を動的に制御するプロフェッショナル・コード

それでは、実際に使える堅牢なコードを見ていきましょう。
単に値を書き換えるだけでなく、「エラーが起きても元の設定を必ず復元する」という、エンジニアとして譲れない作法を組み込んでいます。

Option Explicit

''' <summary>
''' 指定した精度でDXFファイルを保存する。
''' </summary>
''' <param name="savePath">保存先のフルパス</param>
''' <param name="precision">小数点以下の桁数 (0-8)</param>
Sub ExportPrecisionDXF(ByVal savePath As String, ByVal precision As Integer)
    Dim acadApp As Object
    Dim acadDoc As AcadDocument
    Dim oldLuprec As Integer
    Dim oldDimzin As Integer
    
    ' 現在の図面オブジェクトを取得
    Set acadDoc = ThisDrawing
    
    ' --- [1] 現在の状態をバックアップ ---
    ' プロの鉄則:環境を変えるときは、必ず「元に戻す準備」をしてから行う
    On Error GoTo ErrorHandler
    oldLuprec = acadDoc.GetVariable("LUPREC")
    oldDimzin = acadDoc.GetVariable("DIMZIN")
    
    Debug.Print "Original LUPREC: " & oldLuprec
    
    ' --- [2] 出力用環境の構築 ---
    ' 精度を指定された桁数に設定
    acadDoc.SetVariable "LUPREC", precision
    ' ゼロの表示設定を安定した状態(例:0)に固定
    acadDoc.SetVariable "DIMZIN", 0
    
    Debug.Print "New LUPREC set to: " & precision
    
    ' --- [3] DXFとしての保存実行 ---
    ' acDXF (定数値: 34) を指定して保存
    ' SaveAs メソッドの引数は (ファイル名, ファイル形式)
    ' ※ AutoCADのバージョンにより定数の扱いに注意
    acadDoc.SaveAs savePath, acDXF
    
    Debug.Print "Success: DXF saved to " & savePath
    
    ' --- [4] 正常終了時の後処理 ---
    ' 設定を元の状態に戻す
    acadDoc.SetVariable "LUPREC", oldLuprec
    acadDoc.SetVariable "DIMZIN", oldDimzin
    
    MsgBox "DXFの出力が完了しました。" & vbCrLf & "精度: 小数点以下 " & precision & "桁", vbInformation
    Exit Sub

ErrorHandler:
    ' --- [5] エラーハンドリング(重要!) ---
    ' 万が一保存に失敗しても、AutoCADの設定を壊したままにしない
    MsgErr = Err.Description
    MsgBox "エラーが発生しました。設定を復元して中断します。" & vbCrLf & "内容: " & MsgErr, vbCritical
    
    ' 可能な限り元の設定に戻す試み
    On Error Resume Next
    acadDoc.SetVariable "LUPREC", oldLuprec
    acadDoc.SetVariable "DIMZIN", oldDimzin
End Sub

''' <summary>
''' テスト実行用メインルーチン
''' </summary>
Sub TestExport()
    Dim targetPath As String
    ' 保存先パスを指定(実際の環境に合わせて変更してください)
    targetPath = "C:\Temp\Precision_Output.dxf"
    
    ' 例:小数点以下4桁の精度で出力したい場合
    Call ExportPrecisionDXF(targetPath, 4)
End Sub

4. コードの解説:ここが「プロ」の設計

このコードが、なぜ単なる「マクロの記録」と違うのか。3つのポイントに注目してください。

① 状態のバックアップと復元 (State Management)

`oldLuprec = acadDoc.GetVariable(“LUPREC”)`
ここが最も重要です。プログラムが勝手にユーザーの作業環境(精度設定)を書き換えて、そのまま放置するのは、ツールとして「失礼」であり「不完全」です。作業中の図面の設定を壊さないよう、必ずバックアップを取り、最後に必ず復元します。

② エラーハンドリングの思想 (Robustness)

`On Error GoTo ErrorHandler`
もし、保存先のフォルダに書き込み権限がなかったら? もし、ファイルが他のソフトで開かれていたら?
エラーが起きた瞬間にプログラムが止まると、AutoCADの設定(LUPREC)が書き換わったままになり、ユーザーは「なぜか急に図面の表示精度が変わったぞ?」と混乱します。`ErrorHandler` を通じて、「失敗しても環境を汚さない」ことが、信頼されるエンジニアの条件です。

③ 動的な引数設計 (Flexibility)

`ExportPrecisionDXF(savePath, precision)`
精度をコード内に直接書き込まず(ハードコーディングせず)、引数として受け取るようにしています。これにより、「基板用には4桁」「簡易確認用には2桁」といった使い分けが、一つの関数でスマートに実現できます。

5. まとめ:次なるステップへ

今回の内容をまとめましょう。

1. DXFの精度は、保存時のシステム変数(LUPREC)に支配される。
2. 後続工程(CAM等)の要求に合わせて、動的に精度を切り替える。
3. 「環境変更 → 実行 → 復元」のサイクルを徹底し、エラー時も復元を試みる。

「動けばいい」というフェーズから、「どんな状況でも、正しく、安全に動作する」フェーズへ。
この視点を持てるようになった時、あなたはもう単なるプログラマーではなく、業務プロセスを設計するエンジニアなのです。

さあ、このコードを自分のプロジェクトに組み込んで、現場の信頼を勝ち取ってください。応援していますよ!

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