Illustratorで変数を削除するスクリプト


Illstratorで変数をまとめ削除したくてスクリプトを組んだが、その際に詰まったことの備忘録。

Illstratorで変数とは?

Illustratorはベクター画像を作るアプリだが、処理の自動化する機構も備わっている。
その代表的なものが「変数」機能で、特定のオブジェクトに対して動的にデータを書き換えることができる。(詳細はここ)。

Illstratorをscriptで自動化

この機能は似たスタイルの画像を大量に作る際は非常に便利なのだが、そのまま相手に渡してしまうとマウス操作を少しミスるだけで大惨事になる。
なので、校正や納品をする際には変数データを削除した状態のファイルで渡したほうが確実である。
手で削除してもいいのだが、面倒だし、ほかの自動化スクリプトに組み込んでしまうのが一番楽だ。
スクリプトを組む場合は以下を参照。
Adobe Illustrator CC Scripting Reference: JavaScript

変数をscriptで操作しよう

変数のデータはvariablesクラスにまとめて格納されている。
そして、クラス内に各変数データがvariableオブジェクトとして保管されている。
各オブジェクトへのアクセスはindexを指定する。

activeDocument.variables[0]; //変数1のオブジェクトにアクセス

全要素を先頭から削除するfor文を書くと...

var variableObj = activeDocument.variables;
for (i=0; i<variableObj.length; i++){
    tmp = variableObj[i];
    tmp.remove();
}

これだと一個飛ばしで削除されて、半分の変数データが残ってしまう。

variableオブジェクトはリスト構造で格納されている

C言語に慣れた身としてはindex指定するので配列のように操作してしまうが、リスト構造で格納されている。
一つ削除すると次要素へのポインタが更新されて、indexの数値が詰まる。なので、先頭から順次削除すると歯抜け状態になってしまう。

全要素をきれいに削除したい場合は後ろから削除していくのが吉。

変数情報削除.js
try{
    removeVariables(activeDocument); //変数情報を削除
}
catch(someError){
    alert( "JavaScript error occurred. Message = " +someError.description)
}    

// 変数情報の削除
function removeVariables(docObj)
{
    var variableObj = docObj.variables;
    var tmp;
    //  variablesクラスのvariableオブジェクトはリスト構造で格納されているので
    //  variablesクラスの中にあるvariableオブジェクトを後ろから順に削除
    for (i=variableObj.length-1; i>=0; i--){
        tmp = variableObj[i];
        tmp.remove();
    }
}

調べてみると、元々JavaScriptでは配列の要素操作はリスト構造でやっているらしい。
てへぺろ☆(・ω<)