こんにちは!いつも設計業務や3Dモデリング、本当にお疲れ様です。
普段の設計業務の中で、「エクセルに並んだ大量の測定データ(XYZ座標)」や「実験から得られた点群のCSVデータ」を渡されて、「これをSolidWorks上で3Dスケッチの点にして、滑らかなスプライン曲線で繋いでほしい」と頼まれたことはありませんか?
「1点ずつ手入力で3Dスケッチを描いていくなんて、気が遠くなる……」
「マクロの記録を使ってみたけれど、座標が変わるたびにコードを書き直すなんて無理!」
そんな風に頭を抱えてしまった方も少なくないはずです。
でも、安心してください。今回紹介する「SketchManager.CreatePointを用いた3次元空間上の基準点群の一括プロットと、スプライン自動結線」の技術をマスターすれば、何百、何千という点群であっても、ボタン一発、わずか数秒で美しく滑らかな3Dスプライン曲線へと昇華させることができるようになります。
この記事では、マクロの記録から一歩踏み出し、SolidWorks VBAの「本質」を理解しながら、実務でそのまま使える極上の自動化コードを学んでいきましょう。ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
—
1. 3Dスケッチ自動化における「3つの超重要ルール」
コードを書く前に、まずはSolidWorksのAPIをコントロールするための「基本にして最大の関門」を3つ整理しておきましょう。ここを誤解していると、「コードは動くのに、なぜかスケッチが巨大化する」「エラーで止まる」といった罠にハマってしまいます。
① 単位の罠:SolidWorksの心臓部は常に「メートル(m)」
これが初心者が最も陥りやすい落とし穴です。
SolidWorksのドキュメント設定が「mm」になっていたとしても、VBA APIの内部処理はすべて「メートル(m)」が基準です。
つまり、私たちが「100mm」の場所に点を打ちたい場合、プログラム内では `100` ではなく `100 / 1000 = 0.1`(メートル)として値を渡す必要があります。
② 3Dスケッチの「編集状態(Edit State)」を正しく管理する
2Dスケッチでも3Dスケッチでも、幾何形状を生成するためには「スケッチを開く ➔ 描画する ➔ スケッチを閉じる」というライフサイクルを厳格に守る必要があります。
これを行うのが、`SketchManager.Insert3DSketch` メソッドです。
③ オブジェクトを「選択(Select)」して繋ぐというアプローチ
3D空間に打った点(`SketchPoint`)同士をスプラインで結ぶ最も確実な方法は、「打った点を順番に選択状態(Select)にし、その選択された点群に対してスプラインを生成する」というプロセスです。SolidWorksの選択マネージャ(SelectionManager)を味方に付けることで、コードが劇的にシンプルになります。
—
2. 3D点群プロット&スプライン自動結線マクロ(完全版)
それでは、実際に動くVBAコードを見てみましょう。
このコードは、仮の座標データ(配列)から3D空間に点をプロットし、それらを滑らかに繋ぐスプラインを自動生成するものです。
エクセル(VBA)から実行することを想定し、SolidWorksの起動からパーツファイルの新規作成、そして3D幾何形状の生成までを一気通貫で行います。
‘
‘ SolidWorks VBA – 3D点群の一括プロットとスプライン自動結線マクロ
‘
Option Explicit
Sub Create3DPointAndSpline()
‘ SolidWorksのアプリケーションおよびドキュメント用変数
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swSketchMgr As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension
‘ SolidWorksへの接続
On Error Resume Next
Set swApp = Application.SldWorks
If swApp Is Nothing Then
Set swApp = CreateObject(“SldWorks.Application”)
swApp.Visible = True
End If
On Error GoTo 0
‘ 新規パーツファイルの作成 (デフォルトテンプレートを使用)
Dim defaultTemplate As String
defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
If defaultTemplate = “” Then
MsgBox “デフォルトのパーツテンプレートが見つかりません。設定を確認してください。”, vbCritical, “エラー”
Exit Sub
End If
Set swModel = swApp.NewDocument(defaultTemplate, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “新規パーツの作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
Set swPart = swModel
Set swSketchMgr = swModel.SketchManager
Set swModelDocExt = swModel.Extension
‘ ————————————————————————-
‘ 1. 座標データの準備(実務ではCSVやExcelセルから読み込む部分)
‘ ————————————————————————-
‘ ※ 単位は「mm」で定義し、後からメートル(m)に変換します。
Dim rawPoints() As Double
ReDim rawPoints(0 To 5, 0 To 2) ‘ 6行3列の配列 (X, Y, Z)
‘ サンプルデータ(波を描くような3D点群)
rawPoints(0, 0) = 0#: rawPoints(0, 1) = 0#: rawPoints(0, 2) = 0#
rawPoints(1, 0) = 50#: rawPoints(1, 1) = 20#: rawPoints(1, 2) = 10#
rawPoints(2, 0) = 100#: rawPoints(2, 1) = -10#: rawPoints(2, 2) = 30#
rawPoints(3, 0) = 150#: rawPoints(3, 1) = 40#: rawPoints(3, 2) = -20#
rawPoints(4, 0) = 200#: rawPoints(4, 1) = 10#: rawPoints(4, 2) = 10#
rawPoints(5, 0) = 250#: rawPoints(5, 1) = -30#: rawPoints(5, 2) = 0#
‘ ————————————————————————-
‘ 2. 3Dスケッチの開始
‘ ————————————————————————-
‘ Insert3DSketchの引数に True を渡すと新規作成、または既存の編集を開始します。
swSketchMgr.Insert3DSketch True
‘ 描画中の画面更新を一時停止して処理を高速化
swModel.ShowSystemUIUpdateQueue = False
‘ ————————————————————————-
‘ 3. 点(SketchPoint)のプロット
‘ ————————————————————————-
Dim i As Long
Dim x As Double, y As Double, z As Double
Dim swPoint As SldWorks.SketchPoint
‘ 後でスプラインを引くために、作成した点を一時的に選択状態にする必要があります。
‘ そのため、選択を一度クリアします。
swModel.ClearSelection2 True
For i = LBound(rawPoints, 1) To UBound(rawPoints, 1)
‘ mm ➔ メートル への単位変換
x = rawPoints(i, 0) / 1000#
y = rawPoints(i, 1) / 1000#
z = rawPoints(i, 2) / 1000#
‘ 3D空間上に点をプロット
Set swPoint = swSketchMgr.CreatePoint(x, y, z)
If Not swPoint Is Nothing Then
‘ 作成した点を「追加選択」していく(Append:=True)
‘ これにより、プロットした順番に選択状態になります。
Dim status As Boolean
status = swPoint.Select4(True, Nothing)
End If
Next i
‘ ————————————————————————-
‘ 4. スプライン曲線の生成
‘ ————————————————————————-
‘ 選択されている点群(SketchPoint)を結ぶスプラインを生成します。
‘ CreateSpline は、選択されたオブジェクトを順番に繋いでスプラインを作成する仕様です。
Dim swSpline As SldWorks.SketchSegment
Set swSpline = swSketchMgr.CreateSpline(Nothing)
If swSpline Is Nothing Then
MsgBox “スプラインの生成に失敗しました。点群の数や配置を確認してください。”, vbExclamation, “警告”
End If
‘ ————————————————————————-
‘ 5. スケッチの終了と後処理
‘ ————————————————————————-
‘ 画面更新を再開
swModel.ShowSystemUIUpdateQueue = True
‘ 3Dスケッチを閉じる(引数を False にするとスケッチを抜けます)
swSketchMgr.Insert3DSketch False
‘ 選択状態を解除して、画面を「等角投影(アイソメトリック)」で見やすく整える
swModel.ClearSelection2 True
swModel.ViewZoomtofit2
MsgBox “3Dスケッチとスプラインの自動生成が完了しました!”, vbInformation, “成功”
End Sub
—
3. 先輩が教える!コードの肝と重要テクニック解説
このコードには、単純に「マクロを動かす」だけでなく、実務でトラブルを起こさないためのチーフアーキテクトならではの知恵が散りばめられています。いくつか深掘りしてみましょう。
ポイント①:`rawPoints(i, 0) / 1000#`(メートル変換)
VBAの数値の末尾についている `#` は、その数値が Double型(倍精度浮動小数点数) であることを明示するものです。「1000」で割る際、明示的に `1000#` と書くことで、予期せぬ型変換による計算精度の低下やエラーを防ぐお作法です。
ポイント②:`Select4` メソッドによる「選択の連鎖」
status = swPoint.Select4(True, Nothing)
第1引数の `True` は、「現在選択されているものに追加して選択する(Append)」という意味です。
これにより、ループが回るたびに `点1 ➔ 点2 ➔ 点3` と順番に選択状態が維持されます。SolidWorksは、この選択された順番を記憶しているため、次の `CreateSpline` を呼び出した瞬間に、その順番通りに綺麗な1本のスプラインを描いてくれるのです。
ポイント③:`ShowSystemUIUpdateQueue` による高速化
大量の点をプロットする場合、1点打つたびにSolidWorksが画面を再描画していると、動作が非常に重くなり、画面がチカチカと点滅してしまいます。
これを防ぐために、プロット開始前に `False` にし、すべてが終わった後に `True` に戻しています。これで処理速度が数倍から数十倍跳ね上がります。
—
4. 応用:CSVファイルから座標を読み込むには?
「手入力の配列ではなく、実際のCSVファイルを読み込ませたい!」という実務の要望にもお答えします。
上記のコードの「1. 座標データの準備」の部分を、以下のようなCSV読み込みロジックに置き換えるだけで、外部データとの連携が簡単に実現できます。
‘ CSVから座標を読み込んで配列に格納する実装例
Dim fileNo As Integer
Dim filePath As String
Dim lineStr As String
Dim splitData() As String
Dim ptCount As Long
filePath = “C:\temp\3d_points.csv” ‘ 読み込みたいCSVのパス
fileNo = FreeFile
ptCount = 0
Open filePath For Input As #fileNo
Do Until EOF(fileNo)
Line Input #fileNo, lineStr
‘ カンマ区切りのデータを分割 (X, Y, Z)
splitData = Split(lineStr, “,”)
ReDim Preserve rawPoints(0 To ptCount, 0 To 2)
rawPoints(ptCount, 0) = CDbl(splitData(0)) ‘ X
rawPoints(ptCount, 1) = CDbl(splitData(1)) ‘ Y
rawPoints(ptCount, 2) = CDbl(splitData(2)) ‘ Z
ptCount = ptCount + 1
Loop
Close #fileNo
※CSVファイルの形式は `X,Y,Z`(例: `10.5,20.0,5.3`)のように、1行に1つの座標が並んでいるシンプルなものを想定しています。
—
5. まとめ
お疲れ様でした!
今回学んだ「3Dスケッチの自動化」は、SolidWorks VBAの中でも非常に応用範囲が広く、かつ実務での時間短縮効果が劇的に現れる分野です。
この記事で学んだ重要ポイントをもう一度おさらいしましょう。
1. APIの内部単位は常に「メートル(m)」。mm単位の設計データは必ず `1000` で割る。
2. `Insert3DSketch` を使って、スケッチの「開始」と「終了」のライフサイクルを正しく制御する。
3. 点を生成しながら `Select4(True, …)` で選択セットに追加し、最後に一括でスプライン化する。
この3つの基本さえ押さえておけば、3Dスケッチの自動化で迷うことはもうありません。
次は、このスプラインをガイドカーブ(案内曲線)にしてスイープフィーチャを作ったり、ロフトのパスにしたりと、さらに高度な3Dジオメトリ生成に挑戦してみてくださいね。
一歩ずつ進めていけば、SolidWorks VBAは必ずあなたの強力な右腕になってくれます。
「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!」
また次回の記事でお会いしましょう。ハッピー・オートメーション!
