CATPart内のワイヤー形状をCATDrawingに投影するマクロ|CATIAマクロの作成方法

今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。

件名 :3Dデータの図面化マクロの記事を希望します。

メッセージ本文 : 
今、標記記載のマクロを作れないかと奮闘しておりますが、分からず困っております。
やりたいことは、1つのCATPartに複数の形状セットがあり、その形状セット一つ一つをCATPart内にある座標系もしくは平面を使用し、正面視で一枚の図面に落としたいです。
平面と座標系の角度はイコールで、CATPart毎に角度が違ったりしています。
形状セットは基本的に数が決まっています。
形状セットの名前も図面に反映させることができましたら、それも記事にしていただけると嬉しいです。

上記内容を簡単にまとめると『CATPart内にある平面を正面視としたビューをCATDrawingに投影する』というものです。

手動操作では非常にシンプルな「投影」の処理ですが、VABで行うには少し難しい内容を理解する必要があります。ただ、1度内容を理解してしまえばどのような場合でもマクロでの投影が可能になります。

マクロでの投影が可能になると一括でビュー作成が行えるため作業効率は格段にUPされます。
かなり長めの内容となっていますが、実のある内容なのでぜひ最後までお付き合いください。

 

マクロの機能

今回作成したマクロはCATPart内のワイヤー形状をCATDrawingに投影するマクロです。
上画像のようにある程度データ構成に決まりがあるので、サンプルコードをそのまま使用する際は注意が必要です。(もちろんコード内容を少し書き換えれば、様々なデータ構成に対応できます)

具体的な機能は以下のとおりです。

 icon-wrench マクロの機能まとめ ・CATPart内にある形状セット「SHAPE」内にある形状をCATDrawingに投影する
・投影方向は形状セット「AXIS」内にある平面方向(座標系と平行関係の平面のみ対応)
・「SHAPE」内にセット分けされている形状セット別に投影する
   このとき形状セットの名前は投影する平面の名前が1番初めに含まれている必要がある
 (たとえば平面「A」の方向に投影する場合は「A-1」や「A-A」のように)
 平面の名前が形状セット名の1番初めに含まれていれば投影可能
 
データ構成
 ∟  座標系ノード
 |     ∟  座標系
 ∟  形状セット「AXIS」
 |     ∟  平面
 |     ∟  平面
 ∟  形状セット「SHAPE」
       ∟  形状セット
   |  ∟ 投影する形状(ワイヤー) 
       ∟  形状セット
   |  ∟ 投影する形状(ワイヤー)              

今回の内容はお問い合わせ頂いた内容をもとにテンプレのデータ構成が決まっています。

 

サンプルコード

マクロのコードは下記の通りです。
エラー処理をあまり行っていないため、予めご了承ください。

