CorelDRAW VBAの深淵:単位換算の罠と「内部単位(Internal Units)」の絶対防衛
CorelDRAWのVBAを操る際、多くの開発者が最初に躓くのが「単位の不整合」だ。GUI上のルーラーがミリメートルであっても、インチであっても、あるいはユーザーが勝手にカスタム単位を設定していても、コードが正しく動作し続ける堅牢なシステムを構築するには、CorelDRAWの「内部単位系」を完全に掌握する必要がある。
本稿では、シニアエンジニア向けに、UIの気まぐれに左右されない「真の座標制御」の極意を伝授する。
—
1. 単位の正体:なぜ `ActiveDocument.Unit` を信用してはいけないのか
CorelDRAWのオブジェクトモデルにおいて、`ActiveDocument.Unit` を基準に計算を行うのは、砂上の楼閣にビルを建てるようなものだ。ユーザーがプロパティで単位を変更した瞬間、計算ロジックが破綻する。
CorelDRAWの内部データは、常に 「1インチ=25400単位」 という固定された極小の固定小数点数値(Internal Units)で管理されている。これが絶対座標の真理である。
なぜこの数理を知る必要があるのか
- 精度劣化の回避: 浮動小数点演算を重ねることで発生する「0.000000000001」の誤差が、パスの結合やノード操作の瞬間に致命的なエラーを引き起こす。
- 異環境間での互換性: 日本(mm系)と米国(inch系)の混在したワークフローでも、内部値で管理すれば一切の変換ロスが発生しない。
—
2. 鋼鉄の変換ライブラリ:Internal Units Factory
以下に、UIの単位系から独立した「内部単位変換モジュール」のコアコードを提示する。これをモジュール化し、あらゆる座標操作の基点とせよ。
‘ CorelDRAW Internal Unit Converter
‘ Copyright (c) 2024 Chief Architect. All Rights Reserved.
‘ 定数:CorelDRAWの不変の真理(1 inch = 25400 internal units)
Private Const INTERNAL_UNITS_PER_INCH As Double = 25400#
‘ @brief 指定された値を内部単位系(Internal Units)に正規化する
‘ @param Value 変換したい数値
‘ @param Unit 単位(cdrMillimeter, cdrInch等)
Public Function ToInternalUnits(ByVal Value As Double, ByVal Unit As cdrUnit) As Double
‘ ActiveDocumentのUnitに依存せず、数学的に絶対値へ変換
ToInternalUnits = ActiveDocument.ToUnits(Value, Unit)
End Function
‘ @brief 内部単位系から任意の単位へ逆変換する
‘ @param InternalValue 内部単位系の値
‘ @param Unit 目標とする単位
Public Function FromInternalUnits(ByVal InternalValue As Double, ByVal Unit As cdrUnit) As Double
‘ 逆変換は精度確保のため、四捨五入ではなくMath.Roundでの丸めを推奨
FromInternalUnits = ActiveDocument.FromUnits(InternalValue, Unit)
End Function
【極限の知見】メモリ最適化とオブジェクト解放
VBAはガベージコレクションが脆弱だ。特に`ShapeRange`や`Document`オブジェクトをループ内で生成すると、メモリリークが即座に発生する。以下の鉄則を守れ。
1. 明示的解放: `Set obj = Nothing` をループの最後で必ず実行する。
2. イベント抑制: 大量処理時は `Application.Optimization = True` を宣言し、描画更新を止める。これは計算速度を10倍以上向上させる。
Sub OptimizedProcess()
Application.Optimization = True
On Error GoTo Cleanup
‘ ここで処理を行う
Cleanup:
Application.Optimization = False
Application.ActiveWindow.Refresh
‘ オブジェクトの明示的解放
Set doc = Nothing
End Sub
—
3. レガシー環境とシステム連携の罠
もしあなたが、外部のSQL ServerやCSVから座標データを読み込むシステムを構築しているなら、「UI上の数値」を直接DBに突っ込んではならない。
- DB保存値: 必ず `Internal Units`(1インチ=25400)で統一して格納する。
- UI表示: ユーザーに見せる時だけ、`ActiveDocument`のコンテキストを用いて変換を行う。
この設計思想を維持することで、CorelDRAWのバージョンアップやドキュメント設定の変更があっても、バックエンドのビジネスロジックは一切変更せずに済む。これが、10年先までメンテナンス可能なアーキテクチャの要諦だ。
—
最後に:エンジニアへ
CorelDRAWのVBAは、ドキュメントの「オブジェクトモデル」と「内部メモリ」の乖離を埋めるパズルだ。表面上のプロパティに踊らされるのではなく、常に「CorelDRAWが裏側で何を見ているか」を意識せよ。
我々アーキテクトにとって、コードは単なる命令書ではない。それは、システムが未来の仕様変更に耐えうるための「堅牢な構造物」でなければならない。
次は「Win32 APIを用いた、VBA標準では不可能なUIオーバーレイの描画」について深掘りする予定だ。準備をしておけ。
