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

C#ATIA

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

InternalNameテスト

内容的にはショボイのですが、実績が少ないのでInternalNameの
テストを行いました。

まずはこんな感じのデータを作りました。
f:id:kandennti:20160412125338p:plain
点を5個作成しただけです。
続いてこんなコードを作成し実行します。

'vba
Sub InternalName_Test()
    Dim Doc As PartDocument
    Set Doc = CATIA.ActiveDocument
    
    Dim Pt As Part
    Set Pt = Doc.Part
    
    Dim HB As HybridBody
    Set HB = Pt.HybridBodies.Item(1)
    
    
    Dim Itm As AnyObject
    Dim ModE As ModelElement
    Debug.Print "*** DisplayName : InternalName ***"
    For Each Itm In HB.HybridShapes
        Set ModE = Itm.GetItem("ModelElement")
        Debug.Print ModE.DisplayName + " : " + ModE.InternalName
    Next
End Sub

形状セット内の要素のDisplayNameとInternalNameを表示させるだけです。
結果はこちら

*** DisplayName : InternalName ***
点.1 : GSMPoint.1
点.2 : GSMPoint.2
点.3 : GSMPoint.3
点.4 : GSMPoint.4
点.5 : GSMPoint.5


続いて、点.3を削除し再度マクロを実行します。
結果はこちら

*** DisplayName : InternalName ***
点.1 : GSMPoint.1
点.2 : GSMPoint.2
点.4 : GSMPoint.4
点.5 : GSMPoint.5

まぁこうなる事を期待してやりました。


このPartファイルをいったん保存し、ついでにCATIAも落とし
再度このファイルを開き、マクロを実行します。

*** DisplayName : InternalName ***
点.1 : GSMPoint.1
点.2 : GSMPoint.2
点.4 : GSMPoint.4
点.5 : GSMPoint.5

InternalNameが変更されていない事が確認できます。

さらにCATDUAを実行し、再度マクロを実行します。
(エラーは検知されませんでしたが)

*** DisplayName : InternalName ***
点.1 : GSMPoint.1
点.2 : GSMPoint.2
点.4 : GSMPoint.4
点.5 : GSMPoint.5

やっぱり変わりません。 InternalNameはオブジェクトの
インスタンスが作成(今回なら点が作成)された時点で割り当てられ
その後変更もされないようなので、同じファイル内であれば
同一オブジェクトだと判断しても良いようです。


続いてInternalNameからオブジェクトを取得したくなります。
・・・と言うより取得できないと、魅力半減です。
先程のPartファイルを利用し、こんなコードを作り実行しました。

'vba
Sub InternalName_Test2()
    Dim Doc As PartDocument
    Set Doc = CATIA.ActiveDocument
    
    Dim Pt As Part
    Set Pt = Doc.Part
    
    Dim InterName As String
    InterName = "GSMPoint.1" 'InternalName
    'InterName = "点.1" 'DisplayName
    
    Dim Oj As AnyObject
    Set Oj = Pt.FindObjectByName(InterName)
    
    Dim Sel As Selection
    Set Sel = Doc.Selection
    
    Sel.Clear
    Sel.Add Oj
    Sel.VisProperties.SetShow catVisPropertyNoShowAttr '非表示
    Sel.Clear
End Sub

結果はこちら
f:id:kandennti:20160412125347p:plain
非表示になりました。PartのFindObjectByName関数でオブジェクトを
取得できます。

これDisplayNameでも取得できるので、"点.2" の名前を
"GSMPoint.1" に変更し再度実行しました。
結果はこちら
f:id:kandennti:20160412125357p:plain

さらに意地悪く、リオーダーし"点.1" と "GSMPoint.1" を入れ替え
実行してみました。
f:id:kandennti:20160412125402p:plain
う~ん。 FindObjectByName関数は InternalName と DisplayName
のどちらを優先しているのかはわかりませんが、Treeの上のほうの
オブジェクトを優先しているようです。 確かGetItem関数もそんな感じ
だったような記憶です。