こちらの続きです。
選択した円弧の長さを表示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" 関数をご覧下さい。
手動で式を作る際には、こんな感じになります。
実は赤印部分が問題なんです。
オブジェクトの名前やリファレンスのディスプレイネームでは "円.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