こんにちは!SolidWorksのマクロ開発の世界へようこそ。
チーフアーキテクトの私です。
マクロの記録ボタンを押して操作を記録し、いざVBAのコードを覗いてみたものの……そこに並んでいたのは、意味不明な文字列と数字の羅列。特に、画面上の面やエッジを指定する`SelectByID2`というメソッドに出会ったとき、「一体これの何を指定しているんだ…?」とフリーズしてしまった経験はありませんか?
ご安心ください。ここをクリアすれば、SolidWorks VBAの基本はバッチリです。
今回は、多くの開発者が最初の壁として挫折しがちな「Extension.SelectByID2の引数の完全理解」について、その裏側の仕組みから確実に要素を掴む極意まで、徹底的に紐解いていきましょう。
—
1. なぜ「マクロの記録」のコードだけでは通用しないのか?
例えば、3次元モデルの適当な「平面」をクリックしてマクロの記録を止めると、VBAのウィンドウには次のようなコードが生成されます。
Dim boolstatus As Boolean
Dim longstatus As Long
boolstatus = swModel.Extension.SelectByID2(“”, “FACE”, 0.05, 0.02, 0.01, False, 0, Nothing, 0)
「……待て待て、名前が空欄(`””`)なのに、どうやって場所を特定しているんだ?」
そう思ったあなたは非常に鋭い。
実は、マクロの記録が吐き出すこのコードは、「その瞬間、その座標(X, Y, Z)にあった面を拾った」というスナップショットに過ぎません。もしモデルの形状が少しでも変わったり、フィーチャーの順番が入れ替わったりすると、この座標指定はあっさり外れ、プログラムは別の場所を選択してエラーを起こします。
これが、「マクロの記録から脱却できない」最大の原因です。
SolidWorksのAPIを掌握するには、`SelectByID2`の各引数が何を意味し、どう使い分けるべきかを完全に理解する必要があります。
—
2. `SelectByID2` の引数を丸裸にする
まずは、`SelectByID2` の構文を確認してみましょう。
bRet = ModelDocExtension.SelectByID2(Name, Type, X, Y, Z, Append, Mark, Callout, SelectOption)
呪文のように長い引数ですが、上から順に紐解けば怖くありません。実務で特に重要な5つの引数をピックアップして解説します。
① `Name`(名前)
選択したい要素の名前を指定します。例えば、押し出しフィーチャーなら `”Boss-Extrude1″`、特定のエッジや面にあらかじめ名前(ユーザー定義属性や面IDなど)がついている場合はその名前を入れます。
- ※後述しますが、座標を使う場合はここを空欄 `””` にします。
② `Type`(要素の種類)
ここが最重要フィルターです。SolidWorksに「何を探しているのか」を教えます。
- `”FACE”` :面
- `”EDGE”` :エッジ(辺)
- `”VERTEX”`:頂点
- `”BODY”` :ソリッド/サーフェスボディ
- `”COMPONENT”`:アセンブリの部品
これらを文字列で正確に指定することで、SolidWorksは検索範囲を劇的に絞り込みます。
③ `X, Y, Z`(座標)
`Name` が空欄 `””` の場合、SolidWorksはこの3次元座標(単位はメートル!)を起点にして、一番近くにある `Type` の要素を探しに行きます。これが「座標による選択」の正体です。
④ `Append`(追加選択のフラグ)
- `False` :現在選択されているものをすべて解除してから、新しく選択する(単一選択)。
- `True` :現在選択されているものを維持したまま、新しい要素を追加する(複数選択)。
⑤ `Mark`(マーク値)
ここを使いこなせると一人前のエンジニアです。
SolidWorksの高度なAPI(例えば合致メイトやフィレットなど)では、「どの面とどの面をどうするか」を区別するために、要素に「背番号(マーク)」を振る必要があります。
- 通常の単一選択なら `0` で構いませんが、複数選択して処理を行う場合は、この `Mark` 値(例: `1`, `2`, `4` など、2のべき乗を使うのが一般的)を適切に割り振ることで、APIに「これは面Aのグループ、こっちのマークは面Bのグループ」と認識させることができます。
—
3. 【実践】意図した面やエッジを確実に掴むための極意
座標指定は手軽ですが、前述の通りモデルの変更に弱いです。実務の自動化において、真に信頼できる選択方法は次の2つに集約されます。
極意A:名前(Name)で確実に指定する
フィーチャー名や、プログラム側であらかじめ一意に定まる名前が分かっている場合は、座標ではなく名前で指定します。
Sub SelectFaceByName()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ “Cut-Extrude1” という名前のフィーチャーを選択する
boolstatus = swModel.Extension.SelectByID2(“Cut-Extrude1”, “BODY”, 0, 0, 0, False, 0, Nothing, 0)
If boolstatus Then
MsgBox “要素の選択に成功しました!”, vbInformation
Else
MsgBox “要素が見つかりませんでした。”, vbCritical
End If
End Sub
極意B:APIのライフサイクルを意識し、選択をクリアする
プログラムを連続して走らせるとき、「前回の選択状態が残っている」という罠に非常によく嵌まります。これを防ぐために、選択処理を行う前には必ず `ClearSelection2` を呼ぶのが、プロのエンジニアの作法です。
‘ 既存の選択を完全にクリアする(オブジェクトのクリーンアップ)
swModel.ClearSelection2 True
この「1行の気配り」が、マクロの暴走や謎のエラーを防ぐ最大の防御壁となります。
—
4. チーフからのエール
SolidWorks VBAのAPIは、最初は冷たく無機質なエラーを返してくるように感じるかもしれません。しかし、今回解説した `SelectByID2` の引数の意味(特に `Type` と `Mark`、そして選択クリアの概念)さえ掴んでしまえば、それはあなたの忠実な手足となります。
「なぜこの引数が必要なのか?」
その本質を理解したあなたなら、もう単なる「マクロの記録のコピーキャット」ではありません。
自信を持って、自分の手で自動化の世界を切り拓いていってください。
それでは、次の建築(コーディング)の現場でお会いしましょう!
