Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03134.jsonl.gz/835

ich habe ein Script erstellt, dass mir Texte aus einer Word-Datei positioniert und anhand den Spaltenvorgaben der aktuellen Seiten als einzelne miteinander verketteten Textblöcke positioniert. So weit, so schön ...
Allerdings greife ich die Seite, auf der mit dem Positionieren angefangen werden soll, über app.activeWindow.activePage ab, was zu keinem befriedigenden Ergebnis führt, da ID und ich unterschiedliche Ansichten über das Thema haben.
Mir wäre es am liebsten, dass ich mit der Maus auf eine beliebige Seite klicke und das Script dann dort startet. Derzeit ist es so, dass ID die Seite nimmt, die (frei übersetzt) am "meisten vorne" ist. Auch mit rechts und links gibt es Probleme.
Nun die Frage: Gibt es einen Eventhandler oder ähnliches, über dessen Eigenschaften/Funktionen man den letzten Klick abfragen kann?
Das Skript erstellt temporär einen Rechteckrahmen, der als IDMS-Datei exportiert wird und anschließend in die Placegun geladen wird. Klickst Du nun auf eine Seite wird dort der Rahmen erstellt. Die Seite ist direkt auslesbar über app.selection[0].parentPage. ***** Mit herzlichem Gruß, Uwe Laubender
Wie halte ich mein Script an, bis die PlaceGun positioniert wurde?
Bei Dateipositionierungen kann ich über true/false abfragen. Derzeit wird zwar meine PlaceGun geladen, aber im Hintergund arbeitet mein Script weiter und will auf das rectangle zugreifen, das sich aber noch in der PlaceGun befindet.
Gute Frage. Wie wär's mit einem eventlistening-Mechanismus, der nach afterPlace schaut? Das Objekt in der placegun könnte einen speziellen Namen enthalten, falls sich der Anwender entscheidet nach dem Skriptstart noch mehr Objekte zu laden. ***** Mit herzlichem Gruß, Uwe Laubender
Habe mich jetzt mal mit den EventListenern beschäftigt und es so gelöst:
Hierzu gleich wieder zwei Fragen: 1) Wie kann ich das ohne diese globale Variable lösen? Würde eigentlich gerne die Listener-ID in die aufgerufene Funktion übergeben. 2) Kann man eine targetEngine zurücksetzen?
so ganz habe ich die Funktion Deined Skriptes nicht verstanden, und Dein Listener wird am Ende nicht gelöscht.
Ich habe Deinen Code etwas umgeschrieben:
Ich erzeuge in der Funktion PlaceGunTest ein Object mit Constructor, der Deinen Code ausführt und die Methode removeListener zum Löschen des Listeners zur Verfogung stellt. Damit ereiche ich, dass alle Variablen innerhalb des Objektes sichtbar sind und Methode removeListener von außen aufzurufen ist.
erzeugt ein neues Objekt in placeGunText und führt den Constructorbereich aus.
entfernt den eventListener,
sollte den Speicher bei der nächsten Ausführung des Garbage Collectors wieder freigeben.
Meines Wissens nach nur durch Neustart von InDesign. HTH
Hallo Werner, Danke erstmal und ich habe das mal ausprobiert. Bei Deinem Vorschlag wird in der ESTK-Konsole zwar "Constructor executed" ausgegeben, nicht aber "Aufruf des weiteren Teils nach der Platzierung". Deutet für mich darauf hin, dass die Funktion listenerTest nicht ausgeführt wird. In dieser will ich aber den ganzen anderen Kram nach der Positionierung ausführen.
weg! ;-) Und wenn Du wirklich nur die Seite brauchst, kann man da natürlich noch einiges verbessern. Der Listener darf erst entfernt werden, wenn die Platzierung erfolgt ist. Ich würde ihn also nur einmal laden und erst entfernen, wenn die komplette Arbeit abgeschlossen ist.
das platzierte Objekt ist bei mir selectiert, Du kannst also app.selection[0] einen Namen, oder besser ein Label zuweisen. Mit dem hinzufügen eines Labels kannst Du auch mehrere Informationen hinterlassen.
Irgendwie habe ich geahnt, dass diese Listener-Nummer wieder komplizierter wird als erhofft.
Bei folgendem Code wird nur ausgegeben: "Fertig mit Hauptprogramm"
Offensichtlich ist das Script nicht geeignet, in die mit afterPlace aufgerufene Funktion listenerTest zu gehen. Wäre dem so, sollte ja zumindest "Aufruf des weiteren Teils nach der Platzierung" ausgegeben werden.
Hat jemand eine Ahnung, was ich falsch gemacht habe?
"nicht gelesen" trifft es nicht, "nicht verstanden" war es leider :-)
Wenn ich Dein Script in einem frisch gestarteten ID in einem neuen Dokument laufen lasse, bekomme ich die Meldung:
"Ein angehängtes Script hat den folgenden Fehler verursacht:Die angeforderte Aktion konnte nicht ausgeführt werden, da das Objekt nicht mehr existiert. Möchten Sie diesen Ereignis-Handler deaktivieren?""
Weiterhin interessant ist der Ablauf: - Das Script läuft im ersten Teil durch. - Ich habe eine geladene PlaceGun, die ich positioniere. - Es kommt im ID der Fehler, den ich wegclicke. - Danach habe ich wieder eine geladene PlaceGun, die ich positinieren kann. - Im Estk wird der Wert der ersten PlaceGun ausgegeben. - Danach habe ich drei Rectangles auf der Seite, wo eigentlich keins mehr sein sollte.
Da ich den Aufbau nicht verstehe, wage ich mich auch nicht an die Fehlersuche.
Warum läuft denn bei Dir das Script korrekt?
Um den Sinn nocheinmal konkret zu formulieren: Ich möchte für den weiteren ABlauf im ID nur wissen, auf welcher Seite an welcher Position der Anwender geklickt hat. Die Rectangles brauche ich nicht.
So leid es mir tut, ich habe den weiteren Ablauf immer noch nicht begriffen! Zuerst einmal, Thema dieses Feeds ist: Auf welche Seite wurde zuletzt geklickt? In Deinem Beispiel fragst Du aber auch die Position des Rechtecks ab. Willst Du also nur die Seite, oder auch die genau Position wissen? Wie willst Du das Ergebnis auswerten und weiterverarbeiten? Zur Zeit gehe ich davon aus, dass Du eine ganze Reihe von Klicks auswerten willst, deshalb liefere ich ein Ergebnis und lade die PlaceGun neu und warte auf den nächsten Klick. Dieses warten musst Du explizit durch den Aufruf der Methode cleanUp() beenden. Auch das Beenden von InDesign räumt auf.
Bei mir passiert das nicht, das müssten wir dann mal im SingleStep-Verfahren und mit einem Errorhandler einkreisen. - Die Fehlermöglichkeiten sind beinahe unendlich groß und müssen gezielt abgefangen werden. Ursache könnten die Voreinstellungen sein.
Wie so oft in InDesign könnte es sein, dass der Eventhandler nach einer Platzierung mehrfach aufgerufen wird, in solch einem Fall muss der Eventhandler so etwas gezielt verhindern. Um das Problem weiter einzukreisen wäre Deine InDesign-Datei hilfreich. Außerdem sollten wir das Skript mit unterschiedlichen InDesign-Versionen prüfen. Auf jeden Fall muss ich zuerst einmal den ganzen Ablauf Deiner Aufgabe verstehen. Muss Dein Skript auf eine Anwenderaktion reagieren, oder benötigst Du nur eine sichere Methode der Erkennung, auf welcher Seite Du gerade stehst? Im letzteren Fall würde doch eigentlich die parentPage der aktuellen Selektion ausreichen, oder?
1) Wenn ich das letzte Skript laufen lasse, wird im ESTK nie ausgegeben "Constructor executed". Also läuft die Funktion AfterSelectionChanged nie zu Ende.
2) Der PlaceGun-Handler ist danach immer aktiv.
3) Diesen Thread habe ich mit der Frage gestartet "Aufwelche Seite wurde zuletzt geclickt?". Durch eine Idee von Uwe bin ich da drauf gekommen, auch noch die Position des Clicks abzufragen.
Ich möchte nicht, dass anch jedem Positionieren das Script ausgeführt wird. Ich will nur nach Aufruf des Scripts ein weiteres Script aufrufen, dass mir auf der Seite an einer bestimmten Stelle ein Word-Doc positioniert. Mit diesem mache ich dann bestimmte Dinge: - Doppelte Leerzeichen entfernen - Richtige Gedankenstriche und Anführungszeichen einsetzen. - Im Word-Doc eingebettete Bilder unembedden, an bestimmter Stelle abspeichern und an der ursprünglichen Stelle wieder einsetzen. Alle letztgenannten Punkte funktionieren problemlos.
Durch Uwe bin ich darauf gekommen, dass ich das Word-Doc nicht nur auf einer bestimmten Seite sondern auch in einer bestimmten Spalte und mit einem definierten Versatz von oben beginnen lassen könnte.
Kurz gesagt brauche ich eine Funktion, die ich wahlweise aufrufen kann und die danach wieder deaktiviert wird. Als Ergebnis brauche ich diese Parameter: - Seite - x-Wert - y-Wert
Ich ging davon aus, dass Du viele Dateien automatisch nacheinander abarbeiten woltest. Aber offensichtlich willst Du nur immer eine Datei bearbeiten. Ich denke, dass Du dafür eigentlich keinen Eventhandler benötigst, denn Du musst ja in diesem Fall jedesmal ein Skript starten. Dennoch mache ich jetzt mal mit Deinem Ansatz weiter:
Ein Problem bleibt aus meiner Sicht übrig: Das platzierte Objekt kann leider nicht im Listener gelöscht werden.