【SolidWorks API】数千部品の地獄を可視化せよ:進捗バーを実装する「非同期模倣」の極意
SolidWorks APIを用いたアセンブリ自動構築。数分かかる処理の最中、画面がフリーズし「SolidWorksが応答していません」と表示される…そんな開発者としての未熟さを晒すのは今日で終わりにしよう。
VBAはシングルスレッドだ。だが、「進捗を更新する」という目的においては、非同期処理を模倣する知的なアプローチが存在する。 今回は、長大なアセンブリ構築処理をユーザーに可視化し、UXを劇的に向上させるための「堅牢なUI設計」を伝授する。
—
1. なぜ「DoEvents」だけでは不十分なのか
初心者は単純にループ内で `DoEvents` を叩くが、これだけでは不十分だ。なぜか?
- イベントの飽和: `DoEvents` を過剰に叩くと、OSがSolidWorksの描画更新よりもメッセージ処理を優先し、逆に処理速度が低下する。
- 再入問題: 処理中にユーザーが「閉じる」ボタンを押せば、メモリリークや未定義状態のアセンブリが生成される。
プロの鉄則: 「進捗更新は一定の閾値(例えば1%ごと)でのみ行い、ユーザーフォームは『モードレス』で開き、かつ『キャンセルフラグ』を厳格に管理する」ことだ。
—
2. 実装:プロフェッショナルなUI制御コード
まずはユーザーフォーム(`frmProgress`)を作成し、`ProgressBar` コントロールを配置してほしい。
ユーザーフォーム側のコード(frmProgress)
フォームは「キャンセル」の受け口に特化させる。
‘ フォームモジュール:frmProgress
Public CancelFlag As Boolean
Private Sub btnCancel_Click()
CancelFlag = True
Me.Hide
End Sub
‘ 呼び出し元からUIを更新するためのメソッド
Public Sub UpdateProgress(ByVal percent As Double, ByVal status As String)
Me.ProgressBar.Value = percent
Me.lblStatus.Caption = status
DoEvents ‘ ここで描画更新を強制する
End Sub
標準モジュール側の処理(メインエンジン)
ここが、数千部品のアセンブリを制御する心臓部だ。
Public Sub BuildAssemblyAutomated()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim progressUI As New frmProgress
Set swApp = Application.SldWorks
‘ モードレスでフォームを表示(これで処理が止まらない)
progressUI.Show vbModeless
Dim totalParts As Long: totalParts = 100 ‘ 例として100パーツ
Dim i As Long
For i = 1 To totalParts
‘ 1. キャンセルチェック(必須)
If progressUI.CancelFlag Then
MsgBox “処理が中断されました。”, vbCritical
Unload progressUI
Exit Sub
End If
‘ 2. アセンブリ構築の重い処理
‘ swAssy.AddComponent6(…) 等
‘ 3. 進捗更新(頻度を調整してパフォーマンスを維持)
If i Mod 5 = 0 Then
progressUI.UpdateProgress (i / totalParts) 100, “部品 ” & i & ” を追加中…”
End If
Next i
Unload progressUI
MsgBox “構築完了!”, vbInformation
End Sub
—
3. 現場で生き残るための「3つの設計哲学」
① 「モードレス表示」の罠を回避せよ
`vbModeless` でフォームを表示すると、ユーザーがSolidWorksの他の操作を行えてしまう。これを防ぐには、処理開始時に `swApp.UserControl = False` を指定し、外部操作を一時的にロックするのが最も確実だ。
② ファイルI/Oのボトルネックを排除せよ
数千部品を読み込む際、最も遅いのは「ファイルを開く」というOSの挙動だ。
- 解決策: すべてのファイルを `swApp.OpenDoc6` でバックグラウンドで開く前に、ファイルパスの存在チェックを事前に行え。実行時のファイル不在エラーは、自動化ツールの最大の恥だ。
③ データベース連携のトランザクション管理
もしExcelやSQL Serverから部品データを取得しているなら、「1パーツ追加ごとに通信するな」。最初に全データを配列に格納し、メモリ上で処理せよ。APIの呼び出し回数が減れば、体感速度は数倍に跳ね上がる。
—
結論:エンジニアの品格
「動けばいいコード」を書くのはアマチュアだ。
長大な処理を回すとき、ユーザーは「今、何が起きているのか」「いつ終わるのか」「失敗していないか」という不安と戦っている。進捗バーは単なるグラフィックではなく、システムとユーザーを結ぶ「信頼の架け橋」である。
このコードをベースに、あなたの現場の要件に合わせて拡張してほしい。堅牢なエラーハンドリングと、ユーザーへの敬意があれば、あなたの作成する自動化ツールは、現場で愛され続ける「伝説のツール」になるはずだ。
さあ、コードを書け。SolidWorksをあなたの思い通りに操るために。
