Скрипт для объединения слоев, которые являются копиями Photoshop - PullRequest
0 голосов
/ 28 января 2019

Я новичок в написании сценариев в фотошопе, и кажется, что не все JavaScript одинаковы.То, что я пытаюсь сделать, у меня есть список слоев, которые выглядят следующим образом:

Cat pic 1.jpg

Cat pic 1.jpg copy

Dog pic1.jpg

Dog pic 1.jpg copy

....

Я хочу объединить те, которые являются копиями друг друга, так что "Cat pic 1.jpg"и" Cat pic 1.jpg copy "и создайте один слой из двух, который будет просто" Cat pic 1.jpg ".

Все они активны, и нет никаких фигур или чего-либо еще, поэтому это просто слои.У меня около 300 слоев, и каждый из них в точности такой.Существует дубликат каждого слоя, а имя имеет копию в конце.Я написал сценарий, но я не знаю, как объединить два слоя.Мой код не работает.Он соединен с кем-то, кто пытается отсортировать слои по алфавиту.

По сути, у меня был список слоев, и я перевернул его по горизонтали, и теперь мне нужно объединить левую половину с правой.Слева без слова «копия».

Любая помощь очень ценится, ребята!Пожалуйста, не стесняйтесь игнорировать весь мой код, я абсолютно не уверен в этом.

Заранее спасибо!

#target photoshop
    var layers = activeDocument.layers;
	var layersArray = [];
	var len = layers.length;
	
	// store all layers in an array
	for (var i = 0; i < len; i++) {
		layersArray.push(layers[i]);
	}

var layersOrig= [];
 for (var i = 0; i < len; i++) {
    var cond = myIndexOf(layersArray[i], "copy");
    if (cond === -1) {
       layersOrig.push(layersArray[i]); 
       delete layersArray[i];
    }
 }
    layersOrig.sort();
	// sort layer top to bottom
	layersArray.sort();
for (var i = 0; i < len; i++) {
    layersArray[i] = merge(layersOrig[i], layersArray[i];
 }
	for (i = 0; i < len; i++) {
		layersArray[i].move(layers[i], ElementPlacement.PLACEBEFORE);
	}

function myIndexOf(array, x){
	var n=-1, N=array.length;
	while (++n<N && array[n]!==x);
	return n<N ? n : -1;
	};

1 Ответ

0 голосов
/ 28 января 2019

Может быть, как это?

function main()
{
    var layersInfo = getAllLayersNames(); //getting myself an object of layer names and IDs

    for (layerName in layersInfo)
    {
        deselectLayers(); //deselecting all layers first

        if (layersInfo[layerName].length == 1) continue; //if there's only one layer in the object: ignore it

        for (var i = 0; i < layersInfo[layerName].length; i++)
        {
            selectById(layersInfo[layerName][i], true); //selecting layers-clones by IDs
        }

        mergeDown(); //merge down selected layers

        activeDocument.activeLayer.name = layerName; //renaming the resulting layer to original layer name
    }

    /////////////////////////////////////////////////////////////////////////////////////
    // functions

    function getAllLayersNames()
    {
        var lyrs = {};
        try
        {
            activeDocument.backgroundLayer;
            var layers = 0
        }
        catch (e)
        {
            var layers = 1;
        };
        while (true)
        {
            ref = new ActionReference();
            ref.putIndex(charIDToTypeID('Lyr '), layers);
            try
            {
                var desc = executeActionGet(ref);
            }
            catch (err)
            {
                break;
            }

            var lyr = {};
            lyr.name = desc.getString(charIDToTypeID("Nm  "));
            var nameWithoutCopy = lyr.name.replace(/\scopy.*/, '');
            lyr.id = desc.getInteger(stringIDToTypeID("layerID"));
            if (lyrs[nameWithoutCopy] == undefined) lyrs[nameWithoutCopy] = [lyr.id]
            else lyrs[nameWithoutCopy].push(lyr.id);
            layers++;
        }
        return lyrs
    };

    function selectById(id, add)
    {
        var desc1 = new ActionDescriptor();
        var ref1 = new ActionReference();
        ref1.putIdentifier(charIDToTypeID('Lyr '), id);
        desc1.putReference(charIDToTypeID('null'), ref1);
        if (add) desc1.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
        executeAction(charIDToTypeID('slct'), desc1, DialogModes.NO);
    };

    function deselectLayers()
    {
        var desc60 = new ActionDescriptor();
        var ref30 = new ActionReference();
        ref30.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
        desc60.putReference(charIDToTypeID('null'), ref30);
        executeAction(stringIDToTypeID('selectNoLayers'), desc60, DialogModes.NO);
    };

    function mergeDown()
    {
        var desc11 = new ActionDescriptor();
        executeAction(charIDToTypeID('Mrg2'), desc11, DialogModes.NO);
    };

}
app.activeDocument.suspendHistory("rename all copies", "main()");

Ввод> Результат:

enter image description here

...