C#ATIA

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

左手系の座標系の存在チェック

当方加工屋のため、加工対象となる形状が製品基準ではなく
こちらの都合の良いように配置し、CAM側に投げる事が多々あります。
古いリリースでは、GSDにしか座標変換のコマンドが無かったのですが、
今はPartデザインにもあるため、イチイチ移動させ回転させ・・等
面倒な事はせず、座標変換を利用するのですが、うっかり座標系を
左手で作成してしまうと、本来の形状の対象形状になってしまいます。
(一度、客先に納品後 "これ反転形状じゃない?" と指摘された事が・・・)

基本的に右手しか使用しない為、ミス防止のためにPartファイル内の座標系
全てをチェックするマクロを以前作成しました。

'VBA 左手系座標軸の存在チェック
Sub AxisCheckStart()
    Dim ActiveDoc As Document
    Dim oPart As Part
    Dim msg As String
    Dim Leftmsg As String
    
    Set ActiveDoc = CATIA.ActiveDocument
    Set oPart = ActiveDoc.Part
    
    Dim oAxis As AxisSystem
    Dim Res As String
    msg = ""
    Leftmsg = "していません"
    
    For Each oAxis In oPart.AxisSystems
        msg = msg + oAxis.Name + " : "
        Res = RightOrLeft(oAxis)
        If Res Then
            msg = msg + "左手系座標軸" + vbCrLf
            Leftmsg = "しています!!"
        Else
            msg = msg + "右手系座標軸" + vbCrLf
        End If
    Next
    MsgBox ("左手系座標軸が存在" + Leftmsg + vbCrLf + vbCrLf + msg)
End Sub

Private Function RightOrLeft(ByVal axisSystem1) As Boolean
    Dim vectorXCoord(2)
    Dim vectorYCoord(2)
    Dim vectorZCoord(2)
    Dim outer(2) As Double
    Dim rightLeftCheck As Double
    
    axisSystem1.GetXAxis vectorXCoord
    axisSystem1.GetYAxis vectorYCoord
    axisSystem1.GetZAxis vectorZCoord
    
    ' X軸からY軸への外積を求める
    outer(0) = vectorXCoord(1) * vectorYCoord(2) - vectorXCoord(2) * vectorYCoord(1)
    outer(1) = vectorXCoord(2) * vectorYCoord(0) - vectorXCoord(0) * vectorYCoord(2)
    outer(2) = vectorXCoord(0) * vectorYCoord(1) - vectorXCoord(1) * vectorYCoord(0)
    
    ' 求めた外積とZ軸との内積を求める
    rightLeftCheck = vectorZCoord(0) * outer(0) + vectorZCoord(1) * outer(1) + vectorZCoord(2) * outer(2)
    
    ' 正負で判定
    If rightLeftCheck > 0 Then
        RightOrLeft = False ' "right"
    Else
        RightOrLeft = True ' "left"
    End If
End Function

以前、"Unofficial CATIA User Forum" で色々とアドバイスしてもらいました。
外積内積を利用する事で判断可能とのことです。
・・・もちろん、マクロを作成している暇がない為のつなぎです。