C#ATIA

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

3Dの文字モデリングマクロ4

こちらの続きです。
3Dの文字モデリングマクロ3 - C#ATIA

最初に全体像をお伝えすべきでした。このような感じです。
f:id:kandennti:20150708100823p:plain
モジュールが1個とクラスが6個で構成されています。
現状、「Text3D_Start」モジュールと「Text3DStringContainer」クラスが
未完成な状態です。


続いてCATIAの要素を保持するText3DObjRefClassクラスです。

'text3D VBA
'Text3DObjRefClass
Option Explicit

Private mObj As AnyObject
Private mSelRef As Reference
Private mBrapRef As Reference
Private mObjRef As Reference

Property Let Obj(O As AnyObject)
    Set mObj = O
    On Error Resume Next
        Set mObjRef = WorkDoc.Part.CreateReferenceFromObject(Obj)
    On Error GoTo 0
End Property

Property Get Obj() As AnyObject
    Set Obj = mObj
End Property

Property Let SelRef(R As Reference)
    Set mSelRef = R
End Property

Property Get SelRef() As Reference
    Set SelRef = mSelRef
End Property

Property Let BrapRef(R As Reference)
    Set mBrapRef = R
End Property

Property Get BrapRef() As Reference
    Set BrapRef = mBrapRef
End Property

Property Get ObjRef() As Reference
    Set ObjRef = mObjRef
End Property

・Objプロパティはオブジェクト(AnyObjectとして)を保持しています。
・SelRefプロパティはSelection.Item(1).Referenceで取得できる
 Referenceを保持します。
・BrapRefプロパティはBrapNameでのReferenceを保持します。
 こちらで行った方法のヤツです。
SelectElementからReferenceの取得 - C#ATIA
・ObjRefプロパティはPartクラスのCreateReferenceFromObjectメソッド
 で取得したReferenceを保持します。
Referenceを3種類も同時に保持するわけではないのですが、
色々なコマンドや処理によりエラーを回避する為のReferenceのタイプが
異なっていた為の苦肉の策です。


次は、辞書ファイル(フォントファイル)で読み込んだ要素(文字の輪郭となるサーフェス)を
保持するText3DFontClassクラスです。

'text3D VBA
'Text3DFontClass
Option Explicit

Private mItem As AnyObject
Private mChar As String
Private mWidth As Double

Function SetFont(Surf As AnyObject) As Boolean
    Dim str
    str = Split(Surf.Name, " ")
    If UBound(str) <> 1 Then
        SetFont = False
        Exit Function
    End If
    Set mItem = Surf
    mChar = str(0)
    mWidth = CDbl(str(1))
    SetFont = True
End Function

Property Get Item() As AnyObject
    Set Item = mItem
End Property

Property Get Char() As String
    Char = mChar
End Property

Property Get Width() As Double
    Width = mWidth
End Property

フォント輪郭の元となるサーフェスと、サーフェスの名称から該当する文字名と
文字の幅を保持しています。


次に実際に3DTextとして配置される文字の輪郭等を保持する
Text3DCharClassクラスです。

'text3D VBA
'Text3DCharClass
Option Explicit

Private mChar As String
Private mFont As Text3DFontClass
Private mWidth As Double
Private mDistance As Double '始点からの距離
Private mAxis As Text3DObjRefClass
Private mBaseFont As Text3DObjRefClass 'コピペされたフォント
Private mResultFont As Text3DObjRefClass '配置スケールされたフォント
Private mBoundary As Text3DObjRefClass '配置後のフォント輪郭
Private mCanUseClass As Boolean

Private Sub Class_Initialize()
    mCanUseClass = True
End Sub

Property Get CanUseClass() As Double
    CanUseClass = mCanUseClass
End Property

Property Let Char(S As String)
    mChar = S
    Call SetFont(Char)
End Property

Property Get Char() As String
    Char = mChar
End Property

Property Let Width(W As Double)
    mWidth = W
End Property

Property Get Width() As Double
    Width = mWidth
End Property

Property Let Distance(D As Double)
    mDistance = D
End Property

Property Get Distance() As Double
    Distance = mDistance
End Property

Property Let Axis(A As Text3DObjRefClass)
    Set mAxis = A
End Property

Property Get Axis() As Text3DObjRefClass
    Set Axis = mAxis
End Property

Property Let BaseFont(F As Text3DObjRefClass)
    Set mBaseFont = F
End Property

Property Get BaseFont() As Text3DObjRefClass
    Set BaseFont = mBaseFont
End Property

Property Let ResultFont(F As Text3DObjRefClass)
    Set mResultFont = F
End Property

Property Get ResultFont() As Text3DObjRefClass
    Set ResultFont = mResultFont
End Property

Private Sub SetFont(S As String)
    If FontData.Exists(S) Then
        Set mFont = FontData.Item(S)
        mWidth = FontData.Item(S).Width
        mCanUseClass = True
    Else
        'Fontが無い場合はスペースとして扱う
        mCanUseClass = False
    End If
End Sub

Property Let Boundary(F As Text3DObjRefClass)
    Set mBoundary = F
End Property

Property Get Boundary() As Text3DObjRefClass
    Set Boundary = mBoundary
End Property

オリジナルコードと同様、文字の配置位置・向きを算出後、
文字サーフェスの座標変換・スケーリングした後、フォントのアウトラインを
境界で取得している為、それら1文字分の関連情報を保持しています。