CorelDRAWの「見えない歪み」を断つ:バウンディングボックス強制リセットの極致
CorelDRAWで長年設計を行っていると、避けて通れない「悪霊」がいる。それは、回転や複雑な変形を繰り返した結果、内部的なバウンディングボックスの座標系が狂い、正確な整列や吸着を阻害する現象だ。
なぜ、オブジェクトを「0度」に戻してもバウンディングボックスが歪むのか? それはCorelDRAWが持つ「変換マトリックスの累積」と、オブジェクトの基点(Origin)の不整合が原因である。今日は、この泥沼から現場を救い出す、シニアエンジニアのための「強制リセット・ルーチン」を伝授する。
—
1. なぜ「単純な回転リセット」では不十分なのか
初心者は `Shape.RotationAngle = 0` で解決したつもりになる。だが、それでは内部的なトランスフォーメーション・マトリックスは完全には初期化されない。真のエンジニアは、「オブジェクトの座標系を世界座標(World Coordinate)に書き換える」というアプローチをとる。
この処理の本質は、既存のパス情報を保持したまま、バウンディングボックスの基準情報を物理的に「再計算して書き込む」ことにある。
—
2. 鋼鉄のコード:強制リセット・マクロ
このコードは、単に整列させるだけでなく、メモリの断片化を極限まで抑える設計思想に基づいている。
Option Explicit
‘ メモリ管理を徹底する:CorelDRAW VBAではオブジェクト参照の破棄が命綱となる
Public Sub ForceResetBoundingBoxes()
Dim doc As Document
Dim shp As Shape
Dim sRange As ShapeRange
Set doc = ActiveDocument
‘ 予期せぬエラーでプロセスがゾンビ化するのを防ぐため、必ず最適化フラグを立てる
Optimization = True
doc.BeginCommandGroup “BoundingBox Reset”
On Error GoTo Cleanup
‘ 全レイヤーから選択対象、あるいは全シェイプを走査
Set sRange = ActivePage.Shapes.All
For Each shp In sRange
‘ グループ化されている場合の再帰的処理の検討が必要だが、
‘ 基本として「現在のパスの形状を一度変換して確定させる」手法をとる
If Not shp.Locked And shp.Visible Then
‘ 座標系を強制再計算させるマジックナンバー:
‘ 一度極小の移動を行い、即座に元に戻すことで内部行列を強制更新する
shp.Move 0.001, 0.001
shp.Move -0.001, -0.001
‘ 回転角の正規化
shp.RotationAngle = 0
‘ スケールを100%に固定し、変形をパスに焼き付ける
‘ これにより、バウンディングボックスがオブジェクト本来の形状に一致する
shp.SetSize shp.SizeWidth, shp.SizeHeight
End If
Next shp
Cleanup:
‘ 確実にリソースを開放する
doc.EndCommandGroup
Optimization = False
ActiveWindow.Refresh
Set sRange = Nothing
Set doc = Nothing
If Err.Number <> 0 Then
MsgBox “Critical Error: ” & Err.Description, vbCritical
End If
End Sub
—
3. シニアエンジニアが押さえるべき「3つの鉄則」
① `Optimization = True` の絶対的使用
VBAの描画更新は、CPUとGPUのパイプラインを極めて非効率に占有する。`Optimization` フラグを立てることで、CorelDRAWの内部描画ループを停止させ、処理速度を数百倍に引き上げることが可能だ。これは、数千のオブジェクトを扱う大規模印刷データでは必須の作法である。
② 明示的な `Nothing` による参照破棄
VBAのガーベジコレクションを過信してはならない。特に `ShapeRange` や `Document` オブジェクトは、スコープを抜けてもメモリに残り、長期稼働時のメモリリークの原因となる。常に `Set obj = Nothing` でデストラクトする意識を持つこと。
③ Windows APIとの連携(高度な応用)
もし、バウンディングボックスの情報を外部の生産管理システム(例:MySQLやSQL Server)と連携させる場合、VBA単体では不安定になることがある。その際は、`kernel32` の `GetTickCount` などでパフォーマンス計測を行い、一定時間以上の処理が走る場合は `DoEvents` を挟むか、あるいは外部DLL(C++で記述)を呼び出して処理をオフロードするアーキテクチャを選択すべきだ。
—
最後に:ツールは「魔法」ではなく「規律」である
このマクロは、あくまで現場の混乱をリセットするための「強制力」に過ぎない。真に自動化を成功させる鍵は、ツールを走らせる前のデータのクリーンさにある。
CorelDRAWの内部構造を理解し、その挙動をコントロール下に置くこと。それが、伝説的な自動化エンジニアへの第一歩だ。現場の「バウンディングボックスの悪夢」を、この一行のコードで終わらせてほしい。
