【入門編】【上級プロ】外部PDS/PLMシステムとのREST API連携による、アセンブリ構成部品の自動チェックイン・チェックアウト制御 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して「生成されたコードを眺めるだけ」のステージは、もう卒業しましたね。

今回は、一歩進んだプロの領域——「外部PDS/PLMシステムとのREST API連携による、アセンブリ構成部品の自動チェックイン・チェックアウト制御」について解説します。

「SolidWorksのマクロで外部のWebサービスと通信するなんて難しそう…」と思うかもしれませんが、ここをクリアすれば、あなたの設計業務は単なる「モデリング作業」から、「エンジニアリング・パイプラインの構築」へと劇的に進化します。

「難しそう」を「なんだ、こういうことか!」に変えるために、優しく、しかし本質を突いたアプローチで一緒に紐解いていきましょう。ここをクリアすれば、SolidWorks VBAの応用力はバッチリですよ!

—

1. なぜ「PLM連携×VBA」なのか?(全体像の理解)

大規模な設計現場では、複数人で同じアセンブリや部品を同時に編集してしまい、データが上書きされて消えてしまう「コンフリクト(競合)」が最大の敵です。これを防ぐのがPLM(Product Lifecycle Management)システムです。

通常、設計者はPDM/PLMの専用アドイン画面から「チェックアウト(編集権限の取得)」や「チェックイン(サーバーへの保存とロック解除)」を行います。しかし、これを定型的なアセンブリの自動生成・構成変更スクリプトの裏側で完全に同期(API連携)させられたらどうでしょう?

[SolidWorks VBA]
│
├─ 1. REST APIでPLMへ「チェックアウト」リクエスト
├─ 2. サーバーから最新部品をローカルにダウンロード
├─ 3. SW上でアセンブリを動的に組み立て・合致(Mate)定義
└─ 4. 処理完了後、自動チェックイン・または状態同期

この一連の流れをVBAで制御する技術を、今回はマスターします。

—

2. SolidWorks VBAからHTTP通信を行う極意

VBAには標準で強力なHTTPクライアント機能がありません。そのため、Windowsが標準搭載しているCOMコンポーネントである `MSXML2.ServerXMLHttp.6.0` または `WinHttp.WinHttpRequest.5.1` を使用します。

ここでは、REST API(JSON形式のデータやり取り)を叩くための最も堅牢な実装パターンを見てみましょう。

実装コード:PLMからチェックアウトを実行する関数

‘ ==============================================================================
‘ 外部PLMシステムに対してREST API経由でチェックアウトを要求する関数
‘ ==============================================================================
Public Function RequestPLMCheckout(ByVal partNumber As String, ByVal targetUser As String) As Boolean
Dim http As Object
Dim url As String
Dim payload As String
Dim responseText As String
Dim status As Long

‘ エラーハンドリングの準備
On Error GoTo ErrorHandler

‘ 1. エンドポイントのURL設定(社内PLMのAPIサーバー)
url = “https://plm.internal-company.com/api/v1/parts/checkout”

‘ 2. 送信データ(JSON形式)の組み立て
payload = “{“”part_number””: “”” & partNumber & “””, “”user””: “”” & targetUser & “””}”

‘ 3. HTTPオブジェクトの生成 (WinHttpRequestを使用)
Set http = CreateObject(“WinHttp.WinHttpRequest.5.1”)

‘ 通信タイムアウト設定 (接続:5秒, 送受信:10秒)
http.SetTimeouts 5000, 5000, 10000, 10000

‘ 4. リクエストの初期化 (POSTメソッド)
http.Open “POST”, url, False

‘ ヘッダーの設定 (JSONを送信することを明示)
http.SetRequestHeader “Content-Type”, “application/json”
http.SetRequestHeader “Accept”, “application/json”
‘ 必要に応じて認証トークンを付与 (Bearer Tokenなど)
http.SetRequestHeader “Authorization”, “Bearer YOUR_API_ACCESS_TOKEN”

‘ 5. リクエスト送信
http.Send payload

‘ 6. レスポンスの検証
status = http.Status
responseText = http.ResponseText

If status = 200 Then
‘ 成功時の処理(必要に応じてJSONをパースする)
Debug.Print “Checkout Success: ” & responseText
RequestPLMCheckout = True
Else
‘ 失敗時
MsgBox “PLMチェックアウトに失敗しました。Status: ” & status & vbCrLf & responseText, vbCritical
RequestPLMCheckout = False
End If

Exit Function

ErrorHandler:
MsgBox “API通信中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical
RequestPLMCheckout = False
End Function

💡 コードの急所解説

  • `WinHttp.WinHttpRequest.5.1` の採用: `MSXML2.ServerXMLHttp` よりもプロキシ環境やタイムアウト制御において安定性が高いため、業務システム連携ではこちらを推奨します。
  • 同期通信 (`False`): 今回は「部品がチェックアウトできたことを確認してからSolidWorksの処理に進む」必要があるため、非同期ではなく同期処理(`False`)を選択しています。

—

3. アセンブリの自動生成と合致(Mate)のライフサイクル管理

PLMから安全にローカルへ取得した部品ファイル(例: `C:\PLM_Cache\bolt.sldprt`)を、SolidWorks上でアセンブリに組み込み、合致を定義します。

