【入門編】【中級者向け】図面シート上に散らばった複数の「等角投影図(Iso View)」の縮尺と配置位置を一括統制 – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

混沌とした図面を、一瞬で「設計者の意志」が宿るレイアウトへ。

〜等角投影図(Iso View)の一括統制術〜

こんにちは。図面作成の自動化という、果てなき、しかし最高にエキサイティングな旅へようこそ。

「マクロの記録」を使って、ようやく一つのビューを動かすことに成功した。そんな喜びを感じているあなた。素晴らしい一歩です。しかし、実際の設計現場では、そんな「一回限りの操作」では太刀打ちできない壁が立ちはだかります。

アセンブリ図面を作成したとき、バラバラの縮尺で、あちこちに配置された等角投影図(アイソメ図)。それらを一つずつマウスでドラッグし、プロパティを開いて縮尺を打ち直す……。そんな作業に、あなたの貴重なエンジニアとしての時間は使えません。

今日は、「図面内の特定のビューをプログラムで探し出し、その性質(縮尺や位置)を強制的に統制する」という、中級者への登竜門となる技術を伝授しましょう。ここをクリアすれば、あなたは「操作を記録する人」から「システムを構築する人」へと進化できます。

1. 「マクロの記録」の限界と、APIの真髄

まず、大切なマインドセットの話をさせてください。

「マクロの記録」は、いわば「録画ビデオ」です。あなたがクリックした座標、選んだボタンの動作をそのまま記録します。しかし、ビデオは「次に何が起きるか」を予測して動くことはできません。

もし、図面の中に新しいアイソメ図が追加されたら? あるいは、既存のビューのサイズが変わってしまったら? 録画されたマクロは、無力です。

プロフェッショナルなVBAエンジニアは、ビデオではなく「地図(オブジェクトモデル)」を使います。
SolidWorksのAPIは、図面を以下のような階層構造(オブジェクトのツリー)として捉えています。

1. SldWorks (Application) :SolidWorksそのもの
2. DrawingDoc (Document) :開いている図面ファイル
3. Sheet (Sheet) :図面の中の「シート」
4. View (View) :シートの上に配置された「ビュー」

私たちがやるべきことは、「図面の中を探索し、『等角投影図』という属性を持つViewオブジェクトを見つけ出し、そのプロパティを書き換える」という、論理的なプロセスなのです。

2. 実践:等角投影図を狙い撃ちするコード

では、魂を込めて書いたコードを見てみましょう。このコードは、現在開いている図面のすべてのシートを巡回し、等角投影図を見つけたら、指定した縮尺と位置に整列させます。

Option Explicit

' ======================================================================================
' テーマ: 図面内の全ての等角投影図(Isometric View)を、指定の縮尺と位置に一括制御する
' ターゲット: 中級者向け(オブジェクトの走査と型判定の習得)
' ======================================================================================

