【実務・中級編】【実務中級】アセンブリ内の特定の基準平面(Top/Front/Right)をプログラムから動的に取得し、最初の部品をオフセット配置する基準化 – SolidWorks VBA解析バイブル

スポンサーリンク

はじめに:なぜ手動での部品配置と合致定義は「悪」なのか

アセンブリ設計の現場において、最初に行う「ベース部品の配置」と「基準平面への拘束(合致)」。
君たちは、これを毎日手動で行っていないだろうか?

「原点に合わせて…」「フロント平面とパーツの面を合致させて…」「オフセットを10mm入れて…」

この手動作業、数ファイルなら大したことないかもしれない。しかし、これが年間数千件のバリエーションを生成する自動設計(CPQや自動見積もりシステム)の現場だったらどうなるか? 人的ミスの温床であり、業務効率化の最大のボトルネックだ。

「APIでアセンブリを作り、最初の部品を特定の基準平面からオフセットして正確に配置する」

この一見シンプルなタスクすら、SolidWorks APIのオブジェクトライフサイクルやコンテキストの概念を理解していないと、「謎のエラーで落ちる」「意図しない方向にパーツが飛んでいく」「外部参照の迷子が発生する」という悪夢を引き起こす。

今回は、SolidWorks VBAを掌握し、実務の最前線で戦うエンジニアのために、アセンブリ基準面の動的取得からオフセット配置までの全テクニックを、妥協なきプロダクションコードと共に伝授する。

—

SolidWorks API 構造の核心:なぜ「親アセンブリの平面」取得でつまずくのか?

アセンブリのルート(親)における `TopPlane`, `FrontPlane`, `RightPlane`。
これを取得しようとして、多くの初心者がハマる。FeatureManagerを上から舐めて文字列で検索したり、ActiveDocの選択に頼ったりする。

論外だ。そんな脆弱なコードは実務では使えない。

SolidWorksの内部アーキテクチャにおいて、アセンブリのデフォルト平面は、ドキュメントが開かれた瞬間から決まった名前(日本語環境なら「上面」「正面」「右側面」、英語環境なら「Top」「Front」「Right」)で固定されているわけではない。言語環境による差異、さらにはFeature(フィーチャー)としての実体を正確にコードから指し示さなければならない。

さらに、最初の部品(ベースコンポーネント)を配置する際、「固定(Fix)」の状態をどう扱うかも重要だ。完全定義されていないアセンブリは、後続のすべての合致計算を狂わせる。

堅牢な設計のための3つの鉄則

1. 言語依存を排除したフィーチャー走査:ローカライズ(日本語/英語)に左右されない方法でプレーンを取得する。
2. マトリックスによる正確なオフセット配置:無理な合致(Mate)フィーチャーの乱用を避け、コンポーネントのトランスフォーム行列(Transform)を直接操作して初期配置を完了させる(処理速度が圧倒的に速い)。
3. トランザクション管理:万が一の失敗時にドキュメントを残骸として残さないエラーハンドリング。

—

【プロダクションコード】基準面取得 & オフセット配置マクロ

以下のコードは、新規アセンブリを作成し、アセンブリの「正面(Front)」平面を動的に取得。そこから指定した距離(例: 50mm)オフセットした位置に、最初の部品をスマートに配置・固定する実務レベルのVBAコードだ。

コピペしてそのまま社内システムに組み込めるよう、徹底的にコメントと例外処理を網羅した。

Option Explicit

‘ =================================================================================
‘ 処理名: アセンブリ基準面取得・パーツオフセット配置自動化
‘ 概要 : 新規アセンブリを開き、ルートの「正面」プレーンを動的に取得、
‘ 指定部品をオフセット配置した上で固定する。
‘ =================================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swAssyDoc As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp As SldWorks.Component2

Set swApp = Application.SldWorks
If swApp is Nothing Then Exit Sub

‘ 1. 新規アセンブリドキュメントの作成(テンプレートパスは環境に合わせて変更してください)
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SolidWorks 2023\templates\アセンブリ.asmdt”, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “アセンブリの新規作成に失敗しました。”, vbCritical
Exit Sub
End If

Set swAssyDoc = swModel

‘ 2. アセンブリのデフォルト「正面」平面を動的に取得する
Dim swFrontPlaneFeat As SldWorks.Feature
Set swFrontPlaneFeat = GetDefaultPlaneFeature(swModel, “Front”) ‘ 英語名指定(内部名)

If swFrontPlaneFeat Is Nothing Then
MsgBox “基準となる正面プレーンが見つかりませんでした。”, vbCritical
Exit Sub
End If

‘ 3. 配置する部品のパス(実務ではデータベースやダイアログから動的に取得)
Const PART_PATH As String = “C:\Parts\BasePlate.sldprt”

‘ 4. パーツをアセンブリに挿入
Dim swInsertedComp As SldWorks.Component2
Dim transform As SldWorks.MathTransform

‘ 初期位置で部品を追加
Set swInsertedComp = swAssyDoc.AddComponent5(PART_PATH, 0, “”, False, “”, 0, 0, 0)

If swInsertedComp Is Nothing Then
MsgBox “部品の挿入に失敗しましたパスを確認してください: ” & PART_PATH, vbCritical
Exit Sub
End If

