Создание действия для перемещения слоев по оси х на самую широкую ширину выбранного слоя? - PullRequest
1 голос
/ 25 мая 2019

Я хочу сделать переменное действие, которое разделяет серию слоев на основе самой широкой ширины одного из этих выбранных слоев. 4 спрайта имеют ширину 100, 100, 100, 200 пикселей. Все слои будут разделены на 200 пикселей по оси x, а общая ширина изображения составит 800 пикселей.

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

1 Ответ

1 голос
/ 25 мая 2019

Я бы сделал что-то подобное.Это предполагает отсутствие групп, фонового слоя, слои являются обычными слоями и используются все слои документа.До и после (самое большое было 150px):

enter image description here

Если вам не нужно, чтобы они поменяли Y позицию, измените 0 - layersInfo[i].top на 0 в строке 13.

function main()
{
    var doc = activeDocument,
        layers = doc.layers, //getting all top layers
        layersInfo = getInfo().reverse(), //getting layers info and reversing the array because DOM indexes are different order than AM indexes
        elWidth = getWidestElement(layersInfo); // getting widest element

    doc.resizeCanvas(elWidth * layers.length, doc.height.as("px"), AnchorPosition.TOPLEFT); // resizing canvas size to new width: widest element * number of elements

    for (var i = 0; i < layers.length; i++) // for every top layer...
    {
        doc.activeLayer = layers[i]; // selecting the layer
        layers[i].translate(i * elWidth - layersInfo[i].left, 0 - layersInfo[i].top) // moving it to top left corner of each block
    }

    function getInfo()
    {
        var layers = 1,
            lyrs = [];
        while (true)
        {
            ref = new ActionReference();
            ref.putIndex(charIDToTypeID('Lyr '), layers);
            try
            {
                var desc = executeActionGet(ref);
            }
            catch (err)
            {
                break;
            }

            var lyr = {},
                bounds = desc.getObjectValue(stringIDToTypeID("bounds"));;

            lyr.top = bounds.getDouble(stringIDToTypeID("top"));
            lyr.left = bounds.getDouble(stringIDToTypeID("left"));
            lyr.width = bounds.getDouble(stringIDToTypeID("width"));

            lyrs.push(lyr)
            layers++;
        }
        return lyrs
    }; // end of getInfo()

    function getWidestElement(layers)
    {
        var curWidth = 0;
        for (var i = 0; i < layers.length; i++)
        {
            if (layers[i].width > curWidth) curWidth = layers[i].width;
        }
        return curWidth
    }; // end of getWidestElement()


}

var curUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
try
{
    app.activeDocument.suspendHistory("temp", "main()");
}
catch (e)
{
    alert(e + '\nLine: ' + e.line)
}
app.preferences.rulerUnits = curUnits;
...