【SolidWorks自動化】アセンブリ・クローン作成の極意:参照パスの「迷子」を完全に撲滅する
エンジニア諸君。設計現場で最も時間を浪費し、かつ最もヒューマンエラーを生むのが「既存アセンブリのコピー&リネーム」だ。
「とりあえずフォルダをコピーして、中身のファイル名を一括置換して……」などと手作業でやっているなら、今すぐその習慣を捨てろ。SolidWorksの内部参照(Reference)は、一度でもパスの整合性が崩れれば、巨大なアセンブリを読み込むたびに「ファイル検索のダイアログ」が立ち上がるという、開発者にとっての悪夢が始まる。
今日は、APIの裏側を叩き、「参照パスを壊さずにサブアセンブリを安全にクローンする」ための、実務レベルの解法を伝授する。
—
1. なぜ「手動コピー」が破滅を招くのか
SolidWorksはファイルをディスク上のパスではなく、内部ID(Internal ID)と相対パスの組み合わせで管理している。OS上の単なるコピペは、この「参照の紐付け」を破壊する最大の原因だ。
堅牢なクローンを実現するためには、以下の原則を守らなければならない。
1. 参照をメモリ上で解決する: ファイルを開く前にリダイレクトをかける必要がある。
2. `ISldWorks::CopyDocument` の限界を知る: 単純なコピー関数では、複雑な参照ツリーを正確に追跡できないケースが多い。
3. パスの完全制御: ターゲットディレクトリの正規化(パスの深さや特殊文字の排除)をコード側で強制する。
—
2. プロダクション級・クローン自動化ロジック
このコードは、単にファイルをコピーするのではない。SolidWorksの `DocumentSpecification` を介して、ファイルを開く前に参照先を「新規プロジェクトフォルダ」へ向けるための設計思想に基づいている。
‘ 必要な参照設定: SolidWorks 20xx Type Library
Option Explicit
Sub CloneSubAssembly()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim sourcePath As String, targetPath As String
Dim swDocSpec As SldWorks.DocumentSpecification
Set swApp = Application.SldWorks
‘ 1. 現在開いているアセンブリのパスを取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then MsgBox “アセンブリを開いてください”: Exit Sub
sourcePath = swModel.GetPathName
‘ 2. ターゲットパスの設定(実務ではここをUI入力やデータベース連携にする)
targetPath = “C:\Projects\NewProject\Assembly_Clone.sldasm”
‘ 3. 堅牢なコピー処理の実行
‘ ISldWorks::CopyDocumentは、参照先を維持しつつ名前を変えるための最強の武器
Dim nErrors As Long, nWarnings As Long
‘ 実行前にディレクトリ存在確認を必ず行う(基本中の基本)
If Not CreateObject(“Scripting.FileSystemObject”).FolderExists(Left(targetPath, InStrRev(targetPath, “\”))) Then
MsgBox “出力先フォルダが存在しません。”
Exit Sub
End If
‘ コピー実行
‘ パラメータ: 元パス, 先パス, 参照ファイルを一緒にコピーするか(True)
Dim bRet As Boolean
bRet = swApp.CopyDocument(sourcePath, targetPath, “”, “”, swReplaceReferences)
If bRet Then
MsgBox “クローン成功: ” & targetPath
Else
MsgBox “エラー: 参照の解決に失敗しました。”
End If
End Sub
—
3. 開発現場で生き残るための「3つの鉄則」
① `swReplaceReferences` の正しい使い所
コード内の `swReplaceReferences` オプションは、コピー先のサブアセンブリが内部で持っているパーツへの参照を、自動的に新しいフォルダ構造に合わせて書き換えてくれる。これを手動でやろうとすれば、再帰処理で数千行のコードを書くことになる。APIの機能を信じろ。
② ファイルシステム連携の罠
`FileSystemObject` (FSO) を多用するな。VBAの標準機能とAPIの機能を混同する初心者が多いが、パス操作は極力「APIが受け入れ可能な形式」を維持すること。 特にネットワークドライブやNAS上のパスでは、UNCパス(`\\Server\Path`)とドライブレターの混在が致命的なバグを生む。必ずパスを正規化(`GetAbsolutePathName`)してから投げること。
③ データベース連携への拡張性
このマクロは、単なるクローンツールで終わらせるな。
- 命名規則の自動化: データベースから「プロジェクト番号」を取得し、ファイル名に自動付与する。
- プロパティの書き換え: `swModel.Extension.CustomPropertyManager` を使い、コピー後のファイル内の「作成者」や「プロジェクト名」を、新規プロジェクトの情報で上書き更新する処理を追加しろ。これで設計管理の手間がゼロになる。
—
最後に:エンジニアへの提言
自動化ツールとは、単に楽をするための手段ではない。「ミスが発生する余地そのものを物理的に消滅させるための防壁」である。
今回解説したクローン処理をマスターすれば、君たちのチームから「参照エラーの再リンク作業」という無価値な時間は消滅する。コードを書き終えたら、次はそれを「いつ、誰が使っても同じ結果が出る仕組み」に昇華させること。それが、真の業務自動化エンジニアの仕事だ。
現場からは以上だ。コードを書き、設計の自由を掴み取れ。