Option Explicit
Sub CATMain()

  'テンプレデータ設定
    Const hb_axis_name = "AXIS"           '平面の入った形状セット名を入力
    Const hb_shape_name = "SHAPE"         '投影形状の入った形状セット名を入力
    
    
  '各種オブジェクト定義
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim pt As Part
    Set pt = doc.Part
    
    Dim sel As Selection
    Set sel = doc.Selection
    sel.Clear
    
    Dim vps As VisPropertySet
    Set vps = sel.VisProperties
    
    
  '座標系取得
    Dim axs 'As AxisSystem
    Set axs = doc.Part.AxisSystems.Item(1)  '座標系ノード内にある1つ目の座標系を取得
    
    Dim XAxis(2), YAxis(2), ZAxis(2)
    Call axs.GetXAxis(XAxis)                '座標系のX座標成分を取得
    Call axs.GetYAxis(YAxis)                '座標系のY座標成分を取得
    Call axs.GetZAxis(ZAxis)                '座標系のZ座標成分を取得
    
    Dim tmpXdir1 As Double, tmpXdir2 As Double, tmpXdir3 As Double
    Dim tmpYdir1 As Double, tmpYdir2 As Double, tmpYdir3 As Double
    Dim tmpZdir1 As Double, tmpZdir2 As Double, tmpZdir3 As Double
    
    tmpXdir1 = Format(XAxis(0), "0.000")
    tmpXdir2 = Format(XAxis(1), "0.000")    '座標系のX座標成分を再取得
    tmpXdir3 = Format(XAxis(2), "0.000")    '取得した成分を有効数字0.000に変換
    
    tmpYdir1 = Format(YAxis(0), "0.000")
    tmpYdir2 = Format(YAxis(1), "0.000")    '座標系のY座標成分を再取得
    tmpYdir3 = Format(YAxis(2), "0.000")    '取得した成分を有効数字0.000に変換
    
    tmpZdir1 = Format(ZAxis(0), "0.000")
    tmpZdir2 = Format(ZAxis(1), "0.000")    '座標系のZ座標成分を再取得
    tmpZdir3 = Format(ZAxis(2), "0.000")    '取得した成分を有効数字0.000に変換
    
    
  'テンプレデータ構成になっているかを確認
    Dim i As Integer
    Dim chk1 As Boolean, chk2 As Boolean
    chk1 = False
    chk2 = False
    For i = 1 To pt.HybridBodies.Count
        If pt.HybridBodies.Item(i).Name = hb_axis_name Then
            chk1 = True
        ElseIf pt.HybridBodies.Item(i).Name = hb_shape_name Then
            chk2 = True
        End If
    Next i
    
    If Not (chk1 = True And chk2 = True) Then
        MsgBox "「" & hb_axis_name & "」、「" & hb_shape_name & "」という名称の形状セットが存在しません。" & vbLf & _
               "ツリー第1階層に該当の形状セットを作成して再度実行してください。"
        Exit Sub
    End If
    
    
  '形状セットを定義
    Dim hb_axis As HybridBody
    Set hb_axis = pt.HybridBodies.Item(hb_axis_name)
    
    Dim hb_shape As HybridBody
    Set hb_shape = pt.HybridBodies.Item(hb_shape_name)
    
    
  '形状セット内の平面をすべて取得
    Dim Planes As Collection
    Set Planes = New Collection
    
    For i = 1 To hb_axis.HybridShapes.Count
        If InStr(1, TypeName(hb_axis.HybridShapes.Item(i)), "HybridShapePlane") = 1 Then
            Planes.Add hb_axis.HybridShapes.Item(i)
        End If
    Next i
    
    
  '投影形状の入った形状セットをすべて非表示化
    For i = 1 To hb_shape.HybridBodies.Count
        sel.Add hb_shape.HybridBodies.Item(i)
    Next i
    vps.SetShow catVisPropertyNoShowAttr
    sel.Clear
    
    
  '新規CATDrawingを作成
    Dim drwdoc As DrawingDocument
    Set drwdoc = CATIA.Documents.Add("Drawing")
    
  'シート定義
    Dim sht As DrawingSheet
    Set sht = drwdoc.Sheets.ActiveSheet
    
    
  'ビュー作成 + ワイヤー投影
    sel.Add hb_shape
    vps.SetShow catVisPropertyShowAttr
    For i = 1 To hb_shape.HybridBodies.Count
    
    
        Dim hb As HybridBody
        Set hb = hb_shape.HybridBodies.Item(i)
    
    
      'Planes(コレクション)内にあるhbの投影方向となる平面を定義
        Dim pln 'As Plane
        Dim j As Integer
        For j = 1 To Planes.Count
            If InStr(1, hb.Name, Planes.Item(j).Name) = 1 Then
                Set pln = Planes.Item(j)
            End If
        Next j
        
        Dim FirstAxis(2), SecondAxis(2)
        Call pln.GetFirstAxis(FirstAxis)    '平面成分1を取得
        Call pln.GetSecondAxis(SecondAxis)  '平面成分2を取得
        
        Dim tmpFirstAxis1 As Double, tmpFirstAxis2 As Double, tmpFirstAxis3 As Double, _
        tmpSecondAxis1 As Double, tmpSecondAxis2 As Double, tmpSecondAxis3 As Double
        
        tmpFirstAxis1 = Format(FirstAxis(0), "0.000")
        tmpFirstAxis2 = Format(FirstAxis(1), "0.000")       '平面成分1を再取得
        tmpFirstAxis3 = Format(FirstAxis(2), "0.000")       '取得した成分を有効数字0.000に変換
        
        tmpSecondAxis1 = Format(SecondAxis(0), "0.000")
        tmpSecondAxis2 = Format(SecondAxis(1), "0.000")      '平面成分2を再取得
        tmpSecondAxis3 = Format(SecondAxis(2), "0.000")      '取得した成分を有効数字0.000に変換
        
        
      '投影する形状セットを表示
        sel.Clear
        sel.Add hb
        vps.SetShow catVisPropertyShowAttr
      
      
      'ビュー作成
        Dim vw_name As String
        vw_name = hb.Name
        
        Dim vw As DrawingView
        Set vw = sht.Views.Add(vw_name)
        
        
      'DrawingViewGenerativeBehavior定義
        Dim vgb As DrawingViewGenerativeBehavior
        Set vgb = vw.GenerativeBehavior
        
        Dim pro As Product
        Set pro = doc.GetItem(pt.Name)
       
        vgb.Document = pro
        
        
      '形状投影(座標系の方向別に条件分岐)
        If tmpXdir1 = tmpFirstAxis1 And tmpXdir2 = tmpFirstAxis2 And tmpXdir3 = tmpFirstAxis3 Then
        
          '座標系Z方向
            If tmpYdir1 = tmpSecondAxis1 And tmpYdir2 = tmpSecondAxis2 And tmpYdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), YAxis(0), YAxis(1), YAxis(2))
            ElseIf tmpZdir1 = tmpSecondAxis1 And tmpZdir2 = tmpSecondAxis2 And tmpZdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), YAxis(0), YAxis(1), YAxis(2))
            End If
        
        ElseIf tmpYdir1 = tmpFirstAxis1 And tmpYdir2 = tmpFirstAxis2 And tmpYdir3 = tmpFirstAxis3 Then
        
          '座標系X方向
            If tmpZdir1 = tmpSecondAxis1 And tmpZdir2 = tmpSecondAxis2 And tmpZdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(-YAxis(0), -YAxis(1), -YAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            ElseIf tmpXdir1 = tmpSecondAxis1 And tmpXdir2 = tmpSecondAxis2 And tmpXdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(YAxis(0), -YAxis(1), YAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            End If
        
        ElseIf tmpZdir1 = tmpFirstAxis1 And tmpZdir2 = tmpFirstAxis2 And tmpZdir3 = tmpFirstAxis3 Then
        
          '座標系Y方向
            If tmpXdir1 = tmpSecondAxis1 And tmpXdir2 = tmpSecondAxis2 And tmpXdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            ElseIf tmpYdir1 = tmpSecondAxis1 And tmpYdir2 = tmpSecondAxis2 And tmpYdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            End If
        
        End If
        
        
      'ビュープロパティ定義
        vw.X = 100 * i  'ビュー X座標
        vw.Y = 100      'ビュー X座標
        vw.[Scale] = 1  'ビュー スケール
        
        
      'ビュー更新
        Set vgb = vw.GenerativeBehavior
        vgb.Update
        
        
      '投影した形状セットを非表示
        sel.Add hb
        vps.SetShow catVisPropertyNoShowAttr
        
    Next i
    
    sht.Activate
    
    
  'シートを全表示(リフレーム)
    Dim win As Window
    Set win = CATIA.Windows.Item(CATIA.Windows.Count)
    
    Dim vwr As Viewer
    Set vwr = win.Viewers.Item(1)
    
    vwr.Reframe
    

End Sub

 

コード解説

テンプレデータ設定

  'テンプレデータ設定
    Const hb_axis_name = "AXIS"           '平面の入った形状セット名を入力
    Const hb_shape_name = "SHAPE"         '投影形状の入った形状セット名を入力

まず、データ構成の名前を定数で指定します。
ここで指定した名前かつツリー第1階層にある形状セットを取得しに行きます。
取得できない場合はエラーが発生するので注意しましょう。
  

各種オブジェクト定義

 '各種オブジェクト定義
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim pt As Part
    Set pt = doc.Part
    
    Dim sel As Selection
    Set sel = doc.Selection
    sel.Clear
    
    Dim vps As VisPropertySet
    Set vps = sel.VisProperties

各種オブジェクトを定義します。
VisPropertySetオブジェクトは形状を投影する際に、形状セットの表示/非表示を切り替えるために定義しておく必要があります。
  

座標系取得

  '座標系取得
    Dim axs 'As AxisSystem
    Set axs = doc.Part.AxisSystems.Item(1)  '座標系ノード内にある1つ目の座標系を取得
    
    Dim XAxis(2), YAxis(2), ZAxis(2)
    Call axs.GetXAxis(XAxis)                '座標系のX座標成分を取得
    Call axs.GetYAxis(YAxis)                '座標系のY座標成分を取得
    Call axs.GetZAxis(ZAxis)                '座標系のZ座標成分を取得
    
    Dim tmpXdir1 As Double, tmpXdir2 As Double, tmpXdir3 As Double
    Dim tmpYdir1 As Double, tmpYdir2 As Double, tmpYdir3 As Double
    Dim tmpZdir1 As Double, tmpZdir2 As Double, tmpZdir3 As Double
    
    tmpXdir1 = Format(XAxis(0), "0.000")
    tmpXdir2 = Format(XAxis(1), "0.000")    '座標系のX座標成分を再取得
    tmpXdir3 = Format(XAxis(2), "0.000")    '取得した成分を有効数字0.000に変換
    
    tmpYdir1 = Format(YAxis(0), "0.000")
    tmpYdir2 = Format(YAxis(1), "0.000")    '座標系のY座標成分を再取得
    tmpYdir3 = Format(YAxis(2), "0.000")    '取得した成分を有効数字0.000に変換
    
    tmpZdir1 = Format(ZAxis(0), "0.000")
    tmpZdir2 = Format(ZAxis(1), "0.000")    '座標系のZ座標成分を再取得
    tmpZdir3 = Format(ZAxis(2), "0.000")    '取得した成分を有効数字0.000に変換

つぎに座標系ノード内にある座標系を取得します。

座標系を取得したら「GetXAxisメソッド」「GetYAxisメソッド」「GetZAxisメソッド」を使い、各方向の成分を取得します。取得した方向成分はかなり細かいものとなっているため「Format関数」を使い、有効数字を小数点以下第3位になるように変換します。

この方向成分は、以降でビューを投影する際の方向として使用します。
 

テンプレデータ構成になっているかを確認 + 形状セットを定義

'テンプレデータ構成になっているかを確認
    Dim i As Integer
    Dim chk1 As Boolean, chk2 As Boolean
    chk1 = False
    chk2 = False
    For i = 1 To pt.HybridBodies.Count
        If pt.HybridBodies.Item(i).Name = hb_axis_name Then
            chk1 = True
        ElseIf pt.HybridBodies.Item(i).Name = hb_shape_name Then
            chk2 = True
        End If
    Next i
    
    If Not (chk1 = True And chk2 = True) Then
        MsgBox "「" & hb_axis_name & "」、「" & hb_shape_name & "」という名称の形状セットが存在しません。" & vbLf & _
               "ツリー第1階層に該当の形状セットを作成して再度実行してください。"
        Exit Sub
    End If

  '形状セットを定義
    Dim hb_axis As HybridBody
    Set hb_axis = pt.HybridBodies.Item(hb_axis_name)
    
    Dim hb_shape As HybridBody
    Set hb_shape = pt.HybridBodies.Item(hb_shape_name)

つぎに、初めに指定した名前の形状セットがあるかを確認します。
2つの形状セット(「AXIS」と「SHAPE」)が見つからなかった場合は、マクロが中断されます。

形状セットが見つかった場合は、それぞれを「hb_axis」「hb_shape」として定義します。
 

形状セット内の平面をすべて取得

  '形状セット内の平面をすべて取得
    Dim Planes As Collection
    Set Planes = New Collection
    
    For i = 1 To hb_axis.HybridShapes.Count
        If InStr(1, TypeName(hb_axis.HybridShapes.Item(i)), "HybridShapePlane") = 1 Then
            Planes.Add hb_axis.HybridShapes.Item(i)
        End If
    Next i

「hb_axis」内の平面をすべて取得します。
「Planes」というCollectionを作成し、平面をすべてここに格納しておきます。
 

投影形状の入った形状セットをすべて非表示化

  '投影形状の入った形状セットをすべて非表示化
    For i = 1 To hb_shape.HybridBodies.Count
        sel.Add hb_shape.HybridBodies.Item(i)
    Next i
    vps.SetShow catVisPropertyNoShowAttr
    sel.Clear

図面に投影する前処理として、「hb_shape」内の形状セットをすべて非表示にします。
以降では、ここで非表示にした形状セットを順に「表示→ビュー更新」といった処理を行います。
 

新規CATDrawingを作成 + シート定義

  '新規CATDrawingを作成
    Dim drwdoc As DrawingDocument
    Set drwdoc = CATIA.Documents.Add("Drawing")
    
  'シート定義
    Dim sht As DrawingSheet
    Set sht = drwdoc.Sheets.ActiveSheet

新規でCATDrawingを作成し、ドキュメントとシートを定義します。
 

ビュー作成 + ワイヤー投影

 'ビュー作成 + ワイヤー投影
    sel.Add hb_shape
    vps.SetShow catVisPropertyShowAttr
    For i = 1 To hb_shape.HybridBodies.Count
    
    
        Dim hb As HybridBody
        Set hb = hb_shape.HybridBodies.Item(i)
    
    
      'Planes(コレクション)内にあるhbの投影方向となる平面を定義
        Dim pln 'As Plane
        Dim j As Integer
        For j = 1 To Planes.Count
            If InStr(1, hb.Name, Planes.Item(j).Name) = 1 Then
                Set pln = Planes.Item(j)
            End If
        Next j
        
        Dim FirstAxis(2), SecondAxis(2)
        Call pln.GetFirstAxis(FirstAxis)    '平面成分1を取得
        Call pln.GetSecondAxis(SecondAxis)  '平面成分2を取得
        
        Dim tmpFirstAxis1 As Double, tmpFirstAxis2 As Double, tmpFirstAxis3 As Double, _
        tmpSecondAxis1 As Double, tmpSecondAxis2 As Double, tmpSecondAxis3 As Double
        
        tmpFirstAxis1 = Format(FirstAxis(0), "0.000")
        tmpFirstAxis2 = Format(FirstAxis(1), "0.000")       '平面成分1を再取得
        tmpFirstAxis3 = Format(FirstAxis(2), "0.000")       '取得した成分を有効数字0.000に変換
        
        tmpSecondAxis1 = Format(SecondAxis(0), "0.000")
        tmpSecondAxis2 = Format(SecondAxis(1), "0.000")      '平面成分2を再取得
        tmpSecondAxis3 = Format(SecondAxis(2), "0.000")      '取得した成分を有効数字0.000に変換
        
        
      '投影する形状セットを表示
        sel.Clear
        sel.Add hb
        vps.SetShow catVisPropertyShowAttr
      
      
      'ビュー作成
        Dim vw_name As String
        vw_name = hb.Name
        
        Dim vw As DrawingView
        Set vw = sht.Views.Add(vw_name)
        
        
      'DrawingViewGenerativeBehavior定義
        Dim vgb As DrawingViewGenerativeBehavior
        Set vgb = vw.GenerativeBehavior
        
        Dim pro As Product
        Set pro = doc.GetItem(pt.Name)
       
        vgb.Document = pro
        
        
      '形状投影(座標系の方向別に条件分岐)
        If tmpXdir1 = tmpFirstAxis1 And tmpXdir2 = tmpFirstAxis2 And tmpXdir3 = tmpFirstAxis3 Then
        
          '座標系Z方向
            If tmpYdir1 = tmpSecondAxis1 And tmpYdir2 = tmpSecondAxis2 And tmpYdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), YAxis(0), YAxis(1), YAxis(2))
            ElseIf tmpZdir1 = tmpSecondAxis1 And tmpZdir2 = tmpSecondAxis2 And tmpZdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), YAxis(0), YAxis(1), YAxis(2))
            End If
        
        ElseIf tmpYdir1 = tmpFirstAxis1 And tmpYdir2 = tmpFirstAxis2 And tmpYdir3 = tmpFirstAxis3 Then
        
          '座標系X方向
            If tmpZdir1 = tmpSecondAxis1 And tmpZdir2 = tmpSecondAxis2 And tmpZdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(-YAxis(0), -YAxis(1), -YAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            ElseIf tmpXdir1 = tmpSecondAxis1 And tmpXdir2 = tmpSecondAxis2 And tmpXdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(YAxis(0), -YAxis(1), YAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            End If
        
        ElseIf tmpZdir1 = tmpFirstAxis1 And tmpZdir2 = tmpFirstAxis2 And tmpZdir3 = tmpFirstAxis3 Then
        
          '座標系Y方向
            If tmpXdir1 = tmpSecondAxis1 And tmpXdir2 = tmpSecondAxis2 And tmpXdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            ElseIf tmpYdir1 = tmpSecondAxis1 And tmpYdir2 = tmpSecondAxis2 And tmpYdir3 = tmpSecondAxis3 Then
                Call vgb.DefineFrontView(XAxis(0), XAxis(1), XAxis(2), ZAxis(0), ZAxis(1), ZAxis(2))
            End If
        
        End If
        
        
      'ビュープロパティ定義
        vw.X = 100 * i  'ビュー X座標
        vw.Y = 100      'ビュー X座標
        vw.[Scale] = 1  'ビュー スケール
        
        
      'ビュー更新
        Set vgb = vw.GenerativeBehavior
        vgb.Update
        
        
      '投影した形状セットを非表示
        sel.Add hb
        vps.SetShow catVisPropertyNoShowAttr
        
    Next i
    
    sht.Activate

つぎにループ処理を使ってCATDrawingに形状を投影していきます。
ループ内処理がかなり長いため、コメント文である程度説明をしているので、ここでは簡単に処理内容を解説していきます。

処理内容としては下記の流れになっています。

① 投影方向となる平面の確認/取得
② ①で取得した平面の2成分(平面のH方向とV方向)を取得
③ 投影する形状セットを表示
④ ビュー作成
⑤ 座標系の成分と②で取得した成分より、投影方向を指定
⑥ ビューに形状を投影(⑤の方向)
⑦ ビュープロパティの指定(ビューの位置やスケールの指定)               
⑧ ビューの更新
⑨ 投影した形状セットを非表示

 
ここでは恐らく1番何をやっているかがわからないであろう⑤の処理内容を詳しく解説していきます。

まず大前提として、方向には「成分」というものがあります。
この成分は(X成分,Y成分,Z成分)の3つの成分あり、この3つの成分で1つの方向が表されます。
(※各成分は絶対座標系を基準とする成分です)

X方向を表すのであれば(1,0,0)、
Y方向を表すのであれば(0,1,0)、
Z方向を表すのであれば(0,0,1)と表すことができます。
  

つぎに平面について考えてみます。
平面は「H方向」「V方向」の2つの成分により定義されます。

つまり、H方向が(1,0,0)でV方向が(0,1,0)の場合、これはXY平面を表します。
平面の方向としてはZ方向[成分でいえば(0,0,1)]となります。
 

本コードでは上記で説明した座標系と平面の方向成分を取得しています。
この2つの成分を比較して、投影する方向を分岐させています。
これは単純に平面の成分で形状を投影すると、意図しない向きで投影されてしまうためです。

コード内の「形状投影(座標系の方向別に条件分岐)」のでは投影方向を指定していますが、投影方向を回転させたい場合はここの成分を変更する必要があります。(マイナスを付けたり、成分を変更したりします)
実際に成分内容を変更して、どのように投影方向が決められているのか調べて見ると理解が深まるのでぜひチャレンジしてみて下さい。
  

シートを全表示(リフレーム)

  'シートを全表示(リフレーム)
    Dim win As Window
    Set win = CATIA.Windows.Item(CATIA.Windows.Count)
    
    Dim vwr As Viewer
    Set vwr = win.Viewers.Item(1)
    
    vwr.Reframe
    

最後にシートを「全表示(リフレーム)」します。

新規作成したCATDrawingはカメラが原点に注視されています。
いちいちカメラをズームアウトするのも面倒なので、実装しているだけの機能であり、必須のものではありません。

 

まとめ

今回はCATPart内のワイヤー形状をCATDrawingに投影するマクロについての内容でした。

コードがかなり長く、また数学の知識(ベクトル関係)も多少必要になるもので、少し難しめの内容でした。ただ、今回の内容のマクロは実用性も高く、作業効率も格段に上げることのできるものなので、時間を割いてでも勉強する価値のあるものです。

今回のサンプルマクロを参考に、自分の好きな方向で形状を投影することのできるマクロが作れたら、図面投影関係のマクロは何でも作れるようになります。ぜひいろいろ試行錯誤して理解を深めていって下さい。

また、今回のコードが理解できて、断面図についても理解してみたい方は下記ページに挑戦してみて下さい。断面図を一括で作成するサンプルマクロです。(今回のマクロよりはるかに難しい内容になっています)

 

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

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

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