Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » "afterOpen", Event ?

"afterOpen", Event ?

AndreasCAR
Beiträge gesamt:

6. Dez 2011, 12:33
Bewertung:

gelesen: 8394

Beitrag als Lesezeichen
Hallo.

Wie kann ich erreichen, dass das " alert( "Habe fertig");" erst erscheint, wenn das ID5-Dokument komplett geöffnet ist? Also zum Schluß, und nicht wie jetzt am Anfang.

Code
#targetengine "session"  

main();

function main() {
app.addEventListener("afterOpen", myEventFunction, false);
}
function myEventFunction(myEvent) {

if (app.documents.length > 0 ) {

alert( "Habe fertig");
}

}


PS: Ich will ein Script erst "loslegen" lassen, wenn das Dokument fertig geöffnet ist.
____________________
Grüße
AndreasCAR

"afterOpen", Event ?

Martin Fischer
  
Beiträge gesamt: 12783

6. Dez 2011, 12:51
Bewertung:

gelesen: 8387

Beitrag als Lesezeichen
Hallo Andreas,

Du meinst vermutlich das Ereignis, nachdem das Layoutfenster geöffnet ist.

Ab InDesign CS5 sollte das so funktionieren:

Code
#targetengine "session"   

main();

function main() {
app.addEventListener("afterOpen", myEventFunction, false);
}
function myEventFunction(myEvent) {
if (myEvent.parent.constructor.name == 'LayoutWindow' ) {

alert( "Habe fertig");
}

}


Viele Grüße
Martin


"afterOpen", Event ?

AndreasCAR
Beiträge gesamt:

6. Dez 2011, 13:06
Bewertung:

gelesen: 8374

Beitrag als Lesezeichen
Hallo Martin.

Danke für die schnelle Antwort. Wenn die alert-Meldung kommt,
ist (siehe Bild) noch das "Neues-Dokument"-Fenster zu sehen.
Kann die "alert-Meldung" evtl. noch etwas verzögert werden...?

____________________
Grüße
AndreasCAR

http://www.pic-upload.de/...Habe-Fertig.jpg.html

"afterOpen", Event ?

Martin Fischer
  
Beiträge gesamt: 12783

6. Dez 2011, 13:25
Bewertung:

gelesen: 8365

Beitrag als Lesezeichen
Hallo Andreas,

Du kannst noch eine Pause-Funktion einbauen.
Code
function pause(zeit) 	//Zeit hier in ms angeben 
{
var starttime=(new Date).getTime();
while (starttime+zeit > (new Date).getTime() ) {};
}


Aber ich fürchte, das bringt nicht den erhofften Effekt (Meldung erscheint erst, wenn "Neues-Dokument"-Fenster verschwunden ist), sondern es bewirkt nur eine nutzlose Verzögerung.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 6. Dez 2011, 13:35 geändert)

"afterOpen", Event ?

AndreasCAR
Beiträge gesamt:

6. Dez 2011, 15:34
Bewertung:

gelesen: 8316

Beitrag als Lesezeichen
Hallo Martin.

Danke, schau ich mir dann in Ruhe an.

____________________
Grüße
AndreasCAR

"afterOpen", Event ?

gfellenz
Beiträge gesamt: 121

6. Dez 2011, 16:22
Bewertung:

gelesen: 8298

Beitrag als Lesezeichen
Hallo Martin,

ich hätte jetzt für Pause $.sleep(TimeInMs) vorgeschlagen.

Aber eigentlich wollte ich zum eigentlichen Thema "afterOpen" noch etwas sagen:

Es scheint ganz so, also ob das Event afterOpen bei großen Dokumenten und (großen) IDML-Dokumenten zu früh ausgelöst wird.

Bspw. hatte ich hier einen Fall, das eine IDML-Datei nach afterOpen noch nicht gespeichert werden konnte. Die Fehlermeldung war, dass noch nicht alle Transaktionen abgeschlossen waren.
Hier im Forum hatten wir ein ähnliches Phänomen mit der Eigenschat allGraphics, die ebenfalls nicht immer richtig referenziert.

Je nachdem welches Problem Andreas hat, ist dieses nicht lösbar. Wobei deine Pause-Funktion eventuell etwas besser ist, da sie durch den Aufbau dazu führen könnte, dass andere Threads noch weiterlaufen können. Bei $.sleep() scheint mir die komplette Verarbeitung gestoppt zu werden, was eigentlich nie etwas bringt. Das ist jetzt aber reine Spekualtion.

