CATIAマクロの備忘録|CATIAマクロの作成方法
ここでは「CATIAマクロでこの操作をしたい!」というものを備忘録的なかたちでまとめていきます。
※全ての操作は書ききれないので、個人的によく使うものや興味のあるもののみをまとめています。
このページに書かれているコードはすべて、空のモジュールにコピペするだけで使えるようになっています。そのためコードをあまり理解できていなくても、いくつかの操作を組み合わせるだけで何かしらのマクロを作ることはできます。いろいろ試してみて徐々に使い方を理解していきましょう。
ここに書いているコードは確かにコピペで実行できるものですが、それはある条件がそろっている場合です。各コード内に「事前準備:」と書かれている場合は、そこに書かれているものを作成してからマクロを実行してください。(※作成しないとエラーが発生してマクロが実行できません)
どの状況でもエラーの起きないマクロをコードにすると、条件分岐やオブジェクト定義などの様々なコードが含まれてかなり長いものになってしまいます。そのためここでは必要最低限のものしか書いていないため上記のような状態になっています。予めご了承ください。
CATIAマクロを本気で勉強するなら
CATIA全般
CATIA全般では主に「ドキュメント」「ウィンドウ」「選択」に関する操作がまとめられています。
新規でオブジェクトを作成するというよりかは、現在あるオブジェクトを読み取りそのオブジェクトに対して何らかの操作をするようなものが多いです。
選択しているオブジェクトのタイプを調べる
CATIAマクロを作成していると「これってVBAのオブジェクトでどうやっていうんだろ?」と思うことがよくあります。
オブジェクトのタイプ名は『TypeName関数』を使うことで取得することができます。
以下のコードを実行することで、選択中のオブジェクトのタイプを調べることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub CATMain() Dim SEL As Selection Set SEL = CATIA.ActiveDocument.Selection If SEL.Count <> 1 Then MsgBox "1つのオブジェクトを選択して実行して下さい。" Exit Sub End If Dim SELItem As AnyObject Set SELItem = SEL.Item(1).Value MsgBox TypeName(SELItem) End Sub |
たとえば「形状セット」を選択した状態で上記のコードを実行すると、形状セットを表すオブジェクトである「HybridBody」をメッセージボックスで表示させることができます。これはCATPartだけでなくCATDrawing,CATProductなど、どのドキュメントでも使用することができます。
任意のウィンドウをアクティブに
ウィンドウをアクティブするには『Windowオブジェクト』の『Activateメソッド』を使用します。以下のコードを書くことで任意のウィンドウをアクティブにすることができます。
下のコードの場合、CATIA.Windows.Item(1)がアクティブウィンドウとなります。CATIA.Windows.Item(1)とは開いているウィンドウの中の1番目のウィンドウを意味しています。(左の画像でいう「Product1」)
1 2 3 4 5 6 7 8 |
Sub CATMain() Dim WIN As Window Set WIN = CATIA.Windows.Item(1) WIN.Activate End Sub |
参考:Windowオブジェクト
ウィンドウを上下/左右に並べて表示
ウィンドウを並べて表示するには『Windowsコレクション』の『Arrangeプロパティ』を使用します。
以下のコードを書くことでウィンドウを任意の表示に切り替えることができます。(①~③のどれかを入力)
1 2 3 4 5 6 7 8 9 10 |
Sub CATMain() Dim WINs As Windows Set WINs = CATIA.Windows WINs.Arrange (catArrangeTiledHorizontal) '①上下に並べて表示 WINs.Arrange (catArrangeTiledVertical) '②左右に並べて表示 WINs.Arrange (catArrangeCascade) '③重ねて表示 End Sub |
ドキュメントを保存
ドキュメントを保存するには『Documentオブジェクト』の『Saveメソッド』を使用します。
このメソッドを実行するとメッセージなどの表示なく上書き保存されるため注意して下さい。
(MsgBoxで保存の確認メッセージを出したりするともう少し親切なマクロになります)
1 2 3 4 5 6 7 8 |
Sub CATMain() Dim DOC As Document Set DOC = CATIA.ActiveDocument DOC.Save End Sub |
同オブジェクトの『SaveAsメソッド』を使うことで、ドキュメントを任意の場所に「名前を付けて保存」をすることも可能です。
オブジェクトの名前を取得
オブジェクトの名前は『AnyObjectオブジェクト』の『Nameプロパティ』を使用します。
このプロパティはどのオブジェクトに対しても使用することができます。
たとえば以下のように書くと「アクティブドキュメントの名前」を取得することができます。
取得した名称は、文字列型の変数(以下でいうObjectName)に代入されます。
1 2 3 4 5 6 7 8 9 |
Sub CATMain() Dim DOC As Document Set DOC = CATIA.ActiveDocument Dim ObjectName As String ObjectName = DOC.Name End Sub |
任意のオブジェクトをクリックして取得
オブジェクトを上から順に定義せずとも『Selectionオブジェクト』の『SelectElement2メソッド』を使えば、ユーザーが選択したオブジェクトを直接取得することが出来ます。
以下のコードではマクロの実行中にユーザーが選択したオブジェクトを取得することができます。
(ユーザーがオブジェクトを選択するまで、マクロの処理はいったんストップされる)
オブジェクトが選択されるとそのオブジェクトは変数(以下でいうSELObj)に代入されます。
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 |
Sub CATMain() On Error Resume Next 'キャンセル時にエラーが出るので無視させる Dim SEL 'このメソッドを使う場合「As Selection」と宣言しない Set SEL = CATIA.ActiveDocument.Selection SEL.Clear Dim FilterArray(0) FilterArray(0) = "AnyObject" Dim Msg As String Msg = "オブジェクトを選択してください。" Dim Status As String Status = SEL.SelectElement2(FilterArray, Msg, False) If ((Status = "Cancel") Or (Status = "Undo")) Then Exit Sub End If Dim SELObj As AnyObject Set SELObj = SEL.Item(1).Value 'SELObjにユーザーが選択したオブジェクトを入れる MsgBox SELObj.Name '取得の確認用 End Sub |
オブジェクトの色を変更
オブジェクトの色を変更するには『VisPropertySetオブジェクト』の『SetRealColorメソッド』を使用します。ワークベンチやドキュメントの決まりはなく、グラフィックプロパティがあるオブジェクトに使用することができます。
以下のコードを実行すると、現在選択しているオブジェクトの色を白に変更することができます。
RGB値を変更することで、任意の色に変更することができます。
1 2 3 4 5 6 7 8 9 10 11 |
Sub CATMain() Dim SEL As Selection Set SEL = CATIA.ActiveDocument.Selection 'Selectionオブジェクトを定義 Dim VPS As VisPropertySet Set VPS = SEL.VisProperties 'VisPropertySetオブジェクトを定義 VPS.SetRealColor 255, 255, 255, 1 'R値,G値,B値,継承値 End Sub |
参考:Selectionオブジェクト / VisPropertySetオブジェクト
オブジェクトの表示状態を変更
オブジェクトの表示状態を変更するには『VisPropertySetオブジェクト』の『SetShowメソッド』を使用します。(表示状態にしたい場合と、非表示にしたい場合のコードは微妙に違うので注意)
以下のコードを実行すると、現在選択しているオブジェクトの表示状態を切り替えることが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub CATMain() Dim SEL As Selection Set SEL = CATIA.ActiveDocument.Selection 'Selectionオブジェクトを定義 Dim VPS As VisPropertySet Set VPS = SEL.VisProperties 'VisPropertySetオブジェクトを定義 VPS.SetShow catVisPropertyShowAttr '①表示状態にする VPS.SetShow catVisPropertyNoShowAttr '②非表示状態にする End Sub |
参考:Selectionオブジェクト / VisPropertySetオブジェクト
アクティブドキュメントをチェック
各ワークベンチでマクロを使う場合、「PartDocument」「ProductDocument」「DrawaingDocument」といったように各ドキュメントを定義する必要があります。多くの場合は以下のように「CATIA.ActiveDocument」を使って定義します。
1 2 3 4 5 6 |
Sub CATMain() Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument 'アクティブドキュメントをパーツ・ドキュメントとして定義 End Sub |
上記を実行した場合、アクティブドキュメントがCATPartであれば問題ありません。
しかし、アクティブドキュメントがドラフティング(CATDrawing)やアセンブリー(CATPuroduct)などのCATPartではない場合にはエラーが発生してしまいます。
このようなエラーを出したくない場合は以下のように条件分岐文を追加します。
以下の場合はアクティブドキュメントがCATPartでない場合はマクロを終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub CATMain() Dim DOC As PartDocument 'PartDocument(CATPart)として宣言 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then 'アクティブドキュメントがPartDocumentか確認 MsgBox "このマクロはPartDocument専用です。" _ & vbLf & _ "パートデザインもしくはGSDワークベンチで実行してください。" Exit Sub 'PartDocumentでない場合はマクロを終了 End If Set DOC = CATIA.ActiveDocument End Sub |
参考:TypeName関数
CATIA画面をキャプチャする
CATIAの画面内をキャプチャするには『Viewrオブジェクト』の『CaptureToFileメソッド』を使用します。キャプチャ画像の保存形式と保存場所を指定して以下のように入力します。
以下のコードの場合、アクティブウィンドウ全体(形状領域内)のキャプチャが「Capture1」という名前でデスクトップ上にJPEG形式で作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub CATMain() Dim WIN As Window Set WIN = CATIA.ActiveWindow Dim VWR As Viewer Set VWR = WIN.ActiveViewer Dim CapName As String CapName = "Capture1.jpeg" 'キャプチャ画像の名前(+拡張子)を入力 VWR.CaptureToFile catCaptureFormatJPEG, "C:\Users\ユーザー名\Desktop\" & CapName '保存場所の指定 End Sub |
上記のCapNameの拡張子と「catCaptureFormatJPEG」の部分を以下のものに変えることで、それぞれの拡張子で保存することができます。※1 グレースケール(白黒)
.cgm → catCaptureFormatCGM
.emf → catCaptureFormatEMF
.tiff → catCaptureFormatTIFF
.tiff → catCaptureFormatTIFFGreyScale ※1
.bmp → catCaptureFormatBMP
GSDワークベンチ
GSDワークベンチはCATPartなので初めに『PartDocument』を定義する必要があります。定義の方法は以下のとおりです。
※以下のコードを書いていないとこの項目の操作はどれも行えないので必ず書いてください。
以下ではDOCは「アクティブなCATPart」
PTはDOCの中の「Part」としてそれぞれ定義しています。
1 2 3 4 5 6 7 8 9 10 11 |
Sub CATMain() Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument Dim PT As Part Set PT = DOC.Part 'ここに処理を入力 End Sub |
任意の形状セットをアクティブに
任意の形状セットをアクティブ(作業オブジェクトとして設定)にするには、『Partオブジェクト』の『InWorkObjectプロパティ』を使用します。
コードとしては「PT.InWorkObject = ○○」と書きます。
この○○に書かれた変数に入っているオブジェクトがアクティブ状態になります。
以下のコードではPart内のHybridBodies内にある1つ目の形状セット(つまりはツリーの1番上にある形状セット)を「HB」としています。つまり以下のコードを実行することでツリーの1番上にある形状セットをアクティブにすることができます。
1 2 3 4 5 6 7 |
Dim HBs As HybridBodies Set HBs = PT.HybridBodies Dim HB As HybridBody Set HB = HBs.Item(1) PT.InWorkObject = HB |
形状セットを作成
形状セットの名前は『HybridBodiesコレクション』の『Addメソッド』を使用します。
以下の場合、PTのHybridBodies内(つまりは仕様ツリー第1階層)に形状セットが作られます。
新規で作成された形状セットは変数(以下の場合HB)に代入されます。
1 2 3 4 5 |
Dim HBs As HybridBodies Set HBs = PT.HybridBodies Dim HB As HybridBody Set HB = HBs.Add |
アクティブ状態の形状セット内に形状セットを作成したい場合は、1つ上の項目でやった「PT.InWorkObject」を使って以下のように書きます。
1 2 3 4 5 |
Dim HBs2 As HybridBodies Set HBs2 = PT.InWorkObject Dim HB2 As HybridBody Set HB2 = HBs2.Add |
形状セットの名前を変更
形状セットの名前を変更するには『AnyObjectオブジェクト』の『Nameプロパティ』を使用します。(AnyObjectを使っているため形状セット以外のオブジェクトもこれと同様に変更することが可能)
コードとしては「○○.Name = “××”」と書きます。
○○には変更したい形状セット(オブジェト)の入った変数を、××には変更したい名前を入力します。
たとえば新規作成した形状セットの名前を変更する場合は以下のように書きます。
以下の場合、形状セットの名前は「NewName」という名前に変更されます。
1 2 3 4 5 6 7 |
Dim HBs As HybridBodies Set HBs = PT.HybridBodies Dim HB As HybridBody Set HB = HBs.Add HB.Name = "NewName" |
ドラフティングワークベンチ
ドラフティングワークベンチでできる操作はExcelマクロの内容とかなり似ているため、Excelマクロをさわったことのある方はとっつきやすい内容となっています。
また、似ていることもありExcelと連携させるとかなり便利なマクロを作成することができます。
(たとえば、エクセルで作成した表をそのままドラフティングのテーブルとして作成するというように)
ドラフティングワークベンチはCATDrawingなので初めに『DrawingDocument』を定義する必要があります。定義の方法は以下のとおりです。
※以下のコードを書いていないとこの項目の操作はどれも行えないので必ず書いてください。
以下ではDrwDOCを「アクティブなCATDrawing」として定義しています。
1 2 3 4 5 6 7 8 |
Sub CATMain() Dim DrwDOC As DrawingDocument Set DrwDOC = CATIA.ActiveDocument 'ここに処理を入力 End Sub |
シートの追加
シートの追加は『DrawaingSheetsコレクション』の『Addメソッド』を使用します。
追加するシートの名前を決めて以下のようなコードで書きます。
以下の場合は「NewSheet」という名前のシートが1つ追加されます。
追加されたシートは変数(以下でいうNewDS)に代入されます。
1 2 |
Dim NewDS As DrawingSheet Set NewDS = DrwDOC.Sheets.Add("NewSheet") 'シートの名前を指定 |
ビューの追加
シートの追加は『DrawaingViewsコレクション』の『Addメソッド』を使用します。
追加するビューの名前を決めて以下のようなコードで書きます。
以下の場合は「NewView」という名前のビューが、アクティブ状態のシートに追加されます。追加されたビューは変数(以下でいうNewVIW)に代入されます。
1 2 3 4 5 6 |
'事前準備:シートを1つ作成 Dim DS As DrawingSheet Set DS = DrwDOC.Sheets.ActiveSheet 'アクティブなシートを定義 Dim NewVIW As DrawingView Set NewVIW = DS.Views.Add("NewView") 'ビューの名前を指定 |
任意の位置にテーブルを作成
テーブルの作成は『DrawaingTablesコレクション』の『Addメソッド』を使用します。
作成する位置や行列の数、幅や高さなどを指定して以下のように書きます。
以下の場合、X座標,Y座標が100の位置にセルの高さが20,幅が50の2×3のテーブルが作成されます。
作成されたテーブルは変数(以下でいうMyTable)に代入されます。
1 2 3 4 5 6 7 8 9 |
'事前準備:シート、ビューをそれぞれ1つずつ作成 Dim DS As DrawingSheet Set DS = DrwDOC.Sheets.ActiveSheet 'アクティブなシートを定義 Dim VIW As DrawingView Set VIW = DS.Views.ActiveView 'アクティブなビューを定義 Dim MyTable As DrawingTable Set MyTable = VIW.Tables.Add(100#, 100#, 2, 3, 20#, 50#) '(X座標,Y座標,行数,列数,セルの高さ,セルの幅)をそれぞれ指定 |
テーブルの任意の位置(セル)に文字を入力
テーブルの任意のセルに文字を入力するには『DrawaingTableオブジェクト』の『SetCellStringメソッド』を使用します。以下のようにセルの位置と入力する文字列を入力します。
以下の場合セル(1,1)の位置、つまりはテーブルの左上に「Text」という文字が入力されます。
セルの番地は左上を基準に(列番,行番)となっています。(Excelと同じ考え方)
1 2 3 4 5 6 7 8 9 10 11 |
'事前準備:シート、ビュー、テーブルをそれぞれ1つずつ作成 Dim DS As DrawingSheet Set DS = DrwDOC.Sheets.ActiveSheet 'アクティブなシートを定義 Dim VIW As DrawingView Set VIW = DS.Views.ActiveView 'アクティブなビューを定義 Dim Table As DrawingTable Set Table = VIW.Tables.Item(1) 'ビュー内の1番目のテーブルを定義 Table.SetCellString 1, 1, "Text" '列番,行番,入力する文字 |
任意の位置にテキストボックスを作成
テキストボックスの作成は『DrawaingTextsコレクション』の『Addメソッド』を使用します。
以下のように入力する文字列と作成する位置を入力します。
以下の場合、X座標,Y座標が50の位置に「Text」と書かれたテキストボックスが作成されます。
作成されたテキストボックスは変数(以下でいうTXT)に代入されます。
1 2 3 4 5 6 7 8 9 |
'事前準備:シート、ビュー、テーブルをそれぞれ1つずつ作成 Dim DS As DrawingSheet Set DS = DrwDOC.Sheets.ActiveSheet 'アクティブなシートを定義 Dim VIW As DrawingView Set VIW = DS.Views.ActiveView 'アクティブなビューを定義 Dim TXT As DrawingText Set TXT = VIW.Texts.Add("Text", 50#, 50#) '(テキスト内容,X座標,Y座標) |
CATIA外操作
CATIAマクロではCATIA内以外の操作を行うことも出来ます。
これによりCATIA内データを外部のファイル(Excelやテキスト)に書き出すことが可能となります。
新規フォルダを作成
任意の場所に新規フォルダを作成するには『FileSystemオブジェクト』の『CreateFolderメソッド』を使用します。以下のように保存場所のパスと作成するフォルダ名を入力します。
新規作成されたフォルダは変数(以下でいうCreateFold)に代入されます。
※保存場所に同一のフォルダ名があった場合は上書きされるので注意
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub CATMain() Dim FileSys 'As FileSystem データ型は指定しない Set FileSys = CATIA.FileSystem Dim FoldName As String FoldName = "New Folder" '作成するフォルダの名前 Dim CreateFold As Folder Set CreateFold = FileSys.CreateFolder("C:\Users\ユーザー名\Desktop\" & FoldName) '保存場所のパス End Sub |
新規ファイルを作成
任意の場所に新規ファイルを作成するには『FileSystemオブジェクト』『CreateFile』を使用します。以下のように保存場所のパスと作成するファイル名(+拡張子)を入力します。
また同一名のファイルがあった場合に上書きする[True]か上書きしない[False]かを指定します。
新規作成されたファイルは変数(以下でいうCreateFil)に代入されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub CATMain() Dim FileSys 'As FileSystem データ型は指定しない Set FileSys = CATIA.FileSystem Dim FileName As String FileName = "New File.txt" '作成するフォルダの名前+拡張子 Dim CreateFil As File Set CreateFil = FileSys.CreateFile("C:\Users\ユーザー名\Desktop\" & FileName, False) '保存場所のパス,上書き指定 End Sub |
CATIAマクロでExcelオブジェクトを取得
CATIAに『Excelマクロのライブラリ』を読み込ませます。
① CATIAのVBEのメニューバーから[Tools]>[References…]をクリック
② ウィンドウの中から『Microsoft Excel 16.0 Object Library』にチェックを入れる
(Excelのバージョンによっては16.0ではない場合がある)
読み込みが終わったら、実行するマクロ内に以下のコードを入力することでExcelのオブジェクト(Cells,WorkSheetなど)を使うことができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub CATMain() Dim Excel As Object Set Excel = GetObject(, “EXCEL.Application”) If Err.Number <> 0 Then Err.Clear Set Excel = CreateObject(“Excel.Application”) End If '実行したい処理 End Sub |
CATIAマクロを本気で勉強するなら