【入門編】【中級者向け】図面内の全寸法・注記に対して一括でフォント・矢印スタイルの統一を行うVBA – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私だ。

「マクロの記録」でコードを出力し、ボタン一つで動くことに感動したのも束の間、実際の業務ではこんな壁にぶ当たっていないだろうか?

  • 「社内製図規程(JIS規格の改定など)が変わったため、過去の膨大な図面の寸法フォントや矢印を一括で書き換えたい」
  • 「手作業で直すと何日かかるかわからない。でも、マクロの記録をしてもビュー内の細かい寸法までは記録されない……」

そう、SolidWorksの図面(Drawing)自動化において、「シート上のあらゆる寸法や注記(アノテーション)を漏れなく、安全にトラバース(走査)して一括制御する」という処理は、中級者へのステップアップにおいて必ず越えなければならない壁だ。

今回は、単なるリファレンスの引き写しではない、SolidWorks APIのオブジェクト構造の急所を突いた、実務で即座に使える「最強の一括スタイル統一マクロ」を授けよう。ここをクリアすれば、あなたの図面自動化スキルは間違いなく本物になる。

—

1. なぜ「マクロの記録」では寸法の一括変更ができないのか?

まず、敵(APIの構造)を知ろう。
「マクロの記録」を起動しながら手動で寸法のフォントを変えてみると、`Extension.Intersector` や `SelectByID2` といったコードが記録される。これらは「今画面でクリックした特定のオブジェクト」を操作するためのものだ。

しかし、図面によって寸法の数も、それが配置されているシート(Sheet)の数も、ビュー(View)の中にあるのかシート上に直接あるのかもバラバラである。
ここで必要になるのが、「ドキュメントのツリー構造を根元からしらみつぶしに辿る再帰的(または階層的な)トラバーサル処理」という概念だ。

SolidWorks図面の階層構造は、ざっくり言うとこうなっている。

DrawingDoc (図面ドキュメント)
┣ Sheet (シート1枚目)
┃ ┣ View (ベースビュー、投影ビュー…)
┃ ┃ ┣ DisplayDimension (寸法)
┃ ┃ ┗ Note (注記)
┃ ┗ Sheet独自の直接配置アノテーション
┗ Sheet (シート2枚目…)

この階層のどこに目的の「寸法(DisplayDimension)」や「注記(Note)」が潜んでいるか分からない。だからこそ、APIの網を正しく張って全走査する必要があるのだ。

—

2. 現場で即戦力となる一括スタイル統一マクロ

百聞は一見にしかずだ。以下のコードをSolidWorksのVBAエディタ([Alt] + [F11])に貼り付けてみてほしい。
このコードは、アクティブな図面内の全シート、全ビュー、そしてシート直下に存在するすべての寸法と注記を走査し、「フォント名」「フォントサイズ」「矢印スタイル」を強制的に統一するものだ。

Option Explicit

‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: 図面内の全寸法・注記のフォントサイズおよび矢印スタイルを一括で書き換える
‘ 対象: SolidWorks 202X (Drawing文書)
‘ ==============================================================================
Sub UniformDrawingStyles()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc

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 “このマクロは図面(Drawing)ドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

Set swDraw = swModel

‘ 処理の高速化と画面描画のロック(※超重要:これがないと画面描画で激重になる)
swModel.EditRebuild
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllAnnotations, False

Dim vSheetNames As Variant
Dim i As Long

‘ 図面内の全シート名を取得
vSheetNames = swDraw.GetSheetNames()

If IsEmpty(vSheetNames) Then Exit Sub

‘ 2. シートのループ
For i = LBound(vSheetNames) To UBound(vSheetNames)
‘ シートをアクティブにする
swDraw.ActivateSheet vSheetNames(i)
Dim swSheetObj As SldWorks.Sheet
Set swSheetObj = swDraw.GetCurrentSheet()

Debug.Print “— 処理中シート: ” & swSheetObj.GetName() & ” —”

‘ 3. 現在のシート上の「ビュー」をトラバース
ProcessViewsOnSheet swDraw

Next i

‘ 4. 変更を反映して画面を再描画
swModel.GraphicsRedraw2
MsgBox “すべての寸法・注記のスタイル統一が完了しました!”, vbInformation, “完了”

End Sub

‘ ——————————————————————————
‘ サブルーチン: シート上のビューを走査し、アノテーションを捕獲する
‘ ——————————————————————————
Private Sub ProcessViewsOnSheet(swDraw As SldWorks.DrawingDoc)
Dim swView As SldWorks.View
Set swView = swDraw.GetFirstView()

‘ ビューの階層を辿る (GetFirstView -> GetNextView)
Do While Not swView Is Nothing
‘ ビュー自体の名前(”DrawView1″ など、シート自体を表すルートビューはスキップするか注意が必要)
If swView.GetName2() <> “DrawingView” Then

‘ A. ビュー内の「寸法 (DisplayDimension)」を走査
ProcessDimensions swView

‘ B. ビュー内の「注記・GDTなどのアノテーション」を走査
ProcessAnnotations swView

End If

Set swView = swView.GetNextView()
Loop
End Sub