ここで重要なのは、「APIで取得 → アセンブリに挿入 → 失敗したらロールバック(チェックインを戻す)」というトランザクションの意識です。

実装コード:アセンブリへの部品挿入と同心円合致の自動化

‘ ==============================================================================
‘ アセンブリに部品を挿入し、特定の面同士を同心円(Concentric)合致させる実例
‘ ==============================================================================
Sub InsertAndMateComponentFromPLM()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim componentPath As String
Dim insertedSuccessful As Boolean

‘ SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ アクティブなドキュメントがアセンブリかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If

If swModel.GetType <> swDocumentTypes_e.swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメント内で実行してください。”, vbExclamation
Exit Sub
End If

Set swAssDoc = swModel

‘ PLMキャッシュから取得した部品パス
componentPath = “C:\PLM_Cache\Bracket_A.sldprt”

‘ 【ステップ1】PLMへチェックアウトを要求
If Not RequestPLMCheckout(“Bracket_A”, “engineer_01”) Then
MsgBox “部品が他のユーザーによってロックされているため、処理を中断します。”, vbCritical
Exit Sub
End If

‘ 【ステップ2】アセンブリへ部品をインスタンス配置
Dim transform As SldWorks.MathTransform
Set swComp = swAssDoc.AddComponents3(componentPath, 0, 0, 0)

If swComp Is Nothing Then
MsgBox “部品の挿入に失敗しました。”, vbCritical
‘ 失敗時はPLMのチェックインを戻す処理(Undo APIなど)をここに記述
Exit Sub
End If

‘ 【ステップ3】面を選択して合致(Mate)を追加する
‘ 実務ではここで正確な面名やфейスIDを指定してSelectByName2等を用います
‘ ※ここでは概念的な構文を示します
Dim mateRet As Long

‘ 例: アセンブリの基準軸と、挿入した部品の穴のエッジを選択して同心円合致
boolstatus = swModel.Extension.SelectByID2(“Axis1@”, “AXIS”, 0, 0, 0, True, 1, Nothing, 0)
boolstatus = swModel.Extension.SelectByID2(“Circle1@Bracket_A-1@Assembly1”, “EDGE”, 0, 0, 0, True, 1, Nothing, 0)

‘ 同心円合致の実行
Dim swMateAddData As SldWorks.Mate2
Set swMateAddData = swAssDoc.AddMate3(swMateType_e.swMateCONCENTRIC, swMateAlign_e.swMateAlignCLOSEST, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateRet)

‘ 再構築
swModel.EditRebuild

MsgBox “PLMからの部品取得、アセンブリ配置、および合致の定義が完了しました!”, vbInformation
End Sub

—

4. 現場で絶対にハマる「落とし穴」と回避の知見

プロの現場でこの仕組みを運用する際、必ず直面する壁があります。事前に知っておくことで、無駄なデバッグ時間を何十時間も節約できます。

1. ネットワーク遅延とタイムアウト

  • 現象: 巨大なアセンブリ(数千部品)に対して一括でAPIチェックアウトを走らせると、サーバーが悲鳴を上げたり、VBA側がタイムアウトエラーを起こします。
  • 対策: 一度に全てを処理せず、`Scripting.Dictionary` や配列を用いて「非同期キュー」を作るか、あるいは必要最小限の部品だけをオンデマンドで取得するようコードを設計してください。

2. ファイルパスのローカルキャッシュ問題

  • 現象: PLMからダウンロードしたファイルが古いキャッシュを参照してしまい、最新の変更が反映されない。
  • 対策: API経由でチェックアウトする際、サーバー側のハッシュ値(MD5等)とローカルファイルのタイムスタンプを比較し、一致しない場合は強制上書きダウンロードするロジックをVBA側(あるいはバッチファイル経由)に組み込みます。

3. SolidWorksのコンテキスト喪失(COMエラー崩壊)

  • 現象: API通信(待ち時間)の最中にユーザーがSolidWorksの画面をカチカチクリックしたり別のモーダルダイアログを開くと、VBAのオブジェクト参照が吹き飛び(`Object variable or With block variable not set`)、SolidWorks自体がフリーズする。
  • 対策: API通信中や重いアセンブリ構築処理の間は、`swApp.UserControl = False` や画面描画の凍結(`swModel.Visible = False` または `swApp.SetProcessPause` 等)を活用し、ユーザーの介入を完全にブロックする気概を持ちましょう。

—

まとめ

今回は、SolidWorks VBAの枠を飛び出し、外部REST API(PLM)と連携した高度なアセンブリ自動化・排他制御の世界を解説しました。

  • HTTP通信: `WinHttp.WinHttpRequest.5.1` を使ってJSONを安全にやり取りする。
  • トランザクション思想: 「APIでロック取得 ➔ SWで配置・合致 ➔ 失敗時のケア」の順序を守る。
  • 堅牢性の確保: ネットワーク遅延やユーザーの割り込みを防ぐ配慮をする。

「マクロの記録」の向こう側にあるこの世界をモノにすれば、あなたの設計部署において、あなたは「ただのSolidWorks使い」ではなく、「誰もが頼る自動化のアーキテクト」になれます。

ぜひ、社内のテスト環境で安全なAPIを叩くところから、一歩を踏み出してみてください。応援しています!

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