Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Auf welche Seite wurde zuletzt geklickt?

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

4. Jan 2019, 15:12
Bewertung:

gelesen: 5139

Beitrag als Lesezeichen
Hallo HDS,

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?

Fragt sich und Euch ...

Peter

Auf welche Seite wurde zuletzt geklickt?

Uwe Laubender
Beiträge gesamt: 5316

4. Jan 2019, 15:37
Bewertung:

gelesen: 5123

Beitrag als Lesezeichen
Hallo Peter,
Idee:

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

Auf welche Seite wurde zuletzt geklickt?

Martin Fischer
  
Beiträge gesamt: 12778

4. Jan 2019, 16:22
Bewertung:

gelesen: 5107

Beitrag als Lesezeichen
Hallo Uwe,

Antwort auf: Das Skript erstellt temporär einen Rechteckrahmen, der als IDMS-Datei exportiert wird und anschließend in die Placegun geladen wird.


Coole Idee!
Im Prinzip kann der Text der Worddatei gleich da rein importiert werden.
Das behalte ich mir im Hinterkopf.

IDMS scheint heute Dein Thema zu sein. Smile

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 4. Jan 2019, 16:28 geändert)

Auf welche Seite wurde zuletzt geklickt?

Uwe Laubender
Beiträge gesamt: 5316

4. Jan 2019, 16:29
Bewertung:

gelesen: 5100

Beitrag als Lesezeichen
Genausogut könntest Du als Auswahlwerkzeug das Seitenwerkzeug nehmen.
app.selection[0] gibt dann die ausgewählte Seite zurück.

Falls Du auf einer Auswahl der Seite im Seitenmenü bestehst, dann schau' Dir mal meine Beiträge zum Thema im amerikanischen InDesign-Scripting-Forum an:

Correct Answer 6. Re: active page vs selected page
Laubender Jan 15, 2017 4:54 PM (in response to Laubender)
https://forums.adobe.com/message/9264014#9264014

Mit InDesign CS6, und nur mit CS6, gibt's eine saubere Lösung:

4. Re: active page vs selected page
Laubender Jan 13, 2017 11:53 AM (in response to Laubender)
https://forums.adobe.com/message/9259728#9259728
*****
Mit herzlichem Gruß,
Uwe Laubender

Auf welche Seite wurde zuletzt geklickt?

Martin Fischer
  
Beiträge gesamt: 12778

4. Jan 2019, 16:34
Bewertung:

gelesen: 5099

Beitrag als Lesezeichen
Allerdings gibt es auch den Befehl "app.activeDocument.placeGuns.loadPlaceGun(FILE)".

Warum nicht gleich auf diese Weise laden, sondern über den IDMS-Umweg?

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 4. Jan 2019, 16:37 geändert)

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

4. Jan 2019, 16:36
Bewertung:

gelesen: 5097

Beitrag als Lesezeichen
Und noch eine Frage:

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.

Auf welche Seite wurde zuletzt geklickt?

Martin Fischer
  
Beiträge gesamt: 12778

4. Jan 2019, 16:47
Bewertung:

gelesen: 5087

Beitrag als Lesezeichen
Antwort auf: Wie halte ich mein Script an, bis die PlaceGun positioniert wurde?


Theoretisch kannst Du den Status "placeGuns.loaded" abfragen.

Praktisch kannst Du das Skript aber nach dem Laden der PlaceGun nicht unterbrechen, um zwischenrein 'was abzulegen und dann mit dem Skript fortzufahren - oder doch?

Viele Grüße
Martin


Auf welche Seite wurde zuletzt geklickt?

Uwe Laubender
Beiträge gesamt: 5316

4. Jan 2019, 16:47
Bewertung:

gelesen: 5084

Beitrag als Lesezeichen
Antwort auf: Und noch eine Frage:
Wie halte ich mein Script an, bis die PlaceGun positioniert wurde?…


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

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

4. Jan 2019, 17:14
Bewertung:

gelesen: 5074

Beitrag als Lesezeichen
Antwort auf:
Antwort auf: Wie halte ich mein Script an, bis die PlaceGun positioniert wurde?


Theoretisch kannst Du den Status "placeGuns.loaded" abfragen.

Praktisch kannst Du das Skript aber nach dem Laden der PlaceGun nicht unterbrechen, um zwischenrein 'was abzulegen und dann mit dem Skript fortzufahren - oder doch?


