こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」ボタンを押して図形をポチポチ……。そこから一歩進んで、「社内標準のポケットやボスを、プログラムから狙った座標にパズルのように正確に配置したい!」と思ったことはありませんか?
マクロの記録では、ライブラリ機能の挿入はパラメータが固定されてしまい、実務では全く使い物になりません。ハードコーディングを排除し、「任意の基準面」の「任意のXY座標」へ、自由自在に社内標準パーツ(.sldlfp)を呼び込む。
ここをクリアすれば、あなたのSolidWorks VBAスキルは「初学者」の領域を完全に脱却し、実務で無双できるプロフェッショナルの域に達します。今日はその極意を、優しく、そして徹底的に伝授しましょう。
—
なぜ `InsertLibraryFeatureEx` なのか?
SolidWorksにはライブラリフィーチャを挿入するAPIがいくつか存在しますが、古いメソッドは挙動が不安定だったり、配置位置(座標)の制御がブラックボックスだったりします。
私たちが使うべきは、`ModelDocExtension.InsertLibraryFeatureEx` です。
このメソッドの真骨頂は、「基準となる面(フェイス)」と「配置位置の座標(XY)」、そして「外部参照(ファイルリンク)の有無」をプログラムから完全にコントロールできる点にあります。
まずは、全体像となるコードを見てください。ここからすべてが始まります。
—
実戦投入可能な最強のインサートコード
以下のコードをSolidWorksのVBAエディタ(VBE)に貼り付けてください。
社内標準のポケット(例: `Standard_Pocket.sldlfp`)を、指定した平面上の(X: 50mm, Y: 30mm)の位置に召喚します。
Sub InsertStandardPocket()
‘ =========================================================================
‘ 宣言と初期化
‘ =========================================================================
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Dim feat As SldWorks.Feature
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アクティブドキュメントが存在するかチェック
If swModel Is Nothing Then
MsgBox “パーツファイルを開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End If
Set swExt = swModel.Extension
‘ =========================================================================
‘ 設定値(ハードコーディング排除:本来はINIやExcel、UIから取得します)
‘ =========================================================================
Dim libraryPath As String
libraryPath = “C:\CompanyStandard\Library\Standard_Pocket.sldlfp”
Dim targetFaceName As String
targetFaceName = “Front Plane” ‘ または実在するサーフェス・平面名
Dim posX As Double
Dim posY As Double
posX = 0.050 ‘ 50mm (APIの単位は常にメートル[m]です!)
posY = 0.030 ‘ 30mm
‘ =========================================================================
‘ 1. 配置基準となる面(フェイス/平面)を選択する
‘ =========================================================================
‘ 確実に面を選択状態(Select4)にする必要があります
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SelectByID2(targetFaceName, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “指定された基準面が見つかりませんでした: ” & targetFaceName, vbCritical, “選択エラー”
Exit Sub
End If
‘ =========================================================================
‘ 2. ライブラリフィーチャの挿入実行 (InsertLibraryFeatureEx)
‘ =========================================================================
‘ 引数構成:
‘ FilePath, X座標, Y座標, 回転角度, スケール
Dim refType As Long
refType = 0 ‘ 0: リンクなし(独立フィーチャ化), 1: ファイルにリンク
Set feat = swExt.InsertLibraryFeatureEx( _
libraryPath, _
posX, _
posY, _
0.0, _ ‘ 回転角度 (ラジアン)
1.0, _ ‘ スケール
Empty, _ ‘ 設定名 (デフォルトはEmpty)
Empty ‘ 外部参照用配列
)
‘ =========================================================================
‘ 3. 成否判定と後処理
‘ =========================================================================
If Not feat Is Nothing Then
‘ 選択をクリア
swModel.ClearSelection2 True
MsgBox “社内標準ポケットの配置に成功しました!”, vbInformation, “完了”
Else
MsgBox “ライブラリの挿入に失敗しました。パスや寸法拘束を確認してください。”, vbCritical, “失敗”
End If
End Sub
—
コードの核心を読み解く:3つの重要ポイント
ここからは、なぜこのコードが動くのか、プロのエンジニアとしての視点で重要なポイントを3つに絞って解説します。
1. SolidWorks APIの絶対原則「単位はメートル [m]」
コード内で `posX = 0.050` と書いていることに気づきましたか?
そう、SolidWorksのAPI内部では、ドキュメントの単位系(mm, inchなど)に関わらず、長さの単位はすべて「メートル(m)」で処理されます。
「あれ? 50mm指定したのに、豆粒みたいなポケットができたぞ?」というミスは、初心者が100%通る道です。`0.050m = 50mm` という変換を忘れないでください。
2. 処理の前に「面」がアクティブ(選択)されていなければならない
`InsertLibraryFeatureEx` は、「今、画面上で何が選択されているか」を文脈として読み取ります。
コード内の `SelectByID2` であらかじめ基準面を選択しているのはそのためです。ここを飛ばすと、「どこに配置していいか分からないよ!」とAPIがフリーズするかエラーを吐きます。
3. 社内標準化の要:「リンクを持たせるか、断ち切るか」
コード内の `refType`(または内部の挙動)において、 `.sldlfp` 自体を社内サーバー等で一元管理する場合、元のライブラリファイルを変更したときに既存の図面も連動させたい(リンクする)のか、それともこのパーツ内だけで完結させたい(リンクを切り離す)のかを設計する必要があります。
基本的には、個々の設計データの独立性を担保するため、リンクを切り離して単体のフィーチャとして取り込む実装が現場では好まれます。
—
陥りやすい罠とエラー回避の知見
実務でこのコードを組み込むと、必ずといっていいほど以下の壁にぶつかります。先回りして解決策を授けましょう。
- 罠1: 「ファイルが見つかりません」エラー
- 原因: `.sldlfp` のファイルパスの記述ミス、または社内ネットワーク(UNCパス `\\server\share\…`)の接続タイムアウト。
- 対策: パスは必ず存在確認(`Dir`関数など)を挟むか、定数として一元管理する設計にしてください。
- 罠2: スケッチのエラー(黄色や赤色の警告)で失敗する
- 原因: ライブラリフィーチャ側の親参照(スケッチの平面や寸法)が、配置先のモデルの形状と矛盾している場合、SolidWorksのジオメトリエンジンがパニックを起こします。
- 対策: `.sldlfp` を作成する段階で、必要最小限の外部参照に留め、コンフィギュレーション名や寸法駆動の依存関係をクリーンにしておく必要があります。
—
ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
お疲れ様でした!
今回学んだ `InsertLibraryFeatureEx` をマスターすれば、単なる「お絵描きマクロ」から、「ルールベースの設計自動化システム(KBE: Knowledge-Based Engineering)」へとあなたのスキルは劇的に進化します。
「決まった形のポケットやボスを、座標を指定して自動配置していく」。
これができれば、筐体設計や金型設計における定型作業の9割は自動化できたも同然です。
ぜひ、あなたの会社の標準ライブラリを読み込ませて、動かしてみてください。
感動の瞬間が待っていますよ。それでは、次の極意でお会いしましょう!
