【実務・中級編】【スケッチ自動化】SketchManager.CreateCenterLineを用いた基準対称線の自動作図と、その後の拘束付与の自動化手順 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】SketchManagerによる基準対称線の完全自動作図とロバスト拘束の極意

機械設計の現場において、対称形状のモデリングは日常茶飯事だ。回転体、左右対称のブラケット、筐体部品――これらに共通して最初に打つべき手は何だ? そう、「基準となる中心線(センターライン)」の確実な配置と、原点への完全拘束である。

手動であれば数クリックの作業だが、これをVBAで自動化しようとした途端、多くのエンジニアが「スケッチが暴れた」「拘束のエラーでマクロが途中で止まった」「意図しない位置に線が生成された」という壁にぶつかる。

今回は、SolidWorks APIの挙動、オブジェクトのライフサイクル、そして実務で絶対につまづかないための「堅牢なスケッチ自動化アーキテクチャ」を、チーフアーキテクトの私から授けよう。

なぜ「中心線の自動作図」で多くのマクロが破綻するのか?

初心者が書いたコードによくいやらしいバグが潜む。
例えば、`SketchManager.CreateCenterLine` を呼んだ後、そのまま続けて `AddConstraint` を実行するコードだ。

‘ 【悪手】ありがちな脆弱なコード
Set swSketchSeg = swModel.SketchManager.CreateCenterLine(0, 0.1, 0, 0, -0.1, 0)
‘ この直後、アクティブなドキュメントの状態や選択状態はどうなっている?
swModel.SketchManager.AddConstraint swConstraintType_e.swConstraintType_Coincident

このアプローチがなぜダメなのか。理由は3つある。

1. 選択コンテキストの曖昧さ: `AddConstraint` は、多くの場合「現在選択されているエンティティ」に対して作用する。API実行直後の暗黙的な選択状態に依存するコードは、SolidWorksのバージョン差異や処理負荷によるタイミングのズレで一巻の終わりを迎える。
2. 座標系の罠: APIに渡す座標がアクティブなビューやスケッチ平面に対して正しく解釈されているか、モデルの単位系(メートル法かミリメートル法か)の意識が欠落している。
3. ライフサイクル管理の欠如: 生成された `SketchSegment` オブジェクトを変数として確実に保持し、後続の操作でそれを明示的に指し示すというオブジェクト指向的なアプローチが抜けている。

プロのエンジニアであれば、「生成(Create)」「取得(Get)」「選択(Select)」「拘束(Constraint)」の各フェーズを完全に分離・制御しなければならない。

堅牢性を極めたプロダクションコード

それでは、実務の現場でそのまま稼働できる、極めてロバストなVBAコードを公開しよう。
このコードは、新規パーツドキュメントを立ち上げ、フロント平面にスケッチを展開し、原点を通る垂直な中心線を自動作図した上で、原点と中心線の中点(または端点)を一致拘束で完全に縛り上げるものだ。

Option Explicit

‘ ==============================================================================
‘ 業務自動化アーキテクチャモデル: 基準対称線自動生成&ロバスト拘束スクリプト
‘ ターゲット: SolidWorks 2022以降推奨
‘ ==============================================================================
Sub Main()
‘ 1. アプリケーションおよびドキュメントの初期化
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

