PhotoshopのUI上では複数のレイヤーを選択することが可能ですが、取得・設定ともにactiveLayerは複数レイヤーには対応していません。

よって、複数選択されたレイヤーにはスクリプトで動的にアクションを生成して対応します。

なお、このようにスクリプトで動的にアクションを生成するコードの作成は、ユーザーの動作(=アクション)を記録してスクリプト化する「Scripting Listener」というプラグインを使うと便利です。

参照:アクションをスクリプト化する(Scripting Listener)

 

<複数選択されたレイヤーの取得>

function getSelectedLayers (){
    // サブ関数
    function idToName( id ) {
        var r= new ActionReference();
        r.putIndex( charIDToTypeID('Lyr '), id );
        return executeActionGet(r).getString( charIDToTypeID('Nm  ') );
    };
    //
    var layerName;
    var selectedLayers= new Array;
    var ref= new ActionReference();
    ref.putEnumerated( charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
    var desc= executeActionGet(ref);
    if( desc.hasKey( stringIDToTypeID('targetLayers') ) ){
        desc= desc.getList( stringIDToTypeID('targetLayers') );
        var cnt= desc.count
        var selectedLayers= new Array();
        for(var i=0; i<cnt; i++){
            try{
                activeDocument.backgroundLayer;
                layerName= desc.getReference( i ).getIndex();
            }catch(e){
                layerName= desc.getReference( i ).getIndex()+1;
            }
            selectedLayers.push( idToName(layerName) );
        }
    } else {
        var actLayer= activeDocument.activeLayer; // アクティブレイヤー
        layerName= actLayer.name; // レイヤー名を取得
        try{
            actLayer.name= layerName; // 同名のレイヤー名を設定してみる
            executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO ); //undo
            selectedLayers.push( layerName );
        }catch( e ){
            //なにもしない
        }
    }
    return selectedLayers;
};
var res= getSelectedLayers();
if (res.length !=0) {
    $.writeln (res);
} 

ただし、これで取得できるのはレイヤー名なので、それを頼りにオブジェクトは改めて取得することになります。

 

<レイヤーの追加選択・部分解除>

この関数setSelectionにレイヤー名と設定値(true/false)を渡します。成功すればtrueが返ります。存在しないレイヤー名だった場合など、エラーが発生した場合はfalseを返します。

なお、同じレイヤー名が存在した場合は、そのうちで下にあるものだけが対象になります。

//アクティブレイヤーの追加選択・部分解除
function setSelection (layerName, isActive){
    var selection, actDesc, actRef;
    if (isActive) {
        selection= 'addToSelection';
    } else {
        selection= 'removeFromSelection';
    }
    actDesc= new ActionDescriptor();
    actRef= new ActionReference();
    actRef.putName( charIDToTypeID('Lyr '), layerName);
    actDesc.putReference( charIDToTypeID('null'), actRef );
    actDesc.putEnumerated( stringIDToTypeID('selectionModifier'),
        stringIDToTypeID('selectionModifierType'),
        stringIDToTypeID(selection) );
    actDesc.putBoolean( charIDToTypeID('MkVs'), false );
    try {
        executeAction( charIDToTypeID('slct'), actDesc, DialogModes.NO );
        return true;
    } catch (e) {
        return false;
    }
}

var res= setSelection('test', false); // 'test'という名のレイヤー
$.writeln (res); //結果

 

 

Joomla templates by a4joomla