IllustratorのJavaScriptでItemをまとめて操作するItemManagerクラスを作り、XY方向連続複製スクリプトを作る
スポンサードリンク
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ども)が一気に動くように設計したということです。今回のスクリプトの前半は、隊長職の人は何をすればいいかという指示書を書いているわけですね。
スポンサードリンク
トラックバック(1)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2644
データー下さいって言ったら、全部アウトラインになっていた。 でもなんだか修正しなくてはいけないっていう状況があったのでちょっと作ってみました。 全部、アウトラインにされてる。。。。 スクリプト一発! よしよし。 CLさんの 「IllustratorのJavaScriptでItemをまと... 続きを読む





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


スクリプト使わせてもらいました。
あと、ちょっと修正しました。
// アイテムをまとめて登録
ItemManager.prototype.addItems = function(objs) {
for (var i = 0; i < objs.length; i++) {
//this.push(objs[i]);
this.items.push(objs[i]);
}
}
その変更をすると、
とするとき、items.lengthが一般的に意図したものがでなくなるなーと思って、回りくどいことをしています。