【CorelDRAW VBA極限の知見】選択オブジェクトの精密外形寸法自動ラベリングシステム
ベクターグラフィックスの現場において、デザイン要素のサイズ確認とドキュメント化は、品質担保の根幹をなす極めて重要かつ退屈な反復作業である。手動による寸法の計測とテキスト入力は、ヒューマンエラーの温床となり、制作スピードを著しく低下させる。
今回は、CorelDRAW VBAのオブジェクトモデルを極限まで最適化し、選択中のベクターオブジェクトの正確な外形寸法(Bounding Box)を瞬時に計算。図面の傍らに動的な注釈テキストとして焼き込む、プロダクション品質のマクロコードを公開する。
単なる「リファレンスの引き写し」ではない。オブジェクトのライフサイクル管理、UIスレッドの最適化、そしてレガシー環境特有の罠を回避するチーフアーキテクトの知見をここに凝縮する。
—
1. 現場の設計思想:なぜこのマクロが必要なのか
CorelDRAWの標準機能でも寸法線ツールは存在するが、特定のワークフロー(パッケージデザイン、看板製作、レーザー加工用パスの確認など)においては、「選択した瞬間に、指定フォーマットで正確な数値をオブジェクトの直近にテキストとして配置する」という特化型の自動化が圧倒的な優位性を持つ。
ここでエンジニアが直面する最大の壁は以下の2点だ。
1. バウンディング・ボックスの罠: オブジェクトの回転や線の太さ(アウトライン)を含めた正確な外形サイズの取得。
2. メモリリークとCOMオブジェクトの解放: CorelDRAW VBAにおける不適切なオブジェクト参照によるメモリ肥大化とハングアップの防止。
これらを完全に制御した実用コードを以下に提示する。
—
2. 実装コード:PrecisionDimensionBurner.bas
以下のコードをCorelDRAWのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けて実行してほしい。
Option Explicit
‘ ==============================================================================
‘ Module: PrecisionDimensionBurner
‘ Description: 選択オブジェクトの正確な外形寸法を算出し、注釈テキストを自動生成する
‘ Author: Chief Architect (CorelDRAW VBA Optimization Project)
‘ ==============================================================================
Public Sub BurnObjectDimensions()
‘ 1. エラーハンドリングの初期化
On Error GoTo ErrorHandler
‘ 2. アプリケーションの最適化(描画停止による爆速化)
ActiveDocument.BeginCommandGroup “Burn Dimensions”
Optimization = True
EventsEnabled = False
‘ 3. 選択オブジェクトの検証
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “寸法を計測するベクターオブジェクトを選択してください。”, vbExclamation, “CorelDRAW Automation”
GoTo CleanUp
End If
Dim srTarget As ShapeRange
Set srTarget = ActiveSelection.Shapes
‘ 4. 複合バウンディング・ボックスの算出(線幅を考慮するかは仕様によるが、今回は外形基準)
Dim dLeft As Double, dTop As Double, dWidth As Double, dHeight As Double
‘ 厳密な外形を取得するため、GetBoundingBoxを使用
srTarget.GetBoundingBox dLeft, dTop, dWidth, dHeight
‘ 5. 寸法文字列のフォーマット(単位はドキュメント設定に依存、ここではミリメートル前提)
Dim sDimensionText As String
sDimensionText = Format$(dWidth, “0.00”) & ” mm × ” & Format$(dHeight, “0.00”) & ” mm”
‘ 6. テキストオブジェクトの動的生成
Dim shText As Shape
‘ 配置位置:ターゲットの右下+オフセット
Dim dOffset As Double
dOffset = 2.0 ‘ 2mmのオフセット
Set shText = ActiveLayer.CreateArtisticText(dLeft, dTop – dHeight – dOffset, sDimensionText)
‘ 7. テキストスタイルのプログラム的統制
With shText.Text.Story
.Size = 8 ‘ フォントサイズ 8pt
.Font = “Meiryo UI”
.Fill.UniformColor.RGBAColor 50, 50, 50 ‘ 濃いグレーで視認性を確保
End With
‘ 8. 生成したテキストと元オブジェクトをグループ化するかどうかは運用次第(今回は独立配置)
CleanUp:
‘ 9. 最適化の解除とリソースの明示的解放(極めて重要)
EventsEnabled = True
Optimization = False
ActiveDocument.EndCommandGroup
‘ オブジェクト変数のメモリ破棄
Set shText = Nothing
Set srTarget = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “System Error”
Resume CleanUp
End Sub
—
3. チーフアーキテクトが解説するコードの急所
① `Optimization = True` によるUI描画のブラックアウト戦術
CorelDRAW VBAで最もやってはいけないのが、ループ内やオブジェクト生成ごとに画面描画を走らせることだ。`Optimization = True` と `EventsEnabled = False` をペアで使用することで、CorelDRAWの画面更新スレッドを完全にロックし、処理速度を最大で数十倍に跳ね上げる。大量のオブジェクトを処理する現場において、これは必須の作法である。
② `GetBoundingBox` の正確性
単純な `.Width` や `.Height` プロパティは、オブジェクトの変形(回転・傾き)や線の太さ(Outline Width)の含まれ方に罠がある。厳密な「見た目の外形寸法」を担保するため、`GetBoundingBox` メソッドを用いて明示的に座標変数を渡す設計としている。これにより、どんなに複雑なパスであっても狂いのない寸法が算出される。
③ COMオブジェクトのライフサイクル管理 (`Set ~ = Nothing`)
VBAのランタイムは優秀だが、CorelDRAWのような重厚長大なCOMサーバーを操作する場合、オブジェクト変数を放置するとメモリリーク(メモリの断片化)を引き起こす。
コードの終端(`CleanUp` ラベル)で、`Set srTarget = Nothing` のように参照を明示的に解放している。これにより、何千回とマクロを連続実行してもメモリ使用量が一定に保たれる堅牢なシステムが完成する。
—
4. さらなる高みへ:システム間連携と将来の拡張
このマクロを単なる「お絵描き補助ツール」で終わらせてはならない。
例えば、算出した寸法データ(`dWidth`, `dHeight`)を、標準の `FileSystemObject` を用いてCSVやJSON形式でローカルディスクに吐き出したり、Windows API(`WScript.Shell`等)を経由して社内の生産管理基幹システム(ERP)へREST APIでPOST送信するブリッジへと拡張することは容易だ。
ベクターデータの形状データから製造コストを自動算出し、見積書をバックグラウンドで生成する――。CorelDRAW VBAをマスターした者だけが到達できる、真の「スマートファクトリーの自動化レイヤー」への第一歩として、本コードを日々のワークフローに組み込んで活用してほしい。
