【入門編】【中級者向け】図面内に配置された不要なスケッチエンティティや構築線を一括削除するクリーンアップVBA – SolidWorks VBA解析バイブル

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

マクロ記録の先へ。図面を「浄化」する、プロフェッショナルなクリーンアップ術

こんにちは。現場で設計自動化の指揮を執っている、あなたの「少し先を行く先輩エンジニア」です。

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)の自動生成」に挑戦してみましょう。道は続いています。

応援していますよ!

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