"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ファイルを開きます。
(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で上手くいった方いらしたら、教えてください)