Seřazení vstrev podle abecedy

lekce 5.

Automatizování úloh v Adobe Photoshop

Pomocí skriptovacího jazyka JavaScript

Cíl lekce

Náplní lekce je seřazení vrstev podle abecedy a to vzestupně, či sestupně. Zároveň na skriptu ukáži jak vyjmout první vrstvu pozadí, aby skript seřadil pouze nově vzniklé vrstvy.

lekce_3puvodni.png lekce_3serazeniBezPozadi.png lekce_3serazeniBezPozadiReverse.png lekce_3serazeniSPozadim.png lekce_3serazeniSPozadimReverse.png

1) původní seřazení, 2) seřazení sestupně abecedně bez pozadí, 3) seřazení vzestupně abecedně bez pozadí, 4) seřazení sestupně abecedně s pozadím, 5) seřazení vzestupně abecedně s pozadím


Třídy

Výčet využívaných tříd v této lekci.

  • Application: pro přístup k vrstvám dokumentu.
  • Konstanty: konstanty výčtu ElementPlacement pro udání pozice při vkládání vrstvy.

Ošetření skriptu

Před napsáním samotné funkčnosti skriptu, je třeba ošetřit několik výjimek, které mohou nastat. Jednou z nich je již několikrát zmíněný neotřevřený soubor. Tuto výjimku lze třeba ošetřit pomocí kódu z lekce 1, či 2. Dalším nežádoucím stavem, který může nastat je, že upravovaná grafika neobsahuje ani jednu vrstvu, případě obsahuje pouze vrstvu pozadí. V případě žádně vrstvy, je tento stav nežádoucí a v případě jedné vrstvy – vrstvy pozadí, není co třídit, jelikož třídit jednu vrstvu je nesmysl. Tento případ lze jednodušše ošetřit podobně jako neotřevený soubor. Pomocí atributu layers aktivního dokumentu. Zeptám se tedy jestli velikost tohoto atributu je větší jak jedna (nikoliv nula).


if(activeDocument.layers.length > 1){
	...
}
				

Vytvoření proměnných

V dalším kroku si připravým proměnné layers – list vrstev a array – pole pro vrstvy a jejich řazení.


//list vrstev
var layers = activeDocument.layers;
//pole pro vrstvy
var array = [];
				

Ošetření vrstvy pozadí

Také je nutno brát v potaz vrstvu pozadí. U třídění vrstev není úskalím zamčená vrstva, ale vrstva pozadí. Vrstvu pozadí je nutno rozpoznat a ve skriptu ji nezahrnou, jelikož v případě neošetření této situace to povede k výjimce ve skriptu. Toto lze provést přístoupením k atributu isBackgroundLayer aktuální vrstvy a přeskočením iterace klíčovým slovem continue.

//Pokud je aktuální vrstva pozadí pokračuj dále
if(array[i].isBackgroundLayer){
    continue;
}

Vložení vrstev do listu a setřídění

Následně přes jednoduchý (for) cyklus vložím všechny vrstvy do pole, abych s nimi pomocí indexu mohl pracovat a metodou sort() je setřídím. Pokud chci setřídění obrátit, stačí nad polem zavolat metodu reverse(), která setřízení otočí. Následující kód ilustruje tuto práci a v zakomentované části je vidět možné použití metody revers().


//vložení vrstev do pole (všech)
for (var i = 0; i < layers.length; i++) {
		//metoda push vloží vrstvu na konec pole
		array.push(layers[i]);
}

//setřídění
array.sort();

//Obrácené setřídění
//array.reverse();

Vložení vrstev z pole

V posledním kroku již jen zbývá umístit jednotlivé vrstvy v pořadí před danou vrstvu. Toto zařídí konstanta PLACEBEFORE z výčtu ElementPlacement.


//projdi všechny vrstvy pole 
for (i = 0; i < layers.length; i++) {
	//přesuň vrstvu z pole před danou vrstvu dokumentu
	array[i].move(layers[i], ElementPlacement.PLACEBEFORE);
}

Vyjmutí vrstvy pozadí z třídění

Vrstva pozadí, bude vždy vrstva s maximálním indexem v listu, či poli. To znamená, že pro vynechání této vrtsvy při třídění stačí v obou sestavených cyklech neindexovat do jejich počtu, ale pouze jen počtu mínus jedna. Prakticky to znamená zaměnit i < layers.length; za i < layers.length - 1;. Celou tuto změnu na obou cyklech ilustruje kód níže.


//nevkládej vrstvu pozadí
for (var i = 0; i < layers.length - 1; i++) {
		array.push(layers[i]);
}
//neprocházej až po vrstvu pozadí
for (i = 0; i < layers.length - 1; i++) { // je bez pozadi
		array[i].move(layers[i], ElementPlacement.PLACEBEFORE);
}

Výsledný zdrojový kód


if (documents.length) {
	if(activeDocument.layers.length > 1){
		//list vrstev
		var layers = activeDocument.layers;
		//pole pro vrstvy
		var array = [];

		//vložení vrstev do pole (všech), možná modifikace na: layers.length - 1
		for (var i = 0; i < layers.length; i++) {
			//metoda push vloží vrstvu na konec pole
			array.push(layers[i]);
		}

		//setřídění
		array.sort();

		//Obrácení setřídění
		//array.reverse();

		//projdi všechny vrstvy pole, možná modifikace na: layers.length - 1
		for (i = 0; i < layers.length; i++) {
            //Pokud je vrstva pozadí pokračuj dále
            if(array[i].isBackgroundLayer){
                continue;
            }
            //přesuň vrstvu z pole před danou vrstvu dokumentu
			array[i].move(layers[i], ElementPlacement.PLACEBEFORE);
		}
	}else{
		alert("Soubor neobsahuje žádnou vrstvu k třídění.", "Varování");
	}
}
else{
	alert("Žádný dokument není otevřený.", "Varování");
}