Hromadné zavření všech otevřených souborů bez uložení změn

lekce 3.

Automatizování úloh v Adobe Photoshop

Pomocí skriptovacího jazyka JavaScript

Cíl lekce

Cílem třetí lekce je ukázat jednoduchý skript pro zavření otevřených souborů. Skript je možný modifikovat na několik kritérií. Zavření všech otevřených dokumentů. Zavření všech otevřených dokumentů, kromě aktivního dokumentu, či zavření pouze aktivního dokumentu. Skript není vůbec složitý a může mít další využití v jiných skriptech, navíc je velmi užitečný a určitě ušetří několikanásobné ruční klikání při zavírání dokumentů a odklikávání dialogového okna.


Využité třídy v této lekci

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

  • Application: využiji atribut documents a metodu close().
  • SaveOptions: konstanty výčtu SaveOptions.

Zjištění zda-li je otevřený soubor

Podobně jako v předchozí lekci je pro mě nežádoucí, aby v programu Adobe Photoshop nebyl otevřený jediný soubor, jelikož bych neměl co zavírat svým skriptem. Narozdíl od minulé lekce, kde jsem sestrojil podmínku (if) ve které jsem se ptal, pokud je velikost atributu documents> rovná nule. V případě, že ano, znamenalo to, že není otevřený žadný dokument. V této ukázce tedy tuto podmínku prohodím a trochu zjednodušším zápis, v případě použití v dalších lekcích se touto problematikou již nezabývám a odkazuji se pouze na lekci 2, 3. Jak jsem již zmínil v následujícím kódu tedy podmínku prohodím a zeptám se, jestli je atribut documents větší než nula. Zároveň zkrátim zápis a neudám žádné znaménko <, =, > a vycházím z toho, že podmínka se vyhodnotí jako true (pravda) v případě, že získaná hodnota je větší jak nula.


//pokud vyhovuje proveď...
if (documents.length) {
    //libovolný počet dokumentů je otevřený

//pokud nevyhovuje podmínce proveď...
}else {
	alert("Žádný dokument není otevřený.", "Varování");
}
				

Zavření souboru

Pro zavření dokumentu beze změn využiji konstantu DONOTSAVECHANGES třídy SaveOptions, kterou vložím do metody close() volanou nad aktivním dokumentem. Tedy skript pro zavření pouze aktivního dokumentu je již s podmínkou otevřeného dokumentu a řádku níže hotový. Na další dvě varianty je nutno skript trochu rozšířit.


//zavření aktivního dokumentu bez uložení změn
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
				

Zavření všech souborů

Zavření všech souborů bez uložení je podobné jako při kontrole otevřeného souboru, jednodušše se v cyklu ptám jestli má atribut documents větší velikost jak nula. Pokud ano, zavírám dál soubory. Níže vytvořím pro přehlednost funkci, které zavře všechny otevřené soubory.

function closeAllFiles(){
	//cykly dokud je splněna podmínka...
    while (documents.length > 0) {
		activeDocument.close(SaveOptions.DONOTSAVECHANGES);
	}
}

Zavření všech souborů, kromě aktivního souboru

Při zavírání všech souborů, kromě aktivního je třeba si uvědomit, že atribut documents je list (seznam) všech otevřených dokumentů v programu. Od toho se poté může odvodit skript. Potřebuji tedy projít všechny položky v seznamu. To jsem již prováděl o pár řádku výše. Nyní to jen upravím a místo (while) cyklu použiji cyklus (for) a to z toho důvodu, že zároveň potřebuji využít proměnou jako index, kde se v listu nacházím. Dále před samotným cyklem je potřeba si uložit aktivní otevřený dokument, abych ho při procházení cyklu mohl přeskočit a nezavřel i soubor, který má aby zůstat otevřený. K tomu mi poslouží atribut activeDocument třídy Application. Ten vrací referenci (odkaz) na daný soubor, který mohu poté porovnávat jenotlivými položkami ze seznamu. Pro tento účel opět vytvořím funkci z důvodu přehlednosti a funkčnosti.

Z důvodu toho, abych zjistil zavření opravdu všech souborů, umístil jsem před for cyklus, ještě jeden cyklus, který kontroluje zda-li jsou opravdu všechny soubory, kromě jednoho zavřeny. Jelikož jsem objevil chybu, že některé ze souborů i přes prohledání celého seznamu zůstaly otevřeny. Důležité je zde uvědomit si, že (while) cyklus zde musí mít podmínku > 1 tedy větší jak jedna a nikoliv > 0. Toto by byla velká chyba, jelikož by se skript zacyklil a nikdy neskončil. Jelikož aktivní soubor nikdy neodstraním.

function closeAllFilesExceptActiveOne(){
    var actDocument = app.activeDocument;
    while (documents.length > 1) {
        //v cyklu procházím...
		for (var i = 0; i < documents.length; i++) {
			//zavřít všechny, kromě aktivního
			if (actDocument != documents[i]) {
				documents[i].close(SaveOptions.DONOTSAVECHANGES);
			}
		}
	}
}

Výsledný zdrojový kód


if (documents.length) {
		//zavření aktivního dokumentu bez uložení změn
		activeDocument.close(SaveOptions.DONOTSAVECHANGES);

        //Použijte funkci, odstraňte lomítka komentáře si 1. nebo 2.
        //1. zavření všech dokumentů
		closeAllFiles()
        //2. zavření všech dokumentů, kromě aktivního
		//closeAllFilesExceptActiveOne()
	}
	else {
		alert("Žádný dokument není otevřený.", "Varování");
}

//funkce na zavření všech souborů
function closeAllFiles(){
	//dokud je otevřený dokument, zavři
    while (documents.length > 0) {
		activeDocument.close(SaveOptions.DONOTSAVECHANGES);
	}
}

//funkce na zavření všech souborů, kromě aktivního
function closeAllFilesExceptActiveOne(){
    var actDocument = app.activeDocument;
    while (documents.length > 1) {
		for (var i = 0; i < documents.length; i++) {
			//zavřít všechny, kromě aktivního
			if (actDocument != documents[i]) {
				documents[i].close(SaveOptions.DONOTSAVECHANGES);
			}
		}
	}
}