Falls das Problem reproduzierbar besteht bitte den Bug unter:

https://www.adobe.com/...ex.cfm?name=wishform

posten. Vielleicht löst Adobe dann dieses lästige Problem!

Grüße,
Gregor
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com

"afterOpen", Event ?

Martin Fischer
  
Beiträge gesamt: 12783

7. Dez 2011, 08:17
Bewertung:

gelesen: 8251

Beitrag als Lesezeichen
Hallo Gregor,

Antwort auf: ich hätte jetzt für Pause $.sleep(TimeInMs) vorgeschlagen.

Ich war knapp dran, auch $.sleep() vorzuschlagen, war mir dann aber spontan unsicher, ob der Core JavaScript Befehl möglicherweise ESKT anstößt, was ich mit dem veröffentlichten Funktionscode (aus fremder Quelle) zu umgehen versuchte.

$.sleep() funktioniert freilich auch.
Vermutlich sogar genau so, wie die obige Funktion (also kein Gewinn/Verlust hinsichtlich der Aufgabenstellung).

Antwort auf: Bspw. hatte ich hier einen Fall, das eine IDML-Datei nach afterOpen noch nicht gespeichert werden konnte. Die Fehlermeldung war, dass noch nicht alle Transaktionen abgeschlossen waren.
Hier im Forum hatten wir ein ähnliches Phänomen mit der Eigenschat allGraphics, die ebenfalls nicht immer richtig referenziert.


Hast Du eine Idee, was alles zwischen
a) beforeOpen (document) und afterOpen (document) und zwischen
b) afterOpen(document) und afterOpen (layoutWindow) passiert?

Habe letzthin ein Logger-Skript entwickelt, das die Dauer des Öffnenvorgangs von Dokumenten unter unterschiedlichen Bedingungen (Links lokal oder auf Server, unterschiedliche Stati) protokolliert. Dabei konnte ich zumindest feststellen, dass die Überprüfung der Schriften und der Links zwischen beforeOpen (document) und afterOpen (document) stattfindet.
Geht es in der Phase zwischen afterOpen (document) und afterOpen (layoutWindow) nur ums Rendern des Inhalts des Layoutfensters?


Übrigens wollte es mir in CS5 nicht gelingen, mit beforeOpen (document) Fehlermeldungen bzgl. Schriften und Links zu unterdrücken, um die Bremse der damit verbundenen Dialoge, die einen Benutzereingriff erfordern, zu umgehen.

Den Zustand des UserInteractionLevels habe ich mir vor und nach dem Unterdrücken der Benutzerinteraktion beim beforeOpen-Event (document) angeschaut. Die Zustandsmeldungen entsprachen der Erwartung; die Wirkungen (das Ergebnis) allerdings nicht: die Fehlermeldungen ließen sich nicht unterdrücken.
Code
#targetengine "session"  

app.addEventListener( "beforeOpen", zeitStoppenEin);
app.addEventListener( "afterOpen", zeitStoppenAus);


function zeitStoppenEin(myEvent)
{
alert( 'beforeOpen (' + myEvent.parent.constructor.name + ') – vor Unterdrückung: ' + app.scriptPreferences.userInteractionLevel );
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
alert( 'beforeOpen (' + myEvent.parent.constructor.name + ') – nach Unterdrückung: ' + app.scriptPreferences.userInteractionLevel );
// do something
}

function zeitStoppenAus(myEvent)
{
alert( 'afterOpen (' + myEvent.parent.constructor.name + ') – vor Reaktivierung: ' + app.scriptPreferences.userInteractionLevel );
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
alert( 'afterOpen (' + myEvent.parent.constructor.name + ') – nach Reaktivierung: ' + app.scriptPreferences.userInteractionLevel );
// do something
}


Hab auch mal auf das Wiederherstellen der Interaktion bei afterOpen (document) bzw. afterOpen (layoutWindow) verzichtet.
Es will mir nicht gelingen, bei diesem Event-Skript die Fehlermeldungen bzgl. Schriften und Verknüpfungen zu unterdrücken.

Hast Du eine Idee, wie man diese Blockade durch die Fehlermeldungen mit der Notwendigkeit eines Benutzereingriffs umgehen könnte?

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 7. Dez 2011, 08:30 geändert)

"afterOpen", Event ?

gfellenz
Beiträge gesamt: 121

7. Dez 2011, 15:06
Bewertung:

gelesen: 8192

