C#ATIA

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

ボディ - ボディ の最短距離の測定1

2要素間の測定をマクロで知りたい場合は、結構あるのではないかと思うの
ですが、"2要素間の測定" コマンドはマクロの記録が取れません。
"Unofficial CATIA User Forum"には、サンプルが有ったのですが、
無くなってしまった為、記載しておこうかと思います。

僕が知る限り、方法が2つあります。

式とパラメータを利用する方法

"式で距離を測定できる" 事さえ知っていれば、マクロの記録が取れるので
それ程難しくは無いかと思います。

'vba
Sub CATMain()
    Dim partDocument1 As PartDocument
    Set partDocument1 = CATIA.ActiveDocument
    
    Dim part1 As Part
    Set part1 = partDocument1.Part
    
    Dim BName1$
    BName1 = SelectItemName$("一つ目のボディを選択して下さい : [Esc]=キャンセル", Array("Body"))
    If Len(BName1) < 1 Then Exit Sub
    
    Dim BName2$
    BName2 = SelectItemName$("二つ目のボディを選択して下さい : [Esc]=キャンセル", Array("Body"))
    If Len(BName2) < 1 Then Exit Sub
    
    Dim parameters1 As Parameters
    Set parameters1 = part1.Parameters
    
    Dim length1 As Length
    Set length1 = parameters1.CreateDimension("", "LENGTH", 0#)
    
    Dim relations1 As Relations
    Set relations1 = part1.Relations
    
    Dim formula1 As Formula
    Set formula1 = relations1.CreateFormula("", "", length1, "distance(`" + BName1 + "`,`" + BName2 + "`)")

    MsgBox CStr(length1.Value) + "mm"

    '以下 式・パラメータ削除
    'Dim Sel As Selection
    'Set Sel = CATIA.ActiveDocument.Selection
    'With Sel
    '    .Clear
    '    .Add formula1
    '    .Add length1
    '    .Delete
    'End With
End Sub

'Bodyの選択
Private Function SelectItemName$(ByVal Msg$, ByVal Filter As Variant)
    Dim Sel As Variant: Set Sel = CATIA.ActiveDocument.Selection
    Sel.Clear
    Select Case Sel.SelectElement2(Filter, Msg, False)
        Case "Cancel", "Undo", "Redo"
            Exit Function
    End Select
    SelectItemName = Sel.Item(1).Value.Name
    Sel.Clear
End Function

実行した際の結果はこのような感じです。
f:id:kandennti:20160325131016p:plain
この方法の場合、式とパラメータが作成される為、数値だけ必要な場合は
ちょっと邪魔です。
コード内の "以下 式・パラメータ削除" 以下のコメント化している部分を
実行するようにすれば、これらの邪魔な要素を削除して終了できます。