【SolidWorks VBA極限の知見】SketchManager.CreateCenterLineによる基準対称線の完全自動作図と頑健な拘束付与
SolidWorks APIを活用した設計自動化の現場において、最も頻繁に発生し、かつ最もデバッグに工数を取られる領域はどこか。それは「スケッチの初期構築と幾何拘束の確実な付与」である。
UI操作であればマウスの数クリックで終わる作業も、VBAからAPIを叩くとなると話が変わる。座標系の取り違え、暗黙的なコンテキストの喪失、そして「なぜか完全定義にならない」というスケッチ破綻の呪縛。
今回は、機械設計の根幹をなす「基準対称線(センターライン)」の自動生成から、原点(Origin)との一致拘束、そして幾何拘束の付与に至る一連のプロセスを、APIのライフサイクルとメモリ管理の観点から極限まで最適化した実務コードとともに解説する。
—
1. 現場を崩壊させる「スケッチ自動化」の罠
多くのエンジニアが犯す最初の過ちは、`SldWorks.ModelDocExtension` や `SketchManager` のメソッドを場当たり的に呼び出すことだ。
SolidWorksのCOMオブジェクトは、背後で重厚長大かつステートフルなC++コアエンジン(Parasolid)を動かしている。VBA側で適切なオブジェクト解放や、アクティブドキュメントのコンテキスト管理を怠ると、「実行するたびにメモリリークが発生する」「特定のモデル形状でのみ座標計算が狂う」「謎のCOM例外(エラー 445: オブジェクトはオートメーションをサポートしていません 等)」という悪夢を見る。
特にセンターラインの作図においては以下の3点を鉄則としなければならない。
1. アクティブスケッチの明示的制御: どの面(Plane)に対してスケッチモードに入っているかをコードで完全に担保する。
2. 正確な座標系(MathUtility)の活用: 2次元スケッチ空間と3次元空間のベクトル変換を意識し、浮動小数点の丸め誤差を排除する。
3. 拘束の「完全な」付与: 線を引いただけで放置するな。原点との一致拘束、水平・垂直拘束をAPIでねじ込み、幾何学的に完全に破綻しないスケッチをプログラム側で完結させる。
—
2. 実装アーキテクチャ:堅牢なセンターライン自動作図モジュール
以下に、実務の現場で即座に稼働し、かつ数千回のバッチ実行に耐えうる堅牢性を持たせたVBAコードを示す。このコードは、新規パーツのフロント平面(Front Plane)に対し、原点を中心とした垂直なセンターラインを描画し、原点との一致拘束(Coincident)および垂直拘束(Vertical)をプログラム的に強制付与するものである。
Option Explicit
‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: 指定されたパーツドキュメントのフロント平面に基準センターラインを自動作図し、
‘ 原点拘束および垂直拘束を付与する実務特化型プロシージャ
‘ ==============================================================================
Public Sub CreateRobustCenterline()
Dim swApp As SldWorks.SldWorks
Dim swPart As SldWorks.PartDoc
Dim swModel As SldWorks.ModelDoc2
Dim swSkMgr As SldWorks.SketchManager
Dim swSelMgr As SldWorks.SelectionMgr
‘ オブジェクトの明示的取得と初期化
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
‘ パーツファイルかどうかの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “対象ファイルはパーツではありません。”, vbExclamation, “Validation Error”
Exit Sub
End If
Set swPart = swModel
Set swSkMgr = swModel.SketchManager
Set swSelMgr = swModel.SelectionMgr
‘ 1. フロント平面の選択とスケッチモードへの突入
‘ 内部キャッシュのクリアと確実なコンテキスト取得のため、Ext.SelectByID2を使用
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SelectByID2(“フロント”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “基準平面 ‘フロント’ が取得できませんでした。”, vbCritical, “Fatal Error”
Exit Sub
End If
‘ スケッチの開始(既にスケッチ中の場合は一度閉じる等のガード処理を入れるのが望ましい)
swSkMgr.InsertSketch True
‘ 2. センターラインの描画 (CreateCenterLine)
‘ 座標系: 単位はメートル (SolidWorks APIの内部単位系)
‘ ここでは原点を挟む形で、Y軸方向に長さ 100mm (0.1m) のセンターラインを生成
Dim lineSegment As SldWorks.SketchSegment
Dim startX As Double, startY As Double, startZ As Double
Dim endX As Double, endY As Double, endZ As Double
startX = 0#
startY = -0.05 ‘ -50mm
startZ = 0#
endX = 0#
endY = 0.05 ‘ +50mm
endZ = 0#
‘ センターライン作成の実行
‘ 注: CreateCenterLineは作成されたセグメントのSketchSegmentオブジェクトを返す
Set lineSegment = swSkMgr.CreateCenterLine(startX, startY, startZ, endX, endY, endZ)
If lineSegment Is Nothing Then
MsgBox “センターラインの生成に失敗しました。”, vbCritical, “API Error”
swSkMgr.InsertSketch True ‘ スケッチを強制終了
Exit Sub
End If
‘ 3. 幾何拘束の自動付与 (AddConstraint)
‘ 堅牢なスケッチ構築の肝:生成したセグメントの端点やエンティティを明示的に選択して拘束をかける
‘ 3-1. センターライン自体の垂直(Vertical)拘束付与
‘ セグメント自体を選択状態にして垂直拘束を追加
swModel.ClearSelection2 True
boolstatus = lineSegment.Select4(False, 0)
If boolstatus Then
‘ swConstraintType_VERTICAL = 1 (APIドキュメント参照)
Dim constraintResult As Long
constraintResult = swModel.SketchAddConstraints(“VERTICAL”)
End If
‘ 3-2. 原点(Origin)とセンターラインの中点、あるいは端点の一致拘束
‘ ここでは原点とセンターラインの下端を「一致 (Coincident)」させる
swModel.ClearSelection2 True
‘ 原点の選択 (内部的には “Point1” として原点が存在する、または原点座標 (0,0,0) を指定)
‘ より確実な方法として、スケッチ原点エンティティを選択する
boolstatus = swModel.Extension.SelectByID2(“Point1”, “EXTSKETCHPOINT”, 0, 0, 0, True, 0, Nothing, 0)
‘ センターラインの下側端点を選択状態に追加 (Mark = 1)
‘ SketchSegmentから端点のSketchPointを取得して選択する手法が最も堅牢
Dim swSkPointStart As SldWorks.SketchPoint
Set swSkPointStart = lineSegment.GetStartPoint2()
Dim swEntity As SldWorks.Entity
Set swEntity = swSkPointStart
boolstatus = swEntity.Select4(True, 0) ‘ Append = True
‘ 一致拘束の付与
‘ swConstraintType_COINCIDENT = 3
constraintResult = swModel.SketchAddConstraints(“COINCIDENT”)
‘ 4. スケッチの終了とメモリの解放
swSkMgr.InsertSketch True ‘ スケッチモード解除(保存)
‘ オブジェクトの明示的破棄(VBAにおけるメモリリーク対策の極意)
Set lineSegment = Nothing
Set swSkPointStart = Nothing
Set swEntity = Nothing
Set swSkMgr = Nothing
Set swSelMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “基準対称線の作成と拘束の付与が正常に完了しました。”, vbInformation, “Success”
End Sub
—
3. チーフアーキテクトが解説するコードの急所と技術的背景
上記のコードは一見して標準的なVBAに見えるが、大規規模な自動化システムや社内CAD連携基盤において破綻しないための「防衛的プログラミング」が随所に組み込まれている。
① 単位系(SI単位系)の厳格な遵守
SolidWorks APIの内部計算はすべて「メートル(m)」で行われる。UI上で「50mm」と入力する感覚で `50` とコーディングすると、長さ50メートルの巨大なモンスターセンターラインが生成され、モデル領域から視覚的にロストする。
コード内で `0.05` と記述しているのは、メートル法への厳密な換算である。この仕様を見落としてトラブルになるケースが後を絶たない。
② SketchSegment と SketchPoint のライフサイクル管理
`CreateCenterLine` は成功すると `SketchSegment` インターフェースを返す。このオブジェクトから `GetStartPoint2()` や `GetEndPoint2()` を経由して `SketchPoint` を取得し、それらを `Select4` メソッドで再選択して `SketchAddConstraints` に持ち込む。
この「取得 $\rightarrow$ キャスト $\rightarrow$ 選択 $\rightarrow$ 拘束」というパイプラインを構築することが、APIの内部選択バッファ(Selection Manager)を汚染せずに確実に対象要素を縛り上げる唯一の手段である。
③ COMオブジェクトの「意図的な無効化(Set Nothing)」
VBAのガベージコレクションは頼りにならない。特にSolidWorksのCOMラッパーは、プロシージャを抜けた後もバックグラウンドでポインタを保持し続け、連続バッチ処理の終盤で突然のクラッシュ(Access Violation)を引き起こす原因になる。
プロシージャの終端で、使用したすべての変数を `Set XXX = Nothing` で明示的に解放する。この儀式を徹底することが、数千パーツの深夜バッチを完走させるための絶対条件である。
—
4. レガシー環境・システム間連携への応用
このコードをベースにして、Webフロントエンドや外部データベース(ERP/PLM)から飛んできたJSON/XMLパラメータに基づき、パラメータ駆動型のパーツ自動生成エンジンを構築することが可能だ。
- 外部連携時の注意点:
外部プロセスからCOM経由でSolidWorksを操作する場合(`CreateObject(“SldWorks.Application”)` など)、UI描画の有無(`swApp.Visible = False`)によってスケッチマネージャーの挙動や選択イベントのタイミングがシビアになる。
このようなバックグラウンド実行時は、画面描画を停止する `swModel.ModelViewManager.DisplayStateRebuildFlag = False` などの最適化を併用し、APIの処理速度を最大化させることが求められる。
総括
スケッチの自動化は、単に線を引く機能の自動化ではない。それは「CADの思考プロセスをコードで完全にトレースする」という高度なエンジニアリングである。
今回解説した `CreateCenterLine` と幾何拘束の連係手法をマスターすれば、社内の標準部品自動生成や、派生設計の完全自動化において、二度とスケッチエラーに悩まされることのない強靭な基盤を手に入れることができるだろう。
妥協なきコードで、真の設計自動化領域へ到達してほしい。
