InDesignを制御するには、Javascript一番よく使われているかと思います。但し、そのJavascriptの基準が1999年のもので、スマート的な言語ではない。InDesign/Illustrator/Photoshopなどを制御する時、それを意識してコードを書く必要がある。この記事では、高速化するかどうかの処理時間差を測ってみる。
InDesignデータ用意:新規documentを作成、1頁目に1000個のtextFrameを追加。
//ページに50*20=1000個のtextFrameを作成
var doc = app.documents.add();
var page = doc.pages[0];
var tf;
var y1, x1;
for (var i = 0; i < 50; i++) {
for (var j = 0; j < 20; j++) {
tf = page.textFrames.add();
tf.contents = i + ":" + j;
y1 = i * 5;
x1 = j * 10
tf.geometricBounds = [y1, x1, y1 + 5, x1 + 10];
}
}
1、再描画を無効に(スクリプトパネルで設定)
//古典的な書き方: Bad (--> page.textFrames, page.textFrames.length)
var page = app.activeDocument.pages[0];
var start = new Date();
for (var i = 0; i < page.textFrames.length; i++) {
page.textFrames[i].contents = "Bad";
}
alert((new Date() - start) / 1000);
結果:48.107秒(再描画有効)-->44.152秒(再描画無効)
※今回の例はあまり効果が見えないが、複雑な描画を行う場合は、処理時間もっと減る。
2、属性を複数回使い回す時、一旦変数に格納-->特にloopの中
//変数使う場合: Good
var page = app.activeDocument.pages[0];
var start = new Date();
var tfs = page.textFrames;//変数に
var len = tfs.length;//変数に
for (var i = 0; i < len; i++) {
tfs[i].contents = "Good";
}
alert((new Date() - start) / 1000);
3、「取り消す」機能を無効に
//「取り消す」機能を無効に: UndoModes.fastEntireScript
app.doScript(main, ScriptLanguage.javascript, [], UndoModes.fastEntireScript);
function main() {
var page = app.activeDocument.pages[0];
var start = new Date();
var tfs = page.textFrames;
var len = tfs.length;
for (var i = 0; i < len; i++) {
tfs[i].contents = "Good";
}
alert((new Date() - start) / 1000);
}
処理時間
| 再描画有効 | 再描画無効 | |||
| 古典loop | 古典loop | 変数 | 変数+取り消し機能を無効に | |
| 1回目 | 9.349 | 7.882 | 6.685 | 6.131 |
| 2回目 | 9.478 | 9.086 | 6.506 | 6.048 |
| 3回目 | 10.219 | 9.036 | 6.738 | 6.104 |
| 4回目 | 9.565 | 9.107 | 6.515 | 6.023 |
| 5回目 | 9.496 | 9.041 | 6.694 | 6.19 |
| 合計(秒) | 48.107 | 44.152 | 33.138 | 30.496 |
| % | 100% | 92% | 69% | 63% |
以上、変数を活用し、また、取り消し機能をOFFにしたら、処理スピードが倍に上がる可能性が十分ある。
因みに、InDesignには、objects[list].everyItem()という謎なメソッド が存在している。これを上手利用したら、特定な処理においては、爆速!(次(次)回)
