【JSX】境界線の線幅とカラーを設定・取得してみた

 レイヤースタイルの境界線の線幅とカラーを取得、または設定する方法です。

設定はScriptingListenerで記録すればわかるけど、取得の方はあんま情報がないんだよね

 どうしてもあまり需要がないこともあってか、情報はかなり少なめな印象です。
 では早速、情報の少ない取得の方からやってみようと思います。

境界線の幅とカラーを取得する

コード

function GetStroke(){ 
	// 選択中のレイヤーの情報を取得する準備 
	var ref = new ActionReference(); 
	ref.putEnumerated(charIDToTypeID("Lyr "),charIDToTypeID("Ordn"),charIDToTypeID("Trgt")); 
	var desc = executeActionGet(ref); 

	// レイヤースタイルが設定されているかを確認する 
	if( !desc.hasKey(stringIDToTypeID( 'layerEffects' )) ){ 
		$.writeln ("レイヤースタイルが設定されていません"); 
		return; 
	} 

	// レイヤースタイルを取得 
	var objLayerEffects = desc.getObjectValue(stringIDToTypeID('layerEffects')); 
	// 境界線があるかを確認する 
	if(!objLayerEffects.hasKey(stringIDToTypeID( 'frameFX'))){ 
		$.writeln ("境界線が設定されていません"); 
		return; 
	} 

	var result = {};	// 結果用 
	// 境界線を取得する 
	var objframeFX = objLayerEffects.getObjectValue(stringIDToTypeID('frameFX')); 
	// 線幅を取得する 
	result.size = objframeFX.getUnitDoubleValue (stringIDToTypeID( 'size' )); 
	// カラーを取得する 
	var objColor = objframeFX.getObjectValue(stringIDToTypeID("color")); 
	result.red = Math.round(objColor.getDouble(charIDToTypeID('Rd  '))); 
	result.green = Math.round(objColor.getDouble(charIDToTypeID('Grn '))); 
	result.blue = Math.round(objColor.getDouble(charIDToTypeID('Bl  '))); 

	return result; 
} 
result = GetStroke(); 
if( result != undefined ){ 
	$.writeln (result.size); 
	$.writeln (result.red); 
	$.writeln (result.green); 
	$.writeln (result.blue); 
}

コードの簡単な解説

 この関数を実行すると、選択中のレイヤーのサイズとカラーが返ってきます
 選択中のレイヤーにレイヤースタイル、および境界線が設定されていなかった場合は、それをデバッグウィンドウに表示して関数を抜けます。
 関数自体は34行で実行されていて、その後、サイズとRGBがそれぞれデバッグウィンドウに出力されます。

たぶんこのソースコードだけで使えると思うけど、一応どこで何をしてるか大まかにコメントをうってあるから、興味があったら見てね

境界線の幅とカラーを設定する

 設定の方はScriptingListenerで記録したものをコピーするだけでできるので割と簡単にできると思います。

ただぱっと見でわかりにくいのが難点なんだよね・・・

だから今回はコードを整理しつつ、設定まわりだけコメントを入れていくね

 特にレイヤースタイル系は出力されるコードも長くなるので、目的の部分を変更するのもちょっと大変です。
 なので、一応よく設定する部分だけど引数にして関数化してみました。

コード

function SetStroke(size,r,g,b,frame){ 
	var ref = new ActionReference(); 
	ref.putProperty( charIDToTypeID( "Prpr" ), charIDToTypeID( "Lefx" ) ); 
	ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) ); 

	var desc1 = new ActionDescriptor(); 
	desc1.putDouble( charIDToTypeID( "Rd  " ), r ); // R 
	desc1.putDouble( charIDToTypeID( "Grn " ), g ); // G 
	desc1.putDouble( charIDToTypeID( "Bl  " ), b ); // B 

	var desc2 = new ActionDescriptor(); 
	desc2.putEnumerated( charIDToTypeID( "Styl" ), charIDToTypeID( "FStl" ), charIDToTypeID( frame ) ); // 位置("InsF" ,"CtrF","OutF") 
	desc2.putEnumerated( charIDToTypeID( "Md  " ), charIDToTypeID( "BlnM" ), charIDToTypeID( "Nrml" ) ); // 描画モード 
	desc2.putUnitDouble( charIDToTypeID( "Opct" ), charIDToTypeID( "#Prc" ), 100 ); // 不透明度 
	desc2.putUnitDouble( charIDToTypeID( "Sz  " ), charIDToTypeID( "#Pxl" ), size ); // 線幅 
	desc2.putEnumerated( charIDToTypeID( "PntT" ), charIDToTypeID( "FrFl" ), charIDToTypeID( "SClr" ) ); // 塗りつぶしタイプ 
	desc2.putBoolean( stringIDToTypeID( "overprint" ), false ); // オーバープリント 
	desc2.putObject( charIDToTypeID( "Clr " ), charIDToTypeID( "RGBC" ), desc1 ); // 色 

	var desc3 = new ActionDescriptor(); 
	desc3.putObject( charIDToTypeID( "FrFX" ), charIDToTypeID( "FrFX" ), desc2 ); 

	var desc4 = new ActionDescriptor(); 
	desc4.putReference( charIDToTypeID( "null" ), ref ); 
	desc4.putObject( charIDToTypeID( "T   " ), charIDToTypeID( "Lefx" ), desc3 ); 
	executeAction( charIDToTypeID( "setd" ), desc4, DialogModes.NO ); 
} 
SetStroke(3,155,155,155,"InsF");

コードの簡単な解説

SetStroke(3,155,155,155,"InsF");

 SetStroke関数では、引数として、線幅とRGBと位置を設定できるようにしてあります。

1つ目の引数:線幅
2つ目の引数:R
3つ目の引数:G
4つ目の引数:B
5つ目の引数:位置(外側:”OutF”、中央:”CtrF”、内側:”InsF”)

 選択中のレイヤーに動作します。塗りつぶしタイプは『カラー』で、描画モードは『通常』、オーバープリントは『なし』、不透明度は『100』で設定してありますが、その部分も引数で渡すようにすれば、対応もできます。

おしまい

 なかなか日本語サイトでの情報が少なく、英語サイトで公開されているサンプルコードを解析するくらいしか情報が見当たらないレイヤースタイル系の取得ですが、他にもいくつかわかったものもあるので、順次載せていければいいと思っています。

私(S.Fuka)が企画、シナリオ、グラフィックを担当させていただきました、にゃっほい屋のゲームがSteamにて配信中です。
もし興味がありましたらSteamページだけでもご覧になっていただければ幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です