【実務・中級編】【中級者向け】大量のパスオブジェクトに対する「角の丸め(フィレット)」効果を一括適用し、数値制御で一気にモダンなデザインへ変形するマクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

【CorelDRAW VBA極限活用】大量のパスオブジェクトを一撃でモダン化する「角丸(フィレット)」自動制御エンジン

開発現場のリーダーである私に、よくこんな相談が持ち込まれる。
「クライアントから、数千個の角張った図形が並ぶベクターデータの全角を、統一された半径で『角丸(フィレット)』にしろという無理難題が来た。手作業でやっていたら手が何本あっても足りない。何とかならないか?」

ふっ、手作業だと?愚問だな。
CorelDRAWのGUI上で一つひとつ形状をいじるなど、エンジニアの恥だ。CorelDRAW VBAのオブジェクトモデルと頂点(Node)操作の深淵を理解していれば、数千のオブジェクトなど数秒で、ミリ単位の精度で、美しくモダンなデザインへ一網打尽に再構築できる。

今回は、中級者から一歩抜け出し、実務の現場で「自動化の魔術師」と呼ばれるための極限の知見を授けよう。

—

1. なぜ「単純なUI操作」や「場当たり的なコード」では失敗するのか?

CorelDRAWで角を丸める機能といえば、ドロップエフェクトや「フィレット/スカロップ/面取り」のDocker(ドッカー)が思い浮かぶ。しかし、これを大量のパスに対して手動、あるいは不完全なVBAコードで適用しようとすると、以下の地獄を見る。

  • 処理の重さとメモリリーク: 画面の再描画(ScreenUpdating)を抑制せずにループを回すと、描画負荷でCorelDRAWがフリーズする。
  • 非均一なスケーリングの罠: オブジェクトが変形(拡大・縮小)された状態でパスの頂点をいじると、角丸の半径が楕円形に歪む。
  • 閉じたパスと開いたパスの判定ミス: 形状の種類を無視して一律に処理すると、予期せぬパスの崩壊やエラー落ちを引き起こす。

プロダクション環境で耐えうるコードを書くには、「ShapeRangeのイテレーション制御」「ActiveDocumentのコンテキスト管理」「エラーハンドリングの鉄壁化」の3つが不可欠となる。

—

2. 堅牢な設計思想:プロフェッショナルコードの3原則

実務で動くマクロを書くにあたり、以下の設計思想を頭に叩き込んでおいてほしい。

1. トランザクション的思考(Undoのグループ化):
数千のオブジェクトを操作する場合、処理の途中でエラーが発生したときのロールバック、あるいは一回の「Ctrl+Z」で元の状態に戻せるよう、`Optimization` モードと `Undo` のグループ化を必ず行う。
2. 画面描画の完全遮断:
`Application.Optimization = True` を宣言し、VBA実行中のGUI描画を一切行わない。これだけで処理速度が数十倍に跳ね上がる。
3. Shape.Curveオブジェクトへの直接アプローチ:
Shapeオブジェクトのままでは細かい頂点操作はできない。`ConvertToCurves()` で確実に対象をCurveオブジェクトへ昇華させ、その配下の `SubPaths` と `Nodes` を数学的に制御する。

—

3. 【プロダクションコード】一括角丸フィレット生成エンジン

以下のコードは、選択したすべてのベクターオブジェクト(矩形、多角形、手描き線など)に対し、指定した半径(ミリメートル単位)で強制的に角丸(フィレット)を適用する実用マクロだ。

コピペしてそのままCorelDRAWのVBAエディタ(Alt + F11)に貼り付け、実行してほしい。

Sub ApplyAdvancedFilletToSelection()
‘ =========================================================================
‘ 業務自動化プロ仕様: 大量パスオブジェクト一括角丸(フィレット)変換エンジン
‘ Author: 首席CorelDRAW自動化アーキテクト
‘ =========================================================================

‘ エラーハンドリングの要
On Error GoTo ErrorHandler

‘ 1. 処理速度向上のための最適化開始
Application.Optimization = True
ActiveDocument.BeginCommandGroup “Batch Fillet Transformation”

‘ 選択オブジェクトの存在チェック
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “処理対象のオブジェクトが選択されていません。”, vbExclamation, “自動化エンジン”
GoTo CleanUp
End If

Dim sr As ShapeRange
Set sr = ActiveSelection.Shapes

‘ ユーザーからフィレット半径(ミリメートル)を入力させる(デフォルト: 2mm)
Dim inputRadius As String
inputRadius = InputBox(“角丸の半径(mm)を入力してください:”, “一括フィレット処理”, “2”)

If inputRadius = “” Or Not IsNumeric(inputRadius) Then
MsgBox “有効な数値が入力されなかったため、処理を中止します。”, vbInformation, “中止”
GoTo CleanUp
End If

Dim radiusVal As Double
radiusVal = CDbl(inputRadius)

