クリエイター手抜きプロジェクト[436]Adobe Photoshop CS5〜CC編 座標(位置)だけ回転させる/古籏一浩

投稿:  著者:  読了時間:6分(本文:約2,900文字)


今回は前回の「座標(位置)だけ回転させる」のPhotoshop版です。

ただし、Illustratorとは異なり、選択したレイヤーを回転させるのではなく、選択したレイヤーと同じ階層にあるレイヤーが対象になります。その際、レイヤーセット内にあるレイヤーは処理しません。つまり対象外になります。

また、まったくレイヤーを選択していない場合や、ボタンを連打するとエラーになることがあります。一度でも何らかのレイヤーをアクティブにするとエラーは出にくくなりますが、動作が不安定になることがあります。

どうしても、エラーが発生する場合はPhotoshopを一度終了させた後で、レイヤーを選択してから実行してください。なお、背景のみの画像の場合は動作しません。




// 座標だけを回転させる for Photoshop
(function(){
if (app.documents.length < 1){ return; }
// 選択されているレイヤーと同じ階層のレイヤーのみ処理対象
var layObj = app.activeDocument.activeLayer.parent.artLayers;
// 現在のレイヤー座標値をオブジェクトに保存する
for(var i=0; i<layObj.length; i++){
layObj[i].oldX = parseFloat(layObj[i].bounds[0]);
layObj[i].oldY = parseFloat(layObj[i].bounds[1]);
}
// GUI部分
var winObj = new Window("dialog", "座標だけ回転", [0,0,480,210]);
winObj.add("statictext", [30, 10, 130, 30], "回転の中心X座標");
winObj.add("statictext", [170, 10, 270, 30], "回転の中心Y座標");
winObj.add("statictext", [310, 10, 380, 30], "回転角度");
var centerX = winObj.add("edittext", [50, 30, 150, 50], 0);
var centerY = winObj.add("edittext", [190, 30, 290, 50], 0);
var degree = winObj.add("edittext", [330, 30, 430, 50], 0);
var btnExec = winObj.add("button", [20, 70, 460, 95], "実行する");
var btnReset = winObj.add("button", [20, 100, 460, 125], "リセットする");
var btnPaperSet = winObj.add("button", [20, 130, 460, 155], "用紙の中央座標を設定する");
var btnEnd = winObj.add("button", [20, 160, 460, 185], "終了する");
// 終了ボタン
btnEnd.onClick = function(){
winObj.close();
}
// 実行ボタン
btnExec.onClick = function(){
var cx = parseFloat(centerX.text);
var cy = parseFloat(centerY.text);
var d = parseFloat(degree.text);
var rad = d * Math.PI / 180;
rotateObj(cx, cy, -rad);
app.refresh();
}
// リセットボタン
btnReset.onClick = function(){
for(var i=0; i<layObj.length; i++){
if (layObj[i].isBackgroundLayer){ continue; }
layObj[i].translate(-layObj[i].bounds[0], -layObj[i].bounds[1]);
layObj[i].translate(layObj[i].oldX, layObj[i].oldY);
}
app.refresh();
}
// 用紙の中央座標を設定
btnPaperSet.onClick = function(){
centerX.text = parseFloat(app.activeDocument.width)/2;
centerY.text = parseFloat(app.activeDocument.height)/2;
}
winObj.center();
winObj.show();
// 選択されたオブジェクトを回転させる
function rotateObj(cx, cy, rad){
for(var i=0; i<layObj.length; i++){
if (layObj[i].isBackgroundLayer){ continue; }
var x1 = layObj[i].oldX - cx;
var y1 = layObj[i].oldY - cy;
x = Math.cos(rad)*x1 - Math.sin(rad)*y1;
y = Math.sin(rad)*x1 + Math.cos(rad)*y1;
layObj[i].translate(-layObj[i].bounds[0], -layObj[i].bounds[1]);
layObj[i].translate(x + cx, y + cy);
}
}
})();


【古籏一浩】openspc@alpha.ocn.ne.jp
< http://www.openspc2.org/ >

パクリンピック、本当に出てた。

・パクリ?ンピック
< http://www.jiji.com/jc/v?p=pakurimpic_index >

これはこれで面白いけど、デザインもどこから派生したのかツリーのように分かる図ってあるのかなあ。

・ジェノグラフィック・プロジェクト
< https://ja.wikipedia.org/wiki/ジェノグラフィック・プロジェクト >

・Photoshop自動化基本編
< http://www.amazon.co.jp/dp/B00W952JQW/ >

・Illustrator自動化基本編
< http://www.amazon.co.jp/dp/B00R5MZ1PA >

・Adobe JavaScriptリファレンス
< http://www.amazon.co.jp/dp/B00FZEK6J6/ >

・ExtendScript Toolkit(ESTK)基本編
< http://www.amazon.co.jp/dp/B00JUBQKKY/ >

・データビジュアライゼーションのためのD3.js徹底入門
< http://www.amazon.co.jp/dp/4797368861 >

・4K/ハイビジョン映像素材集
< http://www.openspc2.org/HDTV/ >

・クリエイター手抜きプロジェクト
< http://www.openspc2.org/projectX/ >