ボディー名と形状セット名をCSVファイルとして出力するマクロ|CATIAマクロの作成方法
今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
題名:
ボディ名形状セット名のcsv書き出し
マクロ案:
パートデザインで、一次レベルのボディ名と形状セット名をCSVファイルに書き出したいです。
CSVファイルに書き出す方法はExcel VBAでもいくつか紹介されていますが、ここではCATIA VBAの「FileSytemオブジェクト」を使ってCSVファイルとして出力していきます。
サンプルコード内にも出てくる処理である”ファイルの作成や存在確認などの方法については「FileSytemオブジェクトページ」で解説しているので、詳しくはそちらを確認してください。
マクロの機能
今回作成したのはツリー第1階層にあるボディー/形状セット名をCSV
具体的な機能は以下のとおりです。
・ファイル名はPart名 (※同名のファイルがある場合は上書きの確認をする)
・ボディー名称、形状セット名称の順で出力
・出力後はCSVファイルを開く
サンプルコード
マクロのコードは以下のとおりです。
コード内の保存場所となる「saveDir」の中身は自身のものに書き換える必要があります。
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 |
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 'Part定義 Dim pt As Part Set pt = doc.Part Dim bName() 'ボディー名格納用配列 Dim hbName() '形状セット名格納用配列 ReDim bName(pt.Bodies.Count) ReDim hbName(pt.HybridBodies.Count) Dim i As Integer 'ボディー名取得 Dim b As Body For i = 1 To UBound(bName) Set b = pt.Bodies.Item(i) bName(i) = b.Name Next '形状セット名取得 Dim hb As HybridBody For i = 1 To UBound(hbName) Set hb = pt.HybridBodies.Item(i) hbName(i) = hb.Name Next 'csv出力用文字列の作成 Dim csv As String csv = bName(1) For i = 2 To UBound(bName) csv = csv + "," + bName(i) 'カンマ + ボディー名を後ろに追加 Next i For i = 1 To UBound(hbName) csv = csv + "," + hbName(i) 'カンマ + 形状セット名を後ろに追加 Next i 'csv出力 Dim fs 'As FileSystem Set fs = CATIA.FileSystem Dim saveDir As String saveDir = "C:\Users\ユーザー名\Desktop" '保存ディレクトリ(フォルダ)の指定 Dim fileName As String fileName = pt.Name + ".csv" '保存ファイル名の指定 Dim savePath As String savePath = saveDir + "\" + fileName '"' If fs.FileExists(savePath) Then Dim res As Integer res = MsgBox("同名のファイルが存在します。上書きしますか?", vbYesNo + vbQuestion) If res = vbNo Then Exit Sub End If Dim csvFile As file Set csvFile = fs.CreateFile(savePath, True) Dim ts As TextStream Set ts = csvFile.OpenAsTextStream("ForWriting") ts.Write (csv) ts.Close Set fs = Nothing Set ts = Nothing '出力したcsvファイルを開く Shell "C:\Windows\Explorer.exe " & savePath, vbNormalFocus End Sub |
コード解説
ドキュメント/パーツの定義
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument Set doc = CATIA.ActiveDocument 'Part定義 Dim pt As Part Set pt = doc.Part |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
つまり、アクティブドキュメントがCATPartの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたらあわせてPartオブジェクトも定義します。
(Partオブジェクトとは仕様ツリーの1番上にある「Part1」のこと)
名称格納用配列の用意
1 2 3 4 5 |
Dim bName() 'ボディー名格納用配列 Dim hbName() '形状セット名格納用配列 ReDim bName(pt.Bodies.Count) ReDim hbName(pt.HybridBodies.Count) |
つぎにボディーと形状セットの名称を格納しておくための配列を用意します。
配列の要素数はPartオブジェクト(pt)の「Bodies」「HybridBodies」の数だけそれぞれ用意します。
ボディー名/形状セット名取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Dim i As Integer 'ボディー名取得 Dim b As Body For i = 1 To UBound(bName) Set b = pt.Bodies.Item(i) bName(i) = b.Name Next '形状セット名取得 Dim hb As HybridBody For i = 1 To UBound(hbName) Set hb = pt.HybridBodies.Item(i) hbName(i) = hb.Name Next |
ボディーと形状セットの数だけ別々にループ処理をさせて、全てのボディー/形状セットの名称を先ほど用意した配列に格納します。
csv出力用文字列の作成
1 2 3 4 5 6 7 8 9 10 11 |
'csv出力用文字列の作成 Dim csv As String csv = bName(1) For i = 2 To UBound(bName) csv = csv + "," + bName(i) 'カンマ + ボディー名を後ろに追加 Next i For i = 1 To UBound(hbName) csv = csv + "," + hbName(i) 'カンマ + 形状セット名を後ろに追加 Next i |
出力するcsvファイルの中身となるカンマ[,]で区切られた文字列を作成します。
初めに「csv」という変数に、bName内にある1番目の文字列(ボディーの名称)を入れます。
その後、ループ文を使いbName、hbNameの数だけ「, 名称」をcsvの後ろに追加していきます。
これにより「名称,名称,名称・・・,名称」というカンマ[,]で区切られた1行のテキストが完成します。
csv出力
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 |
'csv出力 Dim fs 'As FileSystem Set fs = CATIA.FileSystem Dim saveDir As String saveDir = "C:\Users\ユーザー名\Desktop" '保存ディレクトリ(フォルダ)の指定 Dim fileName As String fileName = pt.Name + ".csv" '保存ファイル名の指定 Dim savePath As String savePath = saveDir + "\" + fileName '"' If fs.FileExists(savePath) Then Dim res As Integer res = MsgBox("同名のファイルが存在します。上書きしますか?", vbYesNo + vbQuestion) If res = vbNo Then Exit Sub End If Dim csvFile As file Set csvFile = fs.CreateFile(savePath, True) Dim ts As TextStream Set ts = csvFile.OpenAsTextStream("ForWriting") ts.Write (csv) ts.Close Set fs = Nothing Set ts = Nothing |
次に「FileSytemオブジェクト」を使って先ほど作成した文字列をcsvファイルとして出力します。
「saveDir」「fileName」では「保存場所」「ファイル名」を指定し、
この2つを合体させ出力するファイルのパスとなる「savePath」を作ります。
このとき「savePath」に該当するファイルが存在した場合は、上書きするかしないかのメッセージが表示するようになっています。ファイルの存在を確認するには「FileSytemオブジェクト」の「FileExistsメソッド」を使います。
次に同オブジェクトの「CreateFileメソッド」を使い、csvファイルを作成します。
ただ、この時点では何も書かれていないただの空データです。
そこで「TextStreamオブジェクト」の「Writeメソッド」を使って、先ほど作成したカンマ区切りの文字列を空データに書き込みます。
Dim ts As TextStream
Set ts = csvFile.OpenAsTextStream(“ForWriting”)
ts.Write (csv)
ts.Close
「TextStreamオブジェクト」を定義する際は上記の通り「FileSytemオブジェクト」の「OpenAsTextStreamメソッド」を使い、引数として「ForWriting」という文字列を渡します。
これにより定義した「TextStreamオブジェクト」(ts)を使っての値の書き出しが可能になります。
また、出力後は同オブジェクトの「Closeメソッド」で”ファイルを閉じる”という処理も必要になるので注意しましょう。
出力フォルダを表示
1 2 |
'出力したcsvファイルを開く Shell "C:\Windows\Explorer.exe " & savePath, vbNormalFocus |
最後に出力したcsvファイルを「Shell関数」を使って開きます。
Shell関数についてはExcelマクロでもよく使われ、多くの解説ページがあるためここでは割愛します。
まとめ
今回はツリー第1階層にあるボディー/形状セット名をCSV
大まかな流れとしては以下のような処理を行なっているだけです。
② 配列内に入っている名前とカンマ[,]を使って1つのテキストを作成
③ 空のcsvファイルを作成
④ 空のcsvファイルにテキストを書き出す。
基本的にCATIA VBAでフォルダ作成やファイル作成をする場合は、今回のように「FileSytemオブジェクト」を使います。Excel VBAの場合も同じような「FileSystemObjectオブジェクト(リンク先はMicrsoftページ)」というものを使ってファイル作成をします。
Excel VBAでよく使われる「FileSystemObjectオブジェクト」はCATIA VBAでも使うことができるので自身がやりやすい方を使うといいと思います。