Skriptujeme InDesign (31): Okna - 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:



Software

Skriptujeme InDesign (31): Okna

Adobe InDesign sazba

15. ledna 2007, 00.00 | V této části našeho seriálu o skriptování InDesignu se budeme věnovat práci s okny. Ukážeme si, jak lze provádět různé aranžování oken a také jak kontrolu zobrazení v okně použít v rámci různých diagnostik.

V této části našeho seriálu o skriptování InDesignu se budeme věnovat práci s okny. Ukážeme si, jak lze provádět různé aranžování oken a také jak kontrolu zobrazení v okně použít v rámci různých diagnostik.

Okna aplikace a dokumentu

Okna otevřená v prostředí InDesignu jsou odkazována prostřednictvím kolekce windows. Okno, jež je v danou chvíli v popředí, je přístupné s pomocí vlastnosti activeWindow. Dalším identifikačním prvkem je jméno okna (mimo název souboru obsahuje i údaj o aktuálním zvětšení pohledu na dokument v procentech), zjistitelné vlastnosti name, vlastnost parent pak dovoluje přímo použít název dokumentu, který dané okno zobrazuje (tj. bez údajů o zvětšení).

//Do proměnné myWinName uloží název aktivního okna
var myWinName=app.activeWindow.name;

//Do proměnné myDocName uloží název dokumentu zobrazeného v aktivním okně
var myDocName=app.activeWindow.parent.name;

Kolekce windows přináleží rovněž objektu document, zde lze pomocí metody add() nová okna přidávat (odpovídá příkazu InDesignu pro otevření dokumentu v novém okně Okno-Uspořádat-Nové okno čili Window-Arrange-New Window, připomeňme pak, že v InDesignu mohou být dokumenty otevřeny ke zpracování skriptem i bez okna), metoda close() pak dovoluje okna uzavírat, ovšem neumožňuje uzavřít okna všechna (pro to je zapotřebí zavřít samotný dokument).

//Zobrazí aktuální dokument v dalším okně
app.activeDocument.windows.add();

//Zobrazí názvy všech oken přináležících danému dokumentu
alert(app.activeDocument.windows.everyItem().name);

//Uzavře všechna okna spojená s aktivním dokumentem kromě jednoho
for(j=app.activeDocument.windows.length-1;j>0;j--){app.activeDocument.windows[j].close()}

//Uzavře aktivní dokument a s ním všechna jeho okna
app.activeDocument.close();

Manipulace s okny

K manipulaci s okny lze využít metod odpovídajících obvyklým manipulacím v grafickém uživatelském prostředí, konkrétně to jsou minimize() (okno se minimalizuje), maximize() (okno se otevře přes celé okno aplikace), restore() (obnoví předchozí velikost okna) a close() (okno se uzavře). Dále lze použít metod objektu app pro uspořádání oken, konkrétně to jsou cascadeWindows (okna se uspořádají do kaskády) a tileWindows (okna se uspořádají do dlaždic).

//Minimalizuje aktivní okno
app.activeWindow.minimize();

//Seřadí okna do dlaždic
app.tileWindows();

LayoutWindow vs. StoryWindow

Okna mohou být dvou typů: LayoutWindow obsahuje obvyklé zobrazení (layoutu neboli rozvržení) dokumentu, StoryWindow pak text story (článku) otevřený ve story editoru (editoru článků). Rozlišení mezi danými typy lze provést například s pomocí následujícího testu:

//Otestuje typ aktivního okna
if(app.activeWindow.constructor.name=="LayoutWindow"){alert("Okno je typu LayoutWindow")}
    else{alert("Okno je typu StoryWindow")}

Každý dokument pak může mít v InDesignu otevřeno jedno či více LayoutWindow či StoryWindow, odpovídají tomu kolekce (layoutWindows, storyWindows)

StoryWindow

StoryWindow otevřeme s pomocí skriptu například takto:

if(app.activeDocument.stories.length==0){alert("Dokument neobsahuje žádnou story");exit()}

//Určíme story
var myStory=app.activeDocument.stories[0];

//Otevřeme StoryWindow
myStory.storyEdit();

Uzavření StoryWindow lze zajistit následovně:

if(app.activeWindow.constructor.name=="StoryWindow"){app.activeWindow.close(SaveOptions.yes)}

V případě StoryWindow je možno kontrolovat několik málo základních vlastností popsaných výše (minimalizace/maximalizace, obnovení atp., názvy metod jsou stejné jako u objektu window).

