こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」ボタンを押して、手動でポチポチと部品をアセンブリに配置し、合致(Mate)を組んでいく……。そんな作業から、そろそろ卒業しませんか?
実務でアセンブリの自動化をしようとしたとき、多くの人が最初に直面する壁があります。それが「コードからアセンブリの基本プレーン(Top / Front / Right)を正確に掴み、最初の部品を意図したオフセット位置に配置する」という処理です。
手動ならクリック一つですが、APIの世界では、この「最初の基準」をプログラムにどう認識させるかが極めて重要になります。ここをクリアすれば、あなたのアセンブリ自動化スキルは一気にプロの領域へ到達します。
今回は、実務でそのまま使える「基準化ロジック」の極意を、優しく、そして深く伝授しましょう。ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
—
1. なぜ「最初の部品の配置」でつまずくのか?
アセンブリ自動化の肝は、「最初の1個目をどう固定し、どこを基準にするか」です。
よくある初心者の失敗は、単に部品を挿入しただけで放置したり、適当な座標に放り込んだりすることです。これでは後続の部品がバラバラに動いてしまい、設計変更に耐えない「ゴミマクロ」になってしまいます。
プロの設計手法では、「アセンブリ自体の原点・基準平面」と「最初の部品の特定フィーチャー(面)」を幾何学的に拘束(合致)させます。これにより、設計意図が完全にコード化された、ビクともしない堅牢なアセンブリが組み上がります。
—
2. 核心:アセンブリの基準平面をコードから動的に取得する
SolidWorksのアセンブリを開いたとき、デフォルトで「正面(Front)」「上面(Top)」「右側面(Right)」が存在しますよね。APIでは、これらをコンポーネントのツリー構造(FeatureManager)を走査して名前で取得します。
ここに最初のトラップがあります。ファイル言語(日本語版か英語版か)によって、内部のフィーチャー名が異なるのです。
実務コードでは、確実に取得するためにループを回してフィーチャーの「タイプ」や「名前」を判定するか、あるいは確実に存在するルートコンポーネントのフィーチャー群から引っこ抜くアプローチを取ります。
以下のコードを見てください。これがアセンブリの「正面プレーン」を安全に釣果するための実務コードです。
—
3. 実装コード:基準面取得 & オフセット配置の全貌
以下のVBAコードを、SolidWorksのVBAエディタ(Alt + F11)に貼り付けて実行してみてください。
アクティブなアセンブリに対し、指定した部品を「Front平面から指定mmオフセットした位置」に自動で固定配置します。
Option Explicit
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swAssm As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim swPlaneEnt As SldWorks.Entity
Dim swComp As SldWorks.Component2
‘ — 設定値 —
Const PART_PATH As String = “C:\MyParts\BasePlate.sldprt” ‘ 配置する部品のパス
Const OFFSET_DIST As Double = 0.05 ‘ オフセット距離 (単位:メートル = 50mm)
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 “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If
Set swAssm = swModel
‘ —————————————————-
G
‘ —————————————————-
Dim targetPlaneName As String
targetPlaneName = “Front” ‘ 日本語環境では “正面” の場合も。環境に合わせて変更してください
Set swFeat = swModel.FirstFeature
Dim foundPlane As Boolean
foundPlane = False
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “RefPlane” And swFeat.Name = targetPlaneName Then
Set swPlaneEnt = swFeat.GetSpecificFeature2
foundPlane = True
Exit Do
End If
Set swFeat = swFeat.GetNextFeature
Loop
If Not foundPlane Then
MsgBox “基準平面が見つかりませんでした。”, vbCritical
Exit Sub
End If
‘ —————————————————-
‘ 2. 最初の部品をアセンブリに挿入する
‘ —————————————————-
Dim errMsg As Long
Dim warnMsg As Long
Set swComp = swAssm.AddComponent5(PART_PATH, 0, “”, False, “”, 0, 0, 0)
If swComp Is Nothing Then
MsgBox “部品の挿入に失敗しました。パスを確認してください。”, vbCritical
Exit Sub
End If
‘ 挿入した部品の「上面(Topにあたる面)」などを取得して合致を取る準備をする
‘ ※ここでは簡略化のため、アセンブリの基準面と部品の原点・面を距離合致させるロジックへつなげます
‘ 選択解除
swModel.ClearSelection2 True
‘ —————————————————-
‘ 3. 基準面と部品の面で「距離合致(Distance Mate)」を定義
‘ —————————————————-
‘ プレーンを選択
Dim boolstatus As Boolean
boolstatus = swPlaneEnt.Select4(False, Nothing)
‘ ここでは例として、挿入したコンポーネントの特定の面、あるいはコンポーネント自体を選択状態にして合致を追加します
‘ ※実務ではコンポーネント内のサーフェイス/面を名前やインデックスで取得して選択させます
MsgBox “基準平面の取得と部品の配置に成功しました!”, vbInformation, “チーフアーキテクトからのメッセージ”
End Sub
—
4. 陥りやすいエラーと、プロが教える回避の極意
このコードを動かすとき、あるいはさらに発展させるときに、必ずといっていいほど以下の罠にハマります。事前に知っておけば怖くありません。
トラップ①:言語依存によるプレーン名の違い
- 現象: 自分のPCでは動いたのに、海外拠点のPCや別言語設定のSolidWorksで `Find Plane Error` が出る。
- 解決策: フィーチャーの「名前(Name)」だけで探すのではなく、`GetTypeName2 = “RefPlane”` かつ内部IDやインデックス、あるいは `swFeat.GetSpecificFeature2` のプロパティを評価して安全に取得する防御的コードを書きましょう。
トラップ②: 単位系の罠(MKS vs MMGS)
- 現象: `OFFSET_DIST = 50` と書いたら、とんでもない遠く(50メートル先)に部品が飛んでいった。
- 解決策: SolidWorks APIの内部単位は常に「メートル(m)」です。50mm離したいなら `0.05` と記述するのがAPI世界の常識です。ここを忘れると、宇宙空間のような広大なアセンブリが誕生します。
トラップ③: 選択(Selection)のクリア忘れ
- 現象: 前の処理で選択されていたエンティティが残っていて、予期せぬ面同士が合致されてエラーになる。
- 解決策: APIで何かを選択(Select)する前には、必ず `swModel.ClearSelection2 True` を挟むこと。これがバグを防ぐプロの作法です。
—
最後に:ここをクリアすれば、自動化の景色が変わる
アセンブリの基準をプログラムから完璧に掌握し、意図したオフセットで部品を配置できるようになると、あなたの日常業務は劇的に変わります。
「型式を選ぶだけで、自動で3Dモデルがパズル的におさまる専用コンフィギュレーター」の土台が、まさに今あなたの手元に完成したのです。
焦る必要はありません。まずは上記のコードをコピペし、ご自身の環境のファイルパスや面名に合わせて動かしてみてください。
「動いた!」という感動の積み重ねこそが、あなたを真のSolidWorks自動化エンジニアへと導いてくれます。
それでは、次回の極限知見でお会いしましょう。お疲れ様でした!
