Excelの表から取得した値で点とテキストを作成するマクロ|CATIAマクロの作成方法

今回はマクロ案募集で頂いた内容です。
頂いた内容は以下のとおりです。

ワークベンチ: 
パートデザイン

マクロ案: 
予め準備した座標値(X,Y,Z)と文字を基に3D上に点を作成し、合わせて文字も同じ位置に配置する

今回はExcelの表から座標を取得し点を作成で紹介したコードを少し修正してサンプルマクロを作成しました。下記のようなExcelファイルを読み込ませ「点」と「テキスト」を作成します。

 

マクロの機能

今回作成したのはExcelの表から点とテキストを作成するマクロです。

Excelに書かれている「X座標」「Y座標」「Z座標」という文字を読み取って取得する列を指定しているわけではなく、「B列」「C列」「D列」の値を取得するという処理を行っています。

そのためExcelファイルの方で1行ずれて記入した場合、うまくマクロが作動しません。
Excelファイルが上図と同じテンプレであること前提のマクロとなっているため注意して下さい。
(※B列にX座標,C列にY座標,D列にZ座標 それぞれの座標値は2行目以降に記入されているものに限る)

マクロの機能をまとめると以下のとおりです。

 icon-wrench マクロの機能まとめ ・選択したExcelの表から座標値を取得し、CATIAで同座標位置に点を作成
・ExcelのE列に書かれている文字列をもとに、選択したビュー上にテキストを作成
    ※事前にビューを作成しておく必要あり
・作成する点の名前はExcelのA列に書かれている文字列
・作成した点はすべて新規作成される形状セットにまとまる
・形状セットはツリー第1階層に作成される
・新規形状セットの名前は選択したExcelのファイル名

 

サンプルコード

マクロのコードは下記のとおりです。
マクロを実行してまず始めに注釈セット内にある「ビュー」を選択します。
ここで選択したビュー上にすべてのテキストが作成されます。
※選択するビューは「XY平面」「YZ平面」「ZX平面」を基準としたビューを前提としています。
 ビューのサポートや角度等でうまく実行できない場合があるので注意して下さい。

ビュー選択後は「ファイルを開く」ウィンドウが立ち上がります。
ここで開いたExcelファイルの表を読み取りCATIA内で点を作成します。

Option Explicit
Sub CATMain()

 'アクティブドキュメント定義
    If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then
        MsgBox "CATPartに切り替えてからマクロを実行してください。"
        Exit Sub
    End If
    
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim pt As Part
    Set pt = doc.Part
    
 'Selection定義
    Dim sel 'As Selection
    Set sel = doc.Selection
    sel.Clear

 'TPSView定義
    Dim filter():       filter = Array("TPSView")
    Dim msg As String:  msg = "基準とするビューを選択して下さい。"
    
    Dim status As String
    status = sel.SelectElement2(filter, msg, False)
    If status <> "Normal" Then
        MsgBox "キャンセルしました。"
        End
    End If
    
    Dim tps As TPSView
    Set tps = sel.Item(1).Value
 
 '注釈セット定義
    Dim annSet As AnnotationSet
    If pt.AnnotationSets.Count = 0 Then
        Set annSet = pt.AnnotationSets.Add("")
    Else
        Set annSet = pt.AnnotationSets.Item(1)
    End If
    
 '選択されたTPSViewをアクティブに
    Dim i As Integer:       i = 1
    Dim tpsTmp As TPSView
    Do
        Set tpsTmp = annSet.TPSViews.Item(i)
        
        If tps.Name = tpsTmp.Name Then
            annSet.ActiveView = annSet.TPSViews.Item(i)
            Exit Do
        End If
        i = i + 1
    Loop
    
 'AnnotationFactory定義
    Dim annf As AnnotationFactory
    Set annf = annSet.AnnotationFactory
    
 'Excel定義
    Dim appExcel As Excel.Application
    Set appExcel = CreateObject("Excel.Application")
    
    Dim OpenFileName As String
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx")
    If OpenFileName <> "False" Then
        Dim wb As Workbook
        Set wb = Workbooks.Open(OpenFileName)
    Else
        MsgBox "キャンセルされました"
        Exit Sub
    End If
    
 'ワークシート定義
    Dim ws As Worksheet
    Set ws = wb.Sheets(1)
    
 '形状セット作成
    Dim hb As HybridBody
    Set hb = pt.HybridBodies.Add
    hb.Name = wb.Name
    
 'ワークシート最下行取得
    Dim MaxRow As Integer
    MaxRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To MaxRow
    
     'Excelから値を取得
        Dim PointName As String:    PointName = ws.Cells(i, 1).Value
        Dim Xvalue As Single:       Xvalue = ws.Cells(i, 2).Value
        Dim Yvalue As Single:       Yvalue = ws.Cells(i, 3).Value
        Dim Zvalue As Single:       Zvalue = ws.Cells(i, 4).Value
        Dim txt As String:          txt = ws.Cells(i, 5).Value
        
     '点作成
        Dim p As HybridShapePointCoord
        Set p = pt.HybridShapeFactory.AddNewPointCoord(Xvalue, Yvalue, Zvalue)
        hb.AppendHybridShape p
        
        p.Name = PointName
        pt.Update
     
     'UserSurface定義
        Dim pRef As Reference
        Set pRef = pt.CreateReferenceFromObject(p)
        
        Dim uSurf As UserSurface
        Set uSurf = pt.UserSurfaces.Generate(pRef)

     'アノテーション作成
        Dim ann As Annotation
        
        If tps.Name = "XYビュー" Then
            Set ann = annf.CreateEvoluateText(uSurf, Xvalue, Yvalue, 0, False)
        ElseIf tps.Name = "YZビュー" Then
            Set ann = annf.CreateEvoluateText(uSurf, -Yvalue, Zvalue, 0, False)
        ElseIf tps.Name = "ZXビュー" Then
            Set ann = annf.CreateEvoluateText(uSurf, Xvalue, Zvalue, 0, False)
        End If
        
        ann.Text.Text = txt
        ann.Name = txt
        
    Next i
    
    pt.Update
    wb.Close False
    
    MsgBox "完了しました。" & vbLf & tps.Name & "ビューを基準にテキストを配置しました。"

