【入門編】Page.DrawNURBSを用いた高精度曲線の動的生成:制御点と重み(Weights)の数学的配置によるCAD連携基礎 – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺める段階は、もう卒業しましたね。おめでとうございます。ここからは、Visioの描画エンジンをあなたの思い通りに操る「真の自動化エンジニア」への道です。

今回は、Visio VBAの基礎の総決算とも言える、非常にエキサイティングなテーマを取り上げます。
それが「`Page.DrawNURBS`を用いた高精度曲線の動的生成」です。

「NURBS(ナーブス)なんて難しそう……」と思いましたか?
大丈夫。数学の複雑な式を暗記する必要はありません。CADデータなどから吐き出された数値をVisio上で美しく、寸分違わず復元するための「作法の極意」を、優しく紐解いていきましょう。ここをクリアすれば、あなたのVisio自動化スキルは間違いなくプロの領域に達します。

1. なぜ「NURBS」なのか? Visio描画の限界を超える

Visioの標準機能や通常のVBAメソッド(`DrawLine`や`DrawArc`など)では、直線や円、単純なスプライン曲線しか描けないと思っていませんか?

しかし、機械CADや建築CADからインポートされるデータには、滑らかな工業用デザインや複雑な配管ルートなど、「自由曲線を表現するための数学モデル」が使われています。その業界標準がNURBS(Non-Uniform Rational B-Spline)です。

Visioの `Page.DrawNURBS` メソッドを使えば、CADから得た制御点(Control Points)、重み(Weights)、ノットベクトル(Knots)をそのままVisioの図面に流し込み、ベクターシェイプとして完璧に再現できます。

押さえておくべき3つの要素

NURBSをコードにする際、以下の3つの配列(Array)が必要になります。

1. 制御点 (Control Points): 曲線の形を引っ張る「磁石」のような頂点の座標。
2. ノット (Knots): 制御点が曲線に影響を与える範囲(区間)を決めるパラメータ。
3. 重み (Weights): 各制御点が曲線を引っ張る「強さ」。これがあるからこそ、真円や楕円も正確に描ける(Rationalたる所以です)。

2. 実践:CADデータを模したNURBS曲線の動的生成コード

百聞は一見にしかず。まずは、実際にVisioのページ上にNURBS曲線を描画するVBAコードを見てみましょう。
このコードは、新規ドキュメントのアクティブページに対して、プログラムから計算した制御点をもとに滑らかな曲線を描き出します。

Sub DrawHighPrecisionNURBS()
‘ =========================================================================
‘ 処理概要: Page.DrawNURBS メソッドを使用した高精度なNURBS曲線の動的生成
‘ ターゲット: Visio 2013 / 2016 / 2019 / 2026 / Microsoft 365
‘ =========================================================================

Dim vsoPage As Visio.Page
Set vsoPage = ActivePage

‘ エラーハンドリングの基本:画面描画を停止してパフォーマンスを極限まで高める
Application.ScreenUpdating = False
On Error GoTo ErrorHandler

‘ — 1. 制御点 (Control Points) の定義 —
‘ 2次元座標を 0始まりの1次元Double配列として定義します。(x0, y0, x1, y1, …)
‘ ここでは例として4つの制御点でS字を描く座標を設定します(単位:インチ)
Dim xyControlPoints() As Double
ReDim xyControlPoints(7) ‘ 0 to 7 (計4点分: X, Y, X, Y…)

xyControlPoints(0) = 1.0: xyControlPoints(1) = 1.0 ‘ 始点
xyControlPoints(2) = 2.0: xyControlPoints(3) = 4.0 ‘ 制御点1
xyControlPoints(4) = 4.0: xyControlPoints(5) = 1.0 ‘ 制御点2
xyControlPoints(6) = 5.0: xyControlPoints(7) = 4.0 ‘ 終点

‘ — 2. ノット (Knots) の定義 —
‘ 次数(Degree)や制御点の数に応じて数学的に決定される配列です。
‘ 一般的な3次(Cubic)Bスプライン/NURBSの基本ノット構成例
Dim adfKnots() As Double
ReDim adfKnots(5) ‘ 0 to 5 (合計6個のノット)

adfKnots(0) = 0.0
adfKnots(1) = 0.0
adfKnots(2) = 0.0
adfKnots(3) = 1.0
adfKnots(4) = 1.0
adfKnots(5) = 1.0

