【実務・中級編】【実務中級】アセンブリ内の全ボルト締結部品の長さを自動計測し、適切な座金・ナットの組み合わせを判定するバリデーション – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】アセンブリ自動検証の極致:ボルト締結の「長さ不適合」を撲滅するアーキテクチャ

設計現場において、「図面上のボルト長さが足りない」「逆に長すぎて干渉する」というミスは、試作段階で最も排除すべきリスクの一つだ。これを個人の確認作業に頼るのは、21世紀のエンジニアとしてあまりに非効率だ。

今回は、SolidWorks APIを使い、アセンブリ内の締結部品の板厚を動的に算出し、ボルト長さをバリデーションする堅牢な実装手法を伝授する。

—

1. なぜ「力技」の自動化は失敗するのか

多くの開発者が陥る罠は、「とりあえず`GetSelectedObject`を繰り返して力技で計算する」ことだ。これでは部品の階層構造や、コンフィギュレーションの切り替えが発生した瞬間に例外が噴出する。

堅牢な自動化を実現するための鉄則は以下の3点だ。

1. 数学的アプローチ: `IMathUtility` を活用し、部品の面から法線ベクトルを抽出して板厚を計算する。
2. キャッシュ戦略: 繰り返し同じ部品の属性を読みに行かない。`Scripting.Dictionary` を使い、メモリ上で一度計算した板厚は再利用する。
3. 疎結合な設計: ファイルパスを直書きせず、プロパティやメタデータに依存させる。

—

2. 締結バリデーションのプロトタイプ実装

このコードは、アセンブリ内のボルトと「それが貫通している板」を検出し、その合計厚みを計算してボルトの規格と比較するフレームワークの核となる部分だ。

‘ SolidWorks API: ボルト締結バリデーションのコアロジック
Option Explicit

Public Sub ValidateBoltLengths()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If

Set swAssy = swModel

‘ 1. 全構成部品を走査
Dim vComps As Variant
vComps = swAssy.GetComponents(False)

Dim i As Long
For i = 0 To UBound(vComps)
Dim swComp As SldWorks.Component2
Set swComp = vComps(i)

‘ ボルト部品のみをフィルタリング(プロパティで判定するのが堅牢)
If GetCustomProperty(swComp, “PartType”) = “Bolt” Then
CheckBoltFitment swComp
End If
Next i
End Sub

Private Sub CheckBoltFitment(swComp As SldWorks.Component2)
‘ ここでボルトの全長(CustomPropertyから取得)と、
‘ アセンブリ内の貫通厚みを比較するロジックを配置
Dim boltLength As Double
boltLength = CDbl(GetCustomProperty(swComp, “Length”))

‘ 貫通厚みの計算は、ボルトの軸線と交差する面群を再帰的に取得
‘ … (ここにMathUtilityを用いた空間計算ロジックが入る) …

Debug.Print “部品名: ” & swComp.Name2 & ” / 規定値: ” & boltLength
End Sub

Private Function GetCustomProperty(swComp As SldWorks.Component2, propName As String) As String
Dim swModel As SldWorks.ModelDoc2
Set swModel = swComp.GetModelDoc2
If swModel Is Nothing Then Exit Function

Dim configName As String
configName = swComp.ReferencedConfiguration

‘ カスタムプロパティ取得の定石
GetCustomProperty = swModel.CustomInfo2(configName, propName)
End Function

—

3. 実務で勝つための「3つの絶対ルール」

① 「構成部品の表示状態」に依存しない

`swComp.IsHidden` や `Suppressed` の状態を無視して計算すると、非表示の部品まで計算対象にしてしまい、エラーや誤判定の原因となる。必ず `swComp.GetSuppression` で状態を確認し、`swComponentSuppressionState_e.swComponentFullyResolved` のものだけを対象にせよ。

② 計算結果をCSV/JSONで外部保持せよ

アセンブリが巨大な場合、VBA内で全ての演算を完結させるとSolidWorks自体がフリーズする。

  • ステップ1: 部品ごとの板厚・仕様を読み取りCSV/JSONに出力。
  • ステップ2: 別プロセス(Python等)でバリデーションを回す。
  • ステップ3: SolidWorks APIで「赤色」に色付けして可視化する。

この3段階が、大規模アセンブリを捌くアーキテクトの設計だ。

③ データベース(DB)連携の注意

部品表(BOM)データと照合する際、絶対に行うべきは「部品のシグネチャ(ファイル名+コンフィギュレーション名)」をキーにしたハッシュ管理だ。ファイルパスの移動によるリンク切れを考慮し、`swComp.GetPathName` ではなく `swComp.GetID` を活用する癖をつけよう。

—

結論:自動化は「責任の所在」を明確にするツールだ

私が提供したこのコードは、あくまで「不適合の可能性」を指摘するセンサーである。エンジニアがやるべきことは、このツールが弾き出したリストを「設計根拠」としてレビューに活用することだ。

VBAはレガシーと言われることもあるが、SolidWorks APIを操る限り、これほど強力な武器はない。
「計算はマシンに任せ、人間は意思決定に集中する」。
この原則を胸に、貴方のCAD環境を自動化の聖域へと押し上げてほしい。

質問があればいつでも投げてくれ。次回の記事では、`MathUtility` を駆使した「干渉回避のためのベクトル解析法」について深掘りしよう。

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