レイヤースタイルの境界線の線幅とカラーを取得、または設定する方法です。
設定は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ページだけでもご覧になっていただければ幸いです。