[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt zwei Seiten vertauschen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

zwei Seiten vertauschen

Uwe Laubender
Beiträge gesamt: 5314

22. Mai 2020, 13:04
Beitrag # 16 von 27
Beitrag ID: #575416
Bewertung:
(8217 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Danke euch!

Also "einfach" die Nummer zweier selectierter Seiten auslesen
so in der Art
var seiteA = app.selection[0].page.number
var seiteB = app.selection[1].page.number

und dann mit move verschieben

geht also nicht?


Hallo Jo,
Dein Code hier setzt voraus, dass die beiden Seiten mit dem Seitenwerkzeug ausgewählt sind. Eine Auswahl im Seiten-Bedienfeld wird nicht mit app.selection eingefangen.

Zudem kennt das Objekt Page keine Eigenschaft, die number heißt. Aber das wurde bereits diskutiert.

Zum Verständnis:

Über page.name bekommst Du einen String zurückgeliefert.
Über page.documentOffset eine Zahl. Die Zählung im Dokument beginnt mit der 0 für die erste Seite.

Benutzt Du die Eigenschaft name, dann ist der zurückgelieferte String möglicherweise nicht eindeutig. Es könnte sein, dass es im Dokument mehrere Seiten mit dem gleichen Namen gibt.

Also halte Dich besser an die Eigenschaft documentOffset, wenn Du eine Seite ermittelt hast; durch welches Verfahren auch immer.


als Antwort auf: [#575389]
X

zwei Seiten vertauschen

Uwe Laubender
Beiträge gesamt: 5314

22. Mai 2020, 13:59
Beitrag # 17 von 27
Beitrag ID: #575420
Bewertung:
(8206 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ahem. Nachdem ich nochmal auf den Code von Jo geschaut habe, muss ich mich verbessern:

Falls app.selection[0] tatsächlich das Objekt Page zurückgeben würde, wäre eine Seite mit dem Seitenwerkzeug ausgewählt

Da aber Jo app.selection[0].page geschrieben hatte, müsste in app.selection[0] das Dokument mit app.selection eingefangen worden sein. Das funktioniert so aber nicht.


als Antwort auf: [#575416]

zwei Seiten vertauschen

photojo
Beiträge gesamt: 38

22. Mai 2020, 14:01
Beitrag # 18 von 27
Beitrag ID: #575421
Bewertung:
(8205 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So, ich habe getestet:
1. Die Meldung "Ungültiger Wert für Parameter "reference" der Methode "move". Page or Spread erwartet, aber nothing erhalten." kommt nur, wenn die letzte Seite im Dokument getauscht werden soll.
2. Die Fehler bei der Sortierung habe ich zusammen mit der Datei hier abgelegt: https://www.dropbox.com/...schen_Forum.zip?dl=0
(Ich kann hier leider keine Dateien hochladen.)


als Antwort auf: [#575413]

zwei Seiten vertauschen

WernerPerplies
Beiträge gesamt: 2759

22. Mai 2020, 14:06
Beitrag # 19 von 27
Beitrag ID: #575423
Bewertung:
(8202 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

damit kann ich etwas anfangen und melde mich.


als Antwort auf: [#575421]

zwei Seiten vertauschen

WernerPerplies
Beiträge gesamt: 2759

22. Mai 2020, 15:15
Beitrag # 20 von 27
Beitrag ID: #575424
Bewertung:
(8196 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Also zweiter Versuch:
Code
// AFTER_SELECTION_CHANGED 
// CC 2020;
#target indesign-15.064
// CS 6 not testet!!!!!
// #target indesign-8.0
#targetengine "mySelectionChangedSession"

if ((afterSelectionChanged === undefined) || (afterSelectionChanged == null)){
var afterSelectionChanged = new AfterSelectionChanged();
if (afterSelectionChanged != null)
alert("PageExchange is active");
}
else{
afterSelectionChanged.removeListener();
afterSelectionChanged = null;
alert("PageExchange is inactive");
}

/*Object*/function AfterSelectionChanged(){
var/*EventListener*/ afterSelectionChangedListener = app.eventListeners.itemByName("PageExchange");

this.pages = [];

if (afterSelectionChangedListener != null)
afterSelectionChangedListener.remove();

afterSelectionChangedListener = app.eventListeners.add("afterSelectionChanged", listenerTest);
afterSelectionChangedListener.name = "PageExchange";

function listenerTest () {
if (app.selection.length > 0){
page = wpsGetParentPageOfObjectIfPossible(app.selection[0]);
if (page != null){
afterSelectionChanged.pages.push(page);
if (afterSelectionChanged.pages.length > 1){
exchangePages(afterSelectionChanged.pages);
}
app.selection = NothingEnum.NOTHING;
}
}
}
this.removeListener = function(){
if(afterSelectionChangedListener != null)
afterSelectionChangedListener.remove();
if ("pages" in this)
this.pages.length = 0;
}
/*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;
}
/*Boolean*/function exchangePages(){
try{
var /*Page*/p = null, /*Page*/first = afterSelectionChanged.pages[0], /*Page*/second = afterSelectionChanged.pages[1];
if (first.documentOffset === 0)
p = app.activeDocument.pages[1];

if ((first.documentOffset +1) === second.documentOffset){
second.move(LocationOptions.BEFORE,first);
}
else{
p = app.activeDocument.pages[first.documentOffset-1];
first.move(LocationOptions.BEFORE,second);
second.move(LocationOptions.AFTER,p);
}
}
catch (error){
alert(error.message);
}
afterSelectionChanged.pages.length = 0;
}
}

Viel Erfolg!


als Antwort auf: [#575421]

zwei Seiten vertauschen

photojo
Beiträge gesamt: 38

22. Mai 2020, 16:25
Beitrag # 21 von 27
Beitrag ID: #575425
Bewertung:
(8165 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner! Danke für deine Mühen!

Ich gebe mal einfach folgendes Feddback:
1. Tausch: 3 <-> 9 -> ALLES OK
2. Tausch: 9 <-> 3 -> 3 wieder bei 3, ABER 8 und 9 vertauscht

ABER: Wenn man jedoch das Skript nach Tausch 1 stoppt und erneut startet, klappt Tausch 2 auch ohne Probleme.

Ich kann damit absolut leben. Es ist ja so schon eine sehr große Erleichterung!

Herzlichen Dank und schöne Grüße
Jo


als Antwort auf: [#575424]

zwei Seiten vertauschen

WernerPerplies
Beiträge gesamt: 2759

22. Mai 2020, 17:00
Beitrag # 22 von 27
Beitrag ID: #575426
Bewertung:
(8150 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

Zitat Ich kann damit absolut leben.


Ich eigentlich nicht! :-)

Aber bei funktioniert es.

Das Problem dieses Skriptes besteht darin, dass, sobald es scharf ist, ein ziemlicher Blindflug abläuft, wenn man zum Beispiel 2x auf die gleiche Seite klickt, merkt man das nicht, aber der Speicher wird verworfen.

Auswahl, Auswahl merken, 2. Auswahl, merken, tauschen, gemerkte Auswahlen verwerfen.

Solche Situationen sorgen dafür, dass das Schreiben eines Skriptes oft nur einen kleinen Teil der Arbeitszeit ausmacht. Der Großteil der Zeit wird zu Testen der möglichen Randbedingungen benötigt, und oft reicht die Fantasie eines Einzelnen dafür nicht aus.

Uwe, Weltmeister des Testens, zu welchen Ergebnis kommst Du? :-)


als Antwort auf: [#575425]

zwei Seiten vertauschen

Uwe Laubender
Beiträge gesamt: 5314

22. Mai 2020, 19:46
Beitrag # 23 von 27
Beitrag ID: #575427
Bewertung:
(8139 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich wurde gerufen?
Komme im Moment noch zu keinem Ergebnis, da ich mich gerade um andere Dinge kümmern muss. Skandal! ;-)

Was das Auswählen von Seiten angeht, hier ein Tipp:

[1] Wechseln zum Seiten-Werkzeug.
[2] Auswahl der beiden zu tauschenden Seiten im Seiten-Bedienfeld:
Nicht zusammenhängende Seiten mit der Strg-Taste ( auf Windows ) und Klicken auf die Seitensymbole einfangen.


Dann kann ein Skript die beiden ausgewählten Seiten als:
Code
var page1 = app.documents[0].selection[0]; 

und
Code
var page2 = app.documents[0].selection[1]; 

abgreifen.


als Antwort auf: [#575426]

zwei Seiten vertauschen

WernerPerplies
Beiträge gesamt: 2759

23. Mai 2020, 18:56
Beitrag # 24 von 27
Beitrag ID: #575435
Bewertung:
(8073 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Uwe,

Zitat Ich wurde gerufen?

Ja! :-)

Zitat Was das Auswählen von Seiten angeht, hier ein Tipp:

[1] Wechseln zum Seiten-Werkzeug.
[2] Auswahl der beiden zu tauschenden Seiten im Seiten-Bedienfeld:
Nicht zusammenhängende Seiten mit der Strg-Taste ( auf Windows ) und Klicken auf die Seitensymbole einfangen.


Die Auswahl der Seiten war bisher ja mein kleinstes Problem, größer, dass die richtigen zwei Seiten ausgewählt und dann die Seiten auch richtig platziert werden.

Bei meiner bisherigen Lösung funktioniert das ja so:
Der Anwender markiert ohne optische Rückmeldung zwei Seiten und dann vertauscht das Skript diese zwei Seiten automatisch.

Das erfordert bei der Anwendung eine hohe Konzentration und führt leicht zu Fehlselektionen mit entsprechend falschen Ergebnissen.

Aber durch die Programmierung und die Rückmeldungen von Jo wurde mein Ehrgeiz gepackt und ich arbeite an der für mich ultimativen Lösung.

Mein privates Pflichtenheft sieht jetzt so aus:

1. Während des ganzen Skriptlaufes muss es optische Rückmeldungen geben.
2. Die Selektion der Seiten soll der/die Anwender/in auf die für sie/ihn bequemste Art vornehmen können.
3. Es sollen beliebig viele Seitenpaare ausgewählt werden können.
4. Der eigentliche Tauschvorgang sollte manuell gestartet werden.
5. Das Ergebnis soll nachvollziehbar sein.
6. Das Skript sollte weitgehend fehlerresistent sein.

Sobald die neue Version fertig ist, werde ich sie zur Verfügung stellen.

Zurück zu Deinem Vorschlag zur Auswahl, der zeigt, wie man eine Reihe von Seiten in der Zwischenablage sammeln kann. Das ist schon mal sehr gut!

Aber bei einer wirklich großen Anzahl von ausgewählten Seiten wird es dann wieder schwierig mit der optischen Rückmeldung.

Aber Dein Vorschlag beinhaltet für mich die perfekte Lösung:

Während ein einfaches Anklicken einer Seite kein afterSelectionChanged auslöst, wird nach Anwahl des Seitenwerkzeuges mit jedem Klick ein Event ausgelöst.

Das ist perfekt!

Ach ja, ein erster Ausblick auf meine neue Skriptversion:

WpsExchangePages


als Antwort auf: [#575427]

zwei Seiten vertauschen

photojo
Beiträge gesamt: 38

23. Mai 2020, 20:16
Beitrag # 25 von 27
Beitrag ID: #575437
Bewertung:
(8058 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen, hallo Werner!

Ich wollte durch meinen Post hier nichts lostreten. Da ich ja, wie bereits erwähnt, selber sehr viele programmiere, kann ich absolut verstehen, dass man in Sachen Usability und Errorhandling immer hohe Ansprüche hat.
Ich bin total gespannt auf dein Skript. Wenn ich zumindest, durchs Testen, einen bescheidenen Teil zu deiner Arbeit beitragen kann - gerne!

Herzliche Grüße

Jo


als Antwort auf: [#575435]

zwei Seiten vertauschen

WernerPerplies
Beiträge gesamt: 2759

24. Mai 2020, 12:16
Beitrag # 26 von 27
Beitrag ID: #575442
Bewertung:
(8006 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Jo,

so Augen zu und durch, ich habe jetzt Folgendes realisiert:

1. Nach Skriptstart erscheint ein nicht modales Dialogfenster, das während der Arbeit offen bleiben kann.

2. Es können ein oder mehrere Seitenpaare ausgewählt werden.

3. Die Seitenauswahl kann sowohl direkt in einem Eingabefeld, oder durch Klick auf auszuwählende Seiten vorgenommen werden.
Das Eingabefeld erfordert ein bestimmtes Eingabeformat, deshalb sollte zuerst ein Paar durch Selektion erzeugt werden.

Bis jetzt gefällt mir die Sache ganz gut, aber es gibt noch Schwächen, z. B. ist kein Tausch über unterschiedliche Dokument möglich.
die Meldungen müssten zur besseren AnpassbarKeit in ein eigenes Objekt ausgelagert werden.
Das Protokoll sollte in eine externe Datei exportiert werden können.

Und Euch wird da sicherlich noch einiges weitere einfallen. ;-)

Besonderheiten des Skriptes:

1. Das eigentliche Skript steckt in einem Objekt, welches sowohl private als auch öffentliche Methoden kennt.

2. Die Überwachung der Selektionen wird über einen EventHandler realisiert (AfterSelectionChanged).

3. Das Skriptfenster wird über die private Methode createNoneModalDialog erzeugt.

4. Der eigentliche Tauschvorgang steckt in der privaten Methode exChangeOnePair und erfordert eine Sonderbehandlung, wenn im Seitenpaar die erste oder letzte Seite des Dokuments enthalten ist.

So, ich denke, das ist erstmal genug Stoff.

Da das Skript inzwischen recht groß geworden ist, gibt es es nur über diesen Link:
WpsPageExchange – Skript zum Tausch von Seiten in Adobe InDesign
Dieser Link enthält ein kleines Video (mein zweites überhaupt!) und einen Link zu meinem Supportforum.

Ich hoffe, das Skript gefällt.


als Antwort auf: [#575437]

zwei Seiten vertauschen

photojo
Beiträge gesamt: 38

29. Mai 2020, 10:09
Beitrag # 27 von 27
Beitrag ID: #575512
Bewertung:
(7626 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

sorry für die verspätete Rückmeldung, ich habs irgendwie übersehen.
Danke für deinen Tipp!

Grüße
Jo


als Antwort auf: [#575416]
X