こちらの続きです
オフセット平面をリネーム - C#ATIA
imihitoさんから指摘された部分を修正し、座標系平面からの
オフセット平面も対応させました。
'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させちゃいます。
他の方は間違えませんかね?