こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身がスパゲッティ状態で手が出せない……」そんな壁にぶつかっていませんか?
大丈夫。ここをクリアすれば、あなたもAutoCAD VBAを意のままに操るエンジニアの仲間入りです。今回は、実務で本当によく使う「図面上の点(Point)オブジェクトの自動配置と管理」をテーマに、プロの現場でも通用する本質的なテクニックを優しく、そして深く解説していきます。
測量データのプロットや、設計基準点の網羅的な配置作業。これを手作業でやっていたら、定時には絶対に帰れませんよね。VBAに一瞬で片付けさせましょう!
—
1. AutoCAD VBAの根幹:オブジェクトモデルを把握する
まず、AutoCAD VBAの全体像を頭に叩き込みましょう。AutoCADのオブジェクト構造は、ロシアの民芸品「マトリョーシカ」のようになっています。
- `AcadApplication`(最高神):AutoCADそのもの。
- `AcadDocument`(世界):現在開いている図面ファイル。
- `ModelSpace` または `PaperSpace`(キャンバス):実際に線や文字を描き込む空間。
点(Point)を配置するということは、「現在のDocumentの中にあるModelSpaceに対して、『点を作ってくれ!』と命令する」ことに他なりません。この階層構造の意識を持つことが、エラーを出さないコードを書く第一歩です。
—
2. 【実践】測量データを一撃でプロットするマクロ
それでは、実務で即戦力となるコードを見ていきましょう。
以下のコードは、CSVやメモ帳にあるような「X座標, Y座標, Z座標」のデータを元に、モデル空間へ一瞬でPointオブジェクトを生成するサンプルです。
Sub CreatePointExample()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim pointObj As AcadPoint
‘ 座標を格納するための配列(AutoCAD VBAでは定番のDouble型配列)
Dim insertionPoint(0 To 2) As Double
‘ 1. AutoCADのアプリケーションと現在のアクティブな図面を取得
‘ ※不意のオブジェクト切れを防ぐため、変数にしっかりバインドします
Set acadApp = ThisDrawing.Application
Set acadDoc = ThisDrawing.ActiveDocument
‘ 2. 配置したい座標を指定(例:X=100.5, Y=250.0, Z=0.0)
insertionPoint(0) = 100.5 ‘ X座標
insertionPoint(1) = 250.0 ‘ Y座標
insertionPoint(2) = 0.0 ‘ Z座標(高さ)
‘ 3. モデル空間にPointオブジェクトを追加
‘ AddPointメソッドは、引数に「配列」を要求するのがポイントです
Set pointObj = acadDoc.ModelSpace.AddPoint(insertionPoint)
‘ 4. ついでに画層(レイヤー)や色を変えてみる(実務的な配慮)
pointObj.Color = acRed ‘ 赤色に設定
‘ 画面を強制的に最新の状態に再描画(カクつきや表示抜けを防ぐプロの技)
acadApp.Update
MsgBox “基準点を正常に配置しました!”, vbInformation, “自動化完了”
End Sub
コードの急所:なぜ `Double` 型の配列を使うのか?
初心者が見落としがちなのが、`AddPoint` メソッドの引数です。AutoCADの座標系は3次元(X, Y, Z)で管理されているため、VBA側でも「3つの要素を持つ数値の箱(配列)」を用意してあげる必要があります。
`Dim insertionPoint(0 To 2) As Double` がまさにそれです。ここを単体の変数にしようとすると、容赦なく型不一致エラー(実行エラー 13)が飛んできますので注意してくださいね。
—
3. 配置した点を「管理・編集」するための応用テクニック
点を置くだけならマクロの記録でも似たようなことができますが、真の自動化エンジニアは「配置した後のオブジェクトをどうコントロールするか」にこだわります。
例えば、「図面内にあるすべてのPointオブジェクトを探し出し、特定の処理をする」にはどうすればよいでしょうか? ここでコレクションとループの概念が登場します。
Sub InspectAllPoints()
Dim acadDoc As AcadDocument
Dim ent As AcadEntity
Dim pointCount As Long
Set acadDoc = ThisDrawing.ActiveDocument
pointCount = 0
‘ モデル空間の全エンティティ(図形)を総ナメにして検査する
For Each ent In acadDoc.ModelSpace
‘ オブジェクトのタイプが「点(AcDbPoint)」であるか判定
If TypeOf ent Is AcadPoint Then
pointCount = pointCount + 1
‘ 例:見つけた点の座標をイミディエイトウインドウに出力
‘ ent.Coordinates で座標を取り出せます
Debug.Print “点 #” & pointCount & _
” 座標 -> X:” & ent.Coordinates(0) & _
” Y:” & ent.Coordinates(1) & _
” Z:” & ent.Coordinates(2)
End If
Next ent
MsgBox “図面内に ” & pointCount & ” 個の点オブジェクトが存在します。”, vbInformation
End Sub
ここで知っておくべき「点スタイル」の罠
AutoCADを触っていて、「VBAでコードを実行したのに、図面上に点が見当たらない!」と焦った経験はありませんか?
実はこれ、AutoCADの仕様(罠)です。AutoCADの初期設定では、点オブジェクトは「ただの1ドット(点)」として描画されるため、画面をズームアウトしていると肉眼で見えません。
もし実務で点をハッキリ表示させたい場合は、コードの実行前、あるいはVBAの初期化処理の中で、システム変数 `PDMODE` と `PDSIZE` を操作してあげる必要があります。
‘ 点のスタイルを「丸に十字」、サイズを「5」に変更するコード例
acadDoc.SetVariable “PDMODE”, 34
acadDoc.SetVariable “PDSIZE”, 5
こういった「痒い所に手が届く気配り」ができるかどうかが、実務で頼られるエンジニアへの分かれ道です。
—
4. 陥りやすいエラーと、先輩からのアドバイス
最後に、AutoCAD VBAで初心者が必ず踏む地雷と、その回避策をシェアしておきます。
1. 「オブジェクト変数または With ブロック変数が見つかりません」エラー
- 原因: `ActiveDocument` や `ModelSpace` を取得する前にオブジェクトを操作しようとしています。
- 対策: コードの頭には必ず `Dim` による宣言と `Set` によるインスタンスの紐付けをセットで行いましょう。
2. ループ処理が異常に重い・フリーズする
- 原因: 大量(数千〜数万個)の点を配置する際、ループの回数分だけ画面が再描画(AutoCADが必死に画面を書き換えようとする)されています。
- 対策: 大量処理の前後に `acadApp.ScreenUpdating = False`(画面描画の停止)を挟むと、処理スピードが劇的に跳ね上がります(※VBAの仕様上、明示的な画面抑制プロパティがない場合は、コマンドのラッパーやレイヤー操作で負荷を減らす工夫をします)。
—
まとめ:ここをクリアすれば、基本はバッチリ!
お疲れ様でした!今回は以下のポイントをマスターしました。
- AutoCAD VBAの階層構造(Application > Document > ModelSpace)の理解
- 3次元配列を使った正確な `AddPoint` メソッドの実行
- `TypeOf … Is` を使った図面内オブジェクトのフィルタリング管理
- 視認性を担保するためのシステム変数(`PDMODE`)の重要性
ここをクリアできれば、単なる「お絵かきマクロ」の領域を完全に脱却し、「図面データをプログラムで自在に解析・構築するエンジニア」としての基礎体力が身についています。
明日からの図面作成・編集作業、ぜひあなたの手で作ったマクロに任せて、優雅にコーヒーでも飲んで過ごしてくださいね。それでは、次のステップでお会いしましょう!
