Visioの「心臓部」を叩く:Shape.GeometryとSplineKnotによる極限の曲線制御
VisioのUI上でベジェ曲線やスプラインを描画し、その頂点をマウスでドラッグする……そんな素人仕事は今日で終わりにしよう。
我々が扱うのは、設計図面やCAD連携を前提とした「決定論的な曲線」だ。VisioのShapeSheetにおける`Geometry`セクションは、単なるプロパティの集積ではない。それは、Visioという巨大なレンダリングエンジンに対する「命令書」そのものだ。本稿では、`SplineKnot`セルの直接操作による、計算幾何学に基づいた高精度な曲線描画の深淵へ案内する。
—
1. なぜ「標準機能」ではいけないのか
UIからの操作は、座標の丸め込み(Rounding)と、Visioエンジンによる自動最適化の介入を受ける。しかし、数千点のノードを持つCADデータや、動的に計算された関数グラフを描画する場合、この「おせっかい」がノイズとなり、描画パフォーマンスの低下や誤差の蓄積を招く。
`Geometry`セクションをVBAから直接書き換えるということは、Visioの描画パイプラインの深層部へ直接コマンドを送り込むことに他ならない。
—
2. ShapeSheet操作の鉄則:低レイヤー・アーキテクトの矜持
`Cell.Formula`を逐次呼び出すのは、最も避けるべき「低速アンチパターン」だ。VisioのCOMインターフェースは、呼び出しごとにオーバーヘッドが発生する。
オブジェクトライフサイクルと最適化
1. `Application.ScreenUpdating = False`: 描画更新を止めるのは基本中の基本。
2. `Document.UndoScope`: 巨大な操作は必ずトランザクションで囲む。失敗時のロールバックコストを最小化せよ。
3. `Set`したオブジェクトの解放: `Nothing`を明示的に代入し、COMの参照カウンタを即時デクリメントする。レガシー環境でのメモリリークは、数時間単位の長時間運用で致命傷となる。
—
3. 実装:SplineKnotの動的挿入
以下は、スプライン曲線の制御点(Knot)を動的に生成し、Shapeの`Geometry`セクションへ流し込むためのコアロジックだ。
Option Explicit
‘ 伝説的なエンジニアは「型」と「エラーハンドリング」を疎かにしない
Public Sub InjectSplineKnot(ByVal shp As Visio.Shape, ByVal index As Long, ByVal val As Double)
Dim cell As Visio.Cell
Dim rowIdx As Long
‘ Geometry1セクションにSplineKnot行を追加
‘ VisRowLastは行の末尾に挿入するための定数
rowIdx = shp.AddRow(Visio.VisSectionIndices.visSectionFirstComponent, _
Visio.VisRowIndices.visRowLast, _
Visio.VisRowTags.visTagSplineKnot)
‘ SplineKnotセルの取得と値のセット
‘ FormulaUを用いること。ロケール依存の文字列変換を回避する絶対的な作法である
Set cell = shp.CellsSRC(Visio.VisSectionIndices.visSectionFirstComponent, _
rowIdx, _
Visio.VisCellIndices.visSplineKnot)
cell.FormulaU = CStr(val)
‘ オブジェクト解放
Set cell = Nothing
End Sub
—
4. 高精度描画のためのシステム連携:Windows APIの活用
非常に複雑な曲線計算を行う場合、VBAのネイティブな浮動小数点演算では限界がある。あるいは、外部のC++ライブラリ(DLL)で計算した座標値を高速にVisioへ流し込む必要がある場合、`CopyMemory` APIを使用してメモリバッファを直接操作する手法も検討すべきだ。
しかし、まずは「`FormulaU`による型安全なデータ投入」を徹底すること。Visioは内部で`Double`値を文字列として保持する稀有な設計だ。この仕様を逆手に取り、計算精度を極限まで保持する戦略を取る。
—
5. 運用上の注意点:レガシーとの共存
- データ型の不一致: CAD側はミリメートル単位、Visioは内部的にインチ単位(`visInches`)で計算を行うことが多い。`Application.ConvertResult`を適切に使い、基底単位を常に意識せよ。
- 計算の順序: `SplineKnot`を挿入する際は、必ず`SplineStart`行が先に存在することを確認せよ。順序を違えれば、Visioのレンダラーは無慈悲にも「無効な図形」として描画を拒否する。
—
結論:アーキテクトとしての一歩
Visioを単なるドローソフトとして使うのは、フェラーリで近所のコンビニへ行くようなものだ。`Geometry`セクションをVBAで制御するということは、Visioの「描画エンジン」そのものをプログラミングするということである。
今回紹介した手法をマスターすれば、複雑な数式に基づく曲線や、外部システムと連動した動的図面生成において、あなたは他者の追随を許さない精度と速度を実現できるはずだ。
次は、`Geometry`セクションの`NoShow`セルと、`User-Defined Cells`を組み合わせた「条件付き描画の自動最適化」について掘り下げることとしよう。技術は、常に深化し続ける。準備はいいか。