Das wäre unschön, da diese Word-Positioniererei halt x-mal am Tag durchgeführt wird. Hatte es gerade mal so probiert:

Code
	app.activeDocument.placeGuns.loadPlaceGun(snippetFile); 
while(app.activeDocument.placeGuns.loaded) {
var i = 1; //mach irgendwas
}


Das funktioniert aber nicht, da der Zustand trotz Klicks in ID sich nicht ändert. ESTK bleibt dann in der while-Schleife hängen.

Werde mich wohl, wie von Uwe vorgeschlagen, mit Event-Listener beschäftigen müssen ... hrmpf!

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

5. Jan 2019, 15:33
Bewertung:

gelesen: 4963

Beitrag als Lesezeichen
Habe mich jetzt mal mit den EventListenern beschäftigt und es so gelöst:

Code
#target indesign-10 
#targetengine "mySession"

var gO = {};

main();

function main() {
var newRect = app.activeWindow.activePage.rectangles.add();
var rectFile = File("~/Desktop/rec.idms")
newRect.exportFile(ExportFormat.INDESIGN_SNIPPET, rectFile);
newRect.remove();
gO.placeGunListenerID = app.activeDocument.eventListeners.add("afterPlace", listenerTest).id;
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
$.writeln("Fertig mit Hauptprogramm");
}

function listenerTest () {
$.writeln("Aufruf des weiteren Teils nach der Platzierung");
if(app.activeDocument.eventListeners.itemByID(gO.placeGunListenerID).isValid) {
app.activeDocument.eventListeners.itemByID(gO.placeGunListenerID).remove();
}
}


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?

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

5. Jan 2019, 17:12
Bewertung:

gelesen: 4949

Beitrag als Lesezeichen
Moin Peter,

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:

Code
  
#target indesign-13
#targetengine "mySession"

placeGunTest = new PlaceGunTest();
alert(placeGunTest);
placeGunTest.removeListener();
placeGunTest = undefined;
PlaceGunTest = undefined;
alert(PlaceGunTest==undefined);
alert(placeGunTest==undefined);
/*Object*/function PlaceGunTest()
{
var /*Rectangle*/newRect = app.activeWindow.activePage.rectangles.add(),
/*File*/rectFile = File("~/Desktop/rec.idms"),
/*Int*/placeGunListener;
newRect = app.activeWindow.activePage.rectangles.add();
newRect.exportFile(ExportFormat.INDESIGN_SNIPPET, rectFile);
newRect.remove();
/*EventListener*/placeGunListener = app.activeDocument.eventListeners.add("afterPlace", listenerTest);
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
$.writeln("Constructor executed");
function listenerTest () {
$.writeln("Aufruf des weiteren Teils nach der Platzierung");
}
this.removeListener = function(){
if(placeGunListener != null)
placeGunListener.remove();
}
}


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.
Code
placeGunTest = new PlaceGunTest(); 


erzeugt ein neues Objekt in placeGunText und führt den Constructorbereich aus.
Code
placeGunTest.removeListener(); 


entfernt den eventListener,
Code
placeGunTest = undefined; 
PlaceGunTest = undefined;


sollte den Speicher bei der nächsten Ausführung des Garbage Collectors wieder freigeben.
Antwort auf: Kann man eine targetEngine zurücksetzen?


Meines Wissens nach nur durch Neustart von InDesign.
HTH

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

5. Jan 2019, 17:20
Bewertung:

gelesen: 4946

Beitrag als Lesezeichen
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.

Viele Grüße

Peter

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

5. Jan 2019, 17:31
Bewertung:

gelesen: 4942

Beitrag als Lesezeichen
Hallo Peter,

dann lass mal die Zeile
Code
placeGunTest.removeListener 


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.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

5. Jan 2019, 17:46
Bewertung:

gelesen: 4932

Beitrag als Lesezeichen
Antwort auf:
Antwort auf: Und noch eine Frage:
Wie halte ich mein Script an, bis die PlaceGun positioniert wurde?…


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.


Hallo Uwe,

wie weise ich denn dem platzierten Objekt einen Namen zu oder kann es identifizieren?

Das Resultat aus loadPlaceGun ist undefined und ich kann der Funktion nur die Datei und true/false für das Zeigen des Öffnen-Dialogs übergeben.

