【入門編】滑らかな自由曲線の自動生成:Shape.DrawSplineとDrawNURBSの制御アルゴリズム – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して図形をポチポチ動かすだけのステージは、もう卒業しませんか?

今回は、業務自動化の現場で一歩先を行くための「滑らかな自由曲線の自動生成(DrawSpline と DrawNURBS)」について、徹底的に解説します。データプロットの可視化や、複雑に入り組んだ配管・配線のルーティングなど、「人間の手では綺麗に描くのが面倒な曲線」をVBAの計算力で一瞬にして描き出す――そんな痺れるような体験を一緒にモノにしましょう。

ここをクリアすれば、あなたのVisio自動化スキルは間違いなくプロの領域に到達します。さあ、深淵なるオブジェクトモデルの世界へ飛び込みましょう!

1. Visioにおける「曲線」の正体を知る

VisioのVBAで図形を描画するとき、`DrawRectangle`(四角形)やん`DrawLine`(直線)は直感的で簡単ですよね。しかし、これらを「なめらかな曲線」にしようとすると、途端に壁にぶつかります。

Visio VBAには、主に座標配列から曲線を描くための強力なメソッドが2つ用意されています。

1. `DrawSpline`(スプライン曲線)

  • 指定した通過点を滑らかにつなぐ曲線を描きます。グラフの近似曲線や、おおよその軌跡を通したいときに便利です。

2. `DrawNURBS`(ナブス / 非一様有理Bスプライン)

  • 制御点(コントロールポイント)、結び目(Knot)、重み(Weight)を数学的に指定して描く、より高度で工業的な曲線です。CADデータとの連携や、厳密な曲率コントロールが必要な場面で真価を発揮します。

今回は、実務で圧倒的に出番が多く、直感的に扱いやすい`DrawSpline`を中心に、その制御アルゴリズムの裏側と実践コードを紐解いていきます。

2. 陥りがちな罠:配列の構造と「インチ」の呪縛

コードを書く前に、Visio VBA特有の「お作法」を知っておく必要があります。これを知らないと、エラーが出たり、意図しないとんでもない巨大な曲線が描かれたりします。

罠その1:座標データの持ち方(1次元ではなく2次元配列)

`DrawSpline`に渡す座標は、ただのカンマ区切りの数字ではありません。「(X座標, Y座標)のペアを並べた2次元配列」である必要があります。さらに、Visioの内部単位はミリメートルではなく「インチ(Inch)」です。

罠その2:ページ座標系の原点

Visioのページの原点 `(0, 0)` は、デフォルトでは「左下」です。画面上の感覚(左上)で座標を入れると、上下反転した図形が出来上がってしまいます。この「物理的な座標計算」を頭に入れておくことが、チーフアーキテクトへの第一歩です。

3. 実践!滑らかな自由曲線を自動生成するVBAコード

それでは、実際にアクティブページ上に美しいうねりを持つスプライン曲線を描画するコードを見てみましょう。
開発環境(VBE)の標準モジュールに貼り付け、そのまま実行できるように設計しています。

Sub CreateSmoothSplineDemo()
‘ =====================================================================
‘ テーマ: 座標配列から滑らかな自由曲線(Spline)を自動生成する
‘ 解説: 基礎からステップアップしたいあなたへ贈る、実践的VBAコード
‘ =====================================================================

Dim vsoPage As Visio.Page
Set vsoPage = ActivePage

‘ 1. 通過させたい座標の定義 (X, Y)
‘ ※単位はすべて「インチ」です(1インチ = 25.4mm)
‘ ここでは分かりやすく、右肩上がりにうねる5つの点を指定します。
Dim xyPoints() As Double
ReDim xyPoints(0 to 9) ‘ 5点 × (XとYの2つ) = 要素数0〜9

‘ 点1 (1.0インチ, 2.0インチ)
xyPoints(0) = 1.0: xyPoints(1) = 2.0
‘ 点2 (2.5インチ, 4.5インチ)
xyPoints(2) = 2.5: xyPoints(3) = 4.5
‘ 点3 (4.0インチ, 3.0インチ)
xyPoints(4) = 4.0: xyPoints(5) = 3.0
‘ 点4 (6.0インチ, 5.5インチ)
xyPoints(6) = 6.0: xyPoints(7) = 5.5
‘ 点5 (8.0インチ, 4.0インチ)
xyPoints(8) = 8.0: xyPoints(9) = 4.0

Dim vsoShape As Visio.Shape

‘ 2. DrawSplineメソッドの実行
‘ 構文: Page.DrawSpline(xyArray, [tolerance])
‘ tolerance(許容値)は通常 0.02 程度を指定します(滑らかさの精度)
On Error GoTo ErrorHandler
Set vsoShape = vsoPage.DrawSpline(xyPoints, 0.02)

‘ 3. 生成された図形のスタイルのブラッシュアップ(実務で使える技)
With vsoShape
‘ 線の色を鮮やかな青に変更 (RGB: 0, 120, 215)
.CellsSRC(visSectionObject, visRowLine, visLineColor).FormulaU = “RGB(0,120,215)”
‘ 線の太さを少し太くする (2pt)
.CellsSRC(visSectionObject, visRowLine, visLineWidth).FormulaU = “2 pt”
End With

MsgBox “滑らかな自由曲線の生成に成功しました!”, vbInformation, “Visio VBA 成功”
Exit Sub

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

コードのここがポイント!

  • `ReDim xyPoints(0 to 9)`: 5つの座標を扱う場合、XとYのペアになるため合計10個の要素(インデックス0〜9)を確保します。
  • `0.02` というtolerance(許容誤差): この数値が小さいほど、指定した座標を厳密にトレースしようとして線のデータ構造が複雑になります。実用上は `0.01` 〜 `0.05` の間で調整するのがベストです。
  • `CellsSRC` による装飾: ただ描くだけでなく、自動で色や太さを整えることで、「プログラムが描いたとは思えない美しい図面」が完成します。

4. さらに高みを目指すあなたへ:DrawNURBSへの挑戦

もし、あなたが工業用の配管や、より厳密な制御点による曲線のコントロールを求められているなら、`DrawSpline`の代わりに`DrawNURBS`を使用します。

`DrawNURBS` は以下のような引数を取ります。
`Set vsoShape = Page.DrawNURBS(xyArray, degree, knotArray, weightArray)`

  • `degree`(次数): 通常は 3次(Cubic)スプラインが最も滑らかで美しくなります。
  • `knotArray`(結び目ベクトル): 曲線の継ぎ目のパラメータです。
  • `weightArray`(重み): 各制御点が曲線を引き寄せる強さを調整します。

NURBSは数学的なアプローチが必要になるため初学者のうちはハードルが高く感じられますが、基本の `DrawSpline` で座標の扱い方に慣れておけば、スムーズに移行できます。

まとめ:自動化のキャンバスは、あなた次第で無限に広がる

今回は、Visio VBAにおける自由曲線の自動生成(`DrawSpline`)のアルゴリズムと実践コードを解説しました。

  • 座標は 「2次元のインチ配列」 で渡すこと。
  • 原点は 「左下」 であること。
  • 単に描くだけでなく、`CellsSRC` でプロパティを制御してデザイン性を高めること。

ここさえ押さえておけば、もはやVisioで描けない図形はありません。定型的な図面作成の自動化にとどまらず、動的なデータ可視化ツールとしてのVisioのポテンシャルを、ぜひあなたの手で引き出してみてください。

「ここをもっとこうしたい」「こんな複雑な配管を自動化したい」といった疑問があれば、いつでも先輩エンジニアにお尋ねください。応援しています!

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