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.
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í");
}