Product内のCATPartをIGESファイルで出力|CATIAマクロの作成方法
今回の記事はマクロ案募集でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: アッセンブリーデザイン
マクロ案: Product内のある部品を選択し、 その選択した部品をigesで保存する。
ファイル名は選択した部品のパーツ番号とする。
※IGES(拡張子.igs):様々なCADソフトで利用可能な中間ファイル
マクロの機能
今回作成したマクロはCATPartをIGESファイル(拡張子.igs)として出力するマクロです。
具体的な機能は以下のとおりです。
・CATPartを選択した場合はそのCATPartのみをIGESファイルとして出力
・ファイル名は「各CATPartのパーツ番号.igs」
・マクロ実行後にデスクトップに新規作成される「IGES書き出し 日時」フォルダに出力
・出力後はフォルダを開く
※注意点
・設計モードになっているCATPartのみ対応
・「IGES書き出し 日時」と同名のフォルダがデスクトップにある場合はマクロ中断
(日時には現在の「年/月/日/時/分/秒」が入力されるため、同名フォルダは存在しないはず )
上記の注意点にも書かれているとおり設計モードのCATPartのみ出力することができます。
そのため構成部品数が多いProductの場合は特に、出力漏れがないか注意が必要です。
たとえば100個の部品で構成されているうちの1部品だけが表示モードの場合、特にエラーが発生することもなく99個の部品だけが出力され、その1部品は出力されません。
出力漏れのチェックとしては「選択Product以下のすべてのCATPartが設計モードが表示モードを取得して、表示モードのCATPartの数を出力後にメッセージボックスで表示する」などの処理を追加すればできると思います。
サンプルコード
マクロのコードは以下のとおりです。
マクロ実行後に選択したProduct以下にあるCATPartをすべてIGESファイルとして出力します。
実行後にマクロの操作をキャンセルしたい場合は[Esc]キーを押下してください。
※コピペで実行可能ですが、保存場所のパスだけは自身の環境に合わせて書き直す必要あり。
下記コード45行目の"SavePath"の中身を自身の環境に合わせて書き換えないと、
66行目の「Set CreateFold = FileSys.CreateFolder(FoldPath)」でエラーが発生するので注意。
Option Explicit
Sub CATMain()
Dim ProDOC As ProductDocument
If TypeName(CATIA.ActiveDocument) <> "ProductDocument" Then
MsgBox "このマクロはProductDocument専用です。" & vbLf & _
"アセンブリーワークベンチに切り替えて実行してください。"
Exit Sub
End If
Set ProDOC = CATIA.ActiveDocument
'*********************************************
' Product選択
'*********************************************
Dim SEL
Set SEL = ProDOC.Selection
SEL.Clear
Dim InputType(0)
InputType(0) = "Product"
Dim msg As String
msg = "Productを選択してください。"
Dim Status As String
Status = SEL.SelectElement2(InputType, msg, False)
If ((Status = "Cancel") Or (Status = "Undo")) Then
Exit Sub
End If
SEL.Search ("パート・デザイン.パーツ,sel")
If SEL.Count = 0 Then
MsgBox "選択したProduct内にPartは存在しません。"
Exit Sub
End If
'*********************************************
' 書き出し用フォルダ作成
'*********************************************
Dim SavePath As String
SavePath = "C:\Users\ユーザー名\Desktop" '保存場所のパスを入力 ※必ず自分の環境のものに書き換えて下さい
Dim FoldName As String
FoldName = "IGES書き出し " & Year(Date) & Month(Date) & Day(Date) & _
Hour(Time) & Minute(Time) & Second(Time) '作成するフォルダ名を指定
Dim FoldPath As String
FoldPath = SavePath & "\" & FoldName '新規フォルダのパス"
Dim FileSys 'As FileSystem
Set FileSys = CATIA.FileSystem
Dim FoldExi As Boolean
FoldExi = FileSys.FolderExists(FoldPath)
If FoldExi = True Then
MsgBox "予期せぬエラーが発生しました。" & vbLf & _
"再度マクロを実行し直してください。"
Exit Sub
End If
Dim CreateFold As Folder
Set CreateFold = FileSys.CreateFolder(FoldPath)
'*********************************************
' IGES出力
'*********************************************
Dim i As Integer
Dim SELPart As Part
Dim SELDOC As Document
For i = 1 To SEL.Count
Set SELPart = SEL.Item(i).Value
Set SELDOC = SELPart.Parent
SELDOC.ExportData FoldPath & "\" & SELPart.Name, "igs" '.igsで出力"
Next i
SEL.Clear
Shell "C:\Windows\Explorer.exe " & FoldPath, vbNormalFocus
End Sub
コード解説
本マクロのコードを上から順に部分ごとにわけて解説していきます。
アクティブドキュメントの定義
Dim ProDOC As ProductDocument
If TypeName(CATIA.ActiveDocument) <> "ProductDocument" Then
MsgBox "このマクロはProductDocument専用です。" & vbLf & _
"アセンブリーワークベンチに切り替えて実行してください。"
Exit Sub
End If
Set ProDOC = CATIA.ActiveDocument
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATProductでのみ有効なものなので、アクティブドキュメントがCATProduct以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
条件分岐の先、つまりはアクティブドキュメントがCATProductの場合は変数「ProDOC」にアクティブドキュメントを代入します。
ユーザー選択のProduct内のCATPartをすべて選択
Dim SEL
Set SEL = ProDOC.Selection
SEL.Clear
Dim InputType(0)
InputType(0) = "Product"
Dim msg As String
msg = "Productを選択してください。"
Dim Status As String
Status = SEL.SelectElement2(InputType, msg, False)
If ((Status = "Cancel") Or (Status = "Undo")) Then
Exit Sub
End If
SEL.Search ("パート・デザイン.パーツ,sel")
If SEL.Count = 0 Then
MsgBox "選択したProduct内にPartは存在しません。"
Exit Sub
End If
次に選択したProduct内にあるCATPartをすべて選択状態にします。(最終的にはループ文を使って、ここで選択状態にしたCATPartを1つずつIGESファイルに出力していくという処理を行います。)
まずは「Selectionオブジェクト」の「SelectElement2メソッド」を使って任意のProductを選択状態にします。つぎに同オブジェクトの「Searchメソッド」を使って選択状態にしたProduct内にあるCATPartをすべて選択状態にします。
これでユーザーが選択したProduct内にある、すべてのCATPartが選択状態となります。
※このとき選択状態のCATPartの数が0個の場合にはマクロを中断するよう条件分岐をさせます。
「SelectElement2メソッド」「Searchメソッド」の使い方は下記ページを参照ください。
書き出し用のフォルダを作成
Dim SavePath As String
SavePath = "C:\Users\ユーザー名\Desktop" '保存場所のパスを入力"
Dim FoldName As String
FoldName = "IGES書き出し " & Year(Date) & Month(Date) & Day(Date) & _
Hour(Time) & Minute(Time) & Second(Time) '作成するフォルダ名を指定
Dim FoldPath As String
FoldPath = SavePath & "\" & FoldName '新規フォルダのパス"
Dim FileSys 'As FileSystem
Set FileSys = CATIA.FileSystem
Dim FoldExi As Boolean
FoldExi = FileSys.FolderExists(FoldPath)
If FoldExi = True Then
MsgBox "予期せぬエラーが発生しました。" & vbLf & _
"再度マクロを実行し直してください。"
Exit Sub
End If
Dim CreateFold As Folder
Set CreateFold = FileSys.CreateFolder(FoldPath)
IGESファイルを出力するためのフォルダを作成します。
まずは保存場所のパスを取得します。
上記のコードでは保存場所を「SavePath = “C:\Users\ユーザー名\Desktop"」
つまりはデスクトップとしています。
※再三の注意となりますがここのパスはご自身のPCのパスに書き換えて下さい。
多くの場合、「ユーザー名」の部分を自分のものにすれば問題ないと思います。
次に、作成するフォルダの名称を指定します。
上記コードでは「IGES書き出し 日時」というフォルダ名で作成しています。
(日時には現状の日時の年から秒までを取得し、その数字の羅列を入力しています。
たとえば2020年1月2日3時4分56秒の場合、「20200102030456」と入力されます。)
このようにフォルダ名を時間によって変更させることで
デスクトップ上に同じフォルダが存在しないようにしています。
ただ必ずしも存在しないとは言えないので
万が一同じフォルダが存在した場合にはマクロを終了するようにしています。
フォルダの存在を確認するには「FileSystemオブジェクト」の「FolderExistsメソッド」を使います。
最後に、これまでに決めた「保存場所」と「フォルダ名」を組み合わせてフォルダを新規作成します。
フォルダの作成は「FileSystemオブジェクト」の「CreateFolderメソッド」を使って行います。
「FolderExistsメソッド」「CreateFolderメソッド」の使い方は下記ページを参照ください。
IGES出力
Dim i As Integer
Dim SELPart As Part
Dim SELDOC As Document
For i = 1 To SEL.Count
Set SELPart = SEL.Item(i).Value
Set SELDOC = SELPart.Parent
SELDOC.ExportData FoldPath & "\" & SELPart.Name, "igs" '.igsで出力"
Next i
SEL.Clear
今回のマクロのメインの部分の処理「IGES出力」をしていきます。
現在、ユーザーが選択したProduct内にあるすべてのCATPartが選択状態となっています。
ループ文を使ってこの選択状態のCATPartをIGESファイルとして書き出していきます。
任意のドキュメントを別ファイルとして書き出すには
「Documentオブジェクト」の「ExportDataメソッド」を使います。
Documentオブジェクト.ExportData パス,“拡張子“
この構文によりDocumentオブジェクトを指定した拡張子で書き出すことができます。
パスには出力先のパス(ファイル名も含む)を入力、
拡張子には出力するファイルの拡張子を入力します。
ただ問題なのが、選択状態のCATPartをそのまま取得しても「Partオブジェクト」として取得されてしまい、「ExportDataメソッド」を使うことができないということです。
という訳で選択状態のCATPartをDocumentオブジェクトとして取得します。
「Partオブジェクト」は「PartDocumentオブジェクト」の1つ子供なので、
「Partオブジェクト」の親を取得すれば「Documentオブジェクト」を取得することができます。
Dim SELPart As Part
Dim SELDOC As Document
Set SELPart = SEL.Item(i).Value '選択しているCATPartを取得(Partオブジェクト)
Set SELDOC = SELPart.Parent '選択しているCATPartを取得(Documentオブジェクト)
あとは取得したDocumentオブジェクトを使い、IGESファイルとして書き出すだけです。
このときファイル名は「SELPart.Name」とすれば、パーツ番号で書き出すことができます。
出力フォルダを表示
Shell "C:\Windows\Explorer.exe " & FoldPath, vbNormalFocus
最後にデスクトップに作成したフォルダを「Shell関数」を使って開きます。
Shell関数についてはExcelマクロでもよく使われ、多くの解説ページがあるためここでは割愛します。
まとめ
今回は任意のCATPartをIGESファイルとして出力するマクロについての内容でした。
コードとしては少し長いですが、このマクロの核となる部分は「ExportDataメソッド」だけです。
今回のようなCATIA内だけでは完結しないマクロ、
特にファイルを扱う系のマクロは「パス」の考え方をしっかりと理解しておく必要があります。
CATIAでファイルを扱う方法は下記ページを一読してみて下さい。









