



#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();
}










