【入門編】【エラー対策】面やエッジのトポロジー変更で発生する「SelectByID2失敗」を回避する安全な参照取得術 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの「SelectByID2」の罠を突破せよ:堅牢なフィーチャ操作の極意

こんにちは。SolidWorksの自動化の世界へようこそ。

マクロの記録機能を使って自動化を始めた皆さんが、最初に出くわす「巨大な壁」があります。それが「SelectByID2の呪い」です。

「昨日まで動いていたマクロが、モデルを少し修正しただけでエラーになる…」
「面を選択しようとしても、オブジェクトが見つからないと怒られる…」

これはあなたが悪いのではありません。SolidWorksのAPIが、モデルの履歴やトポロジーの変化によってエンティティID(内部的な名前)を再割り当てしてしまうという「仕様」が原因です。

今日は、マクロの記録という「砂上の楼閣」から脱却し、モデルが変化しても壊れない「動的参照取得」の極意を伝授します。ここをマスターすれば、あなたのマクロは一段上のレベルに到達します。

なぜ「SelectByID2」は裏切るのか?

マクロの記録を使うと、コードは以下のように出力されます。

‘ 典型的な「壊れやすい」コード
boolstatus = Part.Extension.SelectByID2(“”, “FACE”, 0.05, 0.02, 0, False, 0, Nothing, 0)

このコードの何が問題か、わかりますか?
実は、これには「座標」や「内部的な名前」という、極めて不安定な情報しか含まれていないのです。

1. トポロジーの変更: フィーチャを追加・削除すると、SolidWorksは内部の面IDを付け直します。
2. モデルの変形: 寸法を変えると、座標(0.05, 0.02, 0)が「面の上」から外れてしまうことがあります。

これでは、少しの設計変更でマクロが止まるのは当然ですね。

堅牢な参照取得術:属性(Attributes)で特定する

「名前や座標がダメなら、どうすればいいのか?」
答えは「面が持つ固有の情報(幾何学的属性)で探す」ことです。

例えば、「上を向いている平面」や「特定の法線ベクトルを持つ面」は、モデルがどれだけ変更されても、その属性は変わりません。これを利用して、ループ処理で面を一つずつ調査し、ターゲットを見つけ出すのがプロのやり方です。

実践コード:法線ベクトルから「上面」を取得する

このコードは、アクティブなパーツ内のすべての面を走査し、「上向き(Z軸方向)」の面を特定して選択します。

Sub SelectTopFaceSafely()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swBody As SldWorks.Body2
Dim swFace As SldWorks.Face2
Dim swEnt As SldWorks.Entity
Dim swMathUtil As SldWorks.MathUtility
Dim normal As Variant

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swPart = swModel
Set swMathUtil = swApp.GetMathUtility

‘ ボディを取得(通常はパーツ内に1つ)
Set swBody = swPart.Bodies(0)
Set swFace = swBody.GetFirstFace

‘ 全ての面をループして条件に合うものを探す
Do While Not swFace Is Nothing
‘ 法線ベクトルを取得
normal = swFace.Normal

‘ Z軸方向(0, 0, 1)の面かどうかを判定(誤差0.001程度の許容範囲)
If Abs(normal(0)) < 0.001 And Abs(normal(1)) < 0.001 And normal(2) > 0.99 Then
‘ 面をエンティティとして選択
Set swEnt = swFace
swEnt.Select4 False, Nothing
Exit Do ‘ 見つかったら抜ける
End If

‘ 次の面へ
Set swFace = swFace.GetNextFace
Loop
End Sub

このコードの「賢い」ポイント

1. SelectByID2を使わない: 座標依存の選択を排除しました。
2. 幾何学的属性を利用: 「法線ベクトル」という、設計が変わっても変わらない「面の個性」を利用しています。
3. ループによる動的探索: 固定IDに頼らず、その時々のモデルの状態を「検索」しています。

まとめ:マクロを「壊れ物」から「武器」に変えるために

SolidWorks VBAで最も大切なのは、「コンピュータに『あそこを選択しろ』と命令するのではなく、『条件に合うものを探せ』とアルゴリズムを授ける」という考え方の転換です。

  • 面を選びたいとき: 法線ベクトルや面積、中心点から検索する。
  • エッジを選びたいとき: 2つの面の交差や、長さ、方向ベクトルで検索する。

最初は少し難しく感じるかもしれません。しかし、一度この「探索型」のコーディングを覚えれば、モデルの履歴(フィーチャツリー)の変更に怯えることはなくなります。

「マクロが止まる」というストレスから解放され、ぜひ、あなたの創造的な設計作業を加速させる強力な武器を育ててください。

次回の記事では、「エッジの交点を自動検知してスケッチを配置する」という、さらに実践的なテクニックを解説します。お楽しみに!

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