【実務・中級編】【スケッチ自動化】CreateLine2とCreateCircleByRadius2を組み合わせた2次元基本形状のプログラム作図 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】スケッチ自動化の核心:CreateLine2とCreateCircleByRadius2で迷宮の座標計算を制圧する

こんにちは。SolidWorks API開発の現場において、数々の非効率なマクロを血祭りにあげてきたチーフアーキテクトの私だ。

業務効率化の担当者から「手作業で行っている2次元の輪郭作図を自動化したい」という相談をよく受ける。大半の初学者がやりがちなのが、ネットの断片的なコードを継ぎ接ぎし、`CreateLine`の戻り値やコンテキストの概念を無視した脆弱なコードの乱造だ。そして決まってこう嘆く。
「動いたり動かなかったりする」「スケッチ平面が狂う」「エラーの原因が分からない」と。

断言しよう。SolidWorksのスケッチAPIは、「オブジェクトのライフサイクル」と「正しい状態遷移(コンテキスト)」を完全に理解していなければ、実務で使い物にならない。

今回は、`CreateLine2` と `CreateCircleByRadius2` という最も基本にして最も重要な2つのメソッドを駆使し、バグの起きない堅牢な2次元基本形状の自動作図ロジックをあなたに伝授する。

1. 現場のプロが知るべき「SolidWorksスケッチAPIの3大鉄則」

コードを書く前に、SolidWorks APIの裏側で何が起きているのかを理解してほしい。これを無視するコードは、時限爆弾を抱えているようなものだ。

1. アクティブなスケッチコンテキストの厳守
ジオメトリ生成メソッド(`CreateLine2`など)は、「現在編集中のスケッチ(Sketch)」が存在し、かつそれがアクティブである状態でなければ沈黙するか意図せぬ平面に線を描画する。
2. 単位系の呪縛(MKS vs MMGS)
APIが受け取る数値は、SolidWorksのドキュメント単位(通常は「メートル」)に依存していることが多い。画面上で「mm」で見えていても、API内部では「m」で計算が必要なケースがあるため、座標のスケーリングには細心の注意を払え。
3. 戻り値の不毛な保持と解放
これらのメソッドは生成されたエンティティのポインタ(`SketchSegment`)を返す。しかし、単に線を描くだけであれば、戻り値のオブジェクト変数を無駄に保持し続ける必要はない。メモリリークの温床になるため、スコープとライフサイクルを意識せよ。

2. コピペで即実戦投入できるプロダクションコード

以下のコードは、単に動くだけのオモチャではない。エラーハンドリング、単位系の意識、そして拡張性を考慮した、実務レベルの堅牢なテンプレートだ。

新規の部品(Part)ドキュメントを開いた状態で、このマクロを実行してほしい。XY平面(Front平面)を強制的に選択し、その上に長方形と位置決め用の穴(円)を自動生成する。

Option Explicit

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSketchMgr As SldWorks.SketchManager
Dim boolstatus As Boolean

‘ 1. アプリケーションおよびドキュメントの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。部品ファイルを開いてください。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. アクティブドキュメントが「部品 (Part)」であるか厳密にチェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは部品(Part)ドキュメントでのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If

Set swSketchMgr = swModel.SketchManager

‘ 3. 描画の最適化(画面更新を抑制し、描画速度を劇的に向上させる)
swModel.EditRebuild3
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileDragging, False

On Error GoTo ErrorHandler

‘ 4. 基準平面(Front平面)を選択し、スケッチモードに移行
‘ ※ 既存の選択をクリアしてから確実にFront平面を掴む
swModel.ClearSelection2 True
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)

If Not boolstatus Then
Err.Raise 1001, “SketchAutomation”, “基準となる「正面」平面が見つかりませんでした。”
End If

‘ スケッチの開始
swSketchMgr.InsertSketch 2 ‘ 2 = swSketchPositionProfile

‘ —————————————————-
‘ 5. 座標計算とジオメトリ生成ロジック
‘ —————————————————-
‘ 単位系はメートル(m)基準であることが多いため、mmで定義した値を変換する係数を用意
‘ ※ドキュメント単位系がMMGSの場合、CreateLine2の引数は「m」指定に注意が必要なケースがある。
‘ ここでは一般的なMMGS(ミリメートル・グラム・秒)環境を前提に、安全なラッパーを通す。

Dim scaleFactor As Double
scaleFactor = 0.001 ‘ mm -> m 変換用(環境依存を排除するため明示的に換算)

Dim x1 As Double, y1 As Double
Dim x2 As Double, y2 As Double
Dim x3 As Double, y3 As Double
Dim x4 As Double, y4 As Double

‘ 長方形の四隅の座標(単位:mm)
Dim rectWidth As Double, rectHeight As Double
rectWidth = 100# 0
rectHeight = 50#

