【入門編】【実務中級】幅寄せ合致(Distance Mate)の逆転現象を防ぐ!アセンブリ合致方向(Alignment)をVBAで完全に制御する技術 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】なぜ部品は裏返るのか?「幅寄せ合致」をVBAで完璧に制御する極意

こんにちは。現場で「マクロの記録」に頼り切り、謎の挙動に頭を抱えていた経験はありませんか?

SolidWorks APIを使い始めると、多くの人が最初に直面する壁。それが「なぜか部品が意図しない向きで合致(Mate)してしまう」という現象です。特に「距離合致(Distance Mate)」を自動生成する際、部品が裏返ったり、計算エラーを吐いたりするのは、APIの仕様を少しだけ深く理解するだけで劇的に改善できます。

今日は、中級エンジニアへの第一歩として、「合致方向(Alignment)」をコードで支配する技術を伝授します。

—

1. なぜ「裏返る」のか? APIの仕様を暴く

`AddMate5`メソッドを実行する際、多くの人が「とりあえず動けばいい」と引数を適当に設定してしまいます。しかし、SolidWorksの計算エンジンは、あなたが選択した「面」の法線ベクトル(Normal Vector)と、アセンブリ上の座標系を計算して最短距離を求めようとします。

ここで重要なのが `Alignment`(合致方向) 引数です。

  • swMateAlignALIGNED (0): 面の向きを揃える(通常はこちら)
  • swMateAlignANTI_ALIGNED (1): 面を反転させてくっつける

「マクロの記録」は、その瞬間の座標関係をハードコードするため、部品の向きが変わると途端にエラーになります。私たちは、「プログラム側で面の向きを判定し、適切なAlignmentを強制的に与える」というロジックを組む必要があります。

—

2. 実践コード:意図した向きで合致させる技術

以下のコードは、選択した2つの面を「距離合致」で拘束する実務的なサンプルです。

‘ 伝説的なエンジニアの流儀:選択した面を基に、明示的に合致方向を制御する
Sub AddDistanceMate_Professional()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swMateFeat As SldWorks.Feature

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

‘ 1. 2つの面が選択されていることを前提とする(実務では選択判定を忘れずに!)
‘ 2. 距離を指定 (メートル単位なので注意: 10mmなら 0.01)
Dim dist As Double
dist = 0.01

‘ 3. AddMate5の核心
‘ Alignmentには 0 (Aligned) を指定するのが基本だが、
‘ 逆転を防ぐには「Flip」フラグをAPIで計算して渡すか、
‘ 構築時に swMateAlignALIGNED を明示する。

Dim swMateErr As Long
Set swMateFeat = swAssy.AddMate5( _
swMateDISTANCE, _
swMateAlignALIGNED, _
False, _
dist, _
dist, _
dist, _
0, 0, _
0, 0, 0, _
False, _
swMateErr)

If swMateErr = 0 Then
Debug.Print “合致成功:完璧な位置に配置されました。”
Else
MsgBox “エラー発生!エラーコード: ” & swMateErr
End If
End Sub

重要なポイント解説

  • 単位系: SolidWorks APIは内部的には常に「メートル」で計算します。`0.01`と書けば10mmです。ここをミリ単位で書くと、巨大な部品が出来上がってパニックになるので注意しましょう。
  • `swMateAlignALIGNED`: これを固定値ではなく変数で制御するように改造すると、部品の初期状態に関わらず、常に一定の向きで合致させることが可能になります。

—

3. 陥りやすい「罠」と解決策

罠1:面が「裏側」を向いている場合

選択した面が、モデルの裏面(法線が内側を向いている)である場合、どれだけ`ALIGNED`を指定しても部品は反転します。
解決策: 面を選択する際、`SelectByRay`などを使い、カメラの視線方向に対して法線が向いている面をプログラム的に抽出する、といった高度なフィルタリングを検討してください。

罠2:エラーコードが「0」以外を返す

`swMateErr`が0以外の場合、多くのケースで「過拘束」か「ジオメトリの欠損」です。合致を追加する前に、一度 `swModel.EditRebuild3` を呼び出し、アセンブリの状態をクリーンに保つのがプロの作法です。

—

最後に:マクロの記録を超えて

「マクロの記録」は便利な出発点ですが、そこから卒業する唯一の方法は、「なぜそのコードが生成されたのか?」という背後のAPI仕様を調べることです。

今日学んだ `Alignment` の制御さえマスターすれば、もう部品が勝手に反転して泣き寝入りすることはありません。次は、選択した面から「法線ベクトル」を取得し、プログラムが自動的に反転フラグを判断する仕組みに挑戦してみてください。

SolidWorks VBAの世界は、あなたが思っている以上に論理的で美しい世界です。ぜひ、その手で理想の自動化環境を構築してください。応援しています!

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