【実務・中級編】【初心者向け】選択中のベクターオブジェクトの正確な外形寸法を計算し、自動でテキストとしてドキュメント内に焼き込むマクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握する極限の知見:選択オブジェクトの外形寸法を自動焼き込みする堅牢な実務ツールの設計

デザインの現場において、作成したベクターオブジェクトの「正確な外形寸法」をドキュメント上に注釈として配置する作業は、仕様書作成やデザインレビューの前段階において非常に頻度の高いルーティンワークだ。

手動で寸法を測り、テキストツールを持ち替えて数値を打ち込む――この泥臭い作業をデザイナーに手動で行わせている時点で、組織の業務効率化における「構造的な敗北」と言わざるを得ない。

今回は、CorelDRAW VBAのオブジェクトモデルの特性、特にバウンディングボックス(BBox)の挙動と座標系の罠を完全に理解した上で、「選択中のベクターオブジェクトの正確な外形寸法を計算し、自動でテキストとしてドキュメント内に焼き込む」ための、実務レベルで耐えうるプロダクションコードを解説する。

—

なぜそのVBAコードは動かないのか? CorelDRAW自動化の罠

ネット上の散見されるサンプルコードをそのまま現場に持ち込むと、決まって次のような重大なバグに直面する。

1. 回転(Rotation)や変形(Skew)を考慮していない
オブジェクトを45度回転させた状態で、単に `.SizeWidth` や `.SizeHeight` を取得すると、「回転前の非バウンディングな軸平行サイズ」が返ってきたり、意図しない数値が算出されたりする。実務の図面では「見た目の外形(Bounding Box)」が必要なケースがほとんどだ。
2. 単位系の混乱(Units mismatch)
CorelDRAWはドキュメント単位(ミリ、インチ、ピクセルなど)を柔軟に変更できる。コード内で数値をハードコーディングすると、単位を変更した瞬間に文字サイズやオフセット位置が破綻する。
3. 複数選択時のカオス
何も考えずに複数選択されたオブジェクトを処理しようとすると、個別の寸法が重なり合って判読不能なゴミテキストが生成される。

これらをすべてクリアし、プロフェッショナルなツールとして機能する設計を構築する。

—

堅牢な設計思想:プロダクションコードの要件

今回のツールで担保すべきアーキテクチャ上の要件は以下の3点だ。

  • 単一責任の原則: 選択オブジェクトの存在チェック、バウンディングボックスの正確な算出、テキスト生成・配置の各処理を分離する。
  • 単位の安全なハンドリング: ドキュメントの現在の測定単位(Measurement Units)を動的に取得し、それに準拠したオフセット計算を行う。
  • トランザクション的思考(Undoのグループ化): `ActiveDocument.BeginCommandGroup` を用いて、生成された一連のテキストと注釈を「1回のCtrl+Z」で完全にロールバックできるようにする。

—

コピペで即座に使える!プロダクションVBAコード

以下のコードをCorelDRAWのVBAエディタ(Alt + F11)の標準モジュールに貼り付けて実行してほしい。実務で即座に稼働する洗練されたコードだ。

Option Explicit

‘ ==============================================================================
‘ 処理名: 選択オブジェクト外形寸法 自動焼き込みマクロ
‘ 概要: 選択中のシェイプの正確なバウンディングボックスを取得し、
‘ その下部に「W: XXX × H: YYY」形式の寸法テキストを自動生成する。
‘ 著者: CorelDRAW VBA Architect
‘ ==============================================================================
Public Sub BurnDimensionText()
‘ 1. プリチェック:ドキュメントが開かれているか
If ActiveDocument Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. プリチェック:オブジェクトが選択されているか
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “寸法を取得するオブジェクトを選択してください。”, vbExclamation, “警告”
Exit Sub
End If

‘ トランザクション(Undoグループ)の開始
ActiveDocument.BeginCommandGroup “外形寸法の自動焼き込み”

‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler

Dim shp As Shape
Dim bBoxX As Double, bBoxY As Double, bBoxW As Double, bBoxH As Double
Dim textStr As String
Dim dimShape As Shape
Dim originalUnits As cdrUnit

