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

スポンサーリンク

【図面アノテーションの拡張】ISketchHatchを用いた断面ビューへのハッチングパターン自動適用

図面自動化の現場において、最もエンジニアの頭を悩ませる領域の一つが「断面ビューのハッチング制御」だ。
材質変更や設計変更に伴うハッチングの再適用を手作業で行うのは、非効率であるばかりか、ヒューマンエラーの温床となる。

今回は、SolidWorks APIの深層に切り込み、`ISketchHatch`(および関連する領域・ビューオブジェクト)を駆使して、断面ビューのハッチングパターンをプログラムから完全に制御・自動化する極限のテクニックを伝授する。

単なるAPIのラッパーではなく、オブジェクトのライフサイクルと実務に耐えうる堅牢なアーキテクチャを共有しよう。

1. なぜ「力技のハッチング制御」は破綻するのか?

多くのVBA初心者が陥る罠は、UIの操作をそのままマクロ記録し、それをループさせることだ。
「断面ビューを選択し、ハッチングプロパティを開き、パターン名を文字列で指定する」――このアプローチは、実務の巨大なアセンブリ図面の前では無力である。

  • ビューとスケッチ、そしてハッチングの親子関係の不在

SolidWorksの図面において、ハッチングは単体の図形ではなく、「ドキュメント(ModelDoc2)」→「シート(Sheet)」→「ビュー(View)」→「スケッチ(Sketch)」→「ハッチング(SketchHatch)」という厳格な階層構造(コンテナチェーン)の中に存在する。このコンテキストを無視して操作すると、APIは容赦なく`Nothing`を返し、ランタイムエラーを引き起こす。

  • 面(Face)と領域(Loop/Region)の識別ミス

どの断面領域に対してハッチングを適用すべきか、一意に特定するロジックがないと、意図しない領域のパターンが書き換わる。

プロのエンジニアであれば、「アクティブなビューから安全にスケッチエンティティをトラバースし、ターゲットとなるハッチングオブジェクトを正確にキャプチャする」設計をとるべきだ。

2. 堅牢な設計アプローチ:ISketchHatchを捉えるアルゴリズム

断面ビューのハッチングを自動化するにあたり、以下のステップを踏んだステートレスかつ安全なコードを構築する。

1. アクティブドキュメントの型安全な取得:図面ドキュメント(`DrawingDoc`)であることを厳密に担保する。
2. 選択ビューの検証:現在選択されている、あるいは指定された名前を持つ「断面ビュー(Section View)」のポインタを確実につかむ。
3. ハッチングパターンの一括走査と置換:ビュー内のスケッチ群を走査し、`ISketchHatch`インターフェースを抽出。材質データ(外部DBや設定ファイル)に基づき、パターン名、スケール、角度を動的に流し込む。

3. プロダクションコード例(SolidWorks VBA)

実務の現場でそのまま組み込み、即座に稼働させることができるプロダクションクオリティのコードを提供する。エラーハンドリングとオブジェクトの解放(メモリ管理)を徹底した実装だ。

Option Explicit

‘ =================================================================================
‘ módulo: 断面ハッチング自動化モジュール
‘ 概要 : アクティブな図面の断面ビューに対し、指定されたハッチングパターンを適用する
‘ =================================================================================

Public Sub ApplyStandardHatching()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View

‘ 1. アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 図面ドキュメントかどうかの型チェック
If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

Set swDraw = swModel

‘ 2. アクティブビューの取得
Set swView = swDraw.ActiveDrawingView
If swView Is Nothing Then
MsgBox “対象となるビューが選択(アクティブ)されていません。”, vbExclamation, “警告”
Exit Sub
End If

‘ ビューが断面図(Section View)であるか判定(簡易的に名前やタイプで判断も可だが、今回は全エンティティ走査)
swModel.EditSketch

