読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

CreateSetOfParameters関数の使い道がわからない

以前、こちらのブログを見て "こんな事できるんだ" と思いました。
How to Create a Parametric Set inside a Geometrical Set - VB Scripting for CATIA V5


そのままコピペでは動かなかったのと、不要な部分を
コメント化しました。

'vba
Sub CATMain()
    Set oDoc = CATIA.ActiveDocument
    Set oPart = oDoc.Part
    Set oParams = oPart.Parameters
     
    Dim HB As HybridBodies
    Set HB = oPart.HybridBodies
     
    Dim HB1 As HybridBody
    Set HB1 = HB.Add()
    
    Set oRootParams = oParams.RootParameterSet
    'Set oMainBody = oPart.MainBody '←ここ直した
     
    Call oParams.CreateSetOfParameters(HB1) '←ここ直した
    oPart.Update
End Sub

f:id:kandennti:20160404191257p:plain
確かに出来ます。 これが出来るのであれば
形状セット内の "パラメータ.2" の中にパラメータを作成したくなります。

Length型のパラメータを作成するコードを追加します。

'vba
Sub CATMain()
    ・・・
    Call oParams.CreateSetOfParameters(HB1) '←ここ直した
    
    Dim length1 As Length '←ここ追加
    Set length1 = oParams.CreateDimension("", "LENGTH", 100#) '←ここ追加
    
    oPart.Update
End Sub

実行するとこんな感じです。
f:id:kandennti:20160404191306p:plain
あれ? あぁ確かに "パラメータ.2" を指定していないから当然かぁ。
"パラメータ.2" を調べてみると "ParameterSet型" です。
f:id:kandennti:20160404191312p:plain
Parentプロパティが "パラメータ.2" の入っている "形状セット.1" なので
そちらを調べてみると
f:id:kandennti:20160404191318p:plain
"ParameterSet型"のものが見つからないんです。
他にも調べたのですが、Length型のパラメータが出来上がった "パラメータ" は
見つかるのですが、 "パラメータ.2" が、見つからないんです。

直接 "パラメータ.2" 内に作成できないのであれば、コピペで出来ないかな?
と思い、こんな風にしてみました。

'vba
Sub CATMain()
    ・・・
    Set length1 = oParams.CreateDimension("", "LENGTH", 100#) '←ここ追加
     
    'ここから
    Dim Sel As Selection: Set Sel = oDoc.Selection
    With Sel
        .Clear
        .Add length1
        .Copy
        .Clear
        .Add HB1
        .Paste
    End With
    'ここまでさらに追加
    
    oPart.Update
End Sub

実行してみると
f:id:kandennti:20160404191340p:plain
確かに "パラメータ.2" を指定していないからそうなるよなぁ。

じゃ "パラメータ.2" を名前で検索してコピペすれば良いと思い
こんな感じにしました。

'vba
Sub CATMain()
    ・・・
    Set length1 = oParams.CreateDimension("", "LENGTH", 100#) '←ここ追加
     
    'ここから
    Dim Sel As Selection: Set Sel = oDoc.Selection
    With Sel
        .Clear
        .Add length1
        .Copy
        .Clear
        .Search "Name='パラメータ.2',all" '←ここ変更
        .Paste
    End With
    'ここまでさらに追加
    
    oPart.Update
End Sub

そうすると、やっと望んでいる形になりました。
f:id:kandennti:20160404191350p:plain
いや、でも "パラメータ.2" の名前になるとは限らない。
それじゃ、タイプで検索しHitした最後の要素を取得しようと
思い、変更しました。

'vba
Sub CATMain()
    ・・・
    Set length1 = oParams.CreateDimension("", "LENGTH", 100#) '←ここ追加
     
    'ここから
    Dim Sel As Selection: Set Sel = oDoc.Selection
    With Sel
        .Clear
        .Add length1
        .Copy
        .Clear
        .Search "CATKnowledgeSearch.AdvisorParameterSet,all" '←さらに変更
        Dim ParSet As ParameterSet '←さらに変更
        Set ParSet = .Item(.Count2).Value '←さらに変更
        .Clear '←さらに変更
        .Add ParSet '←さらに変更
        .Paste
    End With
    'ここまでさらに追加
    
    oPart.Update
End Sub

もう既にコードがグチャグチャですが、結果はこちら
f:id:kandennti:20160404191350p:plain
名前の依存は無くなり、少し使い道が出来ました。
・・・のですが、出来上がった "長さ.2" のパラメータを取得する
方法が良くわからないんです。
パラメータとして最後に追加された要素なのだから、これで行けるかな?
と思ったのですが

'vba
    ・・・
    oPart.Update
    
    Dim Leng As Length '←さらにさらに追加
    Set Leng = oParams.Item(oParams.Count) '←さらにさらに追加
End Sub

これはダメなんです。 パラメータの最後の方は、パーツ番号等プロパティで
使用されるものが予約されている感じなんです。
"パラメータ.2" と同様に、タイプで検索しHitした最後の要素を取得しよう
と思ったのですが、タイプがわからないんです。

oParams.Itemをループし、最後にHitしたLength型が該当するのだろうと
思うのですが、面倒過ぎです。

CreateSetOfParameters関数は、マクロ実行後手動で作業する為の
ものなのだろうか・・・。


追記です。
トイレに行ったらこれで取得できる事を思い出しました。

'vba
Sub CATMain()
    Set oDoc = CATIA.ActiveDocument
    Set oPart = oDoc.Part

    Set oParams = oPart.Parameters
     
    Dim HB As HybridBodies
    Set HB = oPart.HybridBodies
     
    Dim HB1 As HybridBody
    Set HB1 = HB.Add()
     
    Call oParams.CreateSetOfParameters(HB1)
    
    Dim length1 As Length
    Set length1 = oParams.CreateDimension("", "LENGTH", 100#)
    
    Dim Sel As Selection: Set Sel = oDoc.Selection
    Dim Leng As Length
    With Sel
        .Clear
        .Add length1
        .Copy
        .Clear
        .Search "CATKnowledgeSearch.AdvisorParameterSet,all"
        Dim ParSet As ParameterSet
        Set ParSet = .Item(.Count2).Value
        .Clear
        .Add ParSet
        .Paste
        'よく考えたらコピペ後は選択状態なので、これで取得可能でした。
        Set Leng = .Item(1).Value
        .Clear
    End With
        
    oPart.Update
End Sub