【アセンブリ自動化の闇】幅寄せ合致の「反転」を完全に制圧する――Alignment引数の深淵
SolidWorks API、特に`AddMate5`を使いこなしていると必ず直面する壁がある。それが「合致の逆転現象」だ。
「なぜ、意図した向きで配置されないのか?」
「なぜ、前回の実行時と結果が違うのか?」
この問いに対する答えを、ドキュメントの表面的な翻訳で済ませてはならない。これは、SolidWorksが保持する「内部的な法線ベクトル」と「MateAlignment」の数学的な不整合に起因する、極めて構造的な問題だからだ。
今日は、この「合致の方向」をプログラムで完全に掌握し、安定した自動アセンブリを構築するための極限の知見を授ける。
—
1. `swMateAlignment_e` の罠を理解する
`AddMate5`を使用する際、第8引数 `Alignment` に `swMateAlignment_Aligned` か `swMateAlignment_AntiAligned` を指定する。しかし、多くのエンジニアがここで躓く。
なぜなら、この「Aligned(整列)」が指し示す基準は、合致させる2つのサーフェス(または面)の法線ベクトルがどう向いているかという幾何学的な事実に基づいているからだ。
- Aligned: 2つの面の法線が同じ方向を向く(面が向かい合う場合は逆、背中合わせなら同じ)
- AntiAligned: 2つの面の法線が逆方向を向く
部品の設計者がモデリング時に「面の法線をどちらに向けて作成したか」という、属人化された履歴に依存してはいけない。我々が構築すべきは、「現在のベクトルの向きを計算し、望む結果を得るために必要な引数を動的に算出するロジック」である。
—
2. ベクトル制御による完全な合致の自動化
実務レベルで最も確実なのは、合致対象の面の法線を取得し、内積(Dot Product)から現在の相対関係を計算することだ。これにより、部品の向きがどうなっていようと、常に「面Aと面Bを正対させる」といった制御が可能になる。
‘ 伝説的なアセンブリ自動化のための汎用関数
‘ 引数:
‘ swApp As SldWorks.SldWorks
‘ mateEnt1, mateEnt2 As SldWorks.Entity
‘ 戻り値: swMateAlignment_e
Public Function GetCorrectAlignment(ByVal swApp As SldWorks.SldWorks, _
ByVal ent1 As SldWorks.Entity, _
ByVal ent2 As SldWorks.Entity) As Long
Dim face1 As SldWorks.Face2: Set face1 = ent1
Dim face2 As SldWorks.Face2: Set face2 = ent2
‘ 法線ベクトルを取得
Dim normal1 As Variant: normal1 = face1.Normal
Dim normal2 As Variant: normal2 = face2.Normal
‘ 内積計算 (Dot Product)
‘ 負の値ならベクトルは対向している
Dim dotProduct As Double
dotProduct = (normal1(0) normal2(0)) + (normal1(1) normal2(1)) + (normal1(2) normal2(2))
‘ 内積が負であれば、すでに面は向かい合っている(AntiAligned状態)
If dotProduct < 0 Then
GetCorrectAlignment = swMateAlignment_AntiAligned
Else
GetCorrectAlignment = swMateAlignment_Aligned
End If
' メモリ最適化: オブジェクト参照の明示的解放
Set face1 = Nothing
Set face2 = Nothing
End Function
---
3. オブジェクトのライフサイクルとパフォーマンス
SolidWorks APIを扱う際、COMオブジェクトの解放を怠ることは、大規模アセンブリ構築時の「メモリリークによるフリーズ」を招く最大の要因だ。
- 明示的解放: `Set Object = Nothing` は単なる作法ではない。VBAのGC(ガベージコレクション)に頼らず、メモリ上の参照カウントを即座にデクリメントさせることで、SolidWorksプロセスの安定性を担保する。
- 再構築の抑制: `AddMate5`を大量に呼ぶ場合、都度 `Rebuild` をかけるのは愚策である。`ModelDoc2::EditRebuild3` は最後に一度だけ呼べばいい。それまでは `swAssemblyDoc::AutoMate` や `FeatureManager` の更新を最小限に抑えるのが、プロフェッショナルの挙動だ。
—
4. レガシー環境とWindows API連携の極意
もし、アセンブリ生成プロセスが長時間にわたる場合、Windows APIの `Sleep` 関数や `DoEvents` を挟むことは避けられない。しかし、安易な `DoEvents` は、ユーザーの誤操作によるプロセス割り込みを許す隙を生む。
私は、クリティカルな処理中には以下の定石を推奨している。
1. DoEventsの局所化: 処理の合間に挟むなら、最低限の待機時間を設ける。
2. エラーハンドリング: `On Error GoTo` で必ず `swApp.UserControl = True` を復帰させること。これを忘れると、SolidWorksが裏側で死んだままプロセスが残り、次回のマクロ実行を阻害する。
—
結論:技術は「予測可能」でなければならない
アセンブリの自動化において、最もコストがかかるのは「なぜか失敗する」という再現性の低いバグの調査だ。
今回紹介した「法線ベクトルによる動的アライメント計算」を実装すれば、部品の初期姿勢やモデリングの癖に左右されることはなくなる。機械的な処理を人間が直感に頼って解決しようとするな。数学的な根拠(ベクトル)に基づき、コードで強制的に制御せよ。
それが、SolidWorksの APIを掌握する唯一の道である。
貴殿のエンジニアリングが、より強固で、より美しい自動化を実現することを期待している。
