Выбрать маску заданного слоя скриптом. Как?

  • Автор темы Автор темы apg_777
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

apg_777

Топикстартер
20 лет на форуме
Сообщения
278
Реакции
81
CS4, javascript.
Нужно, чтобы по окончании работы скрипта в картинке оказался не только выбран нужный слой, но была бы выбрана маска этого слоя. С выбором слоя проблем нет:
docRef.activeLayer = finalLayer
Но как активизировать маску?
То есть "скриптом нажать комбинацию клавиш Cmd+\" (на PC, видимо, Ctrl+\).
Искать канал маски по имени не хочется, поскольку для русской и английской версий фотошопа эти названия разные, именно поэтому action переписан в скрипт (до кучи добавлены некоторые возможности, которые actions не позволяют).
P.S. Сейчас сделана смесь скрипта и action'а, но это же не солидно :)
 
Ответ: Выбрать маску заданного слоя скриптом. Как?

Собрал масочные функции в кучу. Можно получить из через скриптлистенер, или на пс-скриптс.кам покопаться.

Чтобы выбрать маску юзайте первую, хотя она вообще-то для переключения режима визуализации маски. При отсутсвии аргумента маска останется невидимой.

Функция отключения/включения маски от линка/анлинка отличается 1 аргументом: UsrM и Usrs соответственно. Можно еще оптимизировать. Анлинк требуется когда вы хотите применить к слою некий фильтр с ослаблением (Fade). Наличие связанной маски запрещает это делать. Приходится так: фильтр - отменить - анлинк - ослабление - линк. Отмена и ослабление тоже делаются из скрипта. Здесь этого нет.

PHP:
// use makeVisible boolean option for toggle visbility mask; default == false
function selectMask(makeVisible) {
    if(!hasLayerMask()) return; // if layer has no mask - nothing happens
    if(makeVisible == undefined) makeVisible = false;
    var desc = new ActionDescriptor();
    var ref = new ActionReference();
    ref.putEnumerated( cTID('Chnl'), cTID('Chnl'), cTID('Msk ') );
    desc.putReference( cTID('null'), ref );
    desc.putBoolean( cTID('MkVs'), makeVisible );
    executeAction( cTID('slct'), desc, DialogModes.NO );
};

// set toggle arg to true for enable and to false for disable mask; default == enable (true)
function toggleMask(toggle) {
    if(!hasLayerMask()) return; // if layer has no mask - nothing happens
    if(toggle == undefined) toggle = true;
    var desc14 = new ActionDescriptor();
    var desc15 = new ActionDescriptor();
    var ref10 = new ActionReference();
    ref10.putEnumerated( cTID('Lyr '), cTID('Ordn'), cTID('Trgt') );
    desc14.putReference( cTID('null'), ref10 );
    desc15.putBoolean( cTID('UsrM'), toggle );
    desc14.putObject( cTID('T   '), cTID('Lyr '), desc15 );
    executeAction( cTID('setd'), desc14, DialogModes.NO );
};

// set toggle arg to true for link and false for unlink; default == link
function toggleLinkMask(toggle){
    if(!hasLayerMask()) return; // if layer has no mask - nothing happens
    if(toggle == undefined) toggle = true;
    var desc = new ActionDescriptor();
    var desc2 = new ActionDescriptor();
    var ref = new ActionReference();
    ref.putEnumerated( cTID( "Lyr " ), cTID( "Ordn" ), cTID( "Trgt" ) );
    desc.putReference( cTID( "null" ), ref );
    desc2.putBoolean( cTID( "Usrs" ), toggle );
    desc.putObject( cTID( "T   " ), cTID( "Lyr " ), desc2 );
    executeAction( cTID( "setd" ), desc, DialogModes.NO );
}

function hasLayerMask() {
    var ref = new ActionReference();
    ref.putEnumerated(cTID("Lyr "), cTID("Ordn"), cTID("Trgt"));
    var desc = executeActionGet(ref);
    return desc.hasKey(cTID("UsrM"));
}

function cTID(s) {return app.charIDToTypeID(s);}
function sTID(s) {return app.stringIDToTypeID(s);}
 
Ответ: Выбрать маску заданного слоя скриптом. Как?

Спасибо, заработало.
Кстати, анлинк маски я делаю и тогда, когда даю unsharp mask картинки, в этом случае шарпится только картинка, а если линк не отключить то фильтр действует и на маску.
 
Ответ: Выбрать маску заданного слоя скриптом. Как?

Ага, есть такая фитча в ФШ. Размытия, по гауссу и какие-то еще фильтры почему-то действуют и на связанную маску. Кто-то видимо пожелал в прошлом - так и осталось. В чем логика - один только автор этой фитчи знает.
 
Статус
Закрыто для дальнейших ответов.