グループ化されたオブジェクトを新レイヤーへ複数回コピー・配置する、Illustrator向けのJavaScriptを書いた

元絵が描かれているaiファイルからラベルを作ることになり、

  1. 元絵を一つ用意
  2. 元絵を別レイヤーへ複数コピー
  3. コピーしたものを、ラベルに合わせて位置へ移動
  4. どのラベルも同じような配置になるよう、微調整

という手作業を行ないました。


作業を進めていくうちにラベル位置を手作業で微調整するのが苦痛になっていき、さらには、今後も同じような作業があると言われました。
さすがに今後も手作業というのは耐えられないため、JavaScriptIllustratorの処理を自動化することにしました。



ソース

gistにも載せました。
グループ化されたオブジェクトを新レイヤーへ複数回コピー・配置する、Illustrator向けのJavaScript。ブログはこちら→ http://d.hatena.ne.jp/thinkAmi/20130523/1369257947


//  グループ化されたオブジェクトを新レイヤーへ複数回コピー・配置する
//  方法) 列方向に、ひとつの元絵をコピー・グループ化したあと、行方向に、そのグループをコピーする
(function(){
    const ROW_COUNT = 11;
    const COLUMN_COUNT = 4;

    const SPACE_LEFT_MM = 7.4;
    const SPACE_LEFT_PT = toPT(SPACE_LEFT_MM)

    const A4_HEIGHT_MM = 297;
    const SPACE_TOP_MM = 9.4;
    const LABEL_TOP_MM = A4_HEIGHT_MM - SPACE_TOP_MM;
    const LABEL_TOP_PT = toPT(LABEL_TOP_MM);

    const LABEL_WIDTH_MM = 48.3;
    const LABEL_WIDTH_PT = toPT(LABEL_WIDTH_MM);

    const LABEL_HEIGHT_MM = 25.48;
    const LABEL_HEIGHT_PT = toPT(LABEL_HEIGHT_MM);



    var newLayer = app.activeDocument.layers.add();

    var baseItem = app.activeDocument.layers[1].groupItems[0].duplicate();
    baseItem.moveToEnd(newLayer);
    baseItem.position = [SPACE_LEFT_PT, LABEL_TOP_PT];

    var baseGroup = app.activeDocument.groupItems.add();
    baseItem.move(baseGroup, ElementPlacement.PLACEATEND);


    var leftPosition = SPACE_LEFT_PT;
    for (var i=0; i < COLUMN_COUNT - 1; i++)
    {
        var item = baseItem.duplicate();
        leftPosition += LABEL_WIDTH_PT;
        item.position = [leftPosition, LABEL_TOP_PT];
    }


    var heightPosition = LABEL_TOP_PT;
    for (var i=0; i < ROW_COUNT - 1; i++)
    {
        var group = baseGroup.duplicate();
        heightPosition -= LABEL_HEIGHT_PT;
        group.position = [SPACE_LEFT_PT, heightPosition];
    }
})();


//  ミリメートル単位から、pt単位へと変換する
//  物理的な紙の縦横はミリメートルで指定したほうが分かりやすいため
function toPT(mm){

    const coefficient = 72 / 25.4;
    const unit = 10000000;

    return Math.round(mm * coefficient * unit) / unit;
}