Viele Grüße

Peter

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

5. Jan 2019, 18:05
Bewertung:

gelesen: 4921

Beitrag als Lesezeichen
Peter,

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.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

5. Jan 2019, 18:07
Bewertung:

gelesen: 6981

Beitrag als Lesezeichen
Habe es gerade noch etwas anders gelöst:

Das erzeugte Rectangle bekommt irgendeinen kryptischen eindeutigen Namen, bevor ich es als IDMS exportiere. Darüber finde ich es auch nach dem Rückimport zuverlässig wieder.

Komisch, dass die PlaceGun einem das nicht automatisch als Wert zurückgibt.

Danke trotzdem :-)

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

5. Jan 2019, 18:13
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
Hallo Peter,

so weit ich das verstanden habe, ist das Rechteck doch nur ein Hilfsmittel.

Deshalb würde ich es nur einmal exportieren und dann immer wieder laden.

Oder, wenn Du die Anzahl der zu platzieren Dateien im voraus kennst, könntest Du es gleich in ausreichender Zahl laden.

Dann müsstest Du aber tatsächlich den Namen oder das Label erst nach der Platzierung hinzufügen.

Aber ich habe wirklich keine Ahnung, was Du da genau machen willst.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

6. Jan 2019, 00:36
Bewertung:

gelesen: 6956

Beitrag als Lesezeichen
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?


Code
#target indesign-10 
#targetengine "mySession3"

var gO = {};

main();

function main() {
var newRect = app.activeWindow.activePage.rectangles.add();
newRect.name = "myRectangleForExportImport";
var rectFile = File("~/Desktop/rec.idms")
newRect.exportFile(ExportFormat.INDESIGN_SNIPPET, rectFile);
gO.placeGunListener = app.activeDocument.placeGuns.addEventListener("afterPlace", listenerTest);
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
$.writeln("Fertig mit Hauptprogramm");
}

function listenerTest() {
$.writeln("Aufruf des weiteren Teils nach der Platzierung");
var myRect = app.activeDocument.pageItems.itemByName("myRectangleForExportImport");
if(myRect.isValid) {
$.writeln("PlaceGun wurde positioniert auf Seite " + app.selection[0].parentPage.name + " an Stelle x = " + app.selection[0].geometricBounds[1] + " / y = " + app.selection[0].geometricBounds[0]);
}
myRect.remove();
if(gO.placeGunListener.isValid) {
app.activeDocument.placeGuns.removeEventListener("afterPlace", listenerTest);
}
}

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

6. Jan 2019, 07:21
Bewertung:

gelesen: 6934

Beitrag als Lesezeichen
Moin Peter,
Antwort auf: Hat jemand eine Ahnung, was ich falsch gemacht habe?


Ja ich! :-)
Du hast meine letzten Beiträge nicht gelesen.
Versuche es mal so:
Code
  
#target indesign-13
#targetengine "mySession"

placeGunTest = new PlaceGunTest();
// alert(placeGunTest);

/*Object*/function PlaceGunTest(){
var /*Rectangle*/newRect = app.activeWindow.activePage.rectangles.add(),
/*File*/rectFile = File("~/Desktop/rec.idms"),
/*EventListener*/placeGunListener = app.activeDocument.eventListeners.add("afterPlace", listenerTest);
newRect.exportFile(ExportFormat.INDESIGN_SNIPPET, rectFile);
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
$.writeln("Constructor executed");

function listenerTest () {
$.writeln("Aufruf des weiteren Teils nach der Platzierung");
newRect = app.activeWindow.activePage.rectangles.add()
newRect.remove();
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
// this.activePage = newRect.parentPage; // use this to get last parentPage outside of object in same session
$.writeln(
"Aufruf des weiteren Teils nach der Platzierung:\n" +
app.selection[0].parentPage.name + " an Stelle x = " +
app.selection[0].geometricBounds[1] + " / y = " +
app.selection[0].geometricBounds[0]
);
newRect.remove();
}
this.removeListener = function(){
if(placeGunListener != null)
placeGunListener.remove();
}
this.cleanUp = function(){
this.removeListener();
app.activeDocument.placeGuns.abortPlaceGun();
}
}
[b]// execute this AFTER getting Page or AFTER done whole work!
[b]/*
[b] placeGunTest.cleanUp();
[b] delete $.global.placeGunTest
*/


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

