Photoshop CS3〜CC2014編 選択したレイヤーと同じ階層のレイヤーを指定範囲内に納める

今回はPhotoshopで選択したレイヤーと同じ階層のレイヤーを指定範囲の座標内に納めるスクリプトです。以下のスクリプトを実行する前に、位置を変更する/リサイズするレイヤーを選択します。処理されるレイヤーは選択したレイヤーと同じ階層にあるレイヤーに限定されます。
また、GUI部分で「レイヤーを縮小して納める」にチェックを入れると指定範囲からはみ出しているレイヤーは自動的にリサイズされます。

// 選択されたレイヤーと同じ階層のレイヤーを範囲内に入れる
(function(){
if (app.documents.length < 1){ return; }
var w = app.activeDocument.width.value; // 横幅
var h = app.activeDocument.height.value; // 縦幅
// 内包するオブジェクトを指定する
var targetObj = {
x1 : 0,
y1 : 0,
x2 : w,
y2 : h,
width : w,
height : h
}
// GUI部分
var winObj = new Window("dialog", "ページ内に納める", [0,0,320,230]);
var cropSize1 = winObj.add("statictext", [20, 10, 300, 25], "収める範囲を入れてください");
winObj.add("statictext", [30, 50, 60, 70], "左");
winObj.add("statictext", [170, 50, 180, 70], "上");
winObj.add("statictext", [30, 80, 60, 100], "右");
winObj.add("statictext", [170, 80, 180, 100], "下");
var checkScale = winObj.add("checkbox", [30, 110, 310, 130], "レイヤーを縮小して納める");
var x1e = winObj.add("edittext", [50, 50, 150, 70], targetObj.x1);
var y1e = winObj.add("edittext", [190, 50, 290, 70], targetObj.y1);
var x2e = winObj.add("edittext", [50, 80, 150, 100], targetObj.x2);
var y2e = winObj.add("edittext", [190, 80, 290, 100], targetObj.y2);
var btnExtend = winObj.add("button", [20, 160, 300, 185], "実行する");
var btnEnd = winObj.add("button", [20, 190, 300, 215], "終了する");
// ボタンにイベントを割り当てる
btnExtend.onClick = function(){
targetObj.x1 = parseFloat(x1e.text);
targetObj.y1 = parseFloat(y1e.text);
targetObj.x2 = parseFloat(x2e.text);
targetObj.y2 = parseFloat(y2e.text);
// 指定された範囲の幅を計算
targetObj.width = targetObj.x2 - targetObj.x1;
targetObj.height = targetObj.y2 - targetObj.y1;
adjust();
refresh(); // スクリプトの処理結果を画面に反映させる(再描画)
}
// ウィンドウを閉じる
btnEnd.onClick = function(){
winObj.close();
}
winObj.center();
winObj.show();
// 位置を調整する処理
function adjust(){
// 選択された1つのレイヤーと同じ階層にあるレイヤーに対して処理する
var parentObj = app.activeDocument.activeLayer.parent;
for(var i=0; i<parentObj.artLayers.length; i++){
toInner(parentObj.artLayers[i], targetObj);
}
function toInner(selObj, targetObj){
// 図形の座標を読み出し
var rect = selObj.bounds;
var srcX1 = parseFloat(rect[0]);
var srcY1 = parseFloat(rect[1]);
var srcX2 = parseFloat(rect[2]);
var srcY2 = parseFloat(rect[3]);
// 自動リサイズ処理を行うかどうか
if(checkScale.value == true){
// 幅が範囲内より大きい場合にはサイズを縮小する
var sW = srcX2- srcX1;
var sH = srcY2 - srcY1;
if (sW > targetObj.width){
var s = (targetObj.width / sW) * 100;
selObj.resize(s, s);
}
if (sH > targetObj.height){
var s = (targetObj.height / sH) * 100;
selObj.resize(s, s);
}
// もう一度座標を読み出す
var rect = selObj.bounds;
var srcX1 = parseFloat(rect[0]);
var srcY1 = parseFloat(rect[1]);
var srcX2 = parseFloat(rect[2]);
var srcY2 = parseFloat(rect[3]);
}
// ページX座標よりも小さい場合
if (srcX1 < targetObj.x1){
selObj.translate(targetObj.x1-srcX1, 0);
}
// ページX座標よりも大きい場合
if (srcX2 > targetObj.x2){
selObj.translate(targetObj.x2-srcX2, 0);
}
// ページY座標よりも小さい場合
if (srcY1 < targetObj.y1){
selObj.translate(0, targetObj.y1-srcY1);
}
// ページY座標よりも大きい場合
if (srcY2 > targetObj.y2){
selObj.translate(0, targetObj.y2-srcY2);
}
}
}
})();


[サンプルをダウンロード]