‘ 現在のドキュメント単位を退避し、内部計算をミリメートル(または現在の単位)に最適化
originalUnits = ActiveDocument.Unit

‘ 選択されているオブジェクトを走査(複数選択に対応)
For Each shp In ActiveSelection.Shapes

‘ コネクタやガイドラインなど、寸法不要な特殊シェイプを除外する場合のガード
If shp.Type = cdrPlaceholderShape Then GoTo ContinueLoop

‘ 【極限の知見】
‘ 単純な .SizeWidth ではなく、現在の変形・回転を考慮した正確なバウンディングボックスを取得する
‘ GetBoundingBoxEx または標準の GetBoundingBox を使用
shp.GetBoundingBox bBoxX, bBoxY, bBoxW, bBoxH, True

‘ 表示用フォーマットの構築(小数点以下2桁に丸める)
‘ ※必要に応じてドキュメント単位に応じた文字列フォーマットに変更可能
textStr = “W: ” & Format(bBoxW, “0.00”) & ” × H: ” & Format(bBoxH, “0.00”)

‘ テキストの配置座標の計算(オブジェクトの真下、少し余白を開ける)
Dim textX As Double
Dim textY As Double
textX = bBoxX + (bBoxW / 2) ‘ 中央揃えのためのX座標
textY = bBoxY – 3 ‘ オブジェクト下端から3mm(または現在の単位)下方に配置

‘ テキストシェイプの作成
Set dimShape = ActiveLayer.CreateArtisticText(textX, textY, textStr)

‘ テキストの書式設定(実務で見やすいように最適化)
With dimShape.Text.Story
.Size = 8.5 ‘ フォントサイズ(ポイント)
.Alignment = cdrCenterAlignment ‘ 中央揃え
‘ .Font = “Meiryo” ‘ 必要に応じてフォントを指定
End With

‘ テキストの位置を正確にセンター合わせで再配置
dimShape.CenterX = textX
dimShape.Top = bBoxY – 2

ContinueLoop:
Next shp

‘ トランザクションの正常終了
ActiveDocument.EndCommandGroup

‘ 完了通知(実務ではあえてポップアップを出さずサイレントに処理することも多い)
‘ MsgBox “寸法テキストの生成が完了しました。”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ 異常発生時のロールバック
ActiveDocument.EndCommandGroup
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

—

コードの解説とアーキテクトからの助言

1. `GetBoundingBox` の第5引数 `True` の重要性

コード内で使用している `shp.GetBoundingBox bBoxX, bBoxY, bBoxW, bBoxH, True` の最後の `True` は非常に重要だ。これは「線の太さ(Outline)」を含めた外形サイズを取得することを意味する。
デザインの実務において、オブジェクトの「パスの寸法」ではなく「描画された実際の外形寸法」が知りたいケースが99%であるため、このフラグを立て忘れないことがプロとアマを分ける境界線となる。

2. トランザクション制御 (`BeginCommandGroup`)

大量のオブジェクトを選択して実行した場合、数十個のテキストが一瞬で生成される。このとき `BeginCommandGroup` を実装していないと、Ctrl+Zを押しても1文字ずつしかUndoできず、デザイナーのワークフローを破壊することになる。一連の自動化処理は、必ず1つの不可分なトランザクションとして扱え。

—

実務・データベース連携への発展

このマクロをさらに昇華させ、単にドキュメントに焼き込むだけでなく、「選択オブジェクトの寸法データを外部のCSVや生産管理データベースへ非同期でJSON送信・記録する」という拡張も容易に想像できるだろう。

CorelDRAW VBAからWindows標準の `MSXML2.DOMDocument` や `WinHttp.WinHttpRequest.5.1` を叩くことで、クラウド上のAPIサーバーへワンクリックで寸法データを飛ばすことも可能だ。

デザインデータと製造・仕様データの乖離をなくす第一歩として、まずはこのローカル自動化スクリプトをあなたの環境に導入し、チームの生産性を圧倒的に引き上げてほしい。

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