C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

CATIAV5 で Ariawase を試してみる(ArrFilter)

"Ariawase" の "Core.bas" や "Ext.bas" の中には魅力的な
関数名が色々と入っているので、勉強を兼ねてやってみます。

ArrFilter関数は、ネーミングからして配列から条件を満たしたものだけを
返してくれそうな感じがします。

CATIAとは無関係ですが、簡単なものから

'vba using_ariawase
Sub ArrFilterTest()
    Dim arr As Variant
    arr = ArrRange(0&, 10&)
    Debug.Print Dump(ArrFilter(Init(New Func, vbLong, AddressOf IsEvenNumber), arr))
End Sub

Private Function IsEvenNumber(ByVal x As Long) As Boolean
    IsEvenNumber = IIf(x Mod 2& = 0, True, False)
End Function

'Array(0&, 2&, 4&, 6&, 8&, 10&)

0~10までの値を持つ配列を生成し、偶数のみを取得してみました。
ArrFilter関数の一つ目の引数には、フィルターとなる関数(戻り値がBoolean型)
を指定し、任意の配列を二つ目の引数に渡せば良いみたいです。

で、今度はCATIAで。
まず、形状セット内に要素を持つPartファイルを開きます。
f:id:kandennti:20151119125741p:plain
(Igesファイルを開いただけです)
本来何か処理を行うべきなのですが、思い付かない上、動作を確認したい
ので、こんな感じの物を作ってみました。

'vba using_ariawase
Sub Catia_ArrFilterTest()
    Dim HSs As HybridShapes
    Set HSs = CATIA.ActiveDocument.Part.HybridBodies.Item(1).HybridShapes
    
    Dim arrHBSs As Variant
    arrHBSs = CatCollection2Array(HSs)
    Debug.Print Dump(arrHBSs)
    
    Dim arrOJ As Variant
    arrOJ = ArrFilter(Init(New Func, vbObject, AddressOf GetTrue), arrHBSs)
End Sub

Private Function GetTrue(ByVal x As AnyObject) As Boolean
    GetTrue = True
End Function

Function CatCollection2Array(ByVal HSs As Variant) As Variant
    Dim ArrEx As New ArrayEx, hs As Object
    For Each hs In HSs
        ArrEx.AddObj hs
    Next
    CatCollection2Array = ArrEx.ToArray
End Function

"Catia_ArrFilterTest" では、アクティブなPartファイルの最初の形状セット内の線や面
のコレクション(HybridShapes)を取得します。
Init関数の第二引数はコレクションではNGっぽかったので、CatCollection2Array関数を
用意しArrExクラスを利用して配列化します。
その後、ArrFilter関数を利用しているのですが、呼び出している関数が
"GetTrue" です。何を受け取っても "True" を返す無意味なものです。

で、これを実行すると・・・エラーなんです。 何故・・・。

色々やったのですがダメだったので、先日成功しているArrMap関数で試して見ます。

'vba using_ariawase
 ・・・
    Dim arrOJ As Variant
    'arrOJ = ArrFilter(Init(New Func, vbObject, AddressOf GetTrue), arrHBSs)
    arrOJ = ArrMap(Init(New Func, vbBoolean, AddressOf GetTrue), arrHBSs)

これならOKでした。 偶数の取得の例でArrFilter関数の使い方は間違っていない
気がしますし、ArrMap関数では上手く行くので、"CatCollection2Array" や
"GetTrue" も間違っていないと思っているのですが・・・。

"Func.cls"をメモ帳等で開いた際しか見れない部分(名称があるのですが忘れました)
にあるリンク先をチラッと見ると、 "STDCALL呼び出し規約" がドウコウ書かれている
のですが(全く理解していません) これがCATIAはNGなのかなぁ。
ArrFilter関数は断念。(CATIAで上手くいった方いらしたら、教えてください)