Sub Main()
    ' --- 1. 変数宣言(型を明示することは、プロの作法です) ---
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    
    ' 制御用の変数
    Dim vSheetNames As Variant
    Dim i As Integer
    Dim targetScale As Double
    Dim targetPosX As Double
    Dim targetPosY As Double

    ' --- 2. 設定値(ここを書き換えるだけで、レイアウトが変わります) ---
    targetScale = 0.5      ' 縮尺を 1:2 に設定
    targetPosX = 0.1       ' 配置X座標 (単位はメートル! 100mm = 0.1m)
    targetPosY = 0.1       ' 配置Y座標 (単位はメートル! 100mm = 0.1m)

    ' --- 3. SolidWorksへの接続とドキュメントの取得 ---
    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 "このマクロは図面ファイル専用です。", vbCritical
        Exit Sub
    End If

    Set swDraw = swModel
    
    ' --- 4. 全シートの巡回プロセス ---
    ' 全てのシート名を取得
    vSheetNames = swDraw.GetSheetNames

    For i = 0 To UBound(vSheetNames)
        ' シートをアクティブにする
        swDraw.ActivateSheet vSheetNames(i)
        Set swSheet = swDraw.GetCurrentSheet
        
        ' --- 5. ビューの走査プロセス ---
        ' GetFirstViewは「シートそのもの」を返すというAPIのクセに注意!
        Set swView = swDraw.GetFirstView
        
        ' シートそのもの(最初のView)をスキップして、実際のビューへ
        Set swView = swView.GetNextView
        
        Do While Not swView Is Nothing
            ' 【ここが核心】ビューのタイプを確認する
            ' swIsometric は等角投影図を指す定数です
            If swView.Type = swViewIsometric Then
                
                ' --- 6. プロパティの書き換え(ここが自動化の心臓部) ---
                
                ' 縮尺の設定
                swView.Scale = targetScale
                
                ' 配置位置の設定(座標系はシートの原点からの距離)
                ' Positionは (X, Y) の配列のような扱いではなく、
                ' 内部的には座標としてセットします。
                swView.Position = Array(targetPosX, targetPosY)
                
                ' ログ出力(デバッグ用)
                Debug.Print "シート [" & vSheetNames(i) & "] 内のアイソメ図を制御しました。"
            End If
            
            ' 次のビューへ移動
            Set swView = swView.GetNextView
        Loop
    Next i

    ' --- 7. 仕上げ ---
    ' 変更を画面に反映させる(これを行わないと、見た目が更新されないことがあります)
    swModel.ForceRebuild3 True
    
    MsgBox "全ての等角投影図のレイアウト制御が完了しました!", vbInformation
End Sub

3. 伝説のアーキテクトが教える「陥りやすい罠」

このコードを動かすとき、あるいは自分でカスタマイズするとき、初心者が必ずと言っていいほど踏んでしまう「地雷」が3つあります。これを知っているかどうかで、あなたのデバッグ時間は劇的に変わります。

① 単位の罠:SolidWorksは「メートル」で生きている

これが最大の落とし穴です。
あなたが「100mmの位置に置きたい」と思って `swView.Position = 100` と書くと、SolidWorksは「100メートル」の位置にビューを飛ばしてしまいます。図面の遥か彼方へ消えたビューを探して、画面を何度もズームしてはいけません。
「APIの世界では、常にメートル(m)を使う」。これを呪文のように唱えてください。

② `GetFirstView` の正体:シートは「最初のビュー」である

SolidWorksのAPIの設計は少し独特です。`swDraw.GetFirstView` を呼び出したとき、返ってくるのは「図面上の最初のビュー」ではなく、実は「シートそのもの」なのです。
そのため、実際のビューを操作するには、必ず一度 `.GetNextView` を呼び出して、シートという「殻」を脱ぎ捨てる必要があります。これを忘れると、ループが空振りしたり、意図しないエラーを招いたりします。

③ パフォーマンスの罠:`ForceRebuild` のタイミング

ループの中で、ビューを動かすたびに `swModel.ForceRebuild3`(再構築)を呼び出さないでください。
再構築は非常に重い処理です。100個のビューがあるときに毎回再構築すると、マクロが終わる頃にはコーヒーが冷めてしまいます。「すべての操作が終わった最後に、一度だけ再構築する」。これが、爆速マクロを作る鉄則です。

4. 次のステップへ

おめでとうございます。あなたは今、「特定の条件(等角投影図)に合致するオブジェクトを、階層を辿って探し出し、一括で制御する」という、高度なプログラミング技術を手に入れました。

このコードをベースに、以下のような改造に挑戦してみてください。

  • 「特定の名前のビューだけを動かす」(`swView.Name` を判定に使う)
  • 「アイソメ図の向き(表示角度)も一括で変える」
  • 「縮尺を、ビューのサイズに合わせて自動計算する」

一歩ずつ、しかし確実に。
APIという強力な武器を使いこなせば、あなたの設計業務は「作業」から「創造」へと変わるはずです。

また次の講義でお会いしましょう。Happy Coding!

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