2012-02-22 3 views
3

У меня есть 6 групп в Photoshop, которые содержат несколько слоев внутри каждой группы. Я хочу включить/выключить слой внутри каждой группы, чтобы создать любую возможную комбинацию изображения.Включение и выключение нескольких слоев в Photoshop Сценарий

Может кто-нибудь указать мне в правильном направлении?

Я никогда не писал сценарии в Photoshop, но пытался понять это самостоятельно.

+1

Посмотрите на этот ответ: HTTP://stackoverflow.com/a/8544923/327466 – KatieK

ответ

3

Я совершенно новичок в CS5, но думаю, что могу объяснить, как это работает. Примеры кода могут быть не самым эффективным способом сделать это, но это делает трюк.

Существует большая разница между Группой слоев или самим отдельным слоем. Все слои и группы упорядочены в формате DOM. Чтобы получить свой корень, вы можете использовать глобальный экземпляр app для получения активного документа: app.activeDocument.

Беспокойная часть состоит в том, что для отдельных слоев и групп имеются два отдельных массива. Чтобы получить массив одиночных слоев, используйте app.activeDocument.layers и app.activeDocument.layerSets для групп.

Чтобы углубиться в иерархичность, используйте массив layerSets для итерации вниз.

Например, предположим следующее hieralcy:

-Border 
+Icons 
    +Left 
     -Star 
     -Home 
    +Right 
     -Add 
     -Remove 

Здесь Border, Star, Home, Add и Remove все одиночные слои, а Icons, Left и Right являются группы.

Для включения группы Left мы должны перебирать вниз Icon группу:

Icons = app.activeDocument.layerSets.getByName("Icons"); 
Left = Icons.layerSets.getByName("Left"); 
Left.visible = true; 

Если вы покажете слой/группу в CS5, щелкнув мышью, все родительские группы автоматически будут отображаться слишком. По сценариям это не так, вы должны включить всех родителей.

Icons = app.activeDocument.layerSets.getByName("Icons"); 
Icons.visible = true; 
Left = Icons.layerSets.getByName("Left"); 
Left.visible = true; 

Чтобы показать слой границы, вам нужно использовать массив слоев.

app.activeDocument.layers.getByName("Border").visible = true; 

Аналогичные вещи применяются, если вы хотите показать слой Add.

Icons = app.activeDocument.layerSets.getByName("Icons"); 
Icons.visible = true; 
Right = Icons.layerSets.getByName("Right"); 
Right.visible = true; 
AddLayer = Right.layers.getByName("Add"); 
AddLayer.visible = true; 

Это может быть немного грязно, если у вас много групп и слоев. Я создал функцию, которая следует за предоставленным путем, чтобы получить конечный объект. Он сам определит, является ли это слоем или группой.

//****************************************** 
// GET BY PATH 
// Author: Max Kielland 
// 
// Gets the LayerSet or Layer at the path's end. 
// Example path "Icons/left" will return the LayerSet object "Left" 
// while "Icons/left/Star" will return the Layer object "Star" 
// If fSetPath is true, all the parents will be visible as well. 

function GetByPath(fPath,fSetPath) { 

    var lGroup = null; 
    var lPathArray = new Array(); 

    lPathArray = fPath.split('/'); 
    try { 
    lGroup = app.activeDocument.layers.getByName(lPathArray[0]); 
    } catch (err) { 
    lGroup = app.activeDocument.layerSets.getByName(lPathArray[0]); 
    } 

    if (fSetPath) 
    lGroup.visible = true; 

    for (n=1; n<lPathArray.length; n++) { 
    try { 
     lGroup = lGroup.layerSets.getByName(lPathArray[n]); 
    } catch(err) { 
     lGroup = lGroup.layers.getByName(lPathArray[n]); 
    } 
    if (fSetPath == true) 
     lGroup.visible = true; 
    } 

    return lGroup; 
} 

... и одна функция просто устанавливает или очищает группу или слой по ее пути.

//****************************************** 
// SET STATUS 
// Author: Max Kielland 
// 
// Sets the Group or Layer's visible property 
// at the end of the path to fStatus. 

function SetStatus(fPath, fStatus) { 

    Obj = GetByPath(fPath,false); 
    Obj.visible = fStatus; 
} 

.. и, наконец, я написал эту функцию, чтобы скрыть все группы и/или слои от указанного пользователем root.

/****************************************** 
// CLEAR GROUP 
// Author: Max Kielland 
// 
// Clears the visible property in a single 
// group/layer with the option to clear all 
// its children as well (fRecurs = true). 
// fLayerSet can be a layerSet object or a 
// String path. 

function ClearGroup(fLayerSet,fRecurs) { 

    var n; 
    var TargetGroup; 

    // Get LayerSet Object if reference is a string. 
    if (typeof fLayerSet == "string") 
    TargetGroup = GetByPath(fLayerSet); 
    else 
    TargetGroup = fLayerSet; 

    // Iterate through all LayerSets 
    for (n=0; n<TargetGroup.layerSets.length; n++) { 
    if (fRecurs == true) 
     ClearGroup(TargetGroup.layerSets[n],true); 
    else 
    TargetGroup.layerSets[n].visible = false; 
    } 

    // Iterate through all layers 
    for (n=0; n<TargetGroup.layers.length; n++) { 
    TargetGroup.layers[n].visible = false; 
    } 

    // Clear self 
    TargetGroup.visible = false; 
} 

Вот пример того, как использовать функции

// Hide group "Icon" and its children 
ClearGroup("Icons",true); 

//Show the layer "Home" 
GetByPath("Icons/Left/Home",true); 

// To just get the object "Right" 
var MyGroup = GetByPath("Icons/Right"); 

// Save the current document as a PNG file 
app.activeDocument.saveAs(File("Scripted Document.png"),PNGSaveOptions); 

Я надеюсь, что это полезно для кого-то больше, чем просто я :)