Пакетное применение Photoshop "Последний фильтр" работает для всех фильтров, ЗА ИСКЛЮЧЕНИЕМ Liquify - PullRequest
8 голосов
/ 20 июня 2020

Этот скрипт берет последний примененный фильтр и повторяет его на всех выбранных слоях и масках. (Он разработан, чтобы избежать необходимости сворачивать слои в смарт-объект для пакетного применения фильтров).

Однако в нем есть ошибка, которую я не могу понять: она прекрасно работает для чего-то как Gaussian Blur, но для Liquify он записывает в историю, что фильтр был применен, но слои остаются нетронутыми.

Шаги для воспроизведения: 1. Слой размытия 1. 2. Выбрать слои 2 (с маской) и 3 (без маски) 3. Выполнить скрипт 4. Повторить 1-3, но с сжижением вместо размытия.

#target photoshop 

var defaultRulerUnits = preferences.rulerUnits; preferences.rulerUnits = Units.PIXELS;
var doc = app.activeDocument; 
var layers = doc.layers;
var typeArray = new Array ();
var isim = new Array();


cTID = function(s) { return app.charIDToTypeID(s); }; sTID = function(s) { return app.stringIDToTypeID(s); };

function repeatlastfilter() {
    runMenuItem(cTID("LstF"), true);
}  

function checklayermask() {
    try {
        Select_Layermask();
    }
    catch (err) { return }
    repeatlastfilter();
    Select_Original_Layer();       
    }

// MAIN
function main()  
{  
    app.bringToFront();  
    var SelectedLayers = getSelectedLayers();  
    for (var i = 0; i < SelectedLayers.length; i++)  
        {  
            doc.activeLayer = SelectedLayers[i];  

            isim[i] = SelectedLayers[i].name;
            //selectlayer(isim[i]);
            //alert (isim[i]);
            repeatlastfilter();
            checklayermask();
            //doAction(DDActions.selection.text, DDActionSet.selection.text);  
     }
}

// SELECT ORIGINAL LAYER
function Select_Original_Layer(enabled, withDialog) {
  
    if (enabled != undefined && !enabled)
      return;
    var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO);
    var desc1 = new ActionDescriptor();
    var ref1 = new ActionReference();
    ref1.putEnumerated(cTID('Chnl'), cTID('Chnl'), sTID("RGB"));
    desc1.putReference(cTID('null'), ref1);
    desc1.putBoolean(cTID('MkVs'), false);
    executeAction(cTID('slct'), desc1, dialogMode);
  };


// SELECT LAYER MASK
function Select_Layermask(enabled, withDialog) {
    if (enabled != undefined && !enabled) 
    return;
    var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO);
    var desc1 = new ActionDescriptor();
    var ref1 = new ActionReference();
    ref1.putEnumerated(cTID('Chnl'), cTID('Chnl'), cTID('Msk '));
    desc1.putReference(cTID('null'), ref1);
    desc1.putBoolean(cTID('MkVs'), false);
    executeAction(cTID('slct'), desc1, dialogMode);
};


// GET SELECTED LAYERS
function getSelectedLayers()  
{  
  var resultLayers=new Array();  
  try{  
    var descGrp = new ActionDescriptor();  
    var refGrp = new ActionReference();  
    refGrp.putEnumerated(cTID( "Lyr " ),cTID( "Ordn" ),cTID( "Trgt" ));  
    descGrp.putReference(cTID( "null" ), refGrp );  
    executeAction( sTID( "groupLayersEvent" ), descGrp, DialogModes.NO );  
    for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])}  
    var desc5 = new ActionDescriptor();  
    var ref2 = new ActionReference();  
    ref2.putEnumerated( cTID( "HstS" ), cTID( "Ordn" ), cTID( "Prvs" ) );  
    desc5.putReference( cTID( "null" ), ref2 );  
    executeAction( cTID( "slct" ), desc5, DialogModes.NO );  
  } catch (err) { }  
  return resultLayers;  
}     

main();
...