全てのボディーをボリューム化しその和を作成するマクロ|CATIAマクロの作成方法
今回の記事は「マクロ案」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ:
ジェネレイティブシェイプデザインマクロ案:
不特定多数のパートボディを形状セット内で全て和をして一つにする
1. 不特定多数のパートボディをそれぞれ抽出(点連続)
2. ボリューム化(クロズサーフェス)(Optimizer)
3. 2をそれぞれ和をする
基本的には形状作成を行なっていくだけのマクロなのでコード自体は単純な内容となっています。
今回のような形状作成だけのマクロは「ShapeFactoryオブジェクト」「HybridShapeFactoryオブジェクト」の使い方さえ理解できれば大抵のものは作れるようになるので、「CATIA V5 サンプルマクロ集」にある他のマクロを参考にこれらオブジェクトの使い方を勉強してみて下さい。
マクロの機能
今回作成したマクロは
『すべてのボディーをボリューム化し、その"和"を作成するマクロ』です。
具体的な機能は以下のとおりです。
・抽出(Extract)、クローズサーフェス(Close Surface)、和(Add)の順で作成
・作成した形状はツリー第一階層に新規作成される形状セット内に格納する
サンプルコード
マクロのサンプルコードは以下のとおりです。
Option Explicit
Sub CATMain()
If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then
MsgBox "CATPartのみ対応のマクロです。"
Exit Sub
End If
Dim Doc As PartDocument
Set Doc = CATIA.ActiveDocument
Dim Pt As Part
Set Pt = Doc.Part
Dim Sel As Selection
Set Sel = Doc.Selection
'ハイブリッドシェイプ(サーフェス)作成用
Dim HSF As HybridShapeFactory
Set HSF = Pt.HybridShapeFactory
'シェイプ(ソリッド)作成用
Dim SF As ShapeFactory
Set SF = Pt.ShapeFactory
'表示/非表示を切り替える用
Dim VPS As VisPropertySet
Set VPS = Sel.VisProperties
CATIA.RefreshDisplay = False '処理中のアニメーションを省略
'書き出し用形状セット作成
Dim HB As HybridBody
Set HB = Pt.HybridBodies.Add
Dim BodyColl As Collection
Set BodyColl = New Collection
Sel.Clear
Sel.Search ("パート・デザイン.ボディー,all") '英語環境の場合は書き換える
Dim i As Integer
For i = 1 To Sel.Count
BodyColl.Add Sel.Item(i).Value 'Doc内のボディーをすべて取得
Next i
Sel.Clear
'抽出(Extract)を作成
Dim HSExtractColl As Collection
Set HSExtractColl = New Collection
For i = 1 To BodyColl.Count
Dim RefBody As Reference
Set RefBody = Pt.CreateReferenceFromObject(BodyColl.Item(i))
Dim HSExtract As HybridShapeExtract
Set HSExtract = HSF.AddNewExtract(RefBody)
HSExtract.PropagationType = 1
HSExtract.ComplementaryExtract = False
HSExtract.IsFederated = False
HB.AppendHybridShape HSExtract
'更新(Update)できない場合は抽出を削除[ErrUpdate]
On Error GoTo ErrUpdate
Pt.Update
On Error GoTo 0
HSExtractColl.Add HSExtract '更新できた抽出のみHSExtractCollの中に格納する
label:
Next i
'クローズサーフェス(Close Surface)を作成
Dim CloseSurfColl As Collection
Set CloseSurfColl = New Collection
For i = 1 To HSExtractColl.Count
Dim RefSurf As Reference
Set RefSurf = Pt.CreateReferenceFromObject(HSExtractColl.Item(i))
Dim CloseSurf As CloseSurface
Set CloseSurf = SF.AddNewVolumeCloseSurface(RefSurf)
CloseSurfColl.Add CloseSurf
Pt.Update
Next i
'クローズサーフェスの和(Add)を作成
Dim RefVolume1 As Reference
Set RefVolume1 = Pt.CreateReferenceFromObject(CloseSurfColl.Item(1))
Dim RefVolume2 As Reference
Set RefVolume2 = Pt.CreateReferenceFromObject(CloseSurfColl.Item(2))
Dim VolAdd As Add
Set VolAdd = SF.AddNewVolumeAdd(RefVolume1, RefVolume2, 4#) '[4#]はGSDを表す(パートデザインは[0#])
For i = 3 To CloseSurfColl.Count
Set RefVolume1 = Pt.CreateReferenceFromObject(VolAdd)
Set RefVolume2 = Pt.CreateReferenceFromObject(CloseSurfColl.Item(i))
Set VolAdd = SF.AddNewVolumeAdd(RefVolume1, RefVolume2, 4#)
Pt.Update
Next i
'抽出(Extract)をすべて非表示
Sel.Clear
For i = 1 To HSExtractColl.Count
Sel.Add HSExtractColl.Item(i) 'HSExtractCollの中身をすべて選択状態にする
Next i
VPS.SetShow catVisPropertyNoShowAttr '選択状態のオブジェクトをすべて非表示
Sel.Clear
CATIA.RefreshDisplay = True '処理中のアニメーション省略を元に戻す
MsgBox "完了"
Exit Sub
'抽出の更新でエラーが出た場合(=ボディーの中身が空の場合)の処理
ErrUpdate:
With Sel
.Clear
.Add HSExtract
.Delete
End With
Resume label 'エラーが出たHSExtractのみを削除して[label]に戻る
End Sub
コード解説
本マクロは基本的に形状を作成するだけのマクロなので、形状作成の部分のコード解説は割愛します。コード内のコメントを見ればどの部分で何を作成しているかは理解できると思うので参考にしてください。
大まかな処理の流れは以下のようになっています。
① CATPart内の[ボディー]を全て取得
② [ボディー]から[抽出]を作成
③ [抽出]から[クローズサーフェス]を作成
④ [クローズサーフェス]から[和]を作成
ただ、①で取得したボディーの中身が空の場合、②でエラーが発生してしまいます。
そこで以下ではボディーの中身が空だった場合の処理部分を解説していきます。
更新(Update)できない場合は抽出を削除[ErrUpdate]
先にもいった通りボディーの中身が空の場合、抽出作成時にエラーが発生します。
ただ厳密にいうとCATIA VBAでは、形状作成時にエラーが発生するのではなく、作成した形状に対して更新を行って初めてエラーが発生します。(つまりボディーが空だとしても抽出自体はツリーに作成されます)
そこで、本マクロでは形状作成後に「更新」を行い、そこでエラーが発生した場合に「エラーが発生した形状を削除する」という処理を行います。
'抽出(Extract)を作成
Dim HSExtractColl As Collection
Set HSExtractColl = New Collection
For i = 1 To BodyColl.Count
Dim RefBody As Reference
Set RefBody = Pt.CreateReferenceFromObject(BodyColl.Item(i))
Dim HSExtract As HybridShapeExtract
Set HSExtract = HSF.AddNewExtract(RefBody)
HSExtract.PropagationType = 1
HSExtract.ComplementaryExtract = False
HSExtract.IsFederated = False
HB.AppendHybridShape HSExtract
'更新(Update)できない場合は抽出を削除[ErrUpdate]
On Error GoTo ErrUpdate
Pt.Update
On Error GoTo 0
HSExtractColl.Add HSExtract '更新できた抽出のみHSExtractCollの中に格納する
label:
Next I
'──────────────────────────────────────────────────────────────────────────────────
'中略
'──────────────────────────────────────────────────────────────────────────────────
'抽出の更新でエラーが出た場合(=ボディーの中身が空の場合)の処理
ErrUpdate:
With Sel
.Clear
.Add HSExtract
.Delete
End With
Resume label 'エラーが出たHSExtractのみを削除して[label]に戻る
End Sub
「Pt.Update」の前に「On Error GoTo ErrUpdate」を入力することで、「Pt.Update」でエラーが発生した時に「ErrUpdate:」ラベルにジャンプするようにしています。
ジャンプ先では「エラーが発生した抽出」を削除して元の処理に戻るようにしているので、空のボディーは無視して抽出が作成できるボディーのみが使われるようになっています。
まとめ
今回は「すべてのボディーをボリューム化し、その"和"を作成するマクロ」についての内容でした。
コード解説でも出てきましたが本マクロの処理の流れは以下のとおりです。
① CATPart内の[ボディー]を全て取得
② [ボディー]から[抽出]を作成
③ [抽出]から[クローズサーフェス]を作成
④ [クローズサーフェス]から[和]を作成
これをループ文やIf文でうまいこと繋げているだけなのであまり難しいものではありません。
冒頭でもいった通りCATIA VBAでは「ShapeFactory」(パート・デザイン)、「HybridShapeFactory」(GSD)のいずれかを使って形状を作成することができます。
これらオブジェクトのメソッドをヘルプで確認すれば、それぞれの形状をどのように作成するか全て出てきます。使い方さえ理解できればどのような形状も作成することができるようになるのでぜひそちらも合わせて勉強してみてください。









