CATPart内のワイヤー形状をCATDrawingに投影するマクロ|CATIAマクロの作成方法
今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
件名 :3Dデータの図面化マクロの記事を希望します。
メッセージ本文 :
今、標記記載のマクロを作れないかと奮闘しておりますが、分からず困っております。
やりたいことは、1つのCATPartに複数の形状セットがあり、その形状セット一つ一つをCATPart内にある座標系もしく は平面を使用し、正面視で一枚の図面に落としたいです。
平面と座標系の角度はイコールで、CATPart毎に角度が違ったりしています。
形状セットは基本的に数が決まっています。
形状セットの名前も図面に反映させることができましたら、それも記事にしていただけると嬉しいです。
上記内容を簡単にまとめると『CATPart内にある平面を正面視としたビューをCATDrawingに投影する』というものです。
手動操作では非常にシンプルな「投影」の処理ですが、VABで行うには少し難しい内容を理解する必要があります。ただ、1度内容を理解してしまえばどのような場合でもマクロでの投影が可能になります。
マクロでの投影が可能になると一括でビュー作成が行えるため作業効率は格段にUPされます。
かなり長めの内容となっていますが、実のある内容なのでぜひ最後までお付き合いください。
マクロの機能
今回作成したマクロはCATPart内のワイヤー形状をCATDrawingに投影するマクロです。
上画像のようにある程度データ構成に決まりがあるので、サンプルコードをそのまま使用する際は注意が必要です。(もちろんコード内容を少し書き換えれば、様々なデータ構成に対応できます)
具体的な機能は以下のとおりです。
・投影方向は形状セット「AXIS」内にある平面方向(座標系と平行関係の平面のみ対応)
・「SHAPE」内にセット分けされている形状セット別に投影する
このとき形状セットの名前は投影する平面の名前が1番初めに含まれている必要がある
(たとえば平面「A」の方向に投影する場合は「A-1」や「A-A」のように)
平面の名前が形状セット名の1番初めに含まれていれば投影可能
データ構成
∟ 座標系ノード
| ∟ 座標系
∟ 形状セット「AXIS」
| ∟ 平面
| ∟ 平面
∟ 形状セット「SHAPE」
∟ 形状セット
| ∟ 投影する形状(ワイヤー)
∟ 形状セット
| ∟ 投影する形状(ワイヤー)
今回の内容はお問い合わせ頂いた内容をもとにテンプレのデータ構成が決まっています。
サンプルコード
マクロのコードは下記の通りです。
エラー処理をあまり行っていないため、予めご了承ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
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 |
コード解説
テンプレデータ設定
1 2 3 |
'テンプレデータ設定 Const hb_axis_name = "AXIS" '平面の入った形状セット名を入力 Const hb_shape_name = "SHAPE" '投影形状の入った形状セット名を入力 |
まず、データ構成の名前を定数で指定します。
ここで指定した名前かつツリー第1階層にある形状セットを取得しに行きます。
取得できない場合はエラーが発生するので注意しましょう。
各種オブジェクト定義
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'各種オブジェクト定義 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オブジェクトは形状を投影する際に、形状セットの表示/非表示を切り替えるために定義しておく必要があります。
座標系取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'座標系取得 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位になるように変換します。
この方向成分は、以降でビューを投影する際の方向として使用します。
テンプレデータ構成になっているかを確認 + 形状セットを定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
'テンプレデータ構成になっているかを確認 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」として定義します。
形状セット内の平面をすべて取得
1 2 3 4 5 6 7 8 9 |
'形状セット内の平面をすべて取得 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を作成し、平面をすべてここに格納しておきます。
投影形状の入った形状セットをすべて非表示化
1 2 3 4 5 6 |
'投影形状の入った形状セットをすべて非表示化 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を作成 + シート定義
1 2 3 4 5 6 7 |
'新規CATDrawingを作成 Dim drwdoc As DrawingDocument Set drwdoc = CATIA.Documents.Add("Drawing") 'シート定義 Dim sht As DrawingSheet Set sht = drwdoc.Sheets.ActiveSheet |
新規でCATDrawingを作成し、ドキュメントとシートを定義します。
ビュー作成 + ワイヤー投影
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
'ビュー作成 + ワイヤー投影 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つの成分を比較して、投影する方向を分岐させています。
これは単純に平面の成分で形状を投影すると、意図しない向きで投影されてしまうためです。
コード内の「形状投影(座標系の方向別に条件分岐)」のでは投影方向を指定していますが、投影方向を回転させたい場合はここの成分を変更する必要があります。(マイナスを付けたり、成分を変更したりします)
実際に成分内容を変更して、どのように投影方向が決められているのか調べて見ると理解が深まるのでぜひチャレンジしてみて下さい。
シートを全表示(リフレーム)
1 2 3 4 5 6 7 8 |
'シートを全表示(リフレーム) 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に投影するマクロについての内容でした。
コードがかなり長く、また数学の知識(ベクトル関係)も多少必要になるもので、少し難しめの内容でした。ただ、今回の内容のマクロは実用性も高く、作業効率も格段に上げることのできるものなので、時間を割いてでも勉強する価値のあるものです。
今回のサンプルマクロを参考に、自分の好きな方向で形状を投影することのできるマクロが作れたら、図面投影関係のマクロは何でも作れるようになります。ぜひいろいろ試行錯誤して理解を深めていって下さい。
また、今回のコードが理解できて、断面図についても理解してみたい方は下記ページに挑戦してみて下さい。断面図を一括で作成するサンプルマクロです。(今回のマクロよりはるかに難しい内容になっています)