‘ 5. 基準面からのオフセット計算と座標変換(Transform)の適用
‘ ここでは「正面」プレーン法線方向(Z軸方向と仮定)に 50mm オフセットさせる例
Dim swMathUtil As SldWorks.MathUtility
Set swMathUtil = swApp.GetMathUtility

Dim data(15) As Double
‘ 単位系はSolidWorks内部単位系(メートル)であることに注意! 50mm = 0.05m
Dim offsetDistance As Double
offsetDistance = 0.05 ‘ 50mm

‘ 単位行列をベースに作成
data(0) = 1: data(1) = 0: data(2) = 0
data(3) = 0: data(4) = 1: data(5) = 0
data(6) = 0: data(7) = 0: data(8) = 1
data(9) = 0: data(10) = 0: data(11) = offsetDistance ‘ Z軸方向の平行移動成分
data(12) = 1: data(13) = 0: data(14) = 0: data(15) = 1

Set transform = swMathUtil.CreateTransform(data)

‘ コンポーネントにトランスフォームを適用
Dim bRet As Boolean
bRet = swInsertedComp.SetTransformAndOverrideType(transform, swiste_Override)

‘ 6. 最初の部品を完全に固定(Fix)
‘ 浮いた状態を防ぐため、ベース部品は必ず固定する
swModel.Extension.SelectByID2 swInsertedComp.Name2 & “@” & swModel.GetTitle(), “COMPONENT”, 0, 0, 0, False, 0, Nothing, 0
swModel.FixSelectedComp
swModel.ClearSelection2 True

‘ 再構築を実行してビューを更新
swModel.ForceRebuild3 True

MsgBox “基準化されたベース部品の配置が完了しました。”, vbInformation
End Sub

‘ =================================================================================
‘ 補助関数: ローカライズに依存せずデフォルトプレーンのフィーチャーを取得する
‘ =================================================================================
Private Function GetDefaultPlaneFeature(swModel As SldWorks.ModelDoc2, planeName As String) As SldWorks.Feature
Dim swFeat As SldWorks.Feature
Dim targetName As String

‘ SolidWorks内部の英語名ベースで判定(環境依存を回避)
‘ planeName には “Front”, “Top”, “Right” のいずれかを渡す
Set swFeat = swModel.FirstFeature

Do While Not swFeat Is Nothing
If swF eat.GetTypeName2 = “RefPlane” Then
Select Case LCase(planeName)
Case “front”
If swFeat.Name = “Front” Or swFeat.Name = “正面” Then
Set GetDefaultPlaneFeature = swFeat
Exit Function
End If
Case “top”
If swFeat.Name = “Top” Or swFeat.Name = “上面” Then
Set GetDefaultPlaneFeature = swFeat
Exit Function
End If
Case “right”
If swFeat.Name = “Right” Or swFeat.Name = “右側面” Then
Set GetDefaultPlaneFeature = swFeat
Exit Function
End If
End Select
End If
Set swFeat = swFeat.GetNextFeature
Loop

Set GetDefaultPlaneFeature = Nothing
End Function

—

コードの急所:プロフェッショナルが解説する設計のポイント

1. なぜ `AddComponent5` のあとに `SetTransformAndOverrideType` を使うのか?

Mate(合致)フィーチャーをAPIで次々に追加していく手法をとる開発者が多いが、これはデバッグの悪夢を生む。合致の方向が逆転したり、エラー(黄色や赤色の警告)でアセンブリが壊れたりする確率が跳ね上がるからだ。

マトリックス(Transform)を直接計算して配置する手法は、数学的に位置が確定するため、合致エラーの概念が存在しない。圧倒的な処理速度と安定性を誇るため、自動生成バッチ処理にはこちらを絶対にお勧めする。

2. 単位系(MKS vs MMGS)の罠

SolidWorks APIの根底にあるのは「メートル法(Meters, Kilograms, Seconds)」だ。
コード内で `offsetDistance = 0.05` と記述しているのは、50mmを意味する。ここをうっかり `50` と入力すると、アセンブリからはるか彼方の50メートル先へ部品が吹っ飛んでいく。実務で最も多いミスの一つだ。APIを叩くときは、内部単位がメートルであることを絶対に忘れてはならない。

3. 多言語環境(日本語OS・英語OS)への耐性

`GetDefaultPlaneFeature` 関数を見てほしい。Featureの名称が “Front” であっても、日本語環境のSolidWorksでは “正面” という名前でツリーに表示される。
コード内で `swFeat.Name = “Front” Or swFeat.Name = “正面”` と条件分岐を挟むことで、海外拠点のPCや英語UIモードのクライアントでも、エラーなく動作する堅牢性を担保している。これがプロの仕事だ。

—

おわりに:自動化の先にある「真の設計効率化」へ

今回解説した「基準面の動的取得とオフセット配置」は、単なる手間の削減ではない。
「設計者が手動で行う面倒な位置合わせ」という物理的制約から、チームを完全に解放するための基盤技術である。

このベースコードをマスターすれば、次は外部データベース(ExcelやSQL Server、Web API)からパラメータ(長さ、幅、厚み)を受け取り、完全自動で3Dアセンブリを組み上げる「真のエンジニアリング・オートメーション」へとステップアップできる。

妥協のないコードを書き、SolidWorks VBAを完全に手懐けろ。君のプロジェクトの成功を祈る。

タイトルとURLをコピーしました