こちらの続きです。
3Dの文字モデリングマクロ3 - C#ATIA
最初に全体像をお伝えすべきでした。このような感じです。
モジュールが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文字分の関連情報を保持しています。