CATDrawingでシート背景にある要素をすべて削除するマクロ|CATIAマクロの作成方法
今回は「マクロ案」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: ドラフティング
マクロ案:
シート背景にはいっているものの一括選択をしたいのですが、どのようにしたらよいでしょうか?
(シート背景内の要素を全削除したい)
マクロとしては「CATDrawing内の指定した図枠(2D構成要素)を一括で削除するマクロ」とほとんど同じで、SelectionオブジェクトのSearchメソッドを使い、削除したい要素を選択状態にしてDeleteメソッドで消すといった処理になっています。
ただ、シート内のビューやそのビューにある要素は選択せずに、シート背景にある要素だけを全選択の方法には少しコツがいります。これは普段CATIAを触っている時には気付きづらいSheetの特性に関係しているのでそちらも合わせて解説していきます。
マクロの機能
今回作成したのはCATDrawingでシート背景にある要素をすべて削除するマクロです。
ここでいうシート背景にある要素というのはビューは対象外ということです。
もう少しわかりやすくいうと、アクティブシート内のビューをすべて非表示にしたときに、シート上に残っている要素のことを“アクティブシート内の要素”と呼んでいます。
このマクロの機能をまとめると下記の通りです。
(※アクティブシート内に作成しているビュー、そのビュー内の要素は全て対象外)
・直線や円といった形状をはじめテキストや寸法などすべての要素に対応
サンプルコード
マクロのコードは下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Option Explicit Sub CATMain() 'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "CATDrawingに切り替えて実行してください。" Exit Sub End If Dim doc As DrawingDocument Set doc = CATIA.ActiveDocument 'アクティブシート定義 Dim sht As DrawingSheet Set sht = doc.Sheets.ActiveSheet 'アクティブシートの「Main View」定義 Dim vw As DrawingView Set vw = sht.Views.Item(1) '削除するオブジェクトを選択 Dim sel As Selection Set sel = doc.Selection sel.Clear sel.Add vw sel.Search ("タイプ=*,sel") '選択しているオブジェクトを削除 sel.Delete End Sub |
コード解説
アクティブドキュメント定義
1 2 3 4 5 6 7 8 9 |
'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "CATDrawingに切り替えて実行してください。" Exit Sub End If Dim doc As DrawingDocument Set doc = CATIA.ActiveDocument |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATDrawingでのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
条件分岐の先、つまりはアクティブドキュメントがCATDrawingの場合は変数「doc」にアクティブドキュメントを代入します。
アクティブシート定義/「Main View」定義
1 2 3 4 5 6 7 |
'アクティブシート定義 Dim sht As DrawingSheet Set sht = doc.Sheets.ActiveSheet 'アクティブシートの「Main View」定義 Dim vw As DrawingView Set vw = sht.Views.Item(1) |
つぎにアクティブシートとそのシートの「Main View」を定義します。
CATIAのシートにはツリー上には表示されていませんが、「Main View」と「Background View」という2つのビューがデフォルトで用意されています。
VBEのローカルウィンドウで確認するとわかる通りで、下画像のようにアクティブシート内のViewsプロパティのItem数を数えると実際のツリー上にあるシート数より2つ多いことがわかります。
Itemの中身の「Name」を確認すればわかりますがItem(1)が「”Main View”」でItem(2)が「”Background View”」、それ以降のItemが実際に作成したビューとなっています。
これはどのシートでも同じ構成になっています。
また、これらの2つのビューはCATIAの[検索]コマンドの結果のパスからも確認できます。
下画像の通り、パス内にも「Main View」と「Background View」の文字があることがわかります。
今回、マクロで削除したい要素は上画像のパスを見ればわかる通りで「Main View」内にしかないということがわかります。つまり、この「Main View」内にある要素をすべて削除すれば、”シート背景にある要素”のみを削除することができるという訳です。
削除するオブジェクトを選択
1 2 3 4 5 6 7 |
'削除するオブジェクトを選択 Dim sel As Selection Set sel = doc.Selection sel.Clear sel.Add vw sel.Search ("タイプ=*,sel") |
VBAでのオブジェクトの削除は基本下記の流れで行います。
ということでここでは①と②の「Selectionオブジェクトの定義」と「削除するオブジェクトを選択状態にする」を行っています。
前項のとおりで今回は「Main View」内の要素を全選択状態にします。
SearchメソッドはCATIAの 検索機能([Ctrl]+[F])と同じ考えで使用できるので、あるオブジェクトを選択した状態で実行することで、その選択状態のオブジェクト内にある要素だけを選択することができます。(検索範囲が「現行選択から」と同じ考え)
上記コードではまず「sel.Clear」で現在の選択状態を一旦すべて解除しています。
次に「sel.Add vw」で先に定義しておいた「Main View」だけを選択状態としています。
「Main View」は画面上には表示されていないため、これは手作業ではできない操作です。
最後に「sel.Search (“タイプ=*,sel”)」として、現行選択である「Main View」内にあるすべての要素を選択させています。これで削除する対象が全選択状態となりました。
※Selectionオブジェクトの「Clear」「Add」「Search」のメソッドについてはSelectionオブジェクトページで解説しているので合わせて参照下さい。
選択しているオブジェクトを削除
1 2 |
'選択しているオブジェクトを削除 sel.Delete |
前項で削除したいオブジェクトのみを選択状態にしているので、Deleteメソッドを使って現在選択状態のすべてのオブジェクトを削除します。
まとめ
今回はCATDrawingでシート背景にある要素をすべて削除するマクロについての内容でした。
今回重要なのは、CATDrawingのシートには「Main View」と「Background View」という2つの見えないビューが存在しているということです。
普段CATIAを使っている分にはあまり意識しませんが、CATIA VBAではオブジェクトの親子関係が非常に重要になります。
オブジェクトの親子の関係性もイメージしながらCATIAを使うことで、よりCATIAの”中身”が理解できるようになるので、ぜひ今後はそういった事も考えながら作業をしてみて下さい。