溶接の長さとその合計をメッセージボックスで表示するマクロ|CATIAマクロの作成方法
今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
マクロで複数のsheetとViewに作図された溶接記号のテキストフィールドに記入されたテキストを検出して、“各部品の溶接の長さの合計値”をメッセージボックスに表示することは可能でしょうか?
[溶接記号]をVBAで操作するには「DrawingWeldingオブジェクト」を使います。
基本的にはテキスト部のみを取得し合計の長さを計算するだけですが、テキスト部は”文字列”と”数字”が混同しているのでうまいこと分けてあげる必要があります。
マクロの機能
今回作成したのは溶接の長さとその合計をメッセージボックスで表示するマクロです。
対象はアクティブドキュメント内の全ての [溶接記号]です。
表示/非表示、シート/ビューなどは関係なく、存在する全ての [溶接記号]が対象です。
具体的な機能は以下のとおりです。
・対象はアクティブドキュメント内の全ての [溶接記号]
(表示/非表示、シート/ビューなどは関係なく、存在する全ての溶接記号が対象)
・溶接記号のテキスト部が「X=000」のかたちのもの以外はカウントの対象外
(Xは部品名等の”文字列”、000には溶接の長さである”数値”がはいる)
・上記の数値部は「×」「+」を使った計算式も対応
基本的に条件分岐でいろいろ機能を分けているだけなので、自身の環境に合わない場合も大いにあります。サンプルコードはあくまでサンプルとしてコードを書き換えて対応してください。
サンプルコード
マクロのコードは以下のとおりです。
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 |
Option Explicit Sub CATMain() 'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "CATDrawingに切り替えて実行してください。" Exit Sub End If Dim doc As DrawingDocument Set doc = CATIA.ActiveDocument 'Selection定義 Dim sel As Selection Set sel = doc.Selection sel.Clear '溶接記号(DrawingWelding)をすべて取得 sel.Search ("ドラフティング.溶接記号,all") Dim welds As Collection Set welds = New Collection Dim i As Integer For i = 1 To sel.Count welds.Add sel.Item(i).Value Next sel.Clear '部品名/溶接長さをすべて取得 Dim partName() Dim arcLength() ReDim partName(welds.Count) ReDim arcLength(welds.Count) Dim x As Double Dim y As Double Dim z As Double Dim sum As Double: sum = 0 Dim msg As String Dim weld As DrawingWelding i = 1 For Each weld In welds '溶接テキスト取得 Dim txtRange As DrawingTextRange Set txtRange = weld.GetTextRange(catWeldingFieldThree) '溶接テキスト情報取得(テキストに「=」が含まれている場合) If InStr(txtRange.Text, "=") <> 0 Then partName(i) = Left(txtRange.Text, InStr(txtRange.Text, "=") - 1) arcLength(i) = Right(txtRange.Text, InStr(StrReverse(txtRange.Text), "=") - 1) 'テキストに「+」が含まれている場合 If InStr(arcLength(i), "+") <> 0 Then x = Left(arcLength(i), InStr(arcLength(i), "+") - 1) y = Right(arcLength(i), InStr(StrReverse(arcLength(i)), "+") - 1) z = Val(x) + Val(y) sum = sum + z 'テキストに「×」が含まれている場合 ElseIf InStr(arcLength(i), "×") <> 0 Then x = Left(arcLength(i), InStr(arcLength(i), "×") - 1) y = Right(arcLength(i), InStr(StrReverse(arcLength(i)), "×") - 1) z = Val(x) * Val(y) sum = sum + z Else sum = sum + Val(arcLength(i)) End If 'メッセージ文作成 If i = 1 Then msg = partName(i) + " = " + arcLength(i) Else msg = msg + vbLf + partName(i) + " = " + arcLength(i) End If End If i = i + 1 Next msg = msg + vbLf + vbLf + "合計 =" + Str(sum) MsgBox (msg) End Sub |
コード解説
アクティブドキュメント定義
1 2 3 4 5 6 7 8 9 |
'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "CATDrawingに切り替えて実行してください。" Exit Sub End If Dim doc As DrawingDocument Set doc = CATIA.ActiveDocument |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATDrawingでのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
つまり、アクティブドキュメントがCATDrawingの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
Selection定義
1 2 3 4 |
'Selection定義 Dim sel As Selection Set sel = doc.Selection sel.Clear |
アクティブドキュメントが定義できたら、そのドキュメント内のSelectionを定義します。
この時、念の為「Clearメソッド」で現在の選択を全て解除しておきます。
溶接記号(DrawingWelding)をすべて取得
1 2 3 4 5 6 7 8 9 10 11 |
'溶接記号(DrawingWelding)をすべて取得 sel.Search ("ドラフティング.溶接記号,all") Dim welds As Collection Set welds = New Collection Dim i As Integer For i = 1 To sel.Count welds.Add sel.Item(i).Value Next sel.Clear |
次にアクティブドキュメント内にある溶接記号(DrawingWelding)を全て取得します。
「welds」というコレクションを用意して、その中に格納していきます。
Selectionオブジェクトの「Searchメソッド」を使って、ドキュメント内の溶接記号を全て選択、選択状態のオブジェクトを全て「welds」に追加という処理を行うことで「welds」に全ての溶接記号が格納されます。
部品名/溶接長さをすべて取得
1 2 3 4 5 6 7 8 9 10 11 12 |
'部品名/溶接長さをすべて取得 Dim partName() '部品名格納用配列 Dim arcLength() '溶接長格納用配列 ReDim partName(welds.Count) ReDim arcLength(welds.Count) Dim x As Double '計算用変数1 Dim y As Double '計算用変数2 Dim z As Double '計算用変数3 Dim sum As Double: sum = 0 '合計値 Dim msg As String 'メッセージボックスの表示文 Dim weld As DrawingWelding |
次に部品名/溶接長さを取得するために変数をいくつか用意します。
各変数の用途は上記のコメント文のとおりです。
計算用の変数「x,y,z」は溶接の長さとして「10×2」や「15+15」のような計算式が書かれている場合に使うための変数です。
変数が用意できたら「welds」内ループを行い、メッセージボックスに表示するためのメッセージ(msg)を作成していきます。
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 |
i = 1 For Each weld In welds '溶接テキスト取得 Dim txtRange As DrawingTextRange Set txtRange = weld.GetTextRange(catWeldingFieldThree) '溶接テキスト情報取得(テキストに「=」が含まれている場合) If InStr(txtRange.Text, "=") <> 0 Then partName(i) = Left(txtRange.Text, InStr(txtRange.Text, "=") - 1) arcLength(i) = Right(txtRange.Text, InStr(StrReverse(txtRange.Text), "=") - 1) 'テキストに「+」が含まれている場合 If InStr(arcLength(i), "+") <> 0 Then x = Left(arcLength(i), InStr(arcLength(i), "+") - 1) y = Right(arcLength(i), InStr(StrReverse(arcLength(i)), "+") - 1) z = Val(x) + Val(y) sum = sum + z 'テキストに「×」が含まれている場合 ElseIf InStr(arcLength(i), "×") <> 0 Then x = Left(arcLength(i), InStr(arcLength(i), "×") - 1) y = Right(arcLength(i), InStr(StrReverse(arcLength(i)), "×") - 1) z = Val(x) * Val(y) sum = sum + z Else sum = sum + Val(arcLength(i)) End If 'メッセージ文作成 If i = 1 Then msg = partName(i) + " = " + arcLength(i) Else msg = msg + vbLf + partName(i) + " = " + arcLength(i) End If End If i = i + 1 Next |
溶接記号のテキスト部にアクセスするには「weld.GetTextRange(catWeldingFieldThree)」というコードになります。(詳しくはDrawingWeldingオブジェクトページ参照)
あとは取得したテキストの値別に処理を分岐させます。
分岐の内容は上記のコメント文を見ればわかると思います。
取得した部品名と溶接の長さは「partName()」と「arcLength()」のなかに格納していきます。
ループの最後に格納した部品名と溶接の長さを使って、msg内に表示させたいメッセージになるようなかたちで入れ込んでいきます。
各部品の部品名と溶接の長さをmsg内に入れたら、最後に合計値も入れ込みます。
あとはこれまでに作成したメッセージをMsgBox関数で表示させる処理を追加すれば完成です。
1 2 3 |
msg = msg + vbLf + vbLf + "合計 =" + Str(sum) MsgBox (msg) |
まとめ
今回は溶接の長さとその合計をメッセージボックスで表示するマクロについての内容でした。
処理としては何か新しいものを作るわけでも操作するわけでもなく、存在しているオブジェクトから情報を抜き出しメッセージとして表示させているだけです。
テキスト部が”文字列”と”数字”が混同していて、それらを分別するための処理で複雑そうに見えているだけで、詳しくみていけば大した処理は行っていません。
大まかな処理の内容さえ理解できれば、自身の環境に合わせたマクロに書き換えることができるはずなので、いろいろ試してみてください。