こんにちは!SolidWorks自動化の現場で泥臭く、かつ優雅にプログラムを書き続けている先輩エンジニアです。
皆さんは、図面作成のこんな「あるある」な苦行に悩まされていませんか?
「ボルトやナット、そして数えきれないほどの締結用の貫通穴……。図面ビューを配置したあとに、一つひとつポチポチと中心マーク(センターマーク)を手動で入れていく作業。あれ、本当に指が疲れるし、入れ忘れも発生するよね……」
分かります。その手作業、完全にエンジニアの無駄なリソース消費です。
今回は、マクロの記録という「お遊戯」を卒業し、SolidWorks VBAの真髄に触れたい中級者の方に向けて、「図面ビュー内の円形フィーチャーや穴要素をVBAで自動走査し、中心マークを一括で爆速配置するロジック」を魂を込めて伝授します。
ここをクリアすれば、あなたの図面作成自動化スキルは間違いなく一段上のステージに上がります。さあ、一緒に扉を開けましょう!
—
1. 思想:なぜマクロの記録では穴の自動化ができないのか?
まず、大前提として知っておいてほしいことがあります。
SolidWorksの「マクロの記録」ボタンを押して中心マークを手動で追加してみてください。記録されるコードは、大体こんな感じになります。
‘ マクロの記録が吐き出す「その場しのぎ」のコード例
boolstatus = swModel.Extension.SelectByID2(“Arc1”, “EDGE”, 0, 0, 0, False, 0, Nothing, 0)
boolstatus = swModel.InsertCenterMark()
お気づきでしょうか? これでは「Arc1(特定の名前のエッジ)」を名指しで指定しているだけです。
モデルの形状が変わればエッジの名前(内部ID)は変わり、このコードは一巻の終わり。実務では全く使い物になりません。
私たちが目指すべきプロフェッショナルなVBAコードは、人間のように図面ビューを眺め、「お、ここに円形の穴があるな、じゃあ中心マークを撃ち込むか」と動的に判断・走査するロジックです。
—
2. 幾何要素走査のメカニズム
SolidWorksの図面(Drawing)APIにおいて、ビュー内の要素をプログラムから触るには、以下の階層構造を正確に理解し、渡り歩く必要があります。
1. DrawingDoc(図面ドキュメント)
2. View(図面ビュー:親ビューや投影ビューなど)
3. DrawingComponent(ビュー内に存在するアセンブリの構成部品)
4. Entity / Edge / Loop(幾何学的実体:円弧やエッジ)
今回は、最も実用的なアプローチとして、「アクティブな図面ビューを選択し、そのビューに含まれるすべての円弧(Arc)または円形エッジをプログラムで探し出し、一括でセンターマークを付与する」というアルゴリズムを構築します。
—
3. 実装コード:中心マーク一括自動配置マクロ
開発環境(VBAエディタ)を開き、以下のコードを標準モジュールに貼り付けてください。実務の現場でそのままコピペして動かせるよう、細部までガチガチにエラー対策とコメントを入れています。
Option Explicit
‘ ==============================================================================
‘ 【マクロ名】DrawingCenterMarkAutoInserter
‘ 【概要】アクティブな図面ビュー内の円形要素を走査し、中心マークを一括挿入する
‘ ==============================================================================
Sub DrawingCenterMarkAutoInserter()
Dim swApp As SldWorks.SldWorks
Dim swDrawing As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim boolstatus As Boolean
‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swDrawing = swApp.ActiveDoc
‘ 安全装置:今開いているのが図面かどうかをチェック
If swDrawing Is Nothing Then
MsgBox “図面ドキュメントを開いた状態で実行してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ 2. ユーザーに処理対象の「図面ビュー」を選択させる
‘ ※SolidWorks APIでは、ユーザーにビューを選択してもらうのが最も確実で安全です
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swDrawing.SelectionManager
‘ 厳密な型チェック:選択されたものが「図面ビュー」か?
If swSelMgr.GetSelectedObjectType3(1) <> swSelectType_e.swSelDrawingViews Then
MsgBox “対象となる『図面ビューの枠』を一つだけ選択してからマクロを実行してください。”, vbExclamation, “操作確認”
Exit Sub
End If
Set swView = swSelMgr.GetSelectedObject6(1, -1)
‘ 3. ビューに紐づくモデル(部品・アセンブリ)のコンポーネントを取得
‘ ここから先はAPIの深部、エッジの走査に入ります
Dim vEdges As Variant
vEdges = swView.GetEdges()
If IsEmpty(vEdges) Then
MsgBox “選択されたビューからエッジを取得できませんでした。”, vbExclamation, “警告”
Exit Sub
End If
‘ 4. 走査の開始(トランザクションの保護とパフォーマンス配慮)
swDrawing.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swDisplayUpdateBypass, True
Dim i As Long
IntCount = 0
Dim processedCount As Long
processedCount = 0
Dim swEdge As SldWorks.Edge
Dim swCurve As SldWorks.Curve
For i = LBound(vEdges) To UBound(vEdges)
Set swEdge = vEdges(i)
Set swCurve = swEdge.GetCurve()
‘ 曲線が「円(Circle)」または「円弧(Arc)」であるかを判定
If swCurve.IsCircle() Then
‘ 該当するエッジを選択状態にする
‘ 秘伝の技:Select4を使うことで、画面描画を伴わずにバックグラウンドで安全に選択できる
boolstatus = swEdge.Select4(False, Nothing)
If boolstatus Then
‘ 選択された円要素に対して中心マークを挿入
‘ 引数の詳細:(形状, 拡張, 隙間, 延長, 破線, 表示) ※デフォルト値を使用
swDrawing.InsertCenterMark2 0, 0, 0
processedCount = processedCount + 1
End If
End If
Next i
‘ 5. 画面描画の復元と後処理
swDrawing.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swDisplayUpdateBypass, False
swDrawing.GraphicsRedraw2
‘ 完了報告
MsgBox “処理が完了しました!” & vbCrLf & _
“挿入された中心マークの数: ” & processedCount & ” 箇所”, vbInformation, “自動化完了”
End Sub
—
4. チーフアーキテクトが教える!陥りやすい罠と極意
このコードを実務で使うにあたって、知っておくべき「プロの知見」をいくつか授けます。
① 画面描画のバイパス(`swDisplayUpdateBypass`)
大量の円弧(例えばフランジのボルト穴が24個ある等)に対して一つひとつ `InsertCenterMark2` を呼ぶと、画面がチラつき、処理速度が極端に落ちます。
コード中の `swDisplayUpdateBypass` は、「裏側で黙々と処理を進め、最後に一気に画面を再描画する」ための、パフォーマンス劇的改善の魔法の呪文です。大規模アセンブリの図面では必須のテクニックです。
② なぜ「ビューを選択」させるのか?
完全自動で「図面内のすべてのビューを総なめする」ことも技術的には可能ですが、断面図や詳細図などが混ざると、意図しない場所の中心マークまで拾ってしまい、図面がぐちゃぐちゃになります。
「人間がビューを指定し、面倒で機械的なエッジの走査と中心マークの打刻をマクロに任せる」。この役割分担こそが、実務で最もエラーが少なく、現場に歓迎される自動化の設計思想です。
—
5. おわりに
お疲れ様でした!
今回解説した「幾何要素の走査(`IsCircle()` による判定)」と「バックグラウンド選択」のテクニックをマスターすれば、円形フィーチャーだけでなく、寸法線の自動配置や特定の穴への注記付与など、あらゆる図面自動化へ応用できるようになります。
「ここをもっとこうしたい」「こんなエラーが出るんだけど」といった疑問があれば、ぜひ日々の開発に取り入れて試行錯誤してみてください。
その試行錯誤の数だけ、あなたのSolidWorks VBAスキルは確固たるものになります。
それでは、快適な自動化ライフを!次回の記事もお楽しみに。
