選択したボディー内の履歴をすべて表示するマクロ|CATIAマクロの作成方法
今回は「お問い合わせ」より頂いた内容です。
複数のボディを選択して、
ボディにぶら下がっているパッド等の履歴自体の非表示を表示に出 来るマクロ。
ボディにぶら下がっている履歴(パッド等)の表示非表示判定せずに、
選択したボディはすべて表示にさせるイメージです。
処理の内容はかなりシンプルなのでマクロ初心者の方でも理解しやすい内容となっています。
マクロの機能
今回作成したマクロは「選択したボディー内の履歴をすべて表示するマクロ」です。
具体的な機能は以下のとおりです。
・ボディーはマクロ実行前に選択しておく必要あり
・選択するボディーは1個以上であれば何個でも可
・ボディー以外のオブジェクトが選択されている場合はマクロを中断
サンプルコード
マクロのコードは以下のとおりです。
ボディーを選択した状態でコードを実行すると、選択したボディー内の履歴がすべて表示されます。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Sub CATMain() 'アクティブドキュメント確認 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartで実行してください" Exit Sub End If 'Selection定義 Dim sel As Selection Set sel = CATIA.ActiveDocument.Selection If sel.Count = 0 Then MsgBox "ボディーを1つ以上選択して下さい。" Exit Sub End If 'VisPropertySet定義 Dim vps As VisPropertySet Set vps = sel.VisProperties '選択されたボディーをCollectionに格納 Dim SELCollection As Collection Set SELCollection = New Collection Dim i As Integer For i = 1 To sel.Count SELCollection.Add sel.Item(i).Value If TypeName(SELCollection.Item(i)) <> "Body" Then MsgBox "ボディー以外のオブジェクトが選択されています" & vbLf & _ "ボディーのみを選択してください。" Exit Sub End If Next i sel.Clear CATIA.RefreshDisplay = False 'ボディー内のShapeをすべて表示 Dim j As Integer For i = 1 To SELCollection.Count For j = 1 To SELCollection.Item(i).Shapes.Count sel.Add SELCollection.Item(i).Shapes.Item(j) vps.SetShow catVisPropertyShowAttr sel.Clear Next j Next i CATIA.RefreshDisplay = True End Sub |
コード解説
アクティブドキュメント確認
1 2 3 4 5 |
'アクティブドキュメント確認 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartで実行してください" Exit Sub End If |
まず、はじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
SelectionとVisPropertySetの定義
1 2 3 4 5 6 7 8 9 10 11 12 |
'Selection定義 Dim sel As Selection Set sel = CATIA.ActiveDocument.Selection If sel.Count = 0 Then MsgBox "ボディーを1つ以上選択して下さい。" Exit Sub End If 'VisPropertySet定義 Dim vps As VisPropertySet Set vps = sel.VisProperties |
SelectionオブジェクトとVisPropertySetオブジェクトの定義を行います。
はじめにSelectionオブジェクトを定義します。
今回は事前にボディーが選択されていることが前提のマクロなので、ここで選択されているオブジェクトの数を調べ、0個の場合はマクロを終了するようにしています。
マクロ実行後にユーザーにボディーを選択させたい場合は、Selectionオブジェクトの「SelectElement2メソッド」もしくは「SelectElement3メソッド」を使うことで、ユーザー選択のフェーズが設けられます。
つぎにVisPropertySetオブジェクトの定義をします。
VisPropertySetオブジェクトはオブジェクトの色や透明度などのグラフィックプロパティを取り扱うためのオブジェクトです。今回は選択したオブジェクトを”表示化”するために利用します。
選択されたボディーをCollectionに格納
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'選択されたボディーをCollectionに格納 Dim SELCollection As Collection Set SELCollection = New Collection Dim i As Integer For i = 1 To sel.Count SELCollection.Add sel.Item(i).Value If TypeName(SELCollection.Item(i)) <> "Body" Then MsgBox "ボディー以外のオブジェクトが選択されています" & vbLf & _ "ボディーのみを選択してください。" Exit Sub End If Next i sel.Clear |
選択されたボディーを1つのCollectionにまとめて格納します。
(Collectionに格納する理由は「選択しているオブジェクトを一時保管する方法」を参照下さい)
このときTypeName関数を使って、選択されているオブジェクトに”Body”以外があった場合にはマクロを中断するようにしています。(今回は中断させていますが、TypeNameの結果が”Body”だった場合のみCollectionに入れるという処理にすれば、Body以外のオブジェクトを選択されていたとしてもエラー無く実行することができます)
ボディー内のShapeをすべて表示
1 2 3 4 5 6 7 8 9 10 11 |
'ボディー内のShapeをすべて表示 Dim j As Integer For i = 1 To SELCollection.Count For j = 1 To SELCollection.Item(i).Shapes.Count sel.Add SELCollection.Item(i).Shapes.Item(j) vps.SetShow catVisPropertyShowAttr sel.Clear Next j Next i |
最後にCollectionに格納されているボディーの履歴をすべて表示させます。
ボディー内の履歴はVBAでは「Shapeオブジェクト」にまとまっていします。(Sketchは除く)
つまりボディー内の「Shapesオブジェクト」の数だけループを回し、「Shapeオブジェクト」を1つずつ「選択→表示」としていけばすべての履歴(Shape)を表示化することができます。
まとめ
今回は「選択したボディー内の履歴をすべて表示するマクロ」についての内容でした。
処理自体はかなり単純で、重要なのは「空のシートをどのようにして判定するか」の部分だけです。
今回のマクロではオブジェクトの数で空のシートを判定しましたが、その他の方法もいくつかあると思うのでサンプルコードはあくまでも参考程度にご利用下さい。