M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2008年10月28日 03:17

IllustratorのJavaScriptでItemをまとめて操作するItemManagerクラスを作り、XY方向連続複製スクリプトを作る

このエントリーをはてなブックマークに追加 mixiチェック

IllustratorのJavaScriptで面付けしろっていうミッション。おそらくどっか見たら複数のItemを一気に操作する方法ありそうだけれども(GoogleMapsですらGMarkerクラスのオブジェクトをまとめて扱うGMarkerManagerクラスがあった)、ここはJavaScriptだからItemをまとめて操作するクラスItemManagerクラスを自分で作るのがおもしろそうだと思って、やってみました。

Filename: multiplecopy.jsx

(function(){
  // ItemManagerクラス(まとめて操作する)
  function ItemManager() {
    // コンストラクタ
    this.items = [];
    this.length = 0;
  }
  // アイテム追加
  ItemManager.prototype.push = function(item) {
    this.items.push(item);
    this.length = this.items.length;
  }
  // アイテム複製
  ItemManager.prototype.duplicate = function() {
    var dupItems = new ItemManager;
    for (var i = 0; i < this.items.length; i++) {
      var dupItem = this.items[i].duplicate();
      dupItems.push(dupItem);
    }
    return dupItems;
  }
  // アイテムの移動
  ItemManager.prototype.translate = function(x, y) {
    for (var i = 0; i < this.items.length; i++) {
      this.items[i].translate(x, y);
    }
  }
  // アイテムの削除
  ItemManager.prototype.remove = function() {
    for (var i=0; i < this.items.length; i++) {
      this.items[i].remove();
    }
    this.items = [];
    this.length = 0;
  }
  // アイテムをまとめて登録
  ItemManager.prototype.addItems = function(objs) {
    for (var i = 0; i < objs.length; i++) {
      this.push(objs[i]);
    }
  }
  
  // main
  if (app.documents.length == 0) {
    alert("ドキュメントを開いてから実行してください。");
    return;
  }
  if (app.activeDocument.selection.length == 0) {
    alert("複製したいアイテムを1つ以上選択してから"
      + "実行してください。");
    return;
  }
  var impositionString
    = prompt("連続複製指示を、Δx,Δx,x方向ステップ数,"
    + "y方向ステップ数の順でコンマ区切りで入力"
    + "(移動単位はmm)","100,100,2,2");
  if (impositionString) {
    var param = impositionString.split(",");
    var imposition = {
      dx: param[0] * 72 / 25.4,
      dy: param[1] * 72 / 25.4,
      sx: param[2],
      sy: param[3]
    };
    var sourceItems = new ItemManager;
      // ItemManagerクラス(まとめて操作する)
    sourceItems.addItems(activeDocument.selection);
      // Illustrator GUI側で選択中のアイテムを登録
    
    for (var y = 0; y < imposition.sy; y++ ) {
      for (var x = 0; x < imposition.sx; x++ ) {
        if ( x != 0 || y != 0 ) {
          // 始点のアイテムを複製する必要はない
          var dupItems = sourceItems.duplicate();
            // 最初のアイテムを複製
          dupItems.translate(imposition.dx * x, imposition.dy * y);
            // 複製したアイテムを移動
        }
      } 
    }
  }
})();

どこがおもしろいか、っていうのを説明すると、隊長職(itemManagerクラス)の人に指令すれば部下(Itemども)が一気に動くように設計したということです。今回のスクリプトの前半は、隊長職の人は何をすればいいかという指示書を書いているわけですね。

投稿 大野 義貴 [DTP] | |

トラックバック(1)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2644

データー下さいって言ったら、全部アウトラインになっていた。 でもなんだか修正しなくてはいけないっていう状況があったのでちょっと作ってみました。 全部、アウトラインにされてる。。。。 スクリプト一発! よしよし。 CLさんの 「IllustratorのJavaScriptでItemをまと... 続きを読む

コメント(2)

スクリプト使わせてもらいました。
あと、ちょっと修正しました。
// アイテムをまとめて登録
ItemManager.prototype.addItems = function(objs) {
for (var i = 0; i < objs.length; i++) {
//this.push(objs[i]);
this.items.push(objs[i]);
}
}

その変更をすると、

var items = new ItemManager;
alert(items.length); // 0が表示
 
var selection = app.activeDocument.selection;
  // Illustrator GUIでなんか選んでおく
alert(selection.length); // 選んだアイテム数が表示
 
items.addItems(selection);
alert(items.length); // ?

とするとき、items.lengthが一般的に意図したものがでなくなるなーと思って、回りくどいことをしています。

コメントする