C#ATIA

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

イナーシャの取得

イナーシャが欲しいのですが、ササっと検索してもProductばかり見つかったのですが
だったのですが、サーフェスで欲しいです。

結局、全部入りのサイトがありました。
Measuring Mass and Inertia | CATIA V5 Automation

消えてしまうと困るので、お借りする。
まず単位はこちら。

メートル法っぽいです。

で、
Product(Partも) : GetTechnologicalObject
Body(形状セットも) : SPAWorkbench.Inertias.Add
で、サーフェスは直接の方法が無い様なのですが、新規の形状セットに
突っ込んで、形状セットのイナーシャで大丈夫だよ と
記載されている気がします。

そこで、好みな部分も有ってこんな感じにしてみました。

'イナーシャの取得
'''param:surf-対象サーフェス
'''return:array(Inertia, HybridBody) - 失敗:empty
private Function get_surf_inertia( _
    Byval surf As HybridShape) As variant

    set get_surf_inertia = empty

    If surf Is Nothing Then exit function

    dim pt As Part
    set pt = get_parent_of_T(surf, "Part")

    Dim objRef As Reference
    Set objRef = pt.CreateReferenceFromObject(surf)

    Dim intType As Integer
    intType = pt.HybridShapeFactory.GetGeometricalFeatureType(objRef)

    If intType = 5 Then exit function

    Dim geoSet As HybridBody
    Set geoSet = pt.HybridBodies.Add
    geoSet.Name = "Temp_ForInertiaMeasure"

    Dim objJoin As HybridShapeAssemble
    Set objJoin = pt.HybridShapeFactory.AddNewJoin(objRef, objRef)
    objJoin.RemoveElement 2
    pt.UpdateObject objJoin

    geoSet.AppendHybridShape objJoin

    On Error Resume Next

    Dim objSPAWorkbench As Workbench
    Set objSPAWorkbench = pt.Parent.GetWorkbench("SPAWorkbench")

    Dim objInertia As Inertia
    Set objInertia = objSPAWorkbench.Inertias.Add(geoSet)

    On Error GoTo 0

    if objInertia is nothing then exit function

    get_surf_inertia = array(objInertia, geoSet)

End Function


'指定した型をParentから取得 - typenameで取得出来るもので
'''param:aoj-対象要素
'''param:T-目的の型名
'''return:AnyObject - 失敗:Nothing
private Function get_parent_of_T( _
    ByVal aoj As AnyObject, _
    ByVal T As String) _
    As AnyObject

    Dim aojName As String
    Dim parentName As String
    
    On Error Resume Next
        Set aoj = as_dispath(aoj)
        aojName = aoj.name
        parentName = aoj.Parent.name
    On Error GoTo 0

    If TypeName(aoj) = TypeName(aoj.Parent) And _
            aojName = parentName Then
        Set get_parent_of_T = Nothing
        Exit Function
    End If
    If TypeName(aoj) = T Then
        Set get_parent_of_T = aoj
    Else
        Set get_parent_of_T = get_parent_of_T(aoj.Parent, T)
    End If

End Function


'ディスパッチ
'''param:o-対象要素
'''param:T-目的の型名
'''return:CATBaseDispatch
Private Function as_dispath( _
    byval o As INFITF.CATBaseDispatch) As INFITF.CATBaseDispatch

    Set as_dispath = o

End Function

関数だけなので動かないですし、VSCodeで書いただけで動かしていないので
間違っている可能性が大。