マクロ記録の先へ。図面を「浄化」する、プロフェッショナルなクリーンアップ術
こんにちは。現場で設計自動化の指揮を執っている、あなたの「少し先を行く先輩エンジニア」です。
SolidWorksで図面を作成していると、ふとした瞬間に「あれ?」と思うことはありませんか?
「モデルからインポートしたはずの意図しないスケッチ線が残っている」「構築線がビューのあちこちに点在して、寸法記入の邪魔をしている」「図面ファイルがなぜか重い……」
これらは、多くの場合、モデルの構成要素が図面ビューに「副産物」として紛れ込んでしまった結果です。手動で一つずつ消していくのは、エンジニアの貴重な時間をドブに捨てるようなもの。
今日は、そんな「図面の汚れ」を一括で掃除し、ファイルを常にクリーンな状態に保つための「図面クリーンアップVBA」の極意を伝授します。
「マクロの記録」ボタンを押す段階から、一歩踏み出して「APIの構造を掌握する」段階へ。一緒に登っていきましょう。
1. 核心:図面オブジェクトの「階層構造」を理解する
コードを書く前に、まず脳内に「地図」を描いてください。SolidWorks VBAにおいて、図面(Drawing)は単なる一枚の絵ではありません。厳格な階層構造を持ったオブジェクトの集合体です。
不要なスケッチを消すためには、以下のルートを辿る必要があります。
1. DrawingDoc (図面ドキュメント):ファイル全体を統括する王様。
2. Sheet (シート):図面が描かれる「紙」。
3. View (ビュー):モデルを覗き込む「窓」。
4. Sketch (スケッチ):ビューの中に存在する「線や点」。
多くの初学者が陥るミスは、「図面全体に対してスケッチを消そうとする」ことです。しかし、図面におけるスケッチは「ビューの中に紐付いている」ことがほとんど。ビューという窓を一つずつ開けて、その中にある不要なものを探していく……この「階層を降りる感覚」が、プロの設計図です。
2. 実践:クリーンアップVBAコード
それでは、実際のコードを見ていきましょう。このコードは、図面内のすべてのビューを走査し、ビューに付随する「図面用スケッチ」を検知して削除するものです。
Option Explicit
''' <summary>
''' 図面内のビューに存在する不要なスケッチをクリーンアップするメインルーチン
''' </summary>
Sub CleanupDrawingSketches()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swSketch As SldWorks.Sketch
Dim vViews As Variant
Dim i As Long
Dim errorCount As Long
' 1. SolidWorksへの接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 2. ドキュメントが図面であるかチェック(ここが重要!)
If swModel Is Nothing Then
MsgBox "ドキュメントが開かれていません。", vbCritical
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox "このマクロは図面ファイル専用です。", vbExclamation
Exit Sub
End If
Set swDraw = swModel
' 3. 全てのビューを取得
' GetViewsは、シート自体(Sheet View)も含めて配列で返します
vViews = swDraw.GetViews
If IsEmpty(vViews) Then
MsgBox "ビューが見つかりませんでした。", vbInformation
Exit Sub
End If
errorCount = 0
' 4. ビューのループ処理
' 注意:コレクションを操作(削除)する場合、後ろから回すのが鉄則ですが、
' 今回は「ビューの中のスケッチ」を消すので、ビュー自体は前から回しても安全です。
For i = 0 To UBound(vViews)
Set swView = vViews(i)
' ビューに紐付いているスケッチマネージャーを取得
' これにより、モデル側のスケッチではなく「図面上のスケッチ」にアクセスできます
Dim swSketchMgr As SldWorks.SketchManager
Set swSketchMgr = swView.GetSketchManager
' ビュー内のスケッチを取得
' ここで「モデルのスケッチ」を消さないよう注意が必要。
' 図面ビューに直接描かれたスケッチのみを対象とするロジックにします。
' スケッチのリストを取得
Dim vSketches As Variant
vSketches = swSketchMgr.GetSketches
If Not IsEmpty(vSketches) Then
' 【極限の知見】
' コレクションから要素を削除する場合、前から(0 to N)回すと、
' 削除した瞬間にインデックスがズレて、次の要素をスキップしてしまいます。
' 必ず「後ろから(N to 0)」ループしてください。
For i = UBound(vSketches) To 0 Step -1
Set swSketch = vSketches(i)
' 条件判定:ここでは「構築線のみのスケッチ」や「特定の名前」を判定基準にできます
' 今回は、図面ビューに作成された「不要なスケッチ」を想定し、
' スケッチが空、あるいは特定の条件を満たす場合に削除します。
If ShouldDeleteSketch(swSketch) Then
swSketch.Select
swModel.EditDelete
errorCount = errorCount + 1
End If
Next i
End If
Next i
' 5. 画面更新と完了通知
swModel.ForceRebuild3 True
MsgBox "クリーンアップ完了!" & vbCrLf & _
"削除したスケッチ数: " & errorCount, vbInformation
End Sub
''' <summary>
''' スケッチを削除すべきかどうかの判定ロジック
''' </summary>
Private Function ShouldDeleteSketch(swSketch As SldWorks.Sketch) As Boolean
' ここに「何をもって不要とするか」のロジックを記述します。
' 例1: スケッチ名が "Sketch" で始まるもの
' 例2: スケッチが構築線のみで構成されているもの
' 今回はデモとして、特定のキーワード("Temp"など)を含むものを対象にします。
Dim sketchName As String
sketchName = swSketch.Name
' ここをカスタマイズすることで、安全に「掃除」の範囲を制御できます
If InStr(1, sketchName, "Temp") > 0 Or InStr(1, sketchName, "Sketch") > 0 Then
ShouldDeleteSketch = True
Else
ShouldDeleteSketch = False
End If
End Function
3. ここがプロの視点:陥りやすい罠と回避策
このコードを理解する上で、絶対に避けて通れない「エンジニアの心得」が3つあります。
① コレクションの反復(Iteration)の罠
コード内の `For i = UBound(vSketches) To 0 Step -1` という部分に注目してください。
初学者が最も多く犯すミスは、`For i = 0 To UBound(vSketches)` と前からループすることです。
要素を削除すると、残った要素のインデックスが一つずつ前に詰まります。すると、ループのインデックスが次に進んだとき、「本来チェックすべきだった次の要素」を飛び越えてしまうのです。
「削除するなら、後ろから回せ」。これはVBAに限らず、あらゆるプログラミングにおける鉄則です。
② 「モデルのスケッチ」を壊さない勇気
図面ビューには、モデルそのものの形状(モデルスケッチ)と、図面上に書き込んだスケッチ(図面スケッチ)が混在しています。
もし、誤ってモデル側のスケッチを消してしまうと、設計データそのものを破壊することになります。
今回のコードでは `swView.GetSketchManager` を使用することで、「そのビューに紐付いたスケッチ」に限定してアプローチしています。対象の範囲(スコープ)を明確に定めること。これが、安全な自動化の第一歩です。
③ パフォーマンスへの配慮
大量のビューがある図面で、一つずつ `EditDelete` を繰り返すと、SolidWorksがその都度画面を再描画しようとして動作が重くなります。
実戦的なマクロでは、処理の最初に `swApp.UserControl = False`(ユーザー操作の停止)を検討したり、最後に一括で `ForceRebuild3` を行ったりすることで、劇的に速度を向上させることができます。
最後に
いかがでしたか?
単に「線を消す」という動作の裏には、オブジェクトの階層、コレクションの性質、そしてデータ整合性への配慮といった、深い設計思想が隠れています。
マクロの記録は「やりたいことの断片」を教えてくれますが、APIの構造を学ぶことは「やりたいことを制御する力」を与えてくれます。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
次は、もっと複雑な「図面の自動レイアウト」や「部品表(BOM)の自動生成」に挑戦してみましょう。道は続いています。
応援していますよ!
