【テクニカル・上級編】【中級者向け】大量のベクターイラストレーションのストローク(線)を一括してアウトラインオブジェクトに変換し、拡大縮小時の変形崩れを防止 – CorelDRAW VBA解析バイブル

スポンサーリンク

【CorelDRAW VBA】ストローク破壊を許さない:ベクターデータ正規化の極致

CorelDRAWにおける「線の太さ問題」は、スケール変換における最大の敵だ。デザインの整合性を守るためにストロークをアウトライン化する。一見単純な作業だが、数千のオブジェクトを抱える巨大なドキュメントでこれを実行すれば、VBAのメモリ管理の甘さが即座に致命的なクラッシュを招く。

本稿では、レガシーなVBA環境において、いかにして「安全かつ高速に」全ストロークをパスへ変換し、データ整合性を担保するか。その設計哲学と実装の深淵を記す。

—

1. なぜ「ConvertOutlineToCurve」は罠なのか

単に `Shape.Outline.ConvertToObject` をループで回せば良い、という安易なアプローチは捨てろ。以下の理由から、大規模データではシステムが確実に悲鳴を上げる。

  • Undoスタックの肥大化: デフォルトの記録動作はメモリを食いつぶす。`Optimization = True` は必須だが、それだけでは足りない。
  • イベントの連鎖: オブジェクト変換は `ShapeChange` イベントを誘発し、意図せぬオーバーヘッドを生む。
  • ゴミの残留: VBAのオブジェクト参照がメモリ上に残存し、変換後のGarbage Collectionが機能しない。

我々が目指すのは、「トランザクション単位での完全なメモリ解放」と「再帰的な深層探索」による最適化だ。

—

2. 極限のストローク・アウトライン化スクリプト

以下のコードは、単なる変換ツールではない。グループ化されたオブジェクト、複雑なパス、すべてを再帰的に走査し、ストロークを殺し、かつメモリをクリアにする設計である。

‘ ————————————————————————–
‘ 伝説のアーキテクトによるストローク変換エンジン
‘ ————————————————————————–
Option Explicit

Public Sub NormalizeAllStrokes()
‘ パフォーマンス向上のための最適化(再描画とイベントの抑制)
Application.Optimization = True
On Error GoTo Cleanup

Dim doc As Document
Set doc = ActiveDocument

‘ Undoのチャンク化(一括戻しを可能にする)
doc.BeginCommandGroup “NormalizeStrokes”

‘ 再帰処理の開始
ProcessContainer doc.ActivePage.Shapes

doc.EndCommandGroup

Cleanup:
Application.Optimization = False
Application.Refresh
If Err.Number <> 0 Then MsgBox “Error: ” & Err.Description, vbCritical
End Sub

Private Sub ProcessContainer(shapes As Shapes)
Dim s As Shape
Dim i As Long

‘ 末尾から走査するのは、要素の追加削除によるインデックスズレを防ぐ鉄則
For i = shapes.Count To 1 Step -1
Set s = shapes(i)

‘ コンテナ(グループ等)であれば再帰
If s.Type = cdrGroupShape Or s.Type = cdrLayer Then
ProcessContainer s.Shapes
Else
‘ 線幅を持ち、かつ変換可能なオブジェクトのみを対象とする
If s.Outline.Type <> cdrOutlineNone Then
‘ 重要:変換後のオブジェクトは新しいShapeとして生成されるため参照を保持
s.Outline.ConvertToObject
End If
End If

‘ 明示的なオブジェクト解放
Set s = Nothing
Next i
End Sub

—

3. シニアエンジニアが押さえるべき「メモリの真実」

Windows APIによる制御の深掘り

大規模なベクターデータ変換中、CorelDRAWが「応答なし」になるのは、Windowsメッセージキューの飽和が原因だ。もし数万規模のオブジェクトを扱うのであれば、`DoEvents` を挟むのも手だが、それよりも `LockWindowUpdate` API(`user32.dll`)を用いてウィンドウの更新を物理的にロックすることを推奨する。これにより、描画コストを極限まで排除できる。

オブジェクトのライフサイクル管理

VBAはCOMベースの言語だ。`s.Outline.ConvertToObject` は内部的に新しいオブジェクトIDを生成する。ループ内でこれらを多用すると、解放されない参照が蓄積し、`Out of Memory` エラーを引き起こす。

  • 対策: `Set s = Nothing` をループの最後で徹底すること。
  • 対策: 変換処理後は `Application.Refresh` を呼び出し、レンダリングパイプラインをクリアにする。

—

4. システム間連携の勘所:フォーマット変換への布石

今回の「アウトライン化」は、実は 「SVG/PDF変換時のデータ化け防止」 という側面において最強のソリューションとなる。

他システム(WebフロントエンドやCAD)へデータを渡す際、ストロークの解釈は環境によって異なる。アウトライン化されたパスデータは、どのレンダラーを通しても「見た目」が変わらない。これが、プロのエンジニアが守るべき「デザインの整合性」である。

最後に:コードは「生き物」である

技術とは、単にコードを書くことではない。その背後にある「なぜそうなるのか」という論理を掌握することだ。CorelDRAW VBAは古い技術かもしれないが、そのAPIの奥底にあるレンダリングエンジンは、今なお強力だ。

このスクリプトをあなたの現場の「武器」として使いこなしてほしい。そして、トラブルが起きたときは、リファレンスではなく、メモリ上のオブジェクトの状態を想像せよ。それが伝説のアーキテクトへの第一歩だ。

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