【入門編】【中級者向け】図面内に追加された「ユーザー定義記号(Sketch Block / 独自シンボル)」の配置と一括削除 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは。設計自動化の迷宮へようこそ。
普段はチーフアーキテクトとして、数万個の部品からなる巨大アセンブリの制御や、全自動出図システムの構築に明け暮れているエンジニアです。

さて、今日は「マクロの記録」という訓練場を卒業し、「自分の意志でSolidWorksを操りたい」と願うあなたに、非常に実用的かつ本質的なテクニックを伝授します。

テーマは「図面内におけるユーザー定義記号(スケッチブロック)の配置と一括削除」です。

「注意マークを定位置に置きたい」「古い規格のシンボルを一斉に消したい」……。こうした要望は現場で頻発します。しかし、APIリファレンスを漫然と読んでも、どこに何を書けばいいのか分かりにくい領域でもあります。

ここをクリアすれば、SolidWorks VBAの「オブジェクト階層」という概念が完全に腑に落ちるはずです。準備はいいですか? それでは、始めましょう。

1. 【概念】「ユーザー定義記号」の正体を知る

まず、プログラミングを始める前に、SolidWorksが内部でこの記号をどう扱っているかを理解しましょう。

私たちが「シンボル」や「ユーザー定義記号」と呼んでいるものの正体は、APIの世界では`SketchBlockInstance`(スケッチブロックインスタンス)です。

イメージしてください。

  • スケッチブロック(定義): 「ハンコ」そのもの。形や線が定義されているマスターデータ。
  • スケッチブロックインスタンス(配置): 紙に押された「印影」。マスターをどこに、どの向きで配置したかという実体。

VBAで操作する場合、私たちがやりたいのは「特定のマスター(定義)を呼び出して、指定の座標にインスタンス(印影)を作る」こと、そして「不要なインスタンスを特定して消し去る」ことです。

ここを混同すると、「定義を消したつもりが、図面上の全ての記号が消えた!」という悲劇が起こります。

2. 【実装】シンボルを定位置に配置する

まずは配置からです。
マクロ記録でこれをやろうとすると、座標指定がめちゃくちゃになり、コードが冗長になります。APIを直接叩けば、たった数行で完結します。

実装のポイント:`InsertSketchBlock` メソッド

図面シートにブロックを挿入するには、`DrawingDoc` オブジェクトの `InsertSketchBlock` を使用します。

' --- ユーザー定義記号を配置する関数 ---
Sub PlaceCustomSymbol(symbolPath As String, x As Double, y As Double)
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 図面ファイルであることを確認
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてください。"
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' 【極意】InsertSketchBlock の引数
    ' 引数1: ブロックファイルのフルパス (.sldblk)
    ' 引数2: X座標 (メートル単位)
    ' 引数3: Y座標 (メートル単位)
    ' 引数4: Z座標 (通常は0)
    
    swModel.InsertSketchBlock symbolPath, x, y, 0
    
    ' 画面を更新して反映
    swModel.EditRebuild3
End Sub

⚠️ ここで陥りやすい罠

1. 単位の壁: SolidWorks APIの内部単位は常に「メートル」です。

  • 10mmの位置に置きたいなら、`0.01` と指定してください。ここを間違えると、記号が遥か彼方(10メートル先)に飛んでいき、「配置されない!」とパニックになります。

2. パスの正確性: `.sldblk` ファイルのパスが正しいか、事前に `Dir()` 関数などでチェックすることを推奨します。

3. 【実装】不要なシンボルを一括削除する

配置よりも難しいのが「削除」です。
なぜなら、図面の中には大量の線や寸法が混在しており、「どれが消すべき記号なのか」をプログラムに判断させなければならないからです。

ここでは、「ブロック名」をキーにして、一致するものだけを狙い撃ちして消去するアルゴリズムを解説します。

実装のコード:名前ベースの一括削除

