takashiskiのブログ

覚書の殴り書き

CorelDRAWのマクロをC#で組む

世間ではIllustrator全盛ですが、レーザー加工機などでは何故かCorelDRAWが強めです。そのためCorelDRAWを使い始めたのですが、全く情報がありません。マクロはどうやらVBAで書けるようなのですが、辛すぎるので探して回りました。

C#が使えるぞ!

ツール>マクロの下に、マクロエディタ以外に「VSTAエディタ」なる謎の項目があります。これを選択するとVisual Studioが起動することから*1、これはVisual Studio Tools for Applicationsの略だということがわかります。そう、そうなのです。VBAだけではなくC#でもマクロを記述できるのです!

APIドキュメント

非常にgoogle検索に引っかかりにくいため見つけるまでに難儀しました。Corel Deveroper Area内の、API Documentationです。やたら重いです。

API Documentation - Developer Area - CorelDRAW Community

ここに書かれている内容すべてがCorel.Interop.VGCore以下に入っています。最初はCorelDRAWの気持ちが中々わからずとても苦労しました。なのでメモ程度ですが記録を残します。

絶対やったほうがいいこと

例えば、1000個Rectangleを生成するマクロを実行すると、とても時間がかかります。それこそ糞ほど時間がかかる上にエディタは操作を受け付けなくなります。途中終了はできません。また実行中はコードの書き換えが不可です。地獄ですね。

なぜこのようになるのかというと、何かしらのObjectの生成や移動のたびに再描画が実施されているからです。

生成数が増えるにつれてデバッグすら辛くなるありさまです。流石に何か方法があるだろうと適当なワードでGoogle検索をしたところ、7年前にVBAの記事が見つかりました。幸い、CorelScriptではなかったのでVBAの記述を参考にドキュメントを読んだところ、描画を一括で行うようにする方法が見つかりました。

Speed up your macros. - Code snippets feedback - Developer Area - CorelDRAW Community

Application.Optimization property - Developer Area - CorelDRAW Community

まずマクロの先頭に次の文を挿入します。これにより、変更時に再描画がされなくなります。

app.Optimazation=true;

マクロの最後に次の文を挿入します。再描画を有効にした後、再描画を実行します。この処理を忘れると文書が真っ白になります。

app.Optimazation=false;
app.Reflesh();

また、マクロの途中でエラーが発生・停止した場合も真っ白になります。単にフラグを折って再描画をするだけのマクロ関数を用意しておくと平和かもしれません。

他にも最適化手法があるようですが、とりあえずこれだけで劇的に変化します。実質フリーズなし。

メモ

なんか起こったら追記します。

重要

バージョン

CorelDRAW2017の場合はVSもVSTAも2017じゃないとだめっぽい。2018の場合も同様。

データ保存

信頼するな。CorelDRAWが起きているときは残っているが、閉じるとどうなるかわからない。VSTAだけどの瞬間かわからない程度前までロールバックしていた。

また、VBAマクロと扱いが違うようでグローバルにしか置けない可能性がある。ちゃんと調べてない。

Startup()

最初に呼ばれる関数です。ここで初期化など実施します。

app

親です。Corel.Interop.VGCore.Application Main.appだそうです。

たぶん Applicationクラスを参照すればよいと思います。ここからDocumentとかPageとかLayerとかShapeをたどっていきます。

Application class - Developer Area - CorelDRAW Community

図形を検索したい

まず、所属するLayerをエディタから検索します。わからない場合は、すべてのLayerを走査します。

LayerのSelectableShapesまたはShapesからShapes(Shapeではない)を得ます。Shapesをforeachなどで走査し、NameやTypeを使って特定してください。

図形の色を変えたい

Shapeは色属性を持っていません。Corelでは外形とフィルに分かれていますので、Shape.OutlineやShape.FillのメンバのColorに対してアクセスします。

図形Aの中心と図形Bの中心を一致させたい。

アンカーが両方とも中心にある前提であれば、ShapeはCenterXとCenterYを持っていますので、SetPositionやPositionX/PositionYに対して他方のCenterX/CenterYを適用することで中心を一致させることができます。

CorelDRAW Essentials Suite 2018(最新)|ダウンロード版

CorelDRAW Essentials Suite 2018(最新)|ダウンロード版

CorelDRAW Graphics Suite 2018

CorelDRAW Graphics Suite 2018

*1:対応したバージョンのVisualStudioとVisual Studio Tools for Applicationsがインストールされている場合のみ