こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して、カチカチと手作業を記録させるだけのステージは、今日で卒業です。
今回は、実務の自動化において最も基本であり、かつ最も強力な武器となる「スケッチのプログラム描画」、その中でも代表格である `SketchManager.CreateCircleByRadius` を使った円の描画を徹底解説します。
「平面を選んで、スケッチモードに入って、円を描く」。この一連の流れをVBAで完全にコントロールできるようになると、あなたの設計業務のスピードは文字通り何倍にも跳ね上がります。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。しっかりとついてきてくださいね!
—
1. 開発の全体像:なぜ「マクロの記録」だけでは実務で戦えないのか?
「マクロの記録」を使うと、次のようなコードが出力されます。
‘ マクロの記録が吐き出す典型的なコードの残骸(※実務では危険!)
boolstatus = swModel.Extension.SelectByID2(“前面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
swModel.SketchManager.InsertSketch2 True
‘ 座標や数値がハードコーディングされている
swModel.SketchManager.CreateCircleByRadius 0, 0, 0, 0.025
これの何が問題か分かりますか?
そう、「今、画面のどこが選択されているか」「モデルの単位系はどうなっているか」というコンテキスト(文脈)に依存しすぎていて、少しでも条件が変わるとエラーで爆発するのです。
プロのエンジニアが書くコードは、選択状態を確実につくりだし、エラーハンドリングを網羅した「意図通りの挙動を100%再現できるコード」です。今回はその極意を伝授します。
—
2. SolidWorks APIの核心:ModelDoc2 と SketchManager
SolidWorks VBAを操る上で、頭に叩き込んでおくべきオブジェクトの階層構造があります。
1. `SldWorks.SldWorks`: アプリケーション本体(大元の親)
2. `SldWorks.ModelDoc2`: 現在開いているドキュメント(部品、アセンブリ、図面)
3. `SldWorks.SketchManager`: スケッチの作成・管理を司るマネージャー
今回使う `CreateCircleByRadius` は、`SketchManager` が持っているメソッドです。「スケッチ空間の管理者に、この中心座標と半径で円を描かせろ」と命令するイメージですね。
—
3. 実践!原点を中心とした円を描くVBAコード
それでは、実務でそのまま使える、洗練されたサンプルコードを公開します。
このコードは、新規部品ドキュメントを開き、「正面」平面をプログラム側で確実に選択し、スケッチモードに移行した上で、原点(0,0,0)を中心とした直径50mm(半径25mm)の円を描画します。
Option Explicit
Sub DrawCircleSample()
‘ — 1. オブジェクト変数の宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSketchMgr As SldWorks.SketchManager
Dim boolstatus As Boolean
‘ — 2. SolidWorks アプリケーションの取得 —
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ — 3. アクティブなドキュメントの取得(なければ新規作成) —
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
‘ ドキュメントが開いていない場合は新規部品作成 (テンプレートは環境に合わせて調整してください)
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SolidWorks 202X\templates\part.prtdot”, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “部品ドキュメントを作成できませんでした。”, vbCritical
Exit Sub
End If
End If
‘ — 4. 描画先となる「正面」平面の確実な選択 —
‘ SelectByID2の引数:(名前, タイプ, X, Y, Z, 追加選択か, 選択n番目, 参照, 理由)
‘ ※SolidWorksの言語環境(日本語/英語)によって平面名が変わる点に注意!
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “「正面」平面の選択に失敗しました。モデルの言語設定を確認してください。”, vbCritical
Exit Sub
End If
‘ — 5. スケッチモードへの移行 —
Set swSketchMgr = swModel.SketchManager
swSketchMgr.InsertSketch True ‘ Trueを指定すると、選択面に対して正対ビューになります
‘ — 6. SketchManager.CreateCircleByRadius を使った円の描画 —
‘ 引数:(中心X座標, 中心X座標, 中心Z座標, 半径)
‘ ※重要:SolidWorks APIの内部単位は常に「メートル(m)」です!
‘ 50mmの円を描きたい場合は、半径 0.025 (m) を指定します。
Dim radiusMeters As Double
radiusMeters = 0.025 ‘ 25mm = 0.025m
swSketchMgr.CreateCircleByRadius 0#, 0#, 0#, radiusMeters
‘ — 7. スケッチの終了 —
swSketchMgr.InsertSketch True ‘ もう一度呼ぶとスケッチを終了して確定します
‘ ビューを等角投影(アイソメ)に戻して美しく仕上げる
swModel.ViewZoomtofit2
MsgBox “円のスケッチ描画が正常に完了しました!”, vbInformation
End Sub
—
4. 陥りやすい罠とエンジニアの知見(ここが重要!)
現場でこのコードを動かすとき、多くのエンジニアが以下の「3つの罠」にハマります。先回りしてクリアしておきましょう。
罠①:単位系の罠(メートル法への換算忘れ)
初心者最大のミスがこれです。画面上のプロパティで「mm」を使っているからといって、VBAの引数に `25` と入れると、直径50m(半径25m)の巨大なモンスター級の円が描かれます。
- SolidWorks APIの内部単位は絶対的に「メートル(m)」です。
- ミリメートルで思考したい場合は、必ず `25 / 1000` のように換算するか、コード内で `0.025` と明記するクセをつけましょう。
罠②:言語環境による平面名の違い
コード内の `SelectByID2(“正面”, “PLANE”, …)` は、日本語版のSolidWorks環境を前提としています。
もし英語版のSolidWorks(または海外の子会社やクライアント)でこのマクロを動かすと、「正面」という名前の平面が見つからず、容赦なくエラーになります。
- 実務での対策: 平面名で指定するのではなく、Featureマネージャーからループを回して `IPlane` オブジェクトを直接取得するか、定数化して切り替えられるように設計するのがプロの技です。
罠③:スケッチモードの閉じ忘れ
コードの途中でエラー終了したりすると、SolidWorksが「スケッチモードのまま」宙ぶらりんになることがあります。
- デバッグ中は、手動でスケッチを閉じるか、`Document` を開き直す必要が出てくるので、コードを書くときは必ず「スケッチの開始(InsertSketch)」と「終了(InsertSketch)」が対になっているかを確認してください。
—
5. おわりに:次のステップへ
お疲れ様でした!これであなたは、単なる「マクロの記録係」から、プログラムで3D CADを自在に操る「SolidWorks自動化エンジニア」への一歩を踏み出しました。
`SketchManager` は円だけでなく、長方形(`CreateCenterRectangle`など)や直線、スプライン曲線など、あらゆる2Dプロファイルを網羅しています。基本の「平面選択 ➔ スケッチ開始 ➔ 図形描画 ➔ スケッチ終了」の型さえ掴んでしまえば、どんな複雑な形状もコードで自動生成できるようになります。
ここをクリアしたあなたなら、もう怖いものはありません。
ぜひ自分の手でコードを打ち込み、思い通りの円が画面上に描かれる瞬間を味わってみてください。それでは、次回の極限知見でお会いしましょう!