End Sub

 

コード解説

本マクロのコードを上から順に部分ごとにわけて解説していきます。
※コード内でもコメントで解説をしているのでそちらも参照ください。
 

アクティブドキュメントの定義

 'アクティブドキュメント定義
    If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then
        MsgBox "CATPartに切り替えてからマクロを実行してください。"
        Exit Sub
    End If
    
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim pt As Part
    Set pt = doc.Part

まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。

条件分岐の先、つまりはアクティブドキュメントがCATPartの場合は変数「doc」にアクティブドキュメントを代入します。

あわせてアクティブドキュメントのPartも変数「pt」に代入します。
  

TPSView定義

 'Selection定義
    Dim sel 'As Selection
    Set sel = doc.Selection
    sel.Clear

 'TPSView定義
    Dim filter():       filter = Array("TPSView")
    Dim msg As String:  msg = "基準とするビューを選択して下さい。"
    
    Dim status As String
    status = sel.SelectElement2(filter, msg, False)
    If status <> "Normal" Then
        MsgBox "キャンセルしました。"
        End
    End If
    
    Dim tps As TPSView
    Set tps = sel.Item(1).Value

次にユーザーが選択した注釈セット内のビュー(TPSViewオブジェクト)を定義します。
Selectionオブジェクト」の「SelectElement2メソッド」を使ってTPSViewを取得します。

基本的には定型文なので詳しくは上記リンクページを確認して下さい。SelectElement2メソッドを使うには「As Selection」と型を指定していると使えないので注意しましょう。 
 

注釈セット定義

'注釈セット定義
    Dim annSet As AnnotationSet
    If pt.AnnotationSets.Count = 0 Then
        Set annSet = pt.AnnotationSets.Add("")
    Else
        Set annSet = pt.AnnotationSets.Item(1)
    End If

次にユーザーが選択した注釈セットを定義します。
既に注釈セットがある場合はそれを、存在しない場合は新たに注釈セットを作成し「annSet」として定義します。 
 

選択されたTPSViewをアクティブに

 '選択されたTPSViewをアクティブに
    Dim i As Integer:       i = 1
    Dim tpsTmp As TPSView
    Do
        Set tpsTmp = annSet.TPSViews.Item(i)
        
        If tps.Name = tpsTmp.Name Then
            annSet.ActiveView = annSet.TPSViews.Item(i)
            Exit Do
        End If
        i = i + 1
    Loop

テキストはそのときアクティブ状態のビュー上に作成されるため、選択されたTPSViewをアクティブにします。アクティブビューの切り替えはAnnotationSetオブジェクトの「ActiveViewプロパティ」の中身を変更すれればOKです。

 icon-code TPSViewをアクティブに

AnnotationSetオブジェクト.ActiveView = TPSViewオブジェクト 

 
AnnotationFactory定義

 'AnnotationFactory定義
    Dim annf As AnnotationFactory
    Set annf = annSet.AnnotationFactory

次に「AnnotationFactory」を定義します。
これは「Factory」「HybridShapeFactory」と同じ部類のオブジェクトで、アノテーションやテキストを作成するために必要なオブジェクトです。
 

