C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

オフセット平面をリネーム2

こちらの続きです
オフセット平面をリネーム - C#ATIA

imihitoさんから指摘された部分を修正し、座標系平面からの
オフセット平面も対応させました。

f:id:kandennti:20180427095941p:plain

'vba Part_OffsetPleneRename_ver0.0.2  using-'KCL0.0.12'  by Kantoku
Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("PartDocument,ProductDocument") Then Exit Sub
    
    Dim Msg As String
    Msg = "オフセット平面を選択して下さい : ESCキー 終了"
    Dim Pln As Plane
    Dim NewName As String
    Do
        Set Pln = KCL.SelectItem(Msg, "Plane")
        If Pln Is Nothing Then Exit Do
        
        'オフセット平面以外を除去
        If Not (TypeOf Pln Is HybridShapePlaneOffset) Then
            MsgBox "指定面はオフセット平面ではありません"
            GoTo Continue
        End If
        
        '参照毎にリネーム名取得
        If InStr(Pln.Plane.DisplayName, "RSur:") > 0 Then
            '座標系の可能性
            NewName = GetAxisPlaneName(Pln)
            If Len(NewName) < 1 Then
                MsgBox "参照面が平面ではありません"
                GoTo Continue
            End If
        Else
            '純粋な平面
            NewName = GetPlaneName(Pln.Plane)
        End If
        
        'リネーム
        With Pln
            .Name = NewName & _
                    Num2Str(.Offset.Value * .Orientation)
        End With
Continue:
    Loop
End Sub

'参照元座標系時の新たな平面名取得
Private Function GetAxisPlaneName(ByVal Pln As Plane) As String
    GetAxisPlaneName = vbNullString
    
    Dim info As Variant
    info = GetBrepInfo(Pln.Plane.DisplayName)
    
    Dim pt As Part
    Set pt = KCL.GetParent_Of_T(Pln, "Part")
    
    Dim inter As String
    Dim ax As AxisSystem
    Dim hit As AxisSystem: Set hit = Nothing
    
    For Each ax In pt.AxisSystems
        inter = KCL.GetInternalName(ax)
        If inter = info(0) Then
            Set hit = ax
            Exit For
        End If
    Next
    If hit Is Nothing Then Exit Function
    
    Dim direction As String
    Select Case info(1)
        Case 1 'XY平面
            direction = "Z"
        Case 2 'YZ平面
            direction = "X"
        Case 3 'ZX平面
            direction = "Y"
        Case Else
            '多分無いはず。止まったら連絡下さい
            Stop
    End Select
    GetAxisPlaneName = hit.Name & "_" & direction & "="
End Function

'BrapNameから参照情報取得
Private Function GetBrepInfo(ByVal BrepName As String) As Variant
    Dim tmp As Variant
    tmp = Split(BrepName, "RSur:(Face:(Brp:(")
    tmp = Split(tmp(1), ")")
    GetBrepInfo = Split(tmp(0), ";")
End Function

'数値を+-付きの文字にする
Private Function Num2Str(ByVal Num As Double) As String
    Num2Str = IIf(Num > 0, "+", "") & CStr(Num)
End Function
 
'新たな平面名取得
Private Function GetPlaneName(ByVal RefPlnName As Reference) As String
    Select Case RefPlnName.DisplayName
        Case "xy plane", "XY平面"
            GetPlaneName = "Z="
        Case "yz plane", "YZ平面"
            GetPlaneName = "X="
        Case "zx plane", "ZX平面"
            GetPlaneName = "Y="
        Case Else
            GetPlaneName = RefPlnName.DisplayName
    End Select
End Function

座標系平面からのオフセット平面の場合、参照元がBrepNameなReferenceと
なってしまいわかり難いのですが、こちらの経験から
参照元のInternalNameが記載されているのは、何となく感じています。
座標系からXY,YZ,ZXの各平面のリファレンスを取得2(InternalName) - C#ATIA

それをGetBrepInfo関数で行っているのですが・・・。
文字列操作が結構苦手なんです。Midで何文字目とか、+1したりとか。
いつも間違えちゃうので、大体Splitさせちゃいます。
他の方は間違えませんかね?