' --- 特定の名前を持つ記号を一括削除する関数 ---
Sub DeleteSymbolsByName(targetBlockName As String)
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    Dim swSketch As SldWorks.Sketch
    Dim swBlockInst As SldWorks.SketchBlockInstance
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    ' 全てのビューを走査する(シート自体も「シートビュー」として扱われる)
    Set swView = swDraw.GetFirstView ' これは基本的にはシートそのものを指す
    
    Do While Not swView Is Nothing
        ' ビューに紐づくスケッチを取得
        Set swSketch = swView.GetSketch
        
        If Not swSketch Is Nothing Then
            ' スケッチ内の全てのブロックインスタンスを走査
            Set swBlockInst = swSketch.GetFirstSketchBlockInstance
            
            Do While Not swBlockInst Is Nothing
                ' 【重要】ブロック名が一致するかチェック
                ' 定義名(Name)を確認し、ターゲットであれば選択して削除
                If swBlockInst.Name = targetBlockName Then
                    ' 選択して削除する(SelectByID2を使わず、オブジェクトから直接選択)
                    swModel.ClearSelection2 True
                    swBlockInst.Select4 False, Nothing, False
                    swModel.EditDelete
                End If
                
                ' 次のブロックへ
                Set swBlockInst = swBlockInst.GetNext
            Loop
        End If
        
        ' 次のビューへ
        Set swView = swView.GetNextView
    Loop
    
    swModel.EditRebuild3
    MsgBox targetBlockName & " の削除が完了しました。"
End Sub

💡 先輩エンジニアの解説:ここが「プロ」の視点

このコードで注目してほしいのは、「入れ子構造の走査」です。

`図面(Drawing)` $\rightarrow$ `ビュー(View)` $\rightarrow$ `スケッチ(Sketch)` $\rightarrow$ `ブロックインスタンス(SketchBlockInstance)`

という階層を、`Do While` ループで一つずつ潜っていっています。
初心者は `SelectByID2` で名前を指定して消そうとしますが、ブロックインスタンスは内部的に `SketchBlockInstance1` のように連番で管理されているため、名前指定による選択は非常に不安定です。

このように「オブジェクトを直接掴んで、そのプロパティ(`.Name`)を確認し、合致すれば消す」という手法が、最も堅牢で高速な自動化手法です。

4. 【極限の知見】さらに上のレベルへ行くために

ここまでできれば、実務上の課題の8割は解決します。しかし、伝説的なエンジニアを目指すなら、以下の2点に留意してください。

① 「シートフォーマット」と「シート」の区別

SolidWorks図面には、「シート(描画領域)」と「シートフォーマット(枠線や表題欄)」の2つのレイヤーがあります。
もし記号がシートフォーマット内に配置されている場合、`swModel.EditSheetFormat` を実行してフォーマット編集モードに入らないと、APIから操作できない場合があります。

② パフォーマンスの最適化

大量の記号を処理する場合、`swModel.EditRebuild3`(再構築)をループの中で回すと、動作が激重になります。
「全ての処理が終わった最後に1回だけ再構築する」。これが処理時間を10倍速くする鉄則です。

まとめ:ここをクリアすれば基本はバッチリです

今回のポイントを振り返りましょう。

1. ユーザー定義記号は `SketchBlockInstance` である。
2. 配置は `InsertSketchBlock`。単位はメートルであることに注意!
3. 削除は「ビュー $\rightarrow$ スケッチ $\rightarrow$ インスタンス」の順で走査し、名前で判定する。
4. `SelectByID2` に頼らず、オブジェクト自体を操作するのが正解。

マクロの記録は「何が起きたか」を教えてくれますが、APIを直接書くことは「どう制御するか」を決定することです。この視点を持てたあなたは、もう単なるユーザーではなく、開発者の入り口に立っています。

このスクリプトをベースに、ぜひ自社専用の「出図標準化ツール」を組み上げてみてください。応援していますよ。

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