スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

配置されている画像を指定したサイズの矩形でマスクし、サイズと位置をフィットさせるIllustrator用JavaScript

Illustratorのドキュメントに配置されている画像を指定したサイズの矩形でマスクして、そのマスクに合うように画像をリサイズし、指定した間隔でファイル名順に並べて行くJavaScript。

例えば、こんな感じでドキュメントにフォルダからドラッグ&ドロップするなどして、無造作に画像を配置しておいて(分かりやすくする為にわざとバラバラに置いてますけど)、


このスクリプトを実行すると、マスクに使う矩形のサイズ、間隔、何列で並べるか等を入力するダイアログを表示するので、それらの数値を入力すると、


画像はドキュメントの左上を起点に、ファイル名順に並んでいきます。


画像は、マスクの矩形のセンターに来るように配置され、サイズはマスクよりほんのちょっとだけ大きくなる様リサイズされます。


■注意点
既にマスクされている画像、グループ化されている画像は処理されません。
ブラウザの環境(Safari等)でスクリプト中に『円マーク』が見えている場合は『バックスラッシュ』に置換する必要があります。
※表示されているコードの上の方にある『view plain』をクリックするとコードがプレーンテキストで表示される筈なんですが、Safari(3.2.1)だと動作しない様なので、対策考えておきます。対策済み。

■動作確認
MacOSX 10.5.6
Illustrator CS4
#target Illustrator

//マスクのサイズを入力するダイアログを表示
function askRectSettings() {
	var mes = 
		"dialog { alignChildren: 'center', \
			field1: Panel { orientation: 'column', alignChildren: 'right', \
				size: [180,72], text: 'マスクのサイズ', \
				size_w: Group { orientation: 'row', \
					s: StaticText { text: '幅:' }, \
					e: EditText { characters: 7, text: '50.0'}, \
					s2: StaticText { text: 'mm'} \
				}, \
				size_h: Group { orientation: 'row', \
					s: StaticText { text: '高さ:' }, \
					e: EditText { characters: 7, text: '50.0' } \
					s2: StaticText { text: 'mm' } \
				} \
			}, \
			field2: Panel { orientation: 'column', alignChildren: 'right', \
				size: [180,72], text: '画像間の余白', \
				margin_w: Group { orientation: 'row', \
					s: StaticText { text: '左右:' }, \
					e: EditText { characters: 7, text: '3.0'}, \
					s2: StaticText { text: 'mm'} \
				}, \
				margin_h: Group { orientation: 'row', \
					s: StaticText { text: '天地:' }, \
					e: EditText { characters: 7, text: '3.0' } \
					s2: StaticText { text: 'mm' } \
				} \
			}, \
			field3: Panel { orientation: 'column', \
				size: [180,40], text: '水平方向に並べる数', \
				column: Group { orientation: 'row', \
					e: EditText { characters: 3, text: '4' }, \
					s: StaticText { text: 'で折り返し' }, \
				} \
			}, \
			buttons: Group { orientation: 'row', \
				cancelBtn: Button { text:'Cancel', properties: { name: 'cancel'} }, \
				okBtn: Button { text: 'OK', properties: {name:'ok'} } \
			} \
		}";
	var dlg = new Window(mes);
	
	dlg.buttons.okBtn.onClick = function() {
		dlg.close(1);
	}

	dlg.center();
	var result = dlg.show();
	var w = dlg.field1.size_w.e.text;
	var h = dlg.field1.size_h.e.text;
	var mw = dlg.field2.margin_w.e.text;
	var mh = dlg.field2.margin_h.e.text;
	var co = dlg.field3.column.e.text;
	if (result == 1) {
		if (w != '' && h != '' && mw != '' && mh != '' && co !='') {
			try {
				return [eval(w), eval(h), eval(mw), eval(mh), eval(co)];
			} catch(e) {
				alert('数字を入力してください!');
				return false;
			}
		} else {
			alert('数値が入力されていません!');
			return false;
		}
	} else {
		return false;
	}
}

//PlacedItemsをファイル名でソートする
function sortPlacedItemsByName(plItems) {
	var retArr = [];
	var fNames = [];
	for (var i=0; i<plItems.length; i++) {
		var fn = plItems[i].file.name + plItems[i].file + i; //同名ファイルをユニークにするためパスと番号を追加
		plItems[i].name = fn
		fNames.push(fn);
	}
	fNames.sort();
	for (var i=0; i<fNames.length; i++) {
		retArr.push(plItems.getByName(fNames[i]));
	}
	return retArr;
}

//マスクされているかどうか
function isMasked(obj) {
	var p = obj.parent;
	while (p.constructor.name != 'Document') {
		if (p.clipped) {
			return true;
		} else {
			p = p.parent;
		}
	}
	return false;
}

//メイン
function clipAndFitImgs() {
	var doc = activeDocument;
	var P = sortPlacedItemsByName(doc.placedItems); //PlacedItemsをソートしておく
	
	var res = askRectSettings();
	if (!res) { return; }
	var ptm = 2.834645;
	var rect_w = res[0] * ptm; //mmに換算
	var rect_h = res[1] * ptm;
	var ofst_x = res[2] * ptm;
	var ofst_y = res[3] * ptm;
	var column = res[4];
	
	var sp = { //整列を開始する起点
		left: 0,
		top: doc.height
		}	
	var tgtImgs = [];		
	var rc = 0; //カウント用
	var cc = 0;
	
	var ro = doc.rulerOrigin;
	var ru = doc.rulerUnits;
	doc.rulerOrigin = [0, 0];
	doc.rulerUnits = 'Points';
	
	//マスク・グループ化されていないものを処理対象にする
	for (var i=0; i<P.length; i++) {
		if (!isMasked(P[i]) && P[i].parent.constructor.name != 'GroupItem') { tgtImgs.push(P[i]); } 
	}

	for (var i=0; i<tgtImgs.length; i++) {
		var ti = tgtImgs[i];
		var l = ti.parent;
		if ( l.constructor.name == 'Layer' ) { //不要?
			var g = l.groupItems.add();
			ti.moveToBeginning(g); //PathItemより先にPlacedItemをGroupItemに追加しないとマスクされない?
			var rect = g.pathItems.rectangle(sp.top - rect_h * rc - ofst_y * rc, sp.left + rect_w * cc + ofst_x * cc, rect_w, rect_h);
			cc++;
			if (cc == column) { 
				cc = 0;
				rc++;
			}
			ti.parent.clipped = true;
			var enl = Math.max((rect_w + 4) / ti.width, (rect_h + 4) / ti.height) * 100;
			ti.resize(enl, enl);
			//マスクに画像をフィットさせる
			//ti.move(rect, ElementPlacement.INSIDE);
			ti.top = (rect.top - rect.height / 2) + ti.height / 2;
			ti.left = (rect.left + rect.width / 2) - ti.width / 2;
		}
	}

	doc.rulerOrigin = ro;
	doc.rulerUnits = ru;
}


if (app.documents.length == 0) {
	alert('ドキュメントが開かれていません。');
} else {
	clipAndFitImgs();
}
関連記事
スポンサーサイト

コメント

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。