【入門編】【図面アノテーションの拡張】ISketchHatchとINoteを組み合わせた断面図のハッチング自動最適化 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の現場で泥臭くも美しいコードを書き続けている、君の先輩エンジニアだ。

「マクロの記録」ボタンを押して図面を作り、その後に手作業で断面ハッチングの角度やパターンの調整、そして注記(Note)の配置をチマチマ直す……そんな不毛な作業に、大切な就業時間を溶かしていないかい?

「すべての図面でハッチングの規格を統一したい」「特定の材質が指定されたら、自動で注記を連動させて整列させたい」――今回は、そんな現場の切実な要望をスマートに解決する【図面アノテーションの拡張:ISketchHatchとINoteを組み合わせた断面図のハッチング自動最適化】を伝授しよう。

ここをクリアすれば、単なる「マクロの記録の貼り付け係」から、SolidWorks APIを自在に操る「自動化エンジニア」への階段を一気に登ることができる。心してついてきてほしい。

1. 为什么我们要用 API でハッチングと注記を操るのか?

SolidWorksの図面(Drawing)環境において、断面ビューのハッチング(ISketchHatch)と、文字情報である注記(INote)は、一見すると別々の独立したエンティティに見える。

しかし、図面の品質を担保する上では、これらは「表裏一体」だ。

  • ハッチング(ISketchHatch): 材質ごとの密度や角度(例:JIS指定の鉄ならピッチ〇、角度〇度)をプログラムで強制適用する。
  • 注記(INote): ハッチング領域の近傍に、材質名や熱処理条件などの付記を正確な座標で美しく配置する。

手作業でこれをやると、ビューが移動するたびに注記がズレ、縮尺が変わるとハッチングのスケールが破綻する。APIを使えば、「どの断面ビューがアクティブか」を検出し、数学的な位置関係を計算した上で、ハッチングと注記をミリ単位で同期させることが可能なんだ。

2. 開発の前提:SolidWorks APIのオブジェクト階層を理解する

コードを書く前に、SolidWorks VBAの「地図」を確認しておこう。
私たちが普段触る `SldWorks.Application` から、図面の中へ潜っていくルートはこうだ。

SldWorks (SldWorks.Application)
┗ ModelDoc2 (アクティブな図面ドキュメント)
┗ DrawingDoc (図面特有の操作)
┗ View (アクティブな断面ビュー)
┗ Sketch (ビューに紐付くスケッチ)
┣ ISketchHatch (ハッチングパターン)
┗ INote (注記テキスト)

この階層構造を意識しながら、次の実用コードを見ていこう。

3. 実装コード:断面ハッチング最適化&注記自動整列マクロ

以下のコードは、現在アクティブな図面シート上の選択された断面ビューに対して、ハッチングのパターンを変更し、その直下に標準化された注記を自動生成・整列させる実践的なサンプルだ。

開発環境(VBE)の標準モジュールにそのまま貼り付けて、動かしてみてほしい。

Option Explicit

‘ ==============================================================================
‘ テーマ: 断面図のハッチング自動最適化と注記の連動配置
‘ 概要: 選択されたビューからスケッチハッチングを取得してパターンを変更し、
‘ その近傍に品質保証用の注記を自動配置する。
‘ ==============================================================================
Sub OptimizeSectionHatchAndNote()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swSk As SldWorks.Sketch
Dim vHatches As Variant
Dim swHatch As SldWorks.SketchHatch
Dim swAnnotation As SldWorks.Annotation
Dim swNote As SldWorks.Note

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

‘ 図面ドキュメントであるかチェック
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

‘ 2. ユーザーに断面ビューを選択させる(またはアクティブビューを取得)
Set swView = swDraw.ActiveDrawingView
If swView Is Nothing Then
MsgBox “対象となるビューが選択(またはアクティブ)されていません。” & vbCrLf & _
“ビューの枠線を選択してから実行してください。”, vbExclamation
Exit Sub
End If

‘ 3. ビュー内のスケッチエンティティ(ハッチング)にアクセス
‘ 断面図には必ず固有のスケッチとハッチングが存在する
Set swSk = swView.GetSketch
If swSk Is Nothing Then
MsgBox “選択されたビューには有効なスケッチが見つかりません。”, vbWarning
Exit Sub
End If

