C#ATIA

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

選択した円弧の長さを表示2

こちらの続きです。
選択した円弧の長さを表示1 - C#ATIA

もう一つ方法があり、パラメータと式を利用した方法です。

'vba  test_Circle_Length_Formula
'using-'KCL0.0.10'
'円弧の長さを表示-式利用

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("PartDocument") Then Exit Sub
    
    '選択
    Dim msg$: msg = "円弧を選択して下さい : ESCキー 終了"
    Dim Elem As SelectedElement
    Dim Pt As Part
    Dim Ref As Reference
    Do
        Set Elem = KCL.SelectElement(msg, "HybridShape")
        If KCL.IsNothing(Elem) Then Exit Do
        Set Pt = Elem.Document.Part
        Set Ref = Elem.Reference
        If IsCircle(Ref, Pt.HybridShapeFactory) Then
            MsgBox "円弧長さは" & GetLength_Formula(Ref, Pt) & "mmです"
        Else
            MsgBox "円弧を選択してください"
        End If
    Loop
End Sub

Private Function GetLength_Formula#(ByVal Ref As Reference, ByVal Pt As Part)
    'パラメータ作成
    Dim length As length
    Set length = Pt.Parameters.CreateDimension("", "LENGTH", 0#)

    '式を作成する為の名前を取得
    Dim CorrectName$: CorrectName = Pt.Parameters.GetNameToUseInRelation(Ref)
    
    '式作成
    Dim formula As formula
    Set formula = Pt.Relations.CreateFormula("AutomaticNaming", "", length, "length(" & CorrectName & " ) ")
    
    '長さ取得
    GetLength_Formula = length.Value
    
    '要らない物削除
    Dim Sel As Selection
    Set Sel = Pt.Parent.Selection
    With Sel
        .Clear
        .Add formula
        .Add length
        .Delete
    End With
End Function

'円弧の判断
Private Function IsCircle(ByVal Ref As Reference, ByVal Fact As HybridShapeFactory) As Boolean
    Dim GeoType&: GeoType = Fact.GetGeometricalFeatureType(Ref)
    'AutomationManualの記述が間違えやすいが、
    '4-Circle になる
    IsCircle = IIf(GeoType = 4, True, False)
End Function

こちらは、一時的に長さのパラメータと式を作成。 値を取得後、パラメータと式を削除しており、
使い勝手としては悪い上、恐らく遅いです。

このサンプルをUpしたのは、これ自体が目的ではないんです。
僕にしてはコメント多めに入れた "GetLength_Formula" 関数をご覧下さい。

手動で式を作る際には、こんな感じになります。
f:id:kandennti:20170412181108p:plain
実は赤印部分が問題なんです。
オブジェクトの名前やリファレンスのディスプレイネームでは "円.1" としか取得出来ませんが、
式として(上記画像の場合)必要なのは、"`形状セット.1\円.1`" なんです。
しかも前後に記載されているシングルクォーテーションの有無は、オプションの設定で
変更が可能な為、非常にややこしいのが本音です。

その為に、式に必要な名称を取得する関数が用意されています。

    '式を作成する為の名前を取得
    Dim CorrectName$: CorrectName = Pt.Parameters.GetNameToUseInRelation(Ref)

実はかなり以前に、こちらで知ったんですが・・・
Developing proper names to use in product relations | CATIA V5 Automation
今回は式に利用していますが、"どこの形状セット等に所属している要素か?"
と言う利用方法もあるかと思います。


又、こちらは式を作成している部分です。

    '式作成
    Dim formula As formula
    Set formula = Pt.Relations.CreateFormula("AutomaticNaming", "", length, "length(" & CorrectName & " ) ")

式を作成する際、第一引数に必ず式の名前を文字列として渡す必要があります。
試したところ、重複した名前でもエラーにはならないようですが、後々の作業で
同じ式が存在したままだと混乱するかも知れません。
この様な場合 "AutomaticNaming" を第一引数にすることで、CATIA自身が自動的な
名前を付けるようになっているようです。
・・・と書いたのですが、長さ0の文字列を渡しても同じでした。

CATIAのマクロで、インスタンスを作成する際に名前を引数で渡さなければならないものが
幾つかあるようなのですが、恐らくそのような場合に利用できるかと思います。

説明していませんが、こちらのサンプルでもDrawのディテールシートを新規に作成する際
"AutomaticNaming" を利用しています。
指定した2D要素を、指定した原点位置でコピペする - C#ATIA