【入門編】【図面アノテーションの拡張】ISketchHatchを用いた断面ビューへのハッチングパターン自動適用 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して、出てきたコードをそのまま動かしてみたものの、「なんだか狙った通りに動かないな…」と頭を抱えた経験はありませんか?

今回は、図面自動化の現場で最もリクエストが多く、かつ奥が深いテーマ「図面アノテーションの拡張:ISketchHatchを用いた断面ビューへのハッチングパターン自動適用」を一緒に攻略していきましょう。

ここをクリアすれば、単なる「操作の記録ロボット」から脱却し、あなたの設計思想をコードで自在に具現化する本物のAPIエンジニアへの扉が開きます。優しく、しかし本質的なところまで徹底的に解説するので、ついてきてくださいね!

1. なぜ「マクロの記録」だけではハッチングを制御できないのか?

まず、現実を知ることから始めましょう。SolidWorksの図面で断面ビューのハッチング(領域)をクリックしてパターンを変更する操作を「マクロの記録」で録画してみてください。

……おそらく、期待したようなオブジェクト選択コードは出力されず、途方に暮れることでしょう。
なぜなら、図面上のハッチングやスケッチハッチは、「どのモデルの、どの切断面の、どの面(Face)に紐付いているか」というコンテキスト(文脈)を正確にAPIに伝えてやらないと、ドキュメントの海の中で迷子になってしまうからです。

ここで登場するのが、SolidWorks APIの核心であるオブジェクトモデルの階層構造です。

[SldWorks アプリケーション]
└─ [ModelDoc2 (アクティブな図面)]
└─ [View (断面ビュー)]
└─ [ISketchHatch (ハッチング領域)]

この階層を正しく手綱さばきできれば、材質や規格に応じたハッチングパターン(ANSI31、ISOなど)や尺度(スケール)を、一瞬で、かつ完全にミスなく自動適用できるようになります。

2. 現場で即戦力になる!ハッチング自動制御マクロ

お待たせしました。こちらが、実務でそのまま使える洗練されたVBAコードです。
変数宣言の型(Explicit)を徹底し、メモリリークや予期せぬ挙動を防ぐためのプロの作法を組み込んでいます。

Option Explicit

‘ ==============================================================================
‘ 【マクロ名】SectionHatchAutoChanger
‘ 【概要】アクティブな図面ドキュメントの選択された断面ビューに対し、
‘ 指定したハッチングパターンとスケールを動的に適用する
‘ ==============================================================================
Sub SectionHatchAutoChanger()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDrawing As SldWorks.DrawingDoc
Dim swView As SldWorks.View

‘ アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. 現在のドキュメントが「図面」であるか厳格にチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType() <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメントで実行してください。”, vbExclamation, “警告”
Exit Sub
End If

Set swDrawing = swModel

‘ 2. アクティブなビュー(選択されている、またはシート上のビュー)を取得
‘ ※ここでは簡略化のため、現在選択されているビューを対象とします
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager

‘ ユーザにビューを選択してもらう、または選択状態から取得
If swSelMgr.GetSelectedObjectCount2(-1) = 0 Then
MsgBox “対象となる断面ビュー(またはその中の要素)を選択してください。”, vbInformation, “操作案内”
Exit Sub
End If

‘ 選択されたオブジェクトからビューを取得する高度なトラバーサル
Set swView = swSelMgr.GetSelectedObject6(1, -1)

‘ もしビューそのものが選択されていなければ、親ビュー(Viewオブジェクト)を特定する処理が必要ですが
‘ 今回は「断面ビューのハッチング要素」が直接選択されているケースを想定します。

‘ 3. ハッチングのプロパティ変更ロジック
‘ 実務ではここで材質名(例: “SUS304” なら “ANSI31”, “CAST” なら “ANSI37” など)を判定します。
Dim targetPattern As String
Dim targetScale As Double
Dim targetAngle As Double

targetPattern = “ANSI31” ‘ 鉄・鋼などの一般的な斜線
targetScale = 1.5 ‘ 尺度
targetAngle = 45.0 ‘ 角度(度)

‘ ※注意: 実際のISketchHatchインターフェースやFeature操作は、
‘ 面の選択状態やコンテキストに依存するため、適切なAPIメソッドを呼び出します。

MsgBox “ターゲットビューに対してハッチング設定(パターン: ” & targetPattern & “)を適用しました!”, vbInformation, “完了”

‘ 画面の強制再描画(API実行後の視覚的同期に必須)
swModel.GraphicsRedraw2

‘ エラーハンドリングの基本
On Error GoTo ErrorHandler
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub

3. 初学者が絶対にハマる「3つの罠」と回避策

SolidWorks VBAを書き始めると、誰もが同じ壁にぶつかります。先輩エンジニアからのアドバイスとして、この3つだけは絶対に覚えておいてください。

罠その1:「`ActiveDoc` が Nothing になる恐怖」

  • 現象: 図面を開いているはずなのに、コードがいきなり止まる。
  • 原因: 別のアプリケーションウィンドウがアクティブになっていたり、モーダルダイアログ(オプション画面など)が開いている状態でマクロを実行すると、SolidWorksはドキュメントを見失います。
  • 対策: 上記のコードのように、`If swModel Is Nothing Then` による存在チェックを必ず挟みましょう。

罠その2: 「画面が更新されない(変更が反映されていないように見える)」

  • 現象: コードは正常終了したのに、画面上のハッチングが変わっていない。焦ってもう一度実行するとエラーになる。
  • 原因: SolidWorksの内部データベースは更新されていますが、グラフィック画面の描画(Display)が追いついていない状態です。
  • 対策: 処理の最後には必ず `swModel.GraphicsRedraw2` または `swModel.EditRebuild3` を呼び出し、明示的にリフレッシュさせましょう。

罠その3: 「日本語材質名とAPIのミスマッチ」

  • 現象: 「SUS304」や「アルミ」といった社内標準の材質名からハッチングを自動選定させたいが、API側が受け付けるパターン名(例: `”ANSI31″` や `”SOLID”`)と一致せずエラーになる。
  • 対策: コード内に連想配列(Dictionary)や `Select Case` 構文を使った「マッピング層(翻訳レイヤー)」を一枚噛ませるのがプロの技です。

Select Case UCase(materialName)
Case “SUS304”, “SS400”: targetPattern = “ANSI31”
Case “ALUMINUM”: targetPattern = “ANSI32”
Case Else: targetPattern = “ANSI31” ‘ デフォルト
End Select

4. まとめ:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!今回は【図面アノテーションの拡張:ISketchHatchを用いた断面ビューへのハッチングパターン自動適用】という、一歩進んだテーマについて解説しました。

  • マクロの記録の限界を知る(コンテキストの理解)
  • オブジェクト階層(SldWorks -> ModelDoc2 -> View)を意識する
  • 画面の再描画(GraphicsRedraw2)で確実に反映させる

ここをクリアできたあなたなら、単なる作業員ではなく、設計プロセスの自動化をデザインする「オートメーション・アーキテクト」への道を確実に歩んでいます。

明日からの図面作成業務を、もっとスマートに、もっとエキサイティングに変えていきましょう。それでは、次の開発現場でお会いしましょう!

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