Excelの定義

 'Excel定義
    Dim appExcel As Excel.Application
    Set appExcel = CreateObject("Excel.Application")
    
    Dim OpenFileName As String
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx")
    If OpenFileName <> "False" Then
        Dim wb As Workbook
        Set wb = Workbooks.Open(OpenFileName)
    Else
        MsgBox "キャンセルされました"
        Exit Sub
    End If
    
 'ワークシート定義
    Dim ws As Worksheet
    Set ws = wb.Sheets(1)

CATIAマクロ上でExcel VBAを使用できるようにExcelを定義します。
上記コードでExcelが定義できない場合は、参照設定がされていない可能性があります
詳しくは下記ページの「Excelマクロのライブラリを読み込む」の項を一読ください。

 
Excelを定義後は「GetOpenFilenameメソッド」を使って、
出力元となるExcelファイル(ブック)をユーザーに選択させ、変数「wb」として代入します。

変数「wb」を定義したら、wbの1つ目のシートを変数「ws」に代入します。
このWSに書かれている座標値をもとに点が作成されます。
 

形状セットの作成

 '形状セット作成
    Dim hb As HybridBody
    Set hb = pt.HybridBodies.Add
    hb.Name = wb.Name

次に作成した点をひとまとめにするための形状セットを作成します。
形状セットの名前は「wb.Name」、つまり選択したExcelファイルと同じ名前にします。
 

座標の取得/点とテキストの作成

 'ワークシート最下行取得
    Dim MaxRow As Integer
    MaxRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To MaxRow
    
     'Excelから値を取得
        Dim PointName As String:    PointName = ws.Cells(i, 1).Value
        Dim Xvalue As Single:       Xvalue = ws.Cells(i, 2).Value
        Dim Yvalue As Single:       Yvalue = ws.Cells(i, 3).Value
        Dim Zvalue As Single:       Zvalue = ws.Cells(i, 4).Value
        Dim txt As String:          txt = ws.Cells(i, 5).Value
        
     '点作成
        Dim p As HybridShapePointCoord
        Set p = pt.HybridShapeFactory.AddNewPointCoord(Xvalue, Yvalue, Zvalue)
        hb.AppendHybridShape p
        
        p.Name = PointName
        pt.Update
     
     'UserSurface定義
        Dim pRef As Reference
        Set pRef = pt.CreateReferenceFromObject(p)
        
        Dim uSurf As UserSurface
        Set uSurf = pt.UserSurfaces.Generate(pRef)

     'アノテーション作成
        Dim ann As Annotation
        
        If tps.Name = "XYビュー" Then
            Set ann = annf.CreateEvoluateText(uSurf, Xvalue, Yvalue, 0, False)
        ElseIf tps.Name = "YZビュー" Then
            Set ann = annf.CreateEvoluateText(uSurf, -Yvalue, Zvalue, 0, False)
        ElseIf tps.Name = "ZXビュー" Then
            Set ann = annf.CreateEvoluateText(uSurf, Xvalue, Zvalue, 0, False)
        End If
        
        ann.Text.Text = txt
        ann.Name = txt
        
    Next i

座標を取得し、点を作成という処理を繰り返すためループ文を使います。

ここではテキストの作成についてのコード解説をしていきます。
(点の作成については「Excelの表から座標を取得し点を作成」のコード解説を参照下さい)

テキストに作成は「AnnotationFactory」の「CreateEvoluateTextメソッド」を使います。

 icon-code CreateEvoluateTextメソッド 

annf.CreateEvoluateText(ユーザーサーフェス, X座標, Y座標, Z座標, 矢印線の有無)

ユーザーサーフェスには、テキスト作成時に必要なオブジェクトをRefernceとして入力します。
今回のサンプルマクロの場合、このオブジェクトは「点」にあたります。

X座標, Y座標, Z座標にはテキストの座標を入力します。ただ、ここで入力する座標の絶対座標はアクティブ状態のビューによって変化するので注意しましょう。

矢印線の有無には「True」「False」のいずれかを入力します。
「True」の場合は矢印線(Leader)が作成されます。

テキストはビューによって作成方法が少しずつ違ってくるので、サンプルマクロでは「XY」「YZ」「ZX」と条件分けをして作成しています。この部分は自身の環境に合わせて書き換えて下さい。

 

まとめ

今回はExcelの表から取得した値で点とテキストを作成するマクロについての内容でした。

基本的にはExcelの表から座標を取得し点を作成で紹介した内容に「AnnotationFactory」の「CreateEvoluateTextメソッド」を使ってテキスト追加の処理をプラスしただけです。

注釈が絡むマクロは少し複雑なのでいろいろ試して徐々に理解していって下さい。

 

サンプルマクロ集に戻る
目次へ戻る

 

 CATIAマクロを本気で勉強するなら

2024年8月26日CATIA,CATIAマクロ