x1 = 0# scaleFactor: y1 = 0# scaleFactor
x2 = rectWidth scaleFactor: y2 = 0# scaleFactor
x3 = rectWidth scaleFactor: y3 = rectHeight scaleFactor
x4 = 0# scaleFactor: y4 = rectHeight scaleFactor

‘ CreateLine2(X1, Y1, Z1, X2, Y2, Z2)
‘ 2次元スケッチであってもZ座標は0を指定
‘ 底辺
swSketchMgr.CreateLine2 x1, y1, 0, x2, y2, 0
‘ 右辺
swSketchMgr.CreateLine2 x2, y2, 0, x3, y3, 0
‘ 上辺
swSketchMgr.CreateLine2 x3, y3, 0, x4, y4, 0
‘ 左辺
swSketchMgr.CreateLine2 x4, y4, 0, x1, y1, 0

‘ 円の生成: CreateCircleByRadius2(XC, YC, ZC, Radius)
‘ 長方形の中心に直径20mm(半径10mm)の穴を配置
Dim cx As Double, cy As Double, circleRadius As Double
cx = (rectWidth / 2#) scaleFactor
cy = (rectHeight / 2#) scaleFactor
circleRadius = 10# scaleFactor

swSketchMgr.CreateCircleByRadius2 cx, cy, 0, circleRadius

‘ 6. スケッチの終了と確定
swSketchMgr.InsertSketch True

‘ 画面更新の復元
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileDragging, True
swModel.GraphicsRedraw2

MsgBox “2次元基本形状の作図が正常に完了しました。”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ 異常終了時のリカバリ
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileDragging, True
If Not swSketchMgr Is Nothing Then
‘ 失敗時はスケッチを破棄して抜ける
swSketchMgr.InsertSketch False
End If
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

3. なぜこのコードが堅牢なのか?(アーキテクチャの解説)

① 描画の最適化 (`SetUserPreferenceToggle`)

複雑なアセンブリや多くの線を引くマクロで最もパフォーマンスを殺すのは、「1本の線を描くたびに画面が再描画されること」だ。
このコードでは、描画更新を一時的に無効化し、一連のジオメトリ生成が終わった後に一括して描画を更新している。これにより、処理速度が数倍〜数十倍に跳ね上がる。実務において「遅いマクロは悪」だ。この配慮を忘れるな。

② 厳密なエラーハンドリングと「スケッチの破棄」

もし座標計算の途中でエラーが発生した場合、スケッチモードに入ったまま放置されると、次にモデルを手動操作するオペレーターが混乱する。
`On Error GoTo ErrorHandler` を経由させ、エラー時には確実に `InsertSketch False`(スケッチ変更の破棄)を実行することで、ドキュメントがゴミデータで汚染されるのを防いでいる。これがプロの設計だ。

③ 単位系の「罠」への対策

SolidWorks APIの数値引数は、ドキュメントの設定単位系に引きずられることがある。特に `CreateLine2` は環境によって動作が微妙に異なるケースがあるため、`scaleFactor`(`0.001`)を明示的に掛け合わせることで、「絶対にmm単位で計算した意図通りの寸法になる」という絶対的な再現性を担保している。

4. データベースや外部CSV連携への発展性

実務において、このコードをハードコーディングのまま使うことは少ないはずだ。「製品データベース」や「CSV/Excel」から幅(Width)や高さ(Height)のパラメータを動的に読み込み、ループ文で何種類もの板金展開形状やフランジを自動描画する基幹システムへと発展させることになるだろう。

その際、座標計算ロジックは必ず「関数(Function)」として独立させ、引数として渡す設計にリファクタリングせよ。

‘ パラメータ駆動型の設計イメージ
Public Sub DrawCustomRectangle(swSketchMgr As SldWorks.SketchManager, w As Double, h As Double)
Dim s As Double: s = 0.001
swSketchMgr.CreateLine2 0, 0, 0, w s, 0, 0
swSketchMgr.CreateLine2 w s, 0, 0, w s, h s, 0
swSketchMgr.CreateLine2 w s, h s, 0, 0, h s, 0
swSketchMgr.CreateLine2 0, h s, 0, 0, 0, 0
End Sub

5. 総括

今回解説した `CreateLine2` と `CreateCircleByRadius2` は、SolidWorks自動化の「第一歩」であると同時に、設計思想の優劣が最も如実に出る部分でもある。

単に動くだけのコードを書いて満足するな。
エラー時を見据えたトランザクション管理、パフォーマンスへの配慮、そして環境依存を排除した単位系のコントロール。これらを網羅したコードこそが、あなたの業務を真に救う「資産」となる。

現場の自動化を泥沼から救い出すのは、いつだってこうした泥臭くも洗練されたエンジニアリングだ。健闘を祈る。

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