形状セット内の要素をIGESファイルで出力|CATIAマクロの作成方法
今回の記事は「お問い合わせ」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
題名: 個別にigsに変換する方法
メッセージ内容 (一部抜粋):
下記のような形状セット下の要素を1個1個igsに変換したいです。
※要素は非パラです。形状セット
┣曲線1
┣曲線2
┣サーフェス1
┗サーフェス2「曲線1.igs」「曲線2.igs」「サーフェス1.igs」
「サーフェス2.igs」のように、
igs形式でファイル名も要素名(プロパティ名)にすることが可能でしょうか?
※IGES(拡張子.igs):様々なCADソフトで利用可能な中間ファイル
以前、Product内のCATPartをIGESファイルで出力するマクロを紹介しましたが、今回はCATPart内の要素を一括でIGES出力するマクロです。
出力方法はCATProductの時と同じなので上記リンクページも合わせて参照ください。
処理内容としては手動操作と同じように「出力する要素のみ表示状態」→「IGES出力」です。
これをループさせることで形状セット内の要素をすべてIGES出力することができます。
マクロの機能
今回作成したマクロはCATPartをIGESファイル(拡張子.igs)として出力するマクロです。
具体的な機能は以下のとおりです。
・仕様ツリー第1階層の1番上の形状セット内の要素を各要素ごとにIGES出力
・ファイル名は「要素名.igs」もしくは「iges_elmX.igs」(Xは連番)
・マクロ実行後にデスクトップに新規作成される「IGES書き出し 日時」フォルダに出力
・出力後はフォルダを開く
※注意点
・要素名が非ASCIIの場合、バージョンによっては要素名での出力不可 (コード解説参照)
・「IGES書き出し 日時」と同名のフォルダがデスクトップにある場合はマクロ中断
(日時には現在の「年/月/日/時/分/秒」が入力されるため、同名フォルダは存在しないはず )
以下で紹介するサンプルコードは前提条件を満たしていないと実行がうまくいかない場合があります。
というのもCATPartのIGES出力は表示されているものすべてが出力されます。
要は今回VBAで操作する形状セット以外の要素があり表示状態になっていると、それらもまとめてIGES出力の対象となっていしまうということです。
マクロ実行直後に全要素を非表示にしてもいいですが、そうすると再度表示するのが大変です。
少し面倒ですが、全要素の表示状態をすべて取得しておき、処理の最後にその状態を再現するコードを付け加えれば問題は解決します。
ここはマクロをどのようなデータに使用するかで変わってくるので、コード解説を参考にうまいこと自身の環境に書き直してみて下さい。
サンプルコード
マクロのコードは以下のとおりです。
※コピペで実行可能ですが、保存場所のパスだけは自身の環境に合わせて書き直す必要があります。
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
Option Explicit Sub CATMain() 'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part Dim sel: Set sel = doc.Selection Dim vps As VisPropertySet: Set vps = sel.VisProperties sel.Clear '書き出し用フォルダ作成 Dim dir As String dir = "C:\Users\user\Desktop" Dim fn As String fn = "igs書き出し " & Year(Date) & Month(Date) & Day(Date) & _ Hour(Time) & Minute(Time) & Second(Time) Dim path As String path = dir & "\" & fn '"フォルダ保存場所パス+フォルダ名 Dim fs 'As FileSystem Set fs = CATIA.FileSystem Dim chk As Boolean chk = fs.FolderExists(path) If chk = True Then MsgBox "予期せぬエラーが発生しました。" & vbLf & _ "再度マクロを実行し直してください。" Exit Sub End If Dim f As Folder Set f = fs.CreateFolder(path) '対象形状セット取得(仕様ツリー) Dim hb As HybridBody Set hb = pt.HybridBodies.Item(1) '対象形状セット内の形状をすべて非表示 Dim hs As HybridShape For Each hs In hb.HybridShapes sel.Add hs Next hs vps.SetShow catVisPropertyNoShowAttr 'IGES出力 Dim cnt As Integer: cnt = 1 For Each hs In hb.HybridShapes sel.Clear sel.Add hs vps.SetShow catVisPropertyShowAttr Dim ext_name As String '日本語非対応の場合 ext_name = path & "\" & "iges_elm" & cnt & ".igs" ' '日本語対応の場合 ' ext_name = path & "\" & hs.Name & ".igs" 'iges出力 ※ファイル名が非ASCIIだと出力不可 Call doc.ExportData(ext_name, "igs") sel.Clear sel.Add hs vps.SetShow catVisPropertyNoShowAttr cnt = cnt + 1 Next hs '対象形状セット内の形状をすべて再表示 For Each hs In hb.HybridShapes sel.Add hs Next hs vps.SetShow catVisPropertyShowAttr '出力フォルダ表示 Shell "C:\Windows\Explorer.exe " & path, vbNormalFocus End Sub |
コード解説
アクティブドキュメント等定義
1 2 3 4 5 6 7 8 9 10 11 12 |
'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part Dim sel: Set sel = doc.Selection Dim vps As VisPropertySet: Set vps = sel.VisProperties sel.Clear |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
条件分岐の先、つまりはアクティブドキュメントがCATPartの場合は変数「doc」にアクティブドキュメントを代入します。アクティブドキュメントが定義出来たら以降で使うオブジェクトもまとめて定義しておきます。
Partオブジェクト :下記オブジェクト取得用/形状セット取得用
Selectionオブジェクト :要素選択用/VispropertySet取得用
VisPropertySetオブジェクト :オブジェクトの表示状態切り替え用
書き出し用のフォルダを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'書き出し用フォルダ作成 Dim dir As String dir = "C:\Users\user\Desktop" Dim fn As String fn = "igs書き出し " & Year(Date) & Month(Date) & Day(Date) & _ Hour(Time) & Minute(Time) & Second(Time) Dim path As String path = dir & "\" & fn '"フォルダ保存場所パス+フォルダ名 Dim fs 'As FileSystem Set fs = CATIA.FileSystem Dim chk As Boolean chk = fs.FolderExists(path) If chk = True Then MsgBox "予期せぬエラーが発生しました。" & vbLf & _ "再度マクロを実行し直してください。" Exit Sub End If Dim f As Folder Set f = fs.CreateFolder(path) |
IGESファイルを出力するためのフォルダを作成します。
まずは保存場所のパスを取得します。
上記のコードでは保存場所を「dir= “C:\Users\user\Desktop”」
つまりはデスクトップとしています。
※ここのパスは保存場所(フォルダを出力する場所)のパスに書き換えて下さい。
次に、作成するフォルダの名称を指定します。
上記コードでは「IGES書き出し 日時」というフォルダ名で作成しています。
(日時には現状の日時の年から秒までを取得し、その数字の羅列を入力しています。
たとえば2021年1月2日3時4分56秒の場合、「20210102030456」と入力されます。)
このようにフォルダ名を時間によって変更させることで
デスクトップ上に同じフォルダが存在しないようにしています。
ただ必ずしも存在しないとは言えないので
万が一同じフォルダが存在した場合にはマクロを終了するようにしています。
フォルダの存在を確認するには「FileSystemオブジェクト」の「FolderExistsメソッド」を使います。
最後に、これまでに決めた「保存場所」と「フォルダ名」を組み合わせてフォルダを新規作成します。
フォルダの作成は「FileSystemオブジェクト」の「CreateFolderメソッド」を使って行います。
「FolderExistsメソッド」「CreateFolderメソッド」の使い方は下記ページを参照ください。
対象形状セット取得(仕様ツリー)
1 2 3 |
'対象形状セット取得(仕様ツリー) Dim hb As HybridBody Set hb = pt.HybridBodies.Item(1) |
つぎにIGES出力する対象の形状セットを取得します。
ここではツリー第1階層にある1つ目の形状セットとしています。
ここの形状セットの取得方法を変えることで任意の形状セットをIGES出力することができます。
たとえばSelectElement2メソッドを使ったユーザー選択、ただこの場合は「マクロの機能」の項でもいったとおり表示状態によってうまくいかないので、何かしらの表示状態の対応コードを追記する必要があるので注意しましょう。
対象形状セット内の形状をすべて非表示
1 2 3 4 5 6 |
'対象形状セット内の形状をすべて非表示 Dim hs As HybridShape For Each hs In hb.HybridShapes sel.Add hs Next hs vps.SetShow catVisPropertyNoShowAttr |
つぎに取得した形状セット内の形状をすべて非表示にします。
表示状態の切り替えは下記の流れで行います。
①Selectionオブジェクトの「Addメソッド」でオブジェクトを選択状態にする
②VisPropertySetオブジェクトの「SetShow」メソッドで選択ブジェクトの表示を切り替える
上記コードでは形状セット内の形状ループ(hb.HybridShapes)でセット内の全オブジェクトを選択し、それらをまとめて非表示(catVisPropertyNoShowAttr)にするという処理をしています。
あとは同様にオブジェクトの表示/非表示の切り替えで「1つずつ表示状態にしてIGES出力する」というループを行うだけです。
IGES出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'IGES出力 Dim cnt As Integer: cnt = 1 For Each hs In hb.HybridShapes sel.Clear sel.Add hs vps.SetShow catVisPropertyShowAttr Dim ext_name As String '日本語非対応の場合 ext_name = path & "\" & "iges_elm" & cnt & ".igs" ' '日本語対応の場合 ' ext_name = path & "\" & hs.Name & ".igs" 'iges出力 ※ファイル名が非ASCIIだと出力不可 Call doc.ExportData(ext_name, "igs") sel.Clear sel.Add hs vps.SetShow catVisPropertyNoShowAttr cnt = cnt + 1 Next hs |
今回のマクロのメインの部分の処理「IGES出力」をしていきます。
前項でもいったとおりで「1つずつ表示状態にしてIGES出力する」という処理を行っています。
前項の内容をみればどこで表示/非表示を切り変えているかはすぐわかると思います。
IGES出力で注意しないといけないのは出力する際のファイル名です。
IGESはASCII(アスキー)という文字コードにより構成されるファイルです。
そのため非ASCIIのファイル名を使用すると下記のようなエラーが発生する場合があります。
要はIGESはANSI規格(アメリカ規格協会)なので日本語に対応していないためのエラーです。
ただIGESのバージョンによっては日本語も対応しているので、環境に合わせてサンプルコードの日本語対応/非対応のどちらかのみを使用してください。
上記内容を理解したうえで作成していたフォルダのパスと組み合わせてファイル名を作成します。
作成したファイルのフルパスは「ext_name」に格納します。
日本語非対応バージョンの場合は「iges_elmX」(Xは連番)という名前で出力して、上記エラーが発生しないようにしています。
あとはこのパスを使ってIGESとして書き出すだけです。
任意のドキュメントを別ファイルとして書き出すには
「Documentオブジェクト」の「ExportDataメソッド」を使います。
Documentオブジェクト.ExportData パス,“拡張子“
この構文によりDocumentオブジェクトを指定した拡張子で書き出すことができます。
パスには出力先のパス(ファイル名も含む)を入力、
拡張子には出力するファイルの拡張子を入力します。
今回はIGESファイルなので拡張子は「igs」で、パスは先ほど作成したフルパスを入力すればOKです。
出力フォルダ表示
1 2 |
'出力フォルダ表示 Shell "C:\Windows\Explorer.exe " & path, vbNormalFocus |
最後にデスクトップに作成したフォルダを「Shell関数」を使って開きます。
Shell関数についてはExcelマクロでもよく使われ、多くの解説ページがあるためここでは割愛します。
まとめ
今回は任意のCATPart内の要素をIGESファイルとして出力するマクロについての内容でした。
コードとしては少し長いですが、このマクロの核となる部分は「ExportDataメソッド」だけです。
あとはSelectionオブジェクトとVisPropertySetオブジェクトを使ってうまいこと表示状態さえ切り替えられれば、もっと汎用的なマクロにすることもできるのでぜひ挑戦してみて下さい。