LayoutWindow

LayoutWindow poskytuje nejen základní kontrolní prostředky jako StoryWindow, ale též řadu dalších, výrazně zajímavějších, vlastností a metod použitelných různým způsobem. Začít můžeme u vlastnosti activePage, která dovoluje zjistit nebo případně i nastavit aktuální pozici v dokumentu.

Zjištění aktuální stránky:

//Otestujeme, jestli okno v popředí není typu StoryWindow
if(app.activeWindow.constructor.name=="StoryWindow"){alert("Se StoryWindow tento skript nefunguje");exit()}

//Do proměnné myPoz nastaví aktuální stránku v dokumentu
var myPoz=app.activeWindow.activePage;

//Vypíše název dané stránky
alert("Aktuální stránka v dokumentu má označení "+myPoz.name)

Nastavení čísla stránky:

//Otestujeme, jestli okno v popředí není typu StoryWindow
if(app.activeWindow.constructor.name=="StoryWindow"){alert("Se StoryWindow tento skript nefunguje");exit()}

//Nastaví aktivní stránku v dokumentu na první stránku (využijeme toho, že rodičem okna je jeho dokument)
app.activeWindow.activePage=app.activeWindow.parent.pages[0];

//Nastaví aktivní stránku v dokumentu na poslední stránku
app.activeWindow.activePage=app.activeWindow.parent.pages[-1];

Obdobně lze pracovat s dvojstránkou (spread):

//Otestujeme, jestli okno v popředí není typu StoryWindow
if(app.activeWindow.constructor.name=="StoryWindow"){alert("Se StoryWindow tento skript nefunguje");exit()}

//Nastaví aktivní dvojstránku v dokumentu na první
app.activeWindow.activeSpread=app.activeWindow.parent.spreads[0];

Jinou zajímavou vlastností, kterou lze měnit, je velikost zobrazení dokumentu v okně. K dispozici jsou zde dva způsoby, nastavení vlastnosti zoomPercentage a použití metody zoom(). V případě zoomPercentage se přitom určuje velikost v procentech, zoom používá nastavení odpovídající příkazům v nabídce InDesignu View-Zobrazení - konkrétně zvětšení (ZoomOptions.zoomIn) nebo zmenšení (ZoomOptions.zoomOut) zobrazení, zvětšení na velikost dvojstránky (ZoomOptions.fitSpread) nebo stránky (ZoomOptions.fitPage) či skutečnou velikost (ZoomOptions.actualSize), případně pak celou pracovní plochu (ZoomOptions.showPasteboard).

//Nastaví velikost zobrazení v aktivním okně na 75 %
app.activeWindow.zoomPercentage=75;

//Nastaví velikost zobrazení v aktivním okně na velikost stránky
app.activeWindow.zoom(ZoomOptions.fitPage);

//Sníží velikost zobrazení o jeden stupeň
app.activeWindow.zoom(ZoomOptions.zoomOut);

Kontrolovat lze rovněž rozměry okna, a to s pomocí vlastnosti bounds (stejně jako u geometricBounds objektu jde o uspořádanou čtveřici hodnot ve tvaru [y-ová souřadnice levého horního rohu,x-ová souřadnice levého horního rohu,y-ová souřadnice pravého dolního rohu,x-ová souřadnice pravého dolního rohu]), hodnoty se udávají v pixelech.

Mimo obecné vlastnosti okna, aktuální stránky či dvojstránky a velikosti lze u LayoutWindow nastavit řadu dalších parametrů, konkrétně to je aktivní vrstva (activeLayer) a dále sada parametrů určujících zobrazení barev (overprintPreview, preserveColorNumbers, proofingProfile,proofingType, simulateInkBlack, simulatePaperWhite - viz příslušné příkazy v nabídce View-Zobrazení uživatelského rozhraní InDesignu), kvalitu zobrazení grafiky (viewDisplaySetting - viz příkaz View-Display Performance tedy Zobrazení-Rychlost zobrazení) či referenční bod, kolem kterého se provádí transformace objektů (transformReferencePoint). Nastavení zobrazení demonstrujeme blíže v následujícím příkladu, použitím vlastnosti transformReferencePoint se v zajímavém článku zabývá Dave Saunders.

//Nastaví aktivní vrstvu na "Text" (musí v dokumentu existovat)
app.activeWindow.activeLayer=app.activeWindow.parent.layers.item("Text");

