Skriptujeme InDesign (24): Vrstvy - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Polygrafie

Skriptujeme InDesign (24): Vrstvy

Adobe InDesign sazba

4. září 2006, 00.00 | Jedním z velmi silných prostředků InDesignu je aparát pro práci s vrstvami. S jeho
pomocí lze objekty v dokumentu zobrazovat či jinak zpracovávat skutečně rozmanitými
způsoby. V tomto díle našeho seriálu se blíže podíváme na to, jak s vrstvami zacházet
pomocí skriptů.

Jedním z velmi silných prostředků InDesignu je aparát pro práci s vrstvami. S jeho pomocí lze objekty v dokumentu zobrazovat či jinak zpracovávat skutečně rozmanitými způsoby. V tomto díle našeho seriálu se blíže podíváme na to, jak s vrstvami zacházet pomocí skriptů.

Vlastnosti vrstev

Vrstvy jsou objekty, patřící objektu document. Ukládají se do odpovídajícího pole layers, přičemž k dispozici jsou příslušné nástroje pro přidání nové vrstvy či naopak její odstranění. Každý dokument obsahuje minimálně jednu vrstvu. Základním identifikátorem vrstvy je její pojmenování (vlastnost name), které je viditelné i na odpovídající paletce Vrstvy (Layers) InDesignu. Dalšími základními vlastnostmi vrstev, které lze opět nastavovat i v GUI InDesignu jsou uzamčení (logická hodnota locked), viditelnost (logická hodnota visible) a barva, kterou je vrstva indikována na dané paletce (layerColor). Co se určení barvy týče, lze zde použít buďto uspořádanou trojici celočíselných hodnot (každá v intervalu od 0 do 255), určující barvu v prostoru RGB, či určení barvy s pomocí tzv. UIColors číslování (odpovídající pojmenování jsou uvedena v referenční příručce na s. 1 238-1 239). Dalšími vlastnostmi vrstev pak jsou určení ignorování zarovnání textu, pokud je vrstva skryta (logická hodnota ignoreWrap), uzamčení vodítek (logická hodnota lockGuides) a zobrazení vodítek (logická hodnota showGuides). Dosavadní výklad si nyní doplňme několika ukázkami kódu.

Výpis informací o vrstvách:

//Vypíše základní informace o vrstvách v daném dokumentu
var myDoc=app.activeDocument;

alert("Počet vrstev v dokumentu: "+myDoc.layers.length+"\nNázvy vrstev: "+myDoc.layers.everyItem().name);

Přidávání vrstev:

//Přidá do dokumentu novou vrstvu jménem Text Layer,
//která je uzamčená, skrytá a na paletce Vrstvy označená oranžovou barvou.
//Pro danou vrstvu je dále nastaveno zrušení obtékání textu při skrytí a zobrazení vodítek
var myDoc=app.activeDocument;

try{myDoc.layers.add({name: "Text Layer", locked: true, visible: false, layerColor: UIColors.orange, ignoreWrap: true, showGuides: true})}
    catch(e){alert("Vrstva daného jména již asi existuje")}

Odstraňování vrstev:

//Zkusí z dokumentu odstranit vrstvu jménem "Text Layer"
var myDoc=app.activeDocument;

try{myDoc.layers.item("Text Layer").remove()}
    catch(e){alert("Vrstva daného jména zřejmě neexistuje")}

Možné jsou pak hromadné manipulace s atributy vrstev, zde si naznačíme pár příkladů pro viditelnost. Nejprve jak všechny vrstvy nastavit jako viditelné:

var myDoc=app.activeDocument;

for(i=0;i<myDoc.layers.length;i++){myDoc.layers[i].visible=true}

Nyní jak skrýt všechny vrstvy s výjimkou určité vrstvy:

//Nechá zobrazenu pouze vrstvu "Layer 4"
var myDoc=app.activeDocument;

for(i=0;i<myDoc.layers.length;i++){myDoc.layers[i].visible=false}
myDoc.layers.item("Layer 4").visible=true;

Poměrně zásadní pak může být v interaktivních skriptech vrstva, která je právě aktivní v daném otevřeném dokumentu. Zjistíme ji například s pomocí metody activeLayer objektu app.activeWindow:

var myDoc=app.activeDocument;
var myLayer=app.activeWindow.activeLayer;

//Ponechá viditelnou pouze aktivní vrstvu
for(i=0;i<myDoc.layers.length;i++){myDoc.layers[i].visible=false}
myLayer.visible=true;

Manipulace s vrstvami

Základními manipulacemi, které se s vrstvami provádí, jsou mimo přidání a odstranění či nastavení atributů popsaných výše i změna pořadí (pomocí metody move), sloučení s jinými vrstvami (metoda merge) a duplikování (metoda duplicate). Opět si ukažme několik příkladů použití daných metod.

Změna pořadí vrstvy:

var myDoc=app.activeDocument;

//Zde určíme požadovanou vrstvu (musí existovat)
var myLayer=myDoc.layers.item("Text Layer");

//Umístí danou vrstvu na konec (naspod)
myLayer.move(LocationOptions.atEnd);

Jiná možnost změny pořadí:

//Umístí danou vrstvu za vrstvu s názvem "Layer 3" (musí existovat)
myLayer.move(LocationOptions.after,myDoc.layers.item("Layer 3"));