6. Jan 2019, 09:47
Bewertung:

gelesen: 6921

Beitrag als Lesezeichen
Hallo Werner,

"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.

Viele Grüße

Peter

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

6. Jan 2019, 10:29
Bewertung:

gelesen: 6917

Beitrag als Lesezeichen
Moin Peter,

Antwort auf: 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.


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.
Antwort auf: "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?""


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.
Antwort auf: Danach habe ich drei Rectangles auf der Seite, wo eigentlich keins mehr sein sollte.


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?

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

6. Jan 2019, 10:46
Bewertung:

gelesen: 6913

Beitrag als Lesezeichen
Hallo Peter,

gerade habe ich gesehen, dass es tatsächlich noch einen Fehler bei Löschen des Rahmens gab.
Also noch einmal:
Code
  
#target indesign-13
#targetengine "mySession"

placeGunTest = new PlaceGunTest();
// alert(placeGunTest);

/*Object*/function PlaceGunTest(){
var /*Rectangle*/newRect = app.activeWindow.activePage.rectangles.add(),
/*File*/rectFile = File("~/Desktop/rec.idms"),
/*EventListener*/placeGunListener = app.activeDocument.eventListeners.add("afterPlace", listenerTest);
newRect.exportFile(ExportFormat.INDESIGN_SNIPPET, rectFile);
newRect.remove();
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
$.writeln("Constructor executed");

function listenerTest () {
$.writeln("Aufruf des weiteren Teils nach der Platzierung");
app.activeDocument.placeGuns.loadPlaceGun(rectFile);
// this.activePage = newRect.parentPage; // use this to get last parentPage outside of object in same session
$.writeln(
"Aufruf des weiteren Teils nach der Platzierung:\n" +
app.selection[0].parentPage.name + " an Stelle x = " +
app.selection[0].geometricBounds[1] + " / y = " +
app.selection[0].geometricBounds[0]
);
}
this.removeListener = function(){
if(placeGunListener != null)
placeGunListener.remove();
}
this.cleanUp = function(){
this.removeListener();
app.activeDocument.placeGuns.abortPlaceGun();
}
}
// execute this AFTER getting Page!
/*
placeGunTest.cleanUp();
delete $.global.placeGunTest
*/


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

6. Jan 2019, 11:24
Bewertung:

gelesen: 6905

Beitrag als Lesezeichen
Hallo Peter,

für den Fall, dass parentPage reicht, könnte auch dies funktionieren:

Code
  
// AFTER_SELECTION_CHANGED
#target indesign-13
#targetengine "mySession"

afterSelectionChanged = new AfterSelectionChanged();

/*Object*/function AfterSelectionChanged(){
var/*EventListener*/ afterSelectionChangedListener = app.activeDocument.eventListeners.add("afterSelectionChanged", listenerTest);
this.page = null;
$.writeln("Constructor executed");

function listenerTest () {
if (app.selection.length > 0)
this.page = wpsGetParentPageOfObjectIfPossible(app.selection[0]);
else
this.page = null;
if (this.page != null){
$.writeln(
"Aufruf des weiteren Teils nach der Platzierung:\nSeite: " +
app.selection[0].parentPage.name
)
}
app.selection[0] = NothingEnum.NOTHING;
}
this.removeListener = function(){
if(afterSelectionChangedListener != null)
afterSelectionChangedListener.remove();
}
/*page*/function wpsGetParentPageOfObjectIfPossible(/*object*/o)
{
try
{
var /*String*/whatIsIt = null, /*Page*/parentPage = null;

if (o === undefined)
return null;
if (o === null)
return null;
if (!(o.isValid))
return null;

if ("parentPage" in o)
return o.parentPage;

parentPage = (("parentTextFrames" in o) && (o.parentTextFrames.length >0)) ? o.parentTextFrames[0].parentPage : null;

if (parentPage != null)
return parentPage;

while (o != null)
{
if ("parentPage" in o)
return o.parentPage;
var whatIsIt = o.constructor;
switch (whatIsIt) {
case Page : return o;
case Character : o = o.parentTextFrames[0]; break;
case Footnote :; // drop through
case Cell : o = o.insertionPoints[0].parentTextFrames[0]; break;
case Note : o = o.storyOffset.parentTextFrames[0]; break;
case XMLElement : if (o.insertionPoints[0] != null) { o = o.insertionPoints[0].parentTextFrames[0]; break; }
case Application : return null;
default: o = o.parent;
}
if (o == null) return null;
}
return o
}
catch (error)
{
alert(error.message + "\nin File: " + error.fileName + "\nZeile: " + error.line);
// throw error;
}
return null;
}
}
// execute this AFTER getting Page!
/*
afterSelectionChanged.removeListener();
delete $.global.removeListener
*/


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

