全てのボディーをボリューム化しその和を作成するマクロ|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)のいずれかを使って形状を作成することができます。
これらオブジェクトのメソッドをヘルプで確認すれば、それぞれの形状をどのように作成するか全て出てきます。使い方さえ理解できればどのような形状も作成することができるようになるのでぜひそちらも合わせて勉強してみてください。