【CNC/レーザー加工機連携】AutoCAD VBAで極める「R12 DXF出力」とポリライン最適化の極意
「AutoCADで完璧に書いた図面なのに、工作機械(CNC)やレーザー加工機に読み込ませるとエラーが出る、あるいは形が崩れる……」
もしあなたがそんな経験をしたことがあるなら、それはあなたの設計能力のせいではありません。「CADという現代の高度な文明」と「工作機械という現場の物理デバイス」の間にある、データ形式の溝に直面しているだけなのです。
こんにちは。今日は、マクロの記録から一歩踏み出し、「実務で本当に使える自動化」を目指すあなたへ、少し踏み込んだ、しかし極めて実践的な技術をお話しします。
今回のテーマは、「CNC/レーザー加工機のために、図面をR12形式のDXFとして、最も『機械が理解しやすい形』で一括出力する」というミッションです。
なぜ「R12形式」なのか? ―― 互換性の本質を知る
現代のAutoCADは、非常にリッチなデータ構造を持っています。スプライン曲線、複雑な属性情報、高度なポリライン……。これらは人間には見やすく、設計には便利ですが、古い工作機械のコントローラーにとっては「理解不能な暗号」に過ぎません。
そこで登場するのが AutoCAD R12形式のDXF です。
R12は、いわば「図面の原始語」です。
- 余計なメタデータを持たない
- 幾何学情報が極めてシンプル(点、線、円、ポリラインのみ)
- メモリ消費が少なく、処理が高速
加工機への出力においては、「最新の機能を使わないこと」こそが、最も確実な「品質保証」になるのです。
陥りやすい罠:スプラインと複雑なポリライン
R12形式で保存する際、最も注意すべきは「エンティティ(図形の種類)の不一致」です。
多くの設計者は、滑らかな曲線を描くために「スプライン(Spline)」を使用します。しかし、多くのCNCコントローラーはスプラインを解釈できません。これをそのままDXF出力しても、加工機側で「図形なし」と判定されたり、最悪の場合、ソフトがクラッシュしたりします。
プロの自動化エンジニアは、保存する前に「図形を掃除」します。
具体的には、スプラインを「細かな直線(Line)の集合」または「ポリライン(Polyline)」に変換するプロセスを組み込むのです。
実践:R12 DXF一括変換・最適化コード
それでは、実際に使えるコードを見ていきましょう。このコードは、現在の図面内の「スプライン」を「ポリライン」に変換し、その上でR12形式のDXFとして保存する、という一連の流れを実装しています。
Option Explicit
''' <summary>
''' 図面をCNC加工用に最適化し、R12 DXF形式で保存する
''' </summary>
Sub ExportToR12DXFForCNC()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
Dim savePath As String
Dim fileName As String
' 1. 保存先のパスとファイル名の設定(デスクトップに保存する例)
' 実務ではダイアログを表示させるか、特定のフォルダを指定してください
fileName = "CNC_Output_" & Format(Now, "yyyymmdd_hhnnss") & ".dxf"
savePath = Environ("USERPROFILE") & "\Desktop\" & fileName
On Error GoTo ErrorHandler
' 画面更新を停止してパフォーマンスを向上させる(プロの作法)
' ※VBA標準にはないため、概念的なステップとして記述
Debug.Print "最適化プロセス開始..."
' 2. 図形オブジェクトの最適化(スプラインの分解)
' 重要:オブジェクトを削除・変更する場合は「後ろからループ」するのが鉄則です!
Dim i As Integer
Dim ent As AcadEntity
Dim objArray As Variant
' モデル空間内のエンティティを後ろから走査
For i = acadDoc.ModelSpace.Count - 1 To 0 Step -1
Set ent = acadDoc.ModelSpace.Item(i)
' スプラインを見つけたら、ポリラインに変換(分解)する
If TypeOf ent Is AcadSpline Then
Debug.Print "スプラインを検出: 分解を開始します。"
' Explodeメソッドで分解し、生成されたオブジェクトを取得
ent.Explode objArray
' 分解されたオブジェクトをポリラインとして扱うための処理
' (ここでは単純化のため、元のスプラインを削除する流れ)
ent.Delete
' objArrayの中身を適切に処理するロジックをここに加えるとより堅牢です
End If
Next i
' 3. R12 DXF形式での保存
' acR12DXF は定数として定義されている必要があります。
' 定数が参照できない場合は、整数値 16 を使用します。
' ※ AutoCADのバージョンにより定数の値が異なる場合があるため注意。
Const acR12DXF As Integer = 16
Debug.Print "保存中: " & savePath
' SaveAsメソッドの実行
' 引数: ファイル名, ファイル形式
acadDoc.SaveAs savePath, acR12DXF
MsgBox "完了しました!" & vbCrLf & "保存先: " & savePath, vbInformation, "CNC出力成功"
Exit Sub
ErrorHandler:
MsgMsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description, vbCritical, "実行エラー"
End Sub
【極限の知見】ここをクリアすれば、あなたはもう初心者ではない
このコードをただコピペするだけでは、あなたはまだ「マクロを使える人」です。
「自動化エンジニア」になるために、以下の3つのポイントを脳に刻んでください。
1. 「逆順ループ(Step -1)」の絶対原則
コードの中に `For i = acadDoc.ModelSpace.Count – 1 To 0 Step -1` という記述がありますね。
図形を削除したり(Delete)、分解したり(Explode)する場合、前から順番にループすると、要素が削除された瞬間に「インデックス(番号)」がズレてしまい、次に処理すべき図形を飛ばしたり、エラーで止まったりします。
「コレクションを操作するときは後ろから回る」。これはAutoCAD VBAにおける黄金律です。
2. オブジェクトのライフサイクルを意識せよ
`ent.Explode` を実行したとき、新しいオブジェクトがメモリ上に生成されます。これを放置すると、大量の図面を処理する際にメモリを圧迫し、AutoCADが重くなります。
実務レベルのプログラムでは、分解した後のオブジェクトが適切に管理されているか、あるいは不要なオブジェクトが残っていないかを常に意識してください。
3. 「例外処理(Error Handling)」は品質の証
`On Error GoTo ErrorHandler` を書いています。
自動化の最大の目的は「人間が手を離すこと」です。もし、ファイルが読み取り専用だったり、保存先のパスが不正だったりしたときに、マクロが黙って止まってしまうと、自動化は失敗です。
「何が原因で失敗したのか」をユーザーに優しく伝えること。これこそが、現場で信頼されるエンジニアの作法です。
まとめ:道具を支配し、現場を楽にする
AutoCAD VBAは、単なる「記録の再生」ではありません。
図形の構造を理解し、機械の特性を理解し、それらを橋渡しする「情報の翻訳機」を作る作業です。
今回学んだ「R12形式への変換」と「スプラインの最適化」は、製造現場における自動化の第一歩です。ここをマスターすれば、次は「レイヤーごとの一括出力」や「座標データのCSV書き出し」といった、より高度な領域へと道が開けます。
一歩ずつ、着実に。
コードの裏側にある「データの動き」を感じながら、最強の自動化ツールを作り上げていきましょう。応援していますよ!
