// ***************************************************************************************************************
// ソース画像にスタック画像のレイヤーをコピーします。
// 作成日 2015/2/14
// 変更日 2016/1/26
// Zerene Stacker と Helicon Focus の両方のスタック画像に対応しました。
// フォルダ名の前後に@をついたフォルダを識別します。
// スタック画像の名前は、ソース画像名 + 半角スペース + メソード名
// 親フォルダ
// ∟作業フォルダ : @000@
// ∟Main画像 : X2_00000.tif
// ∟Focused
// ∟B(2 4)画像 : X2_00000 B,Radius2,Smoothing2.tif
// ∟B(4 8)画像 : X2_00000 B,Radius4,Smoothing8.tif
// D:ZereneImages
// ∟DMap画像 : IMG_1254 DMap.tif
// ∟PMax画像 : IMG_1254 PMax.tif
// ***************************************************************************************************************
// ドキュメント数が1以上のときに実行します。
if (documents.length>=1){
// アクティブドキュメントを格納します。
var mainDocu = activeDocument
// 作業フォルダパスを格納します。
var wFPath = mainDocu.path
// 作業フォルダ名を格納します。
var wFName = wFPath.name
// ZereneImagesフォルダパスを格納します。
var zSPath = new Folder("/d/ZereneImages")
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// マスク作業の完了したドキュメントで、
// レイヤーを統合して、Photoshopデータで保存します。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レイヤー0の名前を格納します。
var layName = mainDocu.artLayers [0].name
// 名前の先頭と最後の文字を格納します。
var aDDDa = layName.charAt(0) + layName.charAt(layName.length-1)
// レイヤー0の名前の先頭と最後の文字が@のときに実行します。
if (aDDDa=="@@"){
// =======================================================
// ”@000@”フォルダがあれば、フォルダ内のファイルと作業フォルダを削除します。
// フォルダ名の先頭と最後の両方に@があったら、作業フォルダ有りです。
// =======================================================
// 作業フォルダ名の先頭と最後の文字を格納します。
var a000a = wFName.charAt(0) + wFName.charAt(wFName.length-1)
// "@@"だったら実行します。
if (a000a == "@@"){
// ZereneImagesフォルダのTIFF画像をリストします。
var fileList = zSPath.getFiles("*.tif");
// メイン画像名を格納します。
mainName = activeDocument.name.split(".");
mainName = mainName[0];
// メイン画像名を含んだTIFF画像を削除します。
for(i=0;i<fileList.length;i++){
if (fileList[i].name.search(mainName)>=0){new File(fileList[i]).remove()};
}
// Focusedフォルダのファイルをリストします。
var fileList = new Folder(wFPath + "/Focused").getFiles();
// Focusedフォルダ内のすべてのファイルを削除します。
for(i=0;i<fileList.length;i++){new File(fileList[i]).remove()};
// 作業フォルダのファイルをリストします。
var fileList = wFPath.getFiles();
// 作業フォルダ内のすべてのファイルを削除します。
for(i=0;i<fileList.length;i++){new File(fileList[i]).remove()}
// 作業フォルダを削除します。
//new File(wFPath).remove()
wFPath.remove()
// 親フォルダパスを格納します。
var wFPath = wFPath.parent
}
// =======================================================
// 名前に"のコピー"を含むレイヤーは非表示にします。他は表示します。
// =======================================================
for(i=0;i<mainDocu.artLayers.length;i++){
// layName = mainDocu.artLayers[i].name;
searchCount = mainDocu.artLayers[i].name.search(/のコピー/g);
if (searchCount >= 0){jadge = false} else {jadge = true};
mainDocu.artLayers [i].visible = jadge;
}
// =======================================================
// 画像を統合します。
// =======================================================
var idFltI = charIDToTypeID( "FltI" );
executeAction( idFltI, undefined, DialogModes.NO );
// =======================================================
// 親フォルダにフォトショップ画像を保存します。
// =======================================================
// 拡張子を削除したファイル名を格納します。
var docName = mainDocu.name.split(".");
// フォトショップ形式で保存します。
psdSave (wFPath+"/"+docName[0]+".psd");
// ファイルを閉じます。
mainDocu.close(SaveOptions.DONOTSAVECHANGES);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ソース画像を開きます。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// フォルダ内のファイル一覧を取得します。
var fileList = wFPath.getFiles();
// フォルダ内の全ファイル数を格納します。
var fileLength = fileList.length;
for (i=0; i<fileLength; i++) {
// フォルダのパスを格納します。
wFPath = fileList[i];
// フォルダ名を格納します。
fName = wFPath.name
// フォルダ名の先頭と最後の文字を格納します。
var a000a = fName.charAt(0) + fName.charAt(fName.length-1)
// フォルダ名の先頭と最後の文字が@のとき実行します。
if (a000a == "@@") {
// TIFF画像をリストします。
TiffList = wFPath.getFiles("*.tif");
// ソース画像をひらきます。
open (new File(TiffList[0]));
// ループをぬけます。
break;
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// マスク作業をスタンバイ状態にします。
// スタック画像を、メイン画像のレイヤーに移動します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ドキュメント数が1以上のときに実行します。
if (documents.length>=1){
// アクティブドキュメントを格納します。
mainDocu = activeDocument
if (mainDocu.artLayers.length == 1){
// 0のときは、レイヤーのコピーとマスクを実行しません。
jadge = 0;
// アクティブドキュメントのパスを格納します。
folderPath = mainDocu.path;
// Helicon Focus画像を処理します。
// Focused フォルダのスタックしたTIFF画像をリストします。
StackList = new Folder(folderPath + "/Focused").getFiles("*.tif");
// 順序を反転します。
StackList.reverse();
// 画像数を格納します。
StackLength = StackList.length;
// Helicon Focus画像を処理します。
for (i=0; i<StackLength; i++){
stackLayerOpen (i, jadge);
jadge = jadge + 1;
}
// Zerene Stacher画像を処理します。
// /d/ZereneImagesフォルダのスタックしたTIFF画像をリストします。
StackList = zSPath.getFiles("*.tif");
// メイン名を格納します。
mainName = mainDocu.name.split(".");
mainName = mainName[0];
// 画像数を格納します。
StackLength = StackList.length;
for (i=0; i<StackLength; i++){
// スタック名を格納します。
StackName = StackList[i].name;
// スタック名をスペース文字で分割します。
StackName = StackName.split("%");
// スタック名にメイン名を含んでいるいる画像を処理します。
if (StackName[0] == mainName){
stackLayerOpen (i, jadge);
jadge = jadge + 1;
}
}
// スタック画像処理を1回以上おこなったら実行します。
if (jadge > 0){
// レイヤー0の名前を変更します。前後に@をつけます。
activeDocument.artLayers[0].name = "@" + activeDocument.artLayers[0].name + "@";
// レイヤー数-1 を格納します。
layersNum = activeDocument.artLayers.length - 1;
// 一番下のレイヤーを削除します。
activeDocument.artLayers[layersNum].remove();
//
for (i=0; i<(layersNum - 1) / 2; i++){
// コピーしたレイヤーを非表示にします。
activeDocument.artLayers[i * 2].visible = false;
}
// 下から2番目のレイヤーをアクティブにします。
activeDocument.activeLayer = activeDocument.artLayers[layersNum-2];
// レイヤーマスクを選択します。
layerMaskSelect ();
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Photoshop形式で保存します。psdPathは、ファイルパスを指定します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function psdSave (psdPath){
fileObj = new File(psdPath);
psdOpt = new PhotoshopSaveOptions();
psdOpt.alphaChannels = true;
psdOpt.annotations = true;
psdOpt.embedColorProfile = true;
psdOpt.layers = true;
psdOpt.spotColors = true;
activeDocument.saveAs(fileObj, psdOpt, true, Extension.LOWERCASE);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ビープ音を鳴らし、Brigeを表示します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function showBrige (){
app.beep (); //ビープ音を鳴らします。
var idshowFileBrowserPalette = stringIDToTypeID( "showFileBrowserPalette" );
var desc1 = new ActionDescriptor();
var idMxm = charIDToTypeID( "Mxm " );
desc1.putBoolean( idMxm, false );
var idNwVw = charIDToTypeID( "NwVw" );
desc1.putBoolean( idNwVw, false );
executeAction( idshowFileBrowserPalette, desc1, DialogModes.NO );
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// アクティブレイヤーのマスクを選択します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function layerMaskSelect (){
var idslct = charIDToTypeID( "slct" );
var desc2 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref1.putEnumerated( idChnl, idChnl, idMsk );
desc2.putReference( idnull, ref1 );
var idMkVs = charIDToTypeID( "MkVs" );
desc2.putBoolean( idMkVs, false );
executeAction( idslct, desc2, DialogModes.NO );
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// スタック画像を開いてメインドキュメントにレイヤーをコピーします。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function stackLayerOpen (imageNumber, jadgeMask){
// 画像を開きます。
open (new File(StackList[imageNumber]));
// メソード名を格納します。
LayerName = activeDocument.name.split(" ");
LayerName = LayerName[1].split(".");
LayerName = LayerName[0];
// レイヤーをコピーします。
activeDocument.artLayers[0].copy();
// アクティブドキュメントを閉じます。
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
// メインドキュメントをアクティブにします。
activeDocument = mainDocu;
// レイヤー0 をアクティブにします。
activeDocument.activeLayer = activeDocument.artLayers[0];
// レイヤーを貼り付けます。
activeDocument.paste();
// 複製したレイヤー名前をメソードにします。
activeDocument.artLayers[0].name = LayerName ;
// ループ初回以外は実行します。
if (jadge > 0){
// レイヤーを複製します。
activeDocument.artLayers[0].duplicate();
// 2番目のレイヤをマスクします
layerMask ();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レイヤーをマスクします。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function layerMask (){
var idMk = charIDToTypeID( "Mk " );
var desc2 = new ActionDescriptor();
var idNw = charIDToTypeID( "Nw " );
var idChnl = charIDToTypeID( "Chnl" );
desc2.putClass( idNw, idChnl );
var idAt = charIDToTypeID( "At " );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref1.putEnumerated( idChnl, idChnl, idMsk );
desc2.putReference( idAt, ref1 );
var idUsng = charIDToTypeID( "Usng" );
var idUsrM = charIDToTypeID( "UsrM" );
var idHdAl = charIDToTypeID( "HdAl" );
desc2.putEnumerated( idUsng, idUsrM, idHdAl );
executeAction( idMk, desc2, DialogModes.NO );
}