Live2D

【Live2D】同名のレイヤー名を抽出するPhotoshopスクリプト

Live2Dのパーツ分けしたpsdに同名のレイヤーがあると差し替えでいろいろ面倒なことが起きるので、レイヤー名の重複を自動でチェックするスクリプト作りました。

レイヤーセットもまとめてチェックしていきます。最後に「同じレイヤー名はありません。」とメッセージが出れば、レイヤーセットとレイヤー、すべてが一意の名前になっています。

[js]
/********/
/* main */
/********/
app.bringToFront();
if (app.documents.length ==0){
//ドキュメントが開かれていない場合は処理をしない。
}else{
//作業するドキュメントの参照
var parent = activeDocument;
alert(“同じレイヤー名をチェックし、テキストファイルに出力します。”);

// レイヤー名を全取得
var allLayerName = [];
getAllLayerName(parent);

// 重複レイヤー名を抽出
var sameLayerName;
sameLayerName = findDuplication();

// 書き出し
if(sameLayerName.length > 0){
writeTextFile(sameLayerName);
alert(“同じレイヤー名が” + sameLayerName.length + “個ありました。”);
}else{
alert(“同じレイヤー名はありません。”);
}
}

function getAllLayerName(parent){
var ChildLayers= parent.layers;
for (var i = 0; i < ChildLayers.length; i++){ if (ChildLayers[i].typename == "LayerSet"){ //レイヤーセットの場合は再帰処理 allLayerName.push(ChildLayers[i].name); getAllLayerName(ChildLayers[i]); }else if(ChildLayers[i].typename == "ArtLayer"){ //レイヤー名を取得 allLayerName.push(ChildLayers[i].name); } } } function findDuplication(){ var s = []; allLayerName.sort(); for(var i = 0 ; i < allLayerName.length ; i++){ if(allLayerName[i] == allLayerName[i+1]){ s.push(allLayerName[i]); while(allLayerName[i] == allLayerName[i+1]){ i++; } } } return s; } function writeTextFile(sameLayerName){ CR = String.fromCharCode(13); savename = File.saveDialog("保存するファイル名を入れてください"); if (savename){ fileObj = new File(savename); flag = fileObj.open("w"); if (flag == true){ for (var i = 0 ; i < sameLayerName.length ; i++){ fileObj.write(sameLayerName[i]+CR); } fileObj.close(); }else{ alert("ファイルが開けませんでした"); } } } [/js] ①psdファイルを開いている状態でスクリプトをPhotoshopへD&D ②「同じレイヤー名をチェックし、テキストファイルに出力します。」と出るのでOK ③同じレイヤー名が存在した場合はファイル出力画面が出るのでテキスト形式(.txt)で保存する。その後「同じレイヤー名がn個ありました。」とメッセージが出るのでOKを押して終わり。出力したテキストファイルを確認して手動で直す。 ④同じレイヤー名がなければ「同じレイヤー名はありません。」とでるはず。   filterを使って重複を抽出する方法が調べたら出てきたけど、Photoshopでfilter使うと、関数ではありませんエラーが起きてなんか使えなかったので、ソートしてから重複チェックをする処理で実装しました。 レイヤーの種類によってはもしかしたら変な挙動するかもしれないです。とりあえず通常のレイヤー(レイヤー効果は使用していてもOK…のはず)とレイヤーセットなら大丈夫かも。 再帰処理をしてるので、可能なら「Live2D_Preprocess」などを使用してレイヤーを全体的に統合した状態で使ったほうがいいです。 [blogcard url="http://sites.cybernoids.jp/cubism2/tools/jsx"] 個人で利用するためなのでデバッグはしてません。利用は自己責任でぇ。