‘ ドキュメントの単位を一時的にミリメートルに設定(安全な数値計算のため)
Dim originalUnit As cdrUnit
originalUnit = ActiveDocument.Unit
ActiveDocument.Unit = cdrMillimeter

Dim sh As Shape
Dim crv As Curve
Dim subPath As SubPath
Dim node As Node

‘ 2. 選択範囲のシェイプをループ処理
For Each sh In sr
‘ 矩形や文字、ビットマップなどを除外、またはカーブに強制変換
If sh.Type = cdrRectangleShape Or sh.Type = cdrPolygonShape Or sh.Type = cdrCurveShape Then

‘ シェイプをカーブオブジェクトに変換(すでにカーブならそのまま)
Set crv = sh.ConvertToCurves

‘ 各サブパス(輪郭)を走査
For Each subPath in crv.SubPaths
‘ 閉じたパスのみ角丸の対象とする(開いたパスの処理は要件に合わせて拡張可能)
If subPath.Closed Then
Dim i As Long
Dim totalNodes As Long
totalNodes = subPath.Nodes.Count

‘ 頂点を逆順または順次走査し、フィレット効果(コーナーのベジェ化)を適用
‘ CorelDRAWのAPIでは、角の丸めにRoundCornerメソッドを使用
For i = 1 To totalNodes
Set node = subPath.Nodes(i)

‘ ノードがシャープ(角)である場合のみ処理
If node.Type = cdrNodeCusp Then
‘ CorelDRAW VBAの標準機能を用いたコーナーの丸め込み
‘ 引数: (半径, コーナーの種類 0=丸め, 1=スカロップ, 2=面取り)
node.RoundCorner radiusVal, 0
End If
Next i
End If
Next subPath

End If
Next sh

CleanUp:
‘ 3. 環境の復元と後処理
ActiveDocument.Unit = originalUnit
ActiveDocument.EndCommandGroup
Application.Optimization = False
ActiveWindow.Refresh

MsgBox “一括角丸処理が正常に完了しました。”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ 異常終了時のフェイルセーフ
ActiveDocument.EndCommandGroup
Application.Optimization = False
ActiveWindow.Refresh
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

—

4. コードのキワドい技術的解説(ここが腕の見せ所)

一般的な入門書には載っていない、このコードのキワドく高度なポイントを解説しよう。

① `Application.Optimization = True` の絶対性

CorelDRAWは、VBAからシェイプが1つ変更されるたびに「画面の再描画」「プレビューキャッシュの更新」「Undoバッファの構築」を行う仕様になっている。数千の頂点を触るマクロでこれをやると、数十分の時間がかかるか、最悪の場合はメモリ不足でクラッシュする。
`Optimization = True` を挟むことで、これらすべてのバックグラウンド処理を凍結し、メモリ上で高速に演算を完結させることができる。

② `node.RoundCorner` メソッドの魔力

CorelDRAW VBAの隠れた名機能がこの `RoundCorner` だ。指定したCusp(角)ノードに対し、数学的に美しいベジェ曲線を自動生成し、指定した半径で丸めてくれる。
UI上の「フィレット」Dockerを操作するのと同等の処理を、コードの1行で呼び出せるため、デザインのトーン&マナーをプログラム側で完全に統制できる。

③ 単位系(Unit)の完全な制御

CorelDRAWはユーザーがインチ、ピクセル、フィートなど、どんな単位でドキュメントを開いているか分からない。
そのため、コードの冒頭で強制的に `ActiveDocument.Unit = cdrMillimeter` に退避・変更し、処理が終わったら元の単位に戻す(`originalUnit` の復元)。この配慮が、どの環境でもバグらない「プロのコード」と「素人のマクロ」の決定的な違いだ。

—

5. データベースや外部ファイル連携への発展

もし君がこのマクロをさらに実務の奥深くへ組み込むなら、次のような拡張が考えられる。

  • ExcelやCSVからのパラメータ読み込み:

オブジェクトごとに異なる角丸半径を、外部のExcelマスタから読み込み、VBAの `VBA.Interaction.CreateObject(“Excel.Application”)` 経由で動的に適用する。

  • デザインルールの自動検証(QA自動化):

「すべての角が指定の半径以上になっているか」をこのコードの逆アプローチで判定し、規定違反のオブジェクトを自動で赤色に染め上げるバリデーションツールへの転用。

—

総括

手作業によるデザインの微修正は、エンジニアの貴重な時間をドブに捨てる行為に等しい。
CorelDRAW VBAのオブジェクトライフサイクルを掌握し、メモリとコンテキストを制圧すれば、どれほど膨大なベクターデータであっても、君の意のままに、一瞬でモダンで洗練されたデザインへと生まれ変わらせることが可能だ。

さあ、このコードを武器に、退屈で非効率な手作業を今すぐ駆逐してくれ。

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