‘ — 3. 重み (Weights) の定義 —
‘ 各制御点の重み。通常はすべて 1.0 (均等な影響力) でスタートします。
Dim adfWeights() As Double
ReDim adfWeights(3) ‘ 0 to 3 (制御点の数と一致させる)

adfWeights(0) = 1.0
adfWeights(1) = 1.0
adfWeights(2) = 1.0
adfWeights(3) = 1.0

‘ — 4. パラメータの設定 —
Dim intDegree As Integer
intDegree = 3 ‘ 3次NURBS曲線を指定

Dim intFlags As Integer
‘ Visio.VisNURBSFlags.visNURBSPeriodic などのフラグを指定可能
‘ 0 は標準的なオープン曲線
intFlags = 0

‘ — 5. 描画実行 (DrawNURBSメソッド) —
Dim vsoShape As Visio.Shape
Set vsoShape = vsoPage.DrawNURBS(xyControlPoints, adfKnots, adfWeights, intDegree, intFlags)

‘ 生成されたシェイプの書式を整える(エンジニアのこだわり)
If Not vsoShape Is Nothing Then
vsoShape.CellsU(“LineColor”).FormulaU = “RGB(0, 102, 204)” ‘ 美しい青色
vsoShape.CellsU(“LineWeight”).FormulaU = “1.5 pt” : 線の太さ
End If

MsgBox “NURBS曲線の生成に成功しました!”, vbInformation, “Visio VBA 建築・CAD連携”

CleanUp:
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “実行時エラー”
Resume CleanUp
End Sub

3. ここで躓く!初心者が陥りやすい「3つの罠」

`DrawNURBS` は非常に強力ですが、API仕様が厳格なため、少しでも配列のサイズや型がズレると、容赦なくエラー(あるいは無視できない不正な挙動)を引き起こします。現場でよくある失敗パターンを事前に防ぎましょう。

罠1:配列のインデックス数と次元のミスマッチ

  • 症状: 「型が一致しません」または「引数が無効です」という実行時エラー。
  • 原因: `DrawNURBS` に渡す配列は、必ず 0始まりの1次元配列 (`Double`) である必要があります。特に `ReDim` のサイズ計算を間違えがちです。
  • 解決策: 制御点が $N$ 個ある場合、`xyControlPoints` のサイズは $(2N – 1)$(つまり `ReDim(2N – 1)`)になります(XとYのペアのため)。また、重み配列 `adfWeights` のサイズは制御点の数 $N$ と一致(`ReDim(N – 1)`)させる必要があります。

罠2: ノットベクトルの数学的整合性エラー

  • 症状: 実行時エラーは出ないが、シェイプが描画されない、または歪な図形になる。
  • 原因: ノットの数(Knots)は、一般的に 「制御点の数 + 次数(Degree) + 1」 である必要があります。ここが破綻していると、Visioの描画エンジンが数式を解決できません。
  • 解決策: CADや外部ライブラリからデータを取得する場合は、必ずノットの配列数が要件を満たしているかループ前で `UBound` を使って検証するロジックを挟みましょう。

罠3: 単位系の罠(インチとミリメートル)

  • 症状: 「ものすごく巨大な線が描画された」、あるいは「ルーペで見ないと見えないほど小さな点になった」。
  • 原因: VisioのVBA内部エンジンは、すべて「インチ(Inches)」を基準に計算しています。しかし、CADデータの多くは「ミリメートル(mm)」で作られています。
  • 解決策: CADから受け取った座標データは、Visioに渡す前に必ず `25.4` で割ってインチに換算 する必要があります。ここを見落とすと、図面全体が崩壊するので注意してください。

先輩エンジニアからのエール

お疲れ様でした! NURBS曲線の描画をVBAからコントロールできるようになると、単なる「お絵かきマクロ」から、「外部システム(CADやCAE、GIS)とVisioをシームレスに繋ぐエンタープライズソリューション」へと、あなたのプログラムは見違えるほど進化します。

「図形を自動で配置する」だけでなく、「数学的な曲線をコードで制御して美しく出力する」。この領域まで来れば、もうVisio VBAで恐れるものは何もありません。

ぜひ、お手元のCADデータや独自の座標計算ロジックを組み込んで、自分だけの自動生成パイプラインを構築してみてください。あなたの開発ライフが、さらに実りあるものになることを応援しています!

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