Beitrag als Lesezeichen
Hallo Martin,

was genau passiert weiß ich leider auch nicht. Bis jetzt habe ich die Namen interpretiert und getestet ob das gewünschte erreicht wird - mit nicht immer befriedigendem Ergebnis wie wir inzwischen wissen.

Zur Frage des Benutzereingriffs: Eine andere Idee habe ich leider auch nicht. Wobei ich nicht ganz verstehe was du willst: Du willst nicht global den UserInteractionLevels setzen, sonder nur die Fehlermeldungen bzgl. Schriften und Links nicht mehr anzeigen?

Grüße,
Gregor
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com

"afterOpen", Event ?

Martin Fischer
  
Beiträge gesamt: 12783

7. Dez 2011, 16:50
Bewertung:

gelesen: 8173

Beitrag als Lesezeichen
Hallo Gregor,

Antwort auf: Du willst nicht global den UserInteractionLevels setzen, sonder nur die Fehlermeldungen bzgl. Schriften und Links nicht mehr anzeigen?


Die Aufgabe lautet: Messung der Dauer des Öffnen-Vorgangs von Dokumenten.

Die Absicht: Anhand des Vergleichs von verschiedenen Parametern (Zahl, Status, Prüfung, Lage/Pfad der Links ...) in einer Liste soll ein Zusammenhang zwischen bestimmten Bedingungen und der Dauer/Langsamkeit des Öffen-Vorgangs ermittelt werden.

Das Problem: Öffnet ein Anwender ein Dokument und geht erst mal einen Kaffee trinken, weil er um die Wartezeit weiß, kann es sein, dass eine Fehlermeldung, die vom Benutzer weggeklickt werden muss, die ermittelte Zeit beim Öffnen eines Dokuments deutlich verfälscht; zumal diese Störung in der Liste nicht festgehalten wird/werden kann.

Das Ziel ist also, eine Störung des regulären Öffnen-Vorgangs durch eine Meldung über fehlende Schriften, fehlende oder nicht aktuelle Verknüpfungen und fehlende Plugins möglichst zu unterdrücken.
Außerhalb des Messbereichs von beforeOpen und afterOpen sollen jedoch Meldungen möglich sein.

Viele Grüße
Martin


"afterOpen", Event ?

gfellenz
Beiträge gesamt: 121

7. Dez 2011, 17:58
Bewertung:

gelesen: 8156

Beitrag als Lesezeichen
Hey Martin,

mit scriptPreferences.userInteractionLevel setzt du fest, wie InDesign sich während des Skript-Ablaufs verhält. Ein Skript läuft aber beim Öffnen nicht, sondern nur während der Event Phase. Für deine Anwendung musst du den Öffnen-Menüeintrag überschreiben. In etwa so:

Code
#targetengine session 

app.menus.item("$ID/Main").submenus.item("$ID/&File").menuItems.item("$ID/kPMOpenDocTextKey").associatedMenuAction.addEventListener ("beforeInvoke", zeitStoppenEin);
app.addEventListener( "afterOpen", zeitStoppenAus);

function zeitStoppenEin(myEvent) {
myEvent.preventDefault();
myEvent.stopPropagation ()
var _file = File.openDialog("InDesign ... "); // ++ Filter etc.
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
$.hiresTimer // Reset
app.open(_file);
}

function zeitStoppenAus(myEvent) {
if (myEvent.constructor.name == "LayoutWindow") {
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
$.writeln("aus: " + $.hiresTimer)
}
}


Keine Garantie, habe es nur kurz getestet.

Funktioniert natürlich nur, wenn der Benutzer immer mit Befehl+O oder dem entsprechenden Menüeintrag öffnet. Bei Drag&Drop oder Doppelklick geht das nicht.

Grüße,
Gregor
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com

"afterOpen", Event ?

Martin Fischer
  
Beiträge gesamt: 12783

8. Dez 2011, 08:41
Bewertung:

gelesen: 8126

Beitrag als Lesezeichen
Hallo Gregor,

prima, so funktioniert es!

Zumindest beim Öffnen über den Menüeintrag.
So könnte man etwa während der Testphase entscheiden, ob das Öffnen protokolliert werden soll oder nicht und entsprechend die Dateien über's Menü üffnen oder durch Doppelklick im Finder.

Danke für den Hinweis und die Skizze.

---
edit:
Auch der $.hiresTimer kommt mir gelegen. ;-)

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 8. Dez 2011, 08:56 geändert)