こちらの続きです。
選択した円弧の長さを表示1 - C#ATIA
もう一つ方法があり、パラメータと式を利用した方法です。
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)
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