こんにちは!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)で確実に反映させる
ここをクリアできたあなたなら、単なる作業員ではなく、設計プロセスの自動化をデザインする「オートメーション・アーキテクト」への道を確実に歩んでいます。
明日からの図面作成業務を、もっとスマートに、もっとエキサイティングに変えていきましょう。それでは、次の開発現場でお会いしましょう!
