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()という謎なメソッド が存在している。これを上手利用したら、特定な処理においては、爆速!(次(次)回)