‘ ハッチングの取得
vHatches = swSk.GetHatch2

If IsEmpty(vHatches) Then
MsgBox “このビューにはハッチング(断面)が存在しません。”, vbInformation
Exit Sub
End If

‘ 4. ハッチングのパラメータを最適化する(例:ANSI31 / JIS材質風への強制変更)
Dim i As Long
For i = LBound(vHatches) <= UBound(vHatches) To UBound(vHatches) Set swHatch = vHatches(i) ' パターン設定(例: "ANSI31(Iron)" やカスタムパターンの指定) ' ※環境にあわせたパターン名を指定してください swHatch.Pattern = "ANSI31" swHatch.Scale2 = 1.5 ' スケール(拡大率)の最適化 swHatch.Angle = 45# ' 角度の強制 Next i ' 5. ハッチング領域の近傍に注記(INote)を自動生成する ' ビューの中心座標(ViewX, ViewY)を基準にオフセット計算する Dim dViewX As Double Dim dViewY As Double dViewX = swView.Position(0) dViewY = swView.Position(1) ' 注記作成: CreateText2(Text, X, Y, Z, Height, Angle, Options) ' 単位はメートル法(米国のSolidWorks内部単位系に準拠するため、通常はメートル指定) Dim noteText As String noteText = "NOTE: MATERIAL - S45C (HRC 20-25)" & vbCrLf & "UNLESS OTHERWISE SPECIFIED: 1.5x45°" Set swNote = swModel.InsertNote(noteText) If Not swNote Is Nothing Then Set swAnnotation = swNote.GetAnnotation ' 注記をビューの少し下方に美しく配置する(座標オフセット) ' ※実務ではビューのバウンディングボックス(BBox)から計算するとさらに綺麗に配置できます Dim bSuccess As Boolean bSuccess = swAnnotation.SetPosition(dViewX, dViewY - 0.05, 0#) If bSuccess Then Debug.Print "注記の配置に成功しました。" End If End If ' 6. 画面の再描画を命じる(これ重要!) swModel.GraphicsRedraw2 MsgBox "断面ハッチングの最適化と注記の連動配置が完了しました!", vbInformation, "SolidWorks VBA 完了" End Sub --- 現場でよくあるミスと、それを回避するための知見をいくつか共有しておこう。

陥りがちな罠 1:内部単位(MKS系)の罠

SolidWorksのAPIが受け付ける座標や長さの引数は、すべて「メートル(m)」だ。コード内で `0.05` と書いているのは、図面上の `50mm` を意味している。もし `50` と書いてしまうと、図面の枠からはるか彼方の宇宙空間に注記が吹っ飛んでいってしまうので注意してくれ。

陥りがちな罠 2:選択状態(Selection)の曖昧さ

「どのビューに対して処理したいのか」がプログラム側で確定していない状態で `ActiveDrawingView` を叩くと、意図しない別のシートのビューを掴んでしまうことがある。
マクロ実行前に、ユーザーに「ビューを選択してください」とメッセージを出すか、ビュー名(`swView.GetName2`)で厳密に特定するガード節を入れるのが、プロのエンジニアの作法だ。

4. さらに高みを目指す君へ(チーフアーキテクトからの助言)

今回のコードをベースに、さらに実務レベルへ引き上げるためのヒントを授けよう。

1. 材質プロパティとの連携:
アセンブリや部品のファイルプロパティ(`CustomPropertyManager`)から「材質(Material)」の文字列をAPI経由で読み取り、その文字列に応じて `swHatch.Pattern` の値を動的に分岐させる(例:アルミなら `ANSI37`、樹脂なら別パターンなど)。
2. バウンディングボックスの活用:
ビューのサイズ(外形寸法)を `swView.GetBox` で取得し、そのビューの最下端から常に一定のオフセット(例: 10mm下)に注記を自動追従させれば、ビューの大きさが変わってもレイアウトが絶対に崩れない。

ここをクリアすれば、君が作るマクロは単なる「お助けツール」を超え、設計部署全体の図面品質を均一化する「強力なインフラ」に生まれ変わる。

分からないことがあれば、いつでも質問してくれ。一緒にSolidWorks自動化の極みに到達しよう!

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