‘ ——————————————————————————
‘ 寸法(DisplayDimension)のスタイル書き換え処理
‘ ——————————————————————————
Private Sub ProcessDimensions(swView As SldWorks.View)
Dim swDispDim As SldWorks.DisplayDimension
Set swDispDim = swView.GetFirstDisplayDimension5()

Do While Not swDispDim Is Nothing
Dim swAnn As SldWorks.Annotation
Set swAnn = swDispDim.GetAnnotation()

If Not swAnn Is Nothing Then
‘ — ここでフォントやプロパティを設定 —
‘ 例: 寸法値のテキストフォーマットやフォント変更
‘ ※TextFormatオブジェクトを取得して書き換える
Dim swTextFormat As SldWorks.TextFormat
Set swTextFormat = swAnn.GetTextFormat(0) ‘ 0 = 主寸法テキスト

If Not swTextFormat Is Nothing Then
swTextFormat.Height = 0.0035 ‘ 文字高さ 3.5mm (単位はメートル法のため 0.0035)
swTextFormat.FaceName = “Meiryo UI” ‘ フォントをメイリオに統一
swAnn.SetTextFormat 0, False, swTextFormat
End If

‘ 矢印スタイルの変更例 (必要に応じて呼び出し)
‘ swDispDim.ArrowStyle1 = swArrowStyle_e.swArrowFilled
‘ swDispDim.ArrowStyle2 = swArrowStyle_e.swArrowFilled
End If

Set swDispDim = swDispDim.GetNextDisplayDimension4()
Loop
End Sub

‘ ——————————————————————————
‘ 注記(Note / Annotation)のスタイル書き換え処理
‘ ——————————————————————————
Private Sub ProcessAnnotations(swView As SldWorks.View)
Dim swAnn As SldWorks.Annotation
Set swAnn = swView.GetFirstAnnotation3()

Do While Not swAnn Is Nothing
‘ アノテーションの種類が「注記 (swAnnotationType_e.swNote)」の場合のみ処理
If swAnn.GetType() = swAnnotationType_e.swNote Then
Dim swTextFormat As SldWorks.TextFormat
Set swTextFormat = swAnn.GetTextFormat(0)

If Not swTextFormat Is Nothing Then
swTextFormat.Height = 0.004 ‘ 注記は少し大きめの4.0mm
swTextFormat.FaceName = “Meiryo UI”
swAnn.SetTextFormat 0, False, swTextFormat
End If
End If

Set swAnn = swAnn.GetNextAnnotation3()
Loop
End Sub

—

3. チーフアーキテクトが教える、実装の「急所」と落とし穴

このコードを実務で使うにあたり、プログラミング初学者や中級者が必ずハマる「3つの罠」について解説しておこう。ここを知っているかいないかで、コードの信頼性が文字通り100倍変わる。

急所その1:単位系は「メートル法(Internal Units)」であること

SolidWorksのAPI内部では、長さの単位はすべて「メートル(m)」で処理されている。
「文字高さを3.5mmにしたい」と思って `3.5` と書くと、文字の高さが 3.5メートル(巨大な文字) になり、SolidWorksがフリーズするかエラーを起こす。
コード内にある `0.0035` という値は、まさに 3.5mm = 0.0035m を意味している。この内部単位の罠にはくれぐれも注意してほしい。

急所その2:画面描画のロック(パフォーマンスの最適化)

図面の中に寸法や注記が何千個とある場合、オブジェクトを1つ書き換えるたびにSolidWorksが画面を再描画(レンダリング)しようとすると、マクロが完了するまでに数分かかるか、最悪の場合は落ちる。
コードの冒頭に入れている、

swModel.EditRebuild

や、ビューの非表示切り替え、そして処理が終わったあとの `swModel.GraphicsRedraw2` は、「裏側で一気に処理を終わらせて、最後に一瞬で画面を更新する」ためのプロの技だ。この作法は必ず守るようにしよう。

急所その3:ポインタの解放(GetFirst〜 と GetNext〜 のペア)

SolidWorks APIのトラバーサル(走査)の基本は、
1. `GetFirstXXXX()` で最初の要素を取得
2. `Do While Not obj Is Nothing` でループ
3. ループの最後に `GetNextXXXX()` で次の要素へポインタを進める
というイディオムの徹底だ。これをサボると、無限ループの沼にハマるか、メモリリークの原因になる。上記のコードの構造をそのままテンプレートとしてストックしておくと、今後どんな要素(部品、面、スケッチエンティティなど)を走査する時にも応用できる。

—

まとめ

今回は、図面内の全寸法・注記に対して一括でフォントやスタイルを統一する、高度なトラバーサル処理について解説した。

  • マクロの記録の限界を知り、APIの階層構造(Sheet -> View -> Dimension / Note)を把握する
  • 内部単位(メートル法)の罠に気をつける(3.5mmなら 0.0035)
  • 画面描画を制御してパフォーマンスを最大化する

ここをクリアしたあなたなら、もはや「マクロに踊らされる人」ではなく、「SolidWorksを意図通りに操る自動化エンジニア」の領域に足を踏み入れている。

日々の退屈な手作業から解放され、よりクリエイティブな設計業務に時間を注力してほしい。それでは、次の自動化の現場でまた会おう!

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