‘ アクティブドキュメントが存在しない場合は新規パーツ作成
If swModel Is Nothing Then
Dim defaultPartTemplate As String
defaultPartTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
Set swModel = swApp.NewDocument(defaultPartTemplate, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツドキュメントの新規作成に失敗しました。”, vbCritical
Exit Sub
End If
End If

‘ 2. ターゲット平面(今回は「正面」=Front Plane)の選択とアクティブ化
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swModel.Extension

‘ 確実に「正面」を選択してスケッチモードへ移行
Dim status As Boolean
status = swModelDocExt.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not status Then
MsgBox “基準平面「正面」が見つかりません。テンプレートを確認してください。”, vbCritical
Exit Sub
End If

‘ スケッチモード開始
swModel.SketchManager.InsertSketch 2 ‘ 2 = swSketchPositionInsertOnPlane (面上の新規スケッチ)

‘ 3. センターラインの自動作図(ミリメートル単位を考慮した座標指定)
‘ ※SolidWorks APIの内部単位は常に「メートル」であることに注意!
‘ 座標: (X1, Y1, Z1) = (0, 0.1, 0) から (X2, Y2, Z2) = (0, -0.1, 0)
Dim swSketchSeg As SldWorks.SketchSegment
Set swSketchSeg = swModel.SketchManager.CreateCenterLine(0, 0.1, 0, 0, -0.1, 0)

If swSketchSeg Is Nothing Then
MsgBox “中心線の生成に失敗しました。”, vbCritical
swModel.SketchManager.InsertSketch 3 ‘ スケッチ終了(破棄)
Exit Sub
End If

‘ 4. 原点と中心線の完全拘束(ロバスト実装)
‘ 暗黙的な選択に頼らず、明示的にオブジェクトを選択して拘束を付与する
swModel.ClearSelection2 True

‘ 原点の選択 (Originは通常、座標 (0,0,0) に存在する点として扱うか、明示的にスケッチポイントを選択)
‘ ここでは中心線の持つスタート/エンドポイント、あるいは原点自体を確実にヒットさせる
status = swModelDocExt.SelectByID2(“原点”, “EXTSKETCHPOINT”, 0, 0, 0, True, 1, Nothing, 0)

‘ 生成した中心線自体、または中心線の中点を選択状態に追加
Dim swCurve As SldWorks.Curve
Set swCurve = swSketchSeg.GetCurve()

‘ 線分自体の選択
status = swSketchSeg.Select4(True, 0)

‘ 一致拘束(Coincident)の付与
Dim constraintResult As Long
constraintResult = swModel.SketchManager.AddConstraint(swConstraintType_e.swConstraintType_Coincident)

If constraintResult = 0 Then
‘ 失敗した場合はログやイミディエイトウインドウへ通知(実務では例外処理に昇格させる)
Debug.Print “Warning: 拘束の付与に失敗したか、既に競合する拘束が存在します。”
End If

‘ 5. スケッチの終了とビューの更新
swModel.SketchManager.InsertSketch True ‘ True = 変更を保持して終了
swModel.ViewZoomToFit2

MsgBox “基準対称線の自動作図と拘束の付与が完了しました。”, vbInformation
End Sub

チーフアーキテクトが教える「3つの実務的急所」

上記のコードをそのまま社内の自動化ツールに組み込むにあたり、エンジニアとして押さえておくべき「現場の知見」を共有する。

① SolidWorks APIの「内部単位(MKS)」の呪縛

コード内で `CreateCenterLine(0, 0.1, 0, 0, -0.1, 0)` と記述している。
UI上ではミリメートル(例: 100mm)で考えていても、APIに渡す引数は強制的に「メートル(m)」である。
そのため、`0.1` は 100mm を意味する。この単位系の変換ロジックをラップする関数を共通モジュールに持たせておくことが、大規模な自動化開発では必須となる。

② `SelectByID2` の名前依存リスク

コード内で `”正面”` や `”原点”` という文字列を指定している。
もし展開先のSolidWorksテンプレートが英語環境(Front / Origin)であった場合、このマクロは一瞬でクラッシュする。
プロダクションレベルのコードにするならば、`swRefPlane` オブジェクトを直接トラバースして取得するか、言語依存しない内部ID・タイプコードで安全に平面をフックする設計に昇格させるべきだ。

③ 拘束の重複(Overdefined)を防ぐ防御的設計

中心線を作成した際、すでに原点を通るように座標を設計しているが、さらに `Coincident`(一致)拘束を強制的にかけると、スケッチが「過剰拘束(Overdefined)」になる危険性がある。
今回のコードでは、点と線分に対する一致拘束として安全に処理しているが、もし端点が原点にスナップしている状態であれば、追加の拘束は不要な場合もある。
実務でデータベース(Excelや外部PDM)からパラメータを動的に流し込む場合は、「既存の拘束をクリアするロジック」または「完全定義されているかを監視する `IModelDocExtension::GetSketchStatus` の活用」をセットで実装すること。

結びに代えて

SolidWorks VBAによる自動化は、単なる「手動操作の置き換え」ではない。
設計の品質を均一化し、ヒューマンエラーを物理的に排除するための「エンジニアリング・インフラストラクチャ」である。

今回解説した「オブジェクトを確実に掴み、意図したコンテキストで拘束を流し込む」という設計思想をマスターすれば、複雑なフランジ、筐体、アセンブリのスケッチ自動生成すら、あなたの手のひらの上で完全にコントロールできるようになるだろう。

プロフェッショナルなコードで、退屈な定型作業を過去のものにしてくれ。

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