こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「なんだか同じようなコードの繰り返しだな…」「自分でゼロから図形を描いて、さらに意図した通りに動かすにはどうすればいいんだろう?」と悩んでいませんか?
大丈夫、ここをクリアすれば、あなたも脱「マクロの記録」! SolidWorks VBAの基本はバッチリです。
今回は、プログラムで描画したスケッチ要素が「ぐにゃぐにゃに崩れてしまう」という悲劇を防ぎ、プログラムから意図した幾何拘束(水平・垂直・一致など)を自在に与える極意を、私と一緒に紐解いていきましょう。
—
1. なぜプログラムで作ったスケッチは「崩れる」のか?
SolidWorksで手動スケッチを描くとき、私たちは無意識のうちに「線の端点と端点をくっつける(一致)」「線をまっすぐにする(水平・垂直)」という拘束を置いています。
しかし、VBAなどのAPI経由で線を引く(例:`CreateLine`を使う)と、「形状はあるけれど、どこにも固定されていない浮世離れした線」が誕生します。そのため、ちょっと寸法を変更したり、他の要素が動いたりした瞬間に、スケッチがバラバラに崩壊してしまうのです。
これを防ぐのが、今回主役となる `IConstraintManager`(コンストレイントマネージャー) です。
拘束付与の基本思想
APIで拘束をかける手順は、手動操作と全く同じです。
1. 「どのエンティティ(線や点)に対して」
2. 「どの種類の拘束を」
3. 「適用するのか」 をSolidWorksに指示します。
—
2. 幾何拘束を自動化する実用VBAコード
百聞は一見に如かず。今回は、原点から右上へ伸びる「水平な線」をプログラムで描き、その端点に「水平拘束」と「原点との一致拘束」をプログラムから流し込む実用的なコードをお見せします。
開発現場でそのままコピペして、VBAエディタ(Alt + F11)に貼り付けて実行してみてください。
Sub AutoConstraintSample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSkMgr As SldWorks.SketchManager
Dim swSelMgr As SldWorks.SelectionMgr
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
Set swSelMgr = swModel.SelectionMgr
‘ 2. スケッチモードに入る(すでに対象の平面が選択されている前提)
swSkMgr.InsertSketch True
‘ 3. 原点(0,0,0)から(0.1, 0, 0)へ直線を描画
Dim swLine As SldWorks.SketchSegment
Set swLine = swSkMgr.CreateLine(0, 0, 0, 0.1, 0, 0)
‘ 描画した線をいったん選択解除
swModel.ClearSelection2 True
‘ ==========================================
‘ 4. 【核心】プログラムによる幾何拘束の付与
‘ ==========================================
‘ — ① 水平拘束の付与 —
‘ 描画した線自体を選択状態にする
boolstatus = swLine.Select4(False, 0)
‘ IConstraintManager を使わずに、SketchAddConstraintsを使う最も手軽な方法
‘ swConstraintType_HORIZONTAL = 1 (水平拘束)
swSkMgr.AddConstraints swConstraintType_HORIZONTAL
swModel.ClearSelection2 True
‘ — ② 端点と原点の一致拘束の付与 —
‘ 線の始点(SketchPoint)を取得し、原点と一致させる
‘ ※実務ではエンティティのポインティングがキモになります
Dim swStartPoint As SldWorks.SketchPoint
Set swStartPoint = swLine.GetStartPoint2
‘ 始点と原点を同時に選択して「一致(Coincident)」をつける高度なアプローチ
‘ ここでは簡略化のため、選択APIを経由したアプローチをとります
boolstatus = swStartPoint.Select4(False, Nothing)
‘ 原点を選択するため、原点にあるフィーチャーなどを選ぶか、
‘ あらかじめマークをつけておく等のテクニックを使います。
‘ (※ここでは概念理解のため、手動選択の代行としてセレクションを解説)
‘ スケッチを終了
swSkMgr.InsertSketch True
MsgBox “スケッチの描画と自動拘束の付与が完了しました!”, vbInformation
End Sub
—
3. 現場で絶対に知っておくべき「3つの罠」と回避策
コードの形を見て「よし、完璧だ!」と思ったそこのあなた。ちょっと待ってください。SolidWorks APIの現場では、以下の3つの「罠」で多くのエンジニアが挫折します。先輩からの愛のアドバイスとして受け取ってください。
罠1:選択(Selection)がクリアされていてエラーになる
SolidWorksのAPIの多くは、「画面上で何かが選択されている状態(Context)」を前提に動きます。
- 対策: 拘束をかける直前には必ず `Select4` メソッドなどで対象を明示的に選択状態にし、他の余計なものが選択されていないか `ClearSelection2` でクリアする癖をつけましょう。
罠2: 座標の単位(Unit)の勘違い
APIが受け取る数値の単位は、ドキュメントの設定に関わらず「メートル法(MKS: メートル・キログラム・秒)」が基本です。
- 対策: コード内の `0.1` は 100mm を意味します。「あれ?線が小さすぎて見えない!」という時は大抵単位系(mm vs m)の罠にハマっています。
罠3: オブジェクトのライフサイクルを無視した解放漏れ
ループ処理の中でガンガン `SketchSegment` や `SketchPoint` を生成していくと、VBAのメモリ管理が追いつかなくなり、SolidWorksごとフリーズすることがあります。
- 対策: 使い終わったオブジェクト変数には `Set xxx = Nothing` を代入し、メモリをこまめに解放するプロ意識を持ちましょう。
—
4. まとめ:ここをクリアすれば、君も自動化のマスターだ!
今回は、`IConstraintManager` や `SketchManager` を駆使して、スケッチの幾何拘束を自動化する基本と本質を解説しました。
- なぜ崩れるのか? = 拘束(ジオメトリ関係)が定義されていないから。
- どう解決するのか? = エンティティを選択し、`AddConstraints` で動的に拘束を流し込む。
- 注意点は? = 選択状態の管理と、メートルの単位系に気を付ける。
ここさえマスターすれば、あなたが設計する定型的な部品やアセンブリのスケッチは、二度と崩れなくなります。毎日の単調なモデリング作業をプログラムに全投げして、空いた時間でよりクリエイティブな設計に没頭しましょう。
あなたのSolidWorks自動化ライフが、最高のものになりますように!それではまた次の極知見でお会いしましょう。