‘ 3. スケッチおよびハッチングの走査と適用
Dim bResult As Boolean
bResult = ProcessHatchesInView(swView, “ANSI31”, 1.0, 0#)

swModel.EditSketch ‘ スケッチモード終了
swModel.ForceRebuild3 True

If bResult Then
MsgBox “ハッチングパターンの適用が完了しました。”, vbInformation, “成功”
Else
MsgBox “対象となるハッチングが見つからないか、処理に失敗しました。”, vbExclamation, “情報”
End If
End Sub

Private Function ProcessHatchesInView(ByVal swViewObj As SldWorks.View, _
ByVal patternName As String, _
ByVal scale As Double, _
ByVal angle As Double) As Boolean
Dim swSketch As SldWorks.Sketch
Dim vHatches As Variant
Dim i As Long
Dim swHatch As SldWorks.SketchHatch
Dim successCount As Long

successCount = 0

‘ ビューに関連付けられたスケッチを取得
‘ 注: 断面ビューのハッチングはビュー自体のスケッチコンテキストに内包される
Set swSketch = swViewObj.GetSketch
If swSketch Is Nothing Then
ProcessHatchesInView = False
Exit Function
End If

‘ ハッチングエンティティの配列を取得
vHatches = swSketch.GetHatches7
If IsEmpty(vHatches) Then
ProcessHatchesInView = False
Exit Function
End If

‘ 各ハッチングに対してプロパティを動的に書き換え
For i = LBound(vHatches) To UBound(vHatches)
Set swHatch = vHatches(i)
If Not swHatch Is Nothing Then
‘ パターン設定の適用
‘ 引数: パターン名, スケール, 角度(ラジアン変換が必要な場合あり。API仕様に準拠)
swHatch.Pattern = patternName
swHatch.Scale = scale
swHatch.Angle = angle (3.14159265358979 / 180#) ‘ 度からラジアンへ変換

successCount = successCount + 1
End If
Next i

ProcessHatchesInView = (successCount > 0)
End Function

4. ファイル・外部データベース連携のベストプラクティス

実務の自動化において、ハードコーディングされたパターン名(例: `”ANSI31″`)をVBA内に直接記述するのは御法度だ。材質(SUS304、SS400、アルミ等)や社内規格(JIS、ISO)に応じてハッチングパターンを切り替えるには、外部データソースとの連携が不可欠となる。

外部連携の設計指針:

1. JSON / CSV または データベース(SQLite / Access)の活用
図面枠のタイトルブロックから「材質情報(Material)」をAPI経由で抽出し、それをキーにして外部の対応表(CSVや簡易DB)を引く仕組みを作る。
2. 設定ファイルのキャッシュ化
ループの都度ファイルI/Oを行うとパフォーマンスが致命的に低下するため、マクロ起動時にメモリ上のDictionaryオブジェクト(`Scripting.Dictionary`)へマスターデータを展開せよ。

‘ 【概念コード】材質名からハッチング設定を引くDictionaryの活用例
Dim materialDict As Object
Set materialDict = CreateObject(“Scripting.Dictionary”)

‘ 外部CSVやDBから読み込み登録(例)
materialDict.Add “SUS304”, Array(“ANSI31”, 1.0, 45#)
materialDict.Add “ALUMI”, Array(“ANSI37”, 0.8, 0#)

‘ 取得した材質に応じたパラメータを ProcessHatchesInView に渡す構造にする

5. チーフアーキテクトからの提言

SolidWorks VBAによる図面自動化は、単なる「手作業の置き換え」ではない。それは「設計意図のデータガバナンス確立」そのものである。

今回紹介した `ISketchHatch` を軸としたアプローチを習得すれば、バラバラだった図面の見た目を一瞬で社内標準に統一し、レビュー工数を極限まで削減することが可能になる。
APIの裏側にあるオブジェクト階層を常に意識し、エラーハンドリングとスケーラビリティを考慮した堅牢なコードベースを築き上げてほしい。君たちの開発プロジェクトの成功を期待する。

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