Sloučení vrstev:

var myDoc=app.activeDocument;

//Zde určíme požadovanou vrstvu (musí existovat)
var myLayer=myDoc.layers.item("Text Layer");

//Sloučí všechny vrstvy v dokumentu do určené vrstvy
myLayer.merge(app.activeDocument.layers);

Jiná možnost sloučení (merge má jako parametr vždy pole vrstev):

//Sloučí vrstvu určenou proměnnou myLayer s vrstvami "Layer 2" a "Layer 4"
myLayer.merge([app.activeDocument.layers.item("Layer 2"),app.activeDocument.layers.item("Layer 4")]);

Duplikování:

var myDoc=app.activeDocument;

//Zde určíme požadovanou vrstvu (musí existovat)
var myLayer=myDoc.layers.item("Text Layer");

//Duplikujeme danou vrstvu
var myDup=myLayer.duplicate();

//Poté případně změníme pojmenování duplikátu
myDup.name="Duplikát";

Objekty na vrstvách

Vlastnosti vrstev dovolují určit objekty na nich obsažené. Konkrétně jsou takto k dispozici allGraphics (pro všechnu grafiku), allPageItems a pageItems (pro všechny stránkové objekty), ovals, polygons, rectangles a textFrames (rámečky všech typů), graphicLines (čáry) a také buttons (tlačítka pro interaktivní PDF) a formFields (formulářová pole pro PDF dokumenty). Ukázky jednoduché diagnostiky:

var myDoc=app.activeDocument;
var myLayer=app.activeWindow.activeLayer;

alert("Počet textových rámečků aktivní vrstvy je "+myLayer.textFrames.length+"\nPočet obrázků je "+myLayer.allGraphics.length);

Odstranění vrstev, které neobsahují žádné objekty:

var myDoc=app.activeDocument;
//Musíme procházet odzadu, odstraněním se mění délka a obsah pole
for(i=myDoc.layers.length-1;i>=0;i--){if(myDoc.layers[i].allPageItems.length==0){myDoc.layers[i].remove()}}

Ke zjišťování přináležitosti objektu k vrstvě lze použít i jiný postup, kterým je určení vrstvy daného objektu s pomocí vlastnosti itemLayer.

var myObject=app.selection[0];
alert("Vybraný objekt je na vrstvě s názvem "+myObject.itemLayer.name);

Metoda itemLayer je typu read/write, tj. s její pomocí lze změnit přiřazení vrstvy objektu. To dává do rukou zásadní prostředek, dovolující hromadně rozmisťovat objekty do vrstev. Příkladem nám může být následující skript, který všechny textové rámečky umístí na vrstvu "Text" a všechnu grafiku na vrstvu "Graphic".

var myDoc=app.activeDocument;
try{myDoc.layers.add({name: "Text"})}catch(e){};
try{myDoc.layers.add({name: "Graphic"})}catch(e){};

//Všechny textové rámečky umístíme velmi jednoduše pomocí everyItem()
myDoc.textFrames.everyItem().itemLayer="Text";

//Pro obrázky - allGraphics už to tak jednoduché nebude, potřebujeme cyklus
//a musíme manipulovat s rodičovským objektem grafiky, tedy jejím rámečkem
for(i=0;i<myDoc.allGraphics.length;i++){myDoc.allGraphics[i].parent.itemLayer="Graphic"}

Naznačeným způsobem lze velmi snadno "rozestrkat" do vrstev objekty podle potřeby. Využití zde může být různorodé, začíná u přehlednějšího rozmístění zdrojů pro design a končí třeba diagnostikou. Konkrétně si lze uvést například skript, jež všechny přetečené textové rámečky umístí do vrstvy "Text Overflow" a všechny obrázky v RGB do vrstvy "RGB": takto lze velmi rychle vizuálně procházet problematické prvky v dokumentu.

var myDoc=app.activeDocument;
try{myDoc.layers.add({name: "Text Overflow"})}catch(e){};
try{myDoc.layers.add({name: "RGB"})}catch(e){};

//Umístíme přetečené rámečky
for(i=0;i<myDoc.textFrames.length;i++){
    if(myDoc.textFrames[i].overflows==true){myDoc.textFrames[i].itemLayer="Text Overflow"}
}

//Umístíme RGB grafiku - připomeňme, že rodič odkazu je obrázek, rodič obrázku je rámeček.
//Do vrstvy umisťujeme rámeček daného obrázku.
for(i=0;i<myDoc.links.length;i++){
    if(myDoc.links[i].parent.constructor.name=="Image"){
        if(myDoc.links[i].parent.space=="RGB"){myDoc.links[i].parent.parent.itemLayer="RGB"}
        }
}

Popsaná metoda má velký potenciál, zde jsme zůstali jen u jednodušších příkladů. Čtenář by si jistě zvládl sám vytvořit skripty například pro podrobnější rozčlenění objektů do vrstev (třeba vrstvy "CMYK", "RGB", "Grayscale" nebo také třeba "PDF", "EPS", "Image" atp. atp.). Pokročilejší způsob zpracování založený na vrstvách, spojený s duplikováním objektů a přidáváním různých metainformací do dokumentu jsme pak již naznačili v dřívější části našeho seriálu (viz sekce "K vizuální diagnostice").