こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」ボタンを押して、画面上のパーツをカチカチと手動でクリックし、そのコードを眺めては「なんだか冗長だな…」「これを動的なアセンブリでどう使えばいいんだ?」と悩んでいませんか?
今回は、「ユーザーに画面を一切クリックさせず、コードの力だけでパーツを特定し、画面上でビシッとハイライト(選択)させる方法」を徹底解説します。
ここをクリアすれば、単なる「操作の再現」から脱却し、「SolidWorksを意のままに操るエンジニア」の仲間入りです。さあ、一緒に扉を開きましょう!
—
1. なぜ「マウス選択」に頼ってはいけないのか?
アセンブリの自動化で最もやってはいけないアンチパターン。それは、`Extension.SelectByID2` メソッドの引数に、画面上のクリック座標をハードコーディングしたり、人間が手動選択する前提のコードを書くことです。
- パーツの名前が変わったら?
- コンフィギュレーションが切り替わったら?
- そもそもアセンブリの階層構造(パス)が深かったら?
人間の手や目に頼る自動化は、モデルのわずかな変更で簡単に崩壊します。
だからこそ、「プログラムが自らパーツの存在を見つけ出し、SelectionManagerを通じてSolidWorksに『これを選択しなさい』と命令する」というアプローチが必要なのです。
—
2. 魔法のオブジェクト「SelectionManager」とは?
SolidWorks VBAにおいて、何かを「選択する」「選択されたものを取り出す」を司る核心が `SelectionManager`(選択マネージャー) です。
イメージとしては、SolidWorksの画面全体を見渡す「優秀なアシスタント」だと思ってください。
あなたが「おい、あの部品を選んでおいてくれ」と指示を出せば、このアシスタントが裏側でパーツを特定し、画面上で赤くハイライト(選択状態)してくれます。
—
3. 実践!パーツをコードだけで特定・ハイライトするVBAコード
百聞は一見にしかず。まずは、現在開いているアセンブリの中で、指定した名前のパーツをコードだけで探し出し、強制的に選択(ハイライト)する実用コードを見てみましょう。
VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。
‘ ==============================================================================
‘ 【テーマ】マウス選択なしでパーツを特定・ハイライトする基本コード
‘ ==============================================================================
Sub SelectPartProgrammatically()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swSelData As SldWorks.SelectData
Dim boolstatus As Boolean
‘ 1. SolidWorksアプリケーションとアクティブなドキュメントを取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 安全装置:ドキュメントが開かれていない、またはアセンブリ以外なら終了
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリ文書でのみ実行可能です。”, vbExclamation
Exit Sub
End If
‘ 2. 検索したいパーツの名前(FeatureManagerのデザインツリーに表示されている名前)を指定
‘ ※環境に合わせて書き換えてください(例: “Bracket-1@Assembly” など)
Dim targetComponentName As String
targetComponentName = “MyPart-1” ‘ ← ここを探したい部品名に変更
‘ 3. SelectionManagerとSelectDataの取得
Set swSelMgr = swModel.SelectionManager
Set swSelData = swSelMgr.CreateSelectData
‘ 4. 既存の選択を一旦クリア(クリーンな状態から始める)
swModel.ClearSelection2 True
‘ 5. 【核心】SelectByID2を使ったプログラムによるパーツの特定と選択
‘ 引数の意味: (名前, タイプ, X座標, Y座標, Z座標, 複数選択するか, 選択データ, 拡張フラグ)
‘ パーツ(コンポーネント)を指定する場合は、タイプに “COMPONENT” を指定します。
boolstatus = swModel.Extension.SelectByID2( _
targetComponentName & “@” & swModel.GetTitle(), _
“COMPONENT”, _
0, 0, 0, _
False, _
swSelData, _
False)
‘ 6. 結果の判定
If boolstatus Then
MsgBox “パーツ「 ” & targetComponentName & ” 」を正常に特定・選択しました!”, vbInformation, “成功”
Else
MsgBox “指定されたパーツが見つかりませんでした。名前を確認してください。”, vbCritical, “エラー”
End If
End Sub
—
4. コードの重要ポイントを徹底解説
初心者の方が「おっ」とつまずきやすいポイントを、建築の基礎工事のようにしっかりと解説しておきます。
① アセンブリにおけるパーツ名のルール(ここが最重要!)
SolidWorksのアセンブリ内で特定の部品を指定するとき、名前は単に `MyPart-1` では通らないことが多いです。
アセンブリのツリー構造を思い出してください。パーツは必ず「アセンブリファイル名」と紐づいていますよね?
- 指定する文字列の書式: `部品名@アセンブリ名`
- 例: `MyPart-1@Assembly1`
コード内では `targetComponentName & “@” & swModel.GetTitle()` という技を使って、現在のアセンブリファイル名とターゲットの部品名を動的に結合させています。これによって、ファイル名が変わってもコードが破綻しなくなります。
② `SelectByID2` の魔法
`swModel.Extension.SelectByID2` は、SolidWorks APIの中で最も使用頻度が高いメソッドの一つです。
画面上のどこをクリックするかではなく、「データベース上の名前と種類(TYPE)」を指定して直接指名買いするのがこのメソッドの正体です。
第2引数に `”COMPONENT”` を指定することで、「あ、これはアセンブリ内の部品だな」とSolidWorksが理解し、画面上で美しくハイライトしてくれます。
—
5. 初心者が陥りやすい罠とエラー対策
現場でこのコードを使い始めると、必ずと言っていいほど以下の壁にぶつかります。先回りしてクリアしておきましょう。
- 罠1:拡張子(.sldprtなど)まで名前に入れてしまう
- 対策:デザインツリーに表示されている名前は拡張子を除いたものです(例:`MyPart-1`)。拡張子を含めると見つからずにエラーになります。
- 罠2:アセンブリの階層が深い(サブアセンブリの中にある)
- 対策:今回のコードはトップレベルのパーツを対象としています。もしサブアセンブリの中にあるパーツを指名する場合、パスの指定(例:`Part1-1@SubAssembly1-1@Assembly1`)が必要になります。この階層構造のトラバーサル(巡回)については、また別の機会に深く掘り下げましょう。
—
最後に:ここをクリアすれば、自動化の景色が変わる
お疲れ様でした!
今回学んだ「コードによるパーツの特定とSelectionManagerの活用」は、アセンブリ自動化のすべての土台となります。
- パーツを選ぶ = 今回の内容
- 選んだパーツ同士で合致(Mate)を組む = 次へのステップ
ここをクリアしたあなたなら、もう「マクロの記録の奴隷」ではありません。自分の手でロジックを組み立て、SolidWorksを意のままに動かす楽しさを実感できているはずです。
明日からの設計業務の効率化に向けて、ぜひご自身の環境でも試してみてくださいね。それでは、次のステップでお会いしましょう!