peterhenrich
Beiträge gesamt: 139

6. Jan 2019, 14:59
Bewertung:

gelesen: 6867

Beitrag als Lesezeichen
Vielen Dank, dass Du Dir so eine Mühe machst.

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

Den Rest mache ich dann weiter mit meinem Script.

Auf welche Seite wurde zuletzt geklickt?

WernerPerplies
Beiträge gesamt: 2760

6. Jan 2019, 15:48
Bewertung:

gelesen: 6859

Beitrag als Lesezeichen
Hallo Peter,

Antwort auf: 1) Wenn ich das letzte Skript laufen lasse, wird im ESTK nie ausgegeben "Constructor executed". Also läuft die Funktion AfterSelectionChanged nie zu Ende.


Kein Bug, sondern Feature!

Antwort auf: 2) Der PlaceGun-Handler ist danach immer aktiv.


Kein Bug, sondern Feature!

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:
Code
  
#target indesign-13
#targetengine "mySession"

placeGunTest = new PlaceGunTest();
delete $.global.placeGunTest;

/*Object*/function PlaceGunTest(){
var /*Rectangle*/newRect = app.activeWindow.activePage.rectangles.add(),
/*File*/rectFile = File("~/Desktop/rec.idms"),
/*EventListener*/placeGunListener = app.activeDocument.eventListeners.add("afterPlace", listenerTest),
/*Object*/resultO = null;
newRect.exportFile(ExportFormat.INDESIGN_SNIPPET, rectFile);
newRect.remove();
app.activeDocument.placeGuns.loadPlaceGun(rectFile);

function listenerTest () {
resultO = {pageName: app.selection[0].parentPage.name, x: app.selection[0].geometricBounds[1], y: app.selection[0].geometricBounds[0]};
doThingsToDo(resultO);
cleanUp();
}
function removeListener(){
if(placeGunListener != null)
placeGunListener.remove();
}
function cleanUp(){
removeListener();
app.activeDocument.placeGuns.abortPlaceGun();
}
/*Void*/function doThingsToDo(/*Object*/resultO)
{
$.writeln(
"Aufruf des weiteren Teils nach der Platzierung:\nSeitennummer: " +
resultO.pageName + " an Stelle x = " + resultO.x + " / y = " + resultO.x
);
}
}


Ein Problem bleibt aus meiner Sicht übrig:
Das platzierte Objekt kann leider nicht im Listener gelöscht werden.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Auf welche Seite wurde zuletzt geklickt?

Uwe Laubender
Beiträge gesamt: 5316

10. Jan 2019, 20:44
Bewertung:

gelesen: 6579

Beitrag als Lesezeichen
Hallo Peter,
frisch aus dem amerkanischen InDesign-Scripting-Forum ein Beitrag zum Thema von Andreas Jansson:

When on a spread, ActivePage returns the page that is most exposed
Andreas Jansson Jan 10, 2019 3:00 PM
https://forums.adobe.com/...ge/10860810#10860810

Zitat According to the Object Model Viewer, LayoutWindow.activePage is said to return "The front-most page." I could not make any sense out of that sentence.

It seems to work this way:

When you are on a spread, activePage returns the page that is most exposed, including areas to the right or left. So if I have a two-sided spread, and zoom out to see the whole spread, with the spine in the middle of the screen, activePage returns the left page if I scroll an inch to the left (getting the spine to the right of the middle), and vice versa.

It doesn't matter whether I've selected an item on one of the pages. That does not matter when it concerns activePage. I was convinced that selections mattered, but obviously not and I realize I must have used this erroneous approach for many years. Will need to pick up the parent page of the selection instead.

Just informing about this, since it may be an easy mistake to make.

Thanks,
Andreas

*****
Mit herzlichem Gruß,
Uwe Laubender