//Pro aktivní okno zapne zobrazení přetisků
app.activeWindow.overprintPreview=true;

//Zachovat číselné hodnoty daného barevného prostoru
app.activeWindow.preserveColorNumbers=true;

//Nastavení kontrolního náhledu - Proof Setup na vlastní - Custom
app.activeWindow.proofingType=ProofingType.custom;
//Další možnosti pro ProofingType jsou proofOff, documentCmyk, workingCmyk

//Simulované zařízení (custom profile)
app.activeWindow.proofingProfile="Photoshop 4 Default CMYK"

//Simulovat černou tiskovou barvu
app.activeWindow.simulateInkBlack=true;

//Simulovat barvu papíru
app.activeWindow.simulatePaperWhite=true;

//Nastaví kvalitu zobrazení (rychlost zobrazení) grafiky na Fast Display (rychlé)
app.activeWindow.viewDisplaySetting=ViewDisplaySettings.optimized;
//Další možnosti pro ViewDisplaySettings jsou highQuality (vysoká kvalita zobrazení) a typical (typické zobrazení)

Palety

Pro kontrolu nástrojových palet nabízí InDesign pouze vlastnost objektu app palettesVisible. Jak již název naznačuje, jedná se o logickou hodnotu, dovolující zobrazit nebo skrýt všechny nástrojové panely (obdoba použití klávesové zkratky Tab).

//Skryje všechny palety
app.palettesVisible=false;

Daný prostředek lze tedy použít samostatně nebo v kombinaci s výše naznačenými prostředky při kontrole vzhledu uživatelského rozhraní. Tím ale možnosti kontroly palet končí (resp. nedopátrali jsme se žádných dalších), což je rozhodně škoda.

Praktické využití

Ukažme si nyní, jak lze výše uvedené prostředky použít k efektivní práci s okny. Jedním z nejužívanějších způsobů je nastavení okna dokumentu na určité požadované místo: danou vlastnost lze využít k různé diagnostice. Konkrétně například tímto způsobem:

//Skript, který dovolí v textu projít a opravit přetečené textové rámečky

//Pracujeme s aktuálním dokumentem
var myDoc=app.activeDocument;

//Projdeme všechny textové rámečky
for(i=0;i<myDoc.textFrames.length;i++){
    var myObj=myDoc.textFrames[i];
    if(myObj.overflows==true){                        //Pokud je rámeček přetečený, pak
    showObject(myObj);                                //jej zobrazíme pomocí funkce showObject()
    if(confirm("Chcete rámeček upravit?")){exit()}}   //a dovolíme jej upravit
}

//Funkce showObject()
function showObject (myObj){
    app.select(myObj);                               //Daný objekt vybereme
    app.activeWindow.activePage=myObj.parent;        //přesuneme se na jeho stránku
    app.activeWindow.zoom(ZoomOptions.fitSpread);    //zvětšíme zobrazení v okně na velikost dvojstránky
}

Jinou zajímavou možnost představuje otevření dvou oken dokumentu, přičemž v každém je dokument zobrazen jiným způsobem.

//Skript zobrazující tentýž dokument ve dvou oknech s odlišnými nastaveními pohledu

//Skript podmíníme jediným otevřeným dokumentem v InDesignu
//(lze samozřejmě napsat kód pro uzavření - přechodné či úplné - dalších dokumentů atp.)
if(app.windows.length!=1){alert("Tento skript vyžaduje, aby byl otevřen právě jeden dokument");exit()}

//V proměnné myDoc je ukazatel na aktivní dokument
var myDoc=app.activeDocument;

//Dokument zobrazíme v dalším okně
myDoc.windows.add();

//Okna uspořádáme do dlaždic
app.tileWindows();

//První okno bude zobrazovat obsah na velikost stránky
myDoc.layoutWindows[0].zoom(ZoomOptions.fitPage);
//a první stránku dokumentu
myDoc.layoutWindows[0].activePage=myDoc.pages[0];

//Druhé okno bude zobrazovat obsah na velikost stránky
myDoc.layoutWindows[1].zoom(ZoomOptions.fitPage);
//a poslední stránku dokumentu
myDoc.layoutWindows[1].activePage=myDoc.pages[-1];

//Tímto způsobem je tedy třeba možno sledovat, jak se změny na první stránce promítnou na stránce poslední apod.
//Možná jsou mnohá další nastavení týkající se nejen stránek a velikosti zobrazení, ale také třeba softproofingu apod.