こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して図形を描かせてみたものの、「自分で一からコードを書こうとすると、生成した線や円がバラバラに崩れてしまう……」そんな壁にぶつかっていませんか?
CADの自動化において、コードで描いたスケッチが意図せず暴走するのを防ぐカギ、それが「幾何拘束(Geometric Relation)」のプログラム制御です。
今回は、SolidWorks APIの心臓部である `IConstraintManager` を使い、スケッチ要素に「水平」「垂直」「一致」の拘束を意図通りに、そしてロバスト(堅牢)に自動付与する極意を伝授します。ここをクリアすれば、あなたのVBAスキルは「記録の模倣者」から「真の自動化エンジニア」へと大きく飛躍しますよ。
—
1. なぜ「幾何拘束のプログラム制御」が必要なのか?
SolidWorksのAPIで直線や円弧を描画するとき、私たちは `CreateLine2` や `CreateArc8` などのメソッドを使います。しかし、これらは「ただそこに線がある」状態を作っているにすぎません。人間がマウスで適当に線を描いたときと同じで、寸法を入れても、ちょっとドラッグしただけで形がぐにゃっと崩れてしまいます。
実務で使える堅牢な自動化ツールを作るには、描画したあとに「お前は水平であれ」「この点とこの点はくっつけ」と、APIを通じて命令(拘束の付与)を叩き込む必要があるのです。
—
2. 幾何拘束を司る黒幕:`IConstraintManager` とは?
SolidWorksのスケッチ空間において、拘束の管理を一手に引き受けているのが `IConstraintManager`(拘束マネージャー) です。
モデルドキュメント(`ModelDoc2`)からスケッチ編集状態(`SketchManager`)を抜け出し、要素を操作する際、このマネージャーが持つ `AddRelation` メソッドを呼び出すことで、プログラムから自由自在に拘束を追加できます。
押さえておくべき主要な拘束タイプ
APIで指定する拘束の種類(定数)はたくさんありますが、実務で最も使用頻度が高いのは以下の3つです。
- 水平 (Horizontal): `swConstraintType_HORIZONTAL`
- 垂直 (Vertical): `swConstraintType_VERTICAL`
- 一致 (Coincident): `swConstraintType_COINCIDENT`
—
3. 【実践】水平・垂直・一致拘束を自動付与するVBAコード
それでは、実際に動くコードを見てみましょう。
このサンプルマクロでは、原点を起点とした「L字型のフレーム(2本の直線)」をプログラムで描き、それぞれの線に「水平」「垂直」拘束を与え、さらに2本の線の端点同士を「一致」させてピタッと繋ぎ合わせます。
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSkMgr As SldWorks.SketchManager
Dim swConstraintMgr As SldWorks.ConstraintManager
Dim line1 As SldWorks.SketchSegment
Dim line2 As SldWorks.SketchSegment
Dim boolstatus As Boolean
‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントを開いてから実行してください。”, vbCritical
Exit Sub
End If
Set swSkMgr = swModel.SketchManager
‘ 2. スケッチモードを開始(新しい平面、または既存の平面を選択状態にしておくこと)
swSkMgr.InsertSketch True
‘ 3. 図形の描画(原点(0,0,0)から(0.1,0,0)まで水平線を描く)
Set line1 = swSkMgr.CreateLine(0, 0, 0, 0.1, 0, 0)
‘ ((0.1,0,0)から(0.1,0.1,0)まで垂直線を描く)
Set line2 = swSkMgr.CreateLine(0.1, 0, 0, 0.1, 0.1, 0)
‘ 一旦選択を解除(クリーンな状態にする)
swModel.ClearSelection2 True
‘ ————————————————————-
‘ 4. 幾何拘束の自動付与 (IConstraintManagerの活用)
‘ ————————————————————-
Set swConstraintMgr = swSkMgr.ConstraintManager
‘ — ① line1 に「水平」拘束を付与 —
line1.Select4 False, 0 ‘ 対象の線をあらかじめ選択する
boolstatus = swConstraintMgr.AddRelation(swConstraintType_HORIZONTAL)
swModel.ClearSelection2 True
If boolstatus Then
Debug.Print “line1 に水平拘束を追加しました。”
End If
‘ — ② line2 に「垂直」拘束を付与 —
line2.Select4 False, 0
boolstatus = swConstraintMgr.AddRelation(swConstraintType_VERTICAL)
swModel.ClearSelection2 True
If boolstatus Then
Debug.Print “line2 に垂直拘束を追加しました。”
End If
‘ — ③ line1 の終点 と line2 の始点 に「一致」拘束を付与 —
‘ 注意:点同士を拘束する場合、それぞれの要素をマーク(Mark)付きで選択する必要があります。
‘ スケッチセグメントの端点を取得するには IGetStartPoint2 / IGetEndPoint2 を使いますが、
‘ 今回は簡易的に「選択」によるAPI操作の基本パターンを示します。
‘ ※実務ではスケッチポイントオブジェクト同士を選択して一致させます
Dim swPoint1 As SldWorks.SketchPoint
Dim swPoint2 As SldWorks.SketchPoint
‘ line1の終点(EndPoint)を取得
Set swPoint1 = line1.GetEndPoint2()
‘ line2の始点(StartPoint)を取得
Set swPoint2 = line2.GetStartPoint2()
‘ それぞれ異なるマーク(Mark)を指定して選択するのがAPIの鉄則!
swPoint1.Select4 1, Nothing, False ‘ Mark = 1
swPoint2.Select4 1, Nothing, True ‘ Mark = 1 (追加選択)
boolstatus = swConstraintMgr.AddRelation(swConstraintType_COINCIDENT)
swModel.ClearSelection2 True
If boolstatus Then
Debug.Print “2つの端点に一致拘束を追加しました。”
End If
‘ 5. スケッチ終了
swSkMgr.InsertSketch True
MsgBox “完全定義されたL字スケッチの生成に成功しました!”, vbInformation
End Sub
—
4. ここでつまずく!初心者が陥りやすい3大エラーと回避術
SolidWorks VBAで幾何拘束を扱う際、誰もが一度はハマる「罠」があります。先輩からのアドバイスとして頭に入れておいてください。
罠1:「何を対象にしているか」がSolidWorksに伝わっていない
APIの `AddRelation` は、「今、画面上で選択されている要素(Selection)」に対して拘束を適用するという仕様になっています。
コード内でいきなり `AddRelation` を呼んでも、「どれを?」とSolidWorksが迷ってエラーになります。必ず対象のオブジェクトに対して `.Select4` メソッドを事前に実行してください。
罠2:複数選択時の「マーク(Mark)」の概念を無視している
「一致(Coincident)」のように、2つの点や線を選ぶ必要がある拘束では、それぞれのオブジェクトに適切なマーク(Mark値)を渡す必要があります。
例えば、点と点を一致させたいときは、両方の点を選択する際に同じマーク(通常は `1`)を指定してあげないと、「何と何を一致させればいいのか」をSolidWorksが理解できず、拘束の追加に失敗します。
罠3:拘束の競合(Over-defined)によるフリーズや失敗
人間が手動でCADを操作しているときと同じです。すでに長さが固定されていたり、別の矛盾した拘束がついている状態に対して無理やり別の拘束を追加しようとすると、スケッチが破綻します。「矛盾した形状をプログラムしていないか?」をロジカルに組み立てることが大切です。
—
まとめ
今回は、`IConstraintManager` を使った幾何拘束のプログラム制御について解説しました。
- 描画するだけではなく、`IConstraintManager.AddRelation` で意味付け(拘束)を行う。
- 操作の前には必ず `.Select4` でオブジェクトを選択状態にする。
- 複数要素の拘束には マーク(Mark) の指定が命綱になる。
ここをクリアすれば、あなたが書くマクロは単なる「お絵描きツール」から、「意図通りにエラーなく完璧な形状を生み出すプロフェッショナルな自動化システム」へと生まれ変わります。
明日からのSolidWorks開発に、ぜひこの知見を活かしてくださいね。それでは、また次回の極限の知見でお会いしましょう!
