CATIAマクロの備忘録|CATIAマクロの作成方法

ここでは「CATIAマクロでこの操作をしたい!」というものを備忘録的なかたちでまとめていきます。
※全ての操作は書ききれないので、個人的によく使うものや興味のあるもののみをまとめています。

このページに書かれているコードはすべて、空のモジュールにコピペするだけで使えるようになっています。そのためコードをあまり理解できていなくても、いくつかの操作を組み合わせるだけで何かしらのマクロを作ることはできます。いろいろ試してみて徐々に使い方を理解していきましょう。

 icon-warning 注意 

ここに書いているコードは確かにコピペで実行できるものですが、それはある条件がそろっている場合です。各コード内に「事前準備:」と書かれている場合は、そこに書かれているものを作成してからマクロを実行してください。(※作成しないとエラーが発生してマクロが実行できません)
 
どの状況でもエラーの起きないマクロをコードにすると、条件分岐やオブジェクト定義などの様々なコードが含まれてかなり長いものになってしまいます。そのためここでは必要最低限のものしか書いていないため上記のような状態になっています。予めご了承ください。

今あるもの以外にも、まだまだ追加していく予定なのでお楽しみに!

 
CATIAマクロの作成方法|目次へ戻る
 

icon-book CATIAマクロを本気で勉強するなら

 

CATIA全般

CATIA全般では主に「ドキュメント」「ウィンドウ」「選択」に関する操作がまとめられています。
新規でオブジェクトを作成するというよりかは、現在あるオブジェクトを読み取りそのオブジェクトに対して何らかの操作をするようなものが多いです。
 

選択しているオブジェクトのタイプを調べる

CATIAマクロを作成していると「これってVBAのオブジェクトでどうやっていうんだろ?」と思うことがよくあります。

オブジェクトのタイプ名は『TypeName関数』を使うことで取得することができます。
以下のコードを実行することで、選択中のオブジェクトのタイプを調べることができます。

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」)

Sub CATMain()

Dim WIN As Window
Set WIN = CATIA.Windows.Item(1)

WIN.Activate

End Sub

参考:Windowオブジェクト
 

ウィンドウを上下/左右に並べて表示

ウィンドウを並べて表示するには『Windowsコレクション』『Arrangeプロパティ』を使用します。

以下のコードを書くことでウィンドウを任意の表示に切り替えることができます。(①~③のどれかを入力)

Sub CATMain()

Dim WINs As Windows
Set WINs = CATIA.Windows

WINs.Arrange (catArrangeTiledHorizontal)  '①上下に並べて表示
WINs.Arrange (catArrangeTiledVertical)    '②左右に並べて表示
WINs.Arrange (catArrangeCascade)          '③重ねて表示

End Sub

参考:Windowsコレクション
 

ドキュメントを保存

ドキュメントを保存するには『Documentオブジェクト』『Saveメソッド』を使用します。
このメソッドを実行するとメッセージなどの表示なく上書き保存されるため注意して下さい。
(MsgBoxで保存の確認メッセージを出したりするともう少し親切なマクロになります)

Sub CATMain()

Dim DOC As Document
Set DOC = CATIA.ActiveDocument

DOC.Save

End Sub

参考:Documentオブジェクト

同オブジェクトの『SaveAsメソッド』を使うことで、ドキュメントを任意の場所に「名前を付けて保存」をすることも可能です。
 

オブジェクトの名前を取得

オブジェクトの名前は『AnyObjectオブジェクト』『Nameプロパティ』を使用します。
このプロパティはどのオブジェクトに対しても使用することができます。

たとえば以下のように書くと「アクティブドキュメントの名前」を取得することができます。
取得した名称は、文字列型の変数(以下でいうObjectName)に代入されます。

Sub CATMain()

Dim DOC As Document 
Set DOC = CATIA.ActiveDocument

Dim ObjectName As String 
ObjectName = DOC.Name

End Sub

 

任意のオブジェクトをクリックして取得

オブジェクトを上から順に定義せずとも『Selectionオブジェクト』『SelectElement2メソッド』を使えば、ユーザーが選択したオブジェクトを直接取得することが出来ます。

以下のコードではマクロの実行中にユーザーが選択したオブジェクトを取得することができます。
(ユーザーがオブジェクトを選択するまで、マクロの処理はいったんストップされる)
オブジェクトが選択されるとそのオブジェクトは変数(以下でいうSELObj)に代入されます。

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

参考:Selectionオブジェクト
 

オブジェクトの色を変更

オブジェクトの色を変更するには『VisPropertySetオブジェクト』『SetRealColorメソッド』を使用します。ワークベンチやドキュメントの決まりはなく、グラフィックプロパティがあるオブジェクトに使用することができます。

以下のコードを実行すると、現在選択しているオブジェクトの色を白に変更することができます。
RGB値を変更することで、任意の色に変更することができます。

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メソッド』を使用します。(表示状態にしたい場合と、非表示にしたい場合のコードは微妙に違うので注意)

以下のコードを実行すると、現在選択しているオブジェクトの表示状態を切り替えることが出来ます。

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」を使って定義します。

Sub CATMain()

Dim DOC As PartDocument
Set DOC = CATIA.ActiveDocument  'アクティブドキュメントをパーツ・ドキュメントとして定義

End Sub

上記を実行した場合、アクティブドキュメントがCATPartであれば問題ありません。
しかし、アクティブドキュメントがドラフティング(CATDrawing)やアセンブリー(CATPuroduct)などのCATPartではない場合にはエラーが発生してしまいます。

このようなエラーを出したくない場合は以下のように条件分岐文を追加します。
以下の場合はアクティブドキュメントがCATPartでない場合はマクロを終了します。

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形式で作成されます。

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」としてそれぞれ定義しています。

Sub CATMain()

Dim DOC As PartDocument
Set DOC = CATIA.ActiveDocument

Dim PT As Part
Set PT = DOC.Part

'ここに処理を入力

End Sub

参考:VBAでオブジェクトを取得1
 

任意の形状セットをアクティブに

任意の形状セットをアクティブ(作業オブジェクトとして設定)にするには、『Partオブジェクト』『InWorkObjectプロパティ』を使用します。
コードとしては「PT.InWorkObject = ○○」と書きます。
この○○に書かれた変数に入っているオブジェクトがアクティブ状態になります。

以下のコードではPart内のHybridBodies内にある1つ目の形状セット(つまりはツリーの1番上にある形状セット)を「HB」としています。つまり以下のコードを実行することでツリーの1番上にある形状セットをアクティブにすることができます。

Dim HBs As HybridBodies
Set HBs = PT.HybridBodies

Dim HB As HybridBody
Set HB = HBs.Item(1)

PT.InWorkObject = HB

参考:VBAでオブジェクトを取得1
 

形状セットを作成

形状セットの名前は『HybridBodiesコレクション』『Addメソッド』を使用します。

以下の場合、PTのHybridBodies内(つまりは仕様ツリー第1階層)に形状セットが作られます。
新規で作成された形状セットは変数(以下の場合HB)に代入されます。

Dim HBs As HybridBodies
Set HBs = PT.HybridBodies

Dim HB As HybridBody
Set HB = HBs.Add

 
アクティブ状態の形状セット内に形状セットを作成したい場合は、1つ上の項目でやった「PT.InWorkObject」を使って以下のように書きます。

Dim HBs2 As HybridBodies
Set HBs2 = PT.InWorkObject

Dim HB2 As HybridBody
Set HB2 = HBs2.Add

 

形状セットの名前を変更

形状セットの名前を変更するには『AnyObjectオブジェクト』『Nameプロパティ』を使用します。(AnyObjectを使っているため形状セット以外のオブジェクトもこれと同様に変更することが可能)

コードとしては「○○.Name = “××"」と書きます。
○○には変更したい形状セット(オブジェト)の入った変数を、××には変更したい名前を入力します。

たとえば新規作成した形状セットの名前を変更する場合は以下のように書きます。
以下の場合、形状セットの名前は「NewName」という名前に変更されます。

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」として定義しています。

Sub CATMain()

Dim DrwDOC As DrawingDocument
Set DrwDOC = CATIA.ActiveDocument

'ここに処理を入力

End Sub

 

シートの追加

シートの追加は『DrawaingSheetsコレクション』『Addメソッド』を使用します。
追加するシートの名前を決めて以下のようなコードで書きます。

以下の場合は「NewSheet」という名前のシートが1つ追加されます。
追加されたシートは変数(以下でいうNewDS)に代入されます。

Dim NewDS As DrawingSheet
Set NewDS = DrwDOC.Sheets.Add("NewSheet") 'シートの名前を指定

 

ビューの追加

シートの追加は『DrawaingViewsコレクション』『Addメソッド』を使用します。
追加するビューの名前を決めて以下のようなコードで書きます。

以下の場合は「NewView」という名前のビューが、アクティブ状態のシートに追加されます。追加されたビューは変数(以下でいうNewVIW)に代入されます。

'事前準備:シートを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つずつ作成
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つずつ作成
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つずつ作成
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)に代入されます。
※保存場所に同一のフォルダ名があった場合は上書きされるので注意

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オブジェクト
 

新規ファイルを作成

任意の場所に新規ファイルを作成するには『FileSystemオブジェクト』『CreateFile』を使用します。以下のように保存場所のパスと作成するファイル名(+拡張子)を入力します。
また同一名のファイルがあった場合に上書きする[True]上書きしない[False]かを指定します。

新規作成されたファイルは変数(以下でいうCreateFil)に代入されます。

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

参考:FileSystemオブジェクト 
 

CATIAマクロでExcelオブジェクトを取得

CATIAに『Excelマクロのライブラリ』を読み込ませます。

① CATIAのVBEのメニューバーから[Tools]>[References…]をクリック
② ウィンドウの中から『Microsoft Excel 16.0 Object Library』にチェックを入れる
    (Excelのバージョンによっては16.0ではない場合がある)

読み込みが終わったら、実行するマクロ内に以下のコードを入力することでExcelのオブジェクト(Cells,WorkSheetなど)を使うことができるようになります。

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マクロでExcelを操作する方法 

 

icon-book CATIAマクロを本気で勉強するなら

 

2024年8月26日CATIA,CATIAマクロ