任意のオフセットの値を一括で変更するマクロ|CATIAマクロの作成方法
今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
左のツリー上にある特定の名称が入ったコマンドの中に
含まれてるパラメータを一気に変更するマクロは可能でしょうか?左のツリー上には、その特定の名称が一個だけではなく、いくつも ある前提となります。 ①特定の名称はナンバー管理したいです。(例:1111、2222等) ※理想は上記のナンバーに加えて、他の言葉も名称にいれたいと思ってます。
同じ名前だと変更が出来ず、〜. 名前を変更となってしまうからです。
(例:1111のオフセット_1、1111のオフセット_2) ②よく使うコマンドについてですが、オフセットです。パラメータはオフセットの1つで単体です。複数になることはないです。
お問い合わせ頂いた内容を簡単にまとめると
「”特定のナンバー”が名称に含まれるオフセットの値を変更する」ということだと思います。
ここではナンバーではなく名称に「オフセット」という文字列が含まれるオフセットの値を一括で変換するマクロとしています。日本語環境で作成したオフセットはデフォルトで「オフセット.X」という名称が付くので、つまりは名称が変更されていない全てのオフセットの値を変更するマクロということです。
サンプルコード内の「オフセット」という部分を「1111」や「2222」とすれば、それらのナンバーが名称に含まれているオフセットの値を全て変更することが可能になります。
マクロの機能
今回作成したのは名称に「オフセット」という文字列が含まれるオフセットの値を一括で変換するマクロです。「オフセット」(全角)や「Offset」という文字列が含まれていてもそれらのオフセット値は変換されず、あくまでも「オフセット」(半角)という文字列が含まれているオフセット値のみが変更されます。
具体的な機能は以下のとおりです。
・オフセット値はインプットボックスでユーザーが任意で変更可能
・オフセットできない場合もパラメータの値は変更される(エラー発生)
サンプルコード
マクロのコードは以下のとおりです。
簡単なエラー処理しかしていないため、任意でエラー処理を追加して下さい。
現状だと入力された値でオフセットができない場合、入力された値が数字でない場合などにエラーが発生するので注意してください。
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 |
Option Explicit Sub CATMain() 'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument Set doc = CATIA.ActiveDocument 'Part定義 Dim pt As Part Set pt = doc.Part 'Selection定義 Dim sel As Selection Set sel = doc.Selection sel.Clear 'ドキュメント内のオフセットを全て取得 Dim offsets As Collection Set offsets = New Collection sel.Search ("ジェネレーティブ・シェイプ・デザイン.オフセット,all") If sel.Count = 0 Then MsgBox "ドキュメント内にオフセットが存在しません。" Exit Sub End If Dim i As Integer For i = 1 To sel.Count offsets.Add sel.Item(i).Value Next i sel.Clear '変更後のオフセット値取得 Dim res As String res = InputBox("変更後のオフセット値を入力して下さい。") If res = "" Then Exit Sub 'オフセットのパラメ-タ変更 Dim offset As HybridShapeOffset For Each offset In offsets Dim key As String key = "オフセット" If InStr(1, offset.Name, key) <> 0 Then offset.OffsetValue.Value = res End If Next pt.Update End Sub |
コード解説
ドキュメント/パーツの定義
1 2 3 4 5 6 7 8 9 |
'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument Set doc = CATIA.ActiveDocument |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
つまり、アクティブドキュメントがCATPartの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたらあわせてPartオブジェクトも定義します。
Part/Selection定義
1 2 3 4 5 6 7 8 |
'Part定義 Dim pt As Part Set pt = doc.Part 'Selection定義 Dim sel As Selection Set sel = doc.Selection sel.Clear |
アクティブドキュメントが定義できたら、そのドキュメント内のPartとSelectionを定義します。
ドキュメント内のオフセットを全て取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'ドキュメント内のオフセットを全て取得 Dim offsets As Collection Set offsets = New Collection sel.Search ("ジェネレーティブ・シェイプ・デザイン.オフセット,all") If sel.Count = 0 Then MsgBox "ドキュメント内にオフセットが存在しません。" Exit Sub End If Dim i As Integer For i = 1 To sel.Count offsets.Add sel.Item(i).Value Next i sel.Clear |
次にアクティブドキュメント内にある”オフセット”を全て取得します。
「offsets」というコレクションを用意して、その中に格納していきます。
Selectionオブジェクトの「Searchメソッド」を使って、ドキュメント内のオフセットを全て選択、選択状態のオブジェクトを全て「offsets」に追加という処理を行うことで「offsets」に全てのオフセットが格納されます。
このとき、「Searchメソッド」で1つも選択できないということはオフセットが存在していないということなので、「If sel.Count = 0 Then」で処理を中断する条件も入れています。
変更後のオフセット値取得
1 2 3 4 |
'変更後のオフセット値取得 Dim res As String res = InputBox("変更後のオフセット値を入力して下さい。") If res = "" Then Exit Sub |
次に変更後のオフセット値を取得します。
InputBox関数を使ってユーザーが任意で設定可能にします。
オフセットのパラメ-タ変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'オフセットのパラメ-タ変更 Dim offset As HybridShapeOffset For Each offset In offsets Dim key As String key = "オフセット" If InStr(1, offset.Name, key) <> 0 Then offset.OffsetValue.Value = res End If Next |
最後に「offsets」内ループを行い、オフセット値の変更を行なっていきます。
このとき指定した文字列が含まれているもののみオフセット値を変更するという条件分岐を追加することで、任意のオフセットのみの値を変更することが可能になります。
今回の場合は「オフセット」という文字列がオフセットの名称に含まれている条件ということなので、InStr関数を使い、「If InStr(1, offset.Name, key) <> 0 Then」という条件にすればOKです。(InStr関数は指定した文字列が含まれている場合はその位置を返し、含まれていない場合は0を返す関数です。)
あとは上記の条件を突破したオフセットのみ値を変更します。
オフセット値は「HybridShapeOffsetオブジェクト.OffsetValue.Value」で表すことができます。つまりこれにInputBox関数で取得した値を入れればオフセット値を変更することができます。
まとめ
今回は名称に「オフセット」という文字列が含まれるオフセットの値を一括で変換するマクロについての内容でした。
サンプルコードの「オフセット」の部分を別の文字列にすれば指定した名称のオフセット値を変更することができますし、そもそもサンプルコードのパラメータ変更時の条件を変更すればより自分好みのマクロに書き換えることができます。
このページの最重要部はおそらくオフセット値を変更することなので「offset.OffsetValue.Value = res」の部分さえ理解できれば、後は”offset”部分のオブジェクトをどのようにして取得するかだけの問題です。
今回は「Selectionオブジェクト」の「Searchメソッド」を使いましたが、取得方法はさまざまなので試行錯誤しながらいろいろな方法を見つけてみてください。できることの引き出しが増えれば、それだけ作成することのできるマクロの幅も広がります。