ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3、DirectX、PhotoshopScript(JavaScript)も触ります

SmartObjectレイヤーの名前を出力するPhotoshopスクリプト

ちょっと必要に迫られたので、スマートオブジェクトレイヤーの一覧をtxtファイルに一括出力するスクリプトを用意しました。

//レイヤーを探す
//LayerSetだったら再帰で探す
function FindLayer( rootLayer, condition )
{
	var artLayers = [];
	var layers = rootLayer.layers;
	var length = layers.length;
	for ( var i = 0 ; i < length ; ++i )
	{
		var layer = layers[i];
		if ( layer.typename == "ArtLayer" )
		{
			if ( condition( layer ) )
			{
				artLayers.push(layer);
			}
		}
		else if ( layer.typename == "LayerSet" )
		{
			artLayers = artLayers.concat( FindLayer(layer, condition) );
		}
	}
	return artLayers;
}

//SmartObjectのArtLayerを取得したいときのCondition
function FindSmartObject( artLayer )
{
	return artLayer.kind == LayerKind.SMARTOBJECT;
}

function WriteLine( f, artLayer )
{
	f.write(artLayer.name);
//情報を足したいときはここに
	f.write("\n");
}

//処理メイン
function Main()
{	
	var activeDocument = app.activeDocument;
	if ( activeDocument == null )
	{
		return;
	}

	//初期設定
	keepUnit = preferences.rulerUnits;
	preferences.rulerUnits = Units.PIXELS;//pixelユニットとする

	//ドキュメント名
	var documentName = activeDocument.name;

	var findLayers = FindLayer(activeDocument, FindSmartObject);
	var length = findLayers.length;
	if ( length == 0 )
	{
		preferences.rulerUnits = keepUnit;
		alert("目的のレイヤーを発見できませんでした。");
		return;
	}

	var txtFile = File.openDialog("矩形情報Textファイルを出力します", "*.txt");
	var f = new File(txtFile);
	f.open('w');
	for ( var i = 0 ; i < length ; ++i )
	{
		WriteLine(f, findLayers[i]);
	}
	f.close();
	
	//戻す
	preferences.rulerUnits = keepUnit;
	
	//完了ダイアログ表示
	alert("出力が完了しました");
}

Main();

本当はスマートオブジェクトのTransformも出力したかったけれどもAMCodeを呼ばなければいけないようなので、後ほどの宿題ということで。