[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Reihenfolge bei der Suche

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

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

31. Jul 2011, 23:15
Beitrag # 1 von 13
Bewertung:
(5091 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

In welcher Reihenfolge wird eigentlich eine Suche .+ mit Zeichenformat x für das komplette Dokument durchgeführt?

Konkret habe ich zwei Rahmen auf Seite 1 und einen Rahmen auf Seite 2. Ich suche im Dokument und die Suche springt mir im UI zuerst in den zweiten Rahmen auf Seite 1, weil dieser wohl zuletzt gezeichnet wurde. Während das für das Zuweisen eines Formates egal ist, liefert mir aber das Skript eine falsche Reihenfolge, falls ich das Gesuchte in eine Liste schreiben möchte.

Fragen:
1. Ist das so oder mache ich einen Fehler?
2. Kann man das beeinflussen, z.B. festlegen der Rahmenreihenfolge durch Ermiteln von y1 auf der Seite?
3. Geht das einfacher?

Hier ein Auszug meiner Skriptzeilen:
Code
app.findGrepPreferences.appliedCharacterStyle = _zf;    
app.findGrepPreferences.findWhat = ".+";
var _gefunden = _dok.findGrep();

// das Gefundene sortieren
var _a = new Array();
for( var n = 0; n < _gefunden.length; n++ ) {
_a.push(_gefunden[n].contents);
}


Wenn ich mir jetzt _a in die Konsole schreibe stimmt die Reihenfolge innerhalb der Rahmen, aber nicht zwischen den Rahmen, weil die Suche nicht im ersten Rahmen beginnt.

Nachtrag: Gerade die Reihenfolge der Textrahmen durch Ausschneiden verändert. Die Suche im UI fängt trotzdem im zweiten Rahmen an. Lösche ich diesen, wird als erstes im ersten Rahmen auf Seite 2 gesucht!?

Anbei noch eine Testdatei.
edit:

(Dieser Beitrag wurde von Kai Rübsamen am 31. Jul 2011, 23:32 geändert)

Anhang:
test.idml.zip (41.4 KB)
X

Reihenfolge bei der Suche

WernerPerplies
Beiträge gesamt: 2731

1. Aug 2011, 07:48
Beitrag # 2 von 13
Beitrag ID: #477202
Bewertung:
(5057 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Ohne es selbst untersucht zu haben, würde ich vermuten, das Dein Verdacht mit der Reihenfolge der Erstellung schon stimmen könnte.

Ausschneiden und wieder Einfügen muss nicht unbedingt einer Neuerstellung entsprechen.

Lösche mal einen Rahmen und erstelle ihn komplett neu.

Vielleicht spielt ja auch die interne ID beim Suchen eine Rolle. Die wird ja von Zeit zu Zeit geändert, nach meiner Erfahrung immer beim Einlesen meiner selbst erzeugten IDMLS, eventuell in diesem Fall immer.

Außerdem würde ich blind vermuten, dass eine Suche immer komplett in verketteten Rahmen ausgeführt wird (Reihenfolge Text)

Zitat 2. Kann man das beeinflussen, z.B. festlegen der Rahmenreihenfolge durch Ermiteln von y1 auf der Seite?


Ich denke, dass Du das nicht direkt beeinflussen kannst, aber warum sortierst Du die Suchliste nicht entsprechend?

Das Suchergebnis ist doch (glaube ich) ein Insertionpoint, und damit kann man doch feststellen, wo das Suchergebnis steht.


als Antwort auf: [#477201]

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

1. Aug 2011, 10:19
Beitrag # 3 von 13
Beitrag ID: #477208
Bewertung:
(5031 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Werner, mit Theorieren aus der Luft heraus ist hier nicht geholfen. :(

Zitat Ausschneiden und wieder Einfügen muss nicht unbedingt einer Neuerstellung entsprechen.

Das entspricht nie einer Neuerstellung, ändert aber in einigen Fällen den Index.

Zu deiner ID-Vermutung: Ich hätte erwartet, dass wenn eine ID einmal am Rahmen klebt, dass diese sich dann nicht ändert. So verhält es sich zumindest in der Zusammenarbeit mit InCopy.

Zitat Ich denke, dass Du das nicht direkt beeinflussen kannst, aber warum sortierst Du die Suchliste nicht entsprechend?

Habe ich bereits gemacht. Was aber, wenn die tatsächliche Reihenfolge gewünscht wird?

Zitat Das Suchergebnis ist doch (glaube ich) ein Insertionpoint, und damit kann man doch feststellen, wo das Suchergebnis steht.

Das Suchergebnis ist z.B. object word oder text range, aber nicht Insertion Point.

Was sagen die anderen Skripter zu diesem für mich merkwürdigen Verhalten?


als Antwort auf: [#477202]

Reihenfolge bei der Suche

WernerPerplies
Beiträge gesamt: 2731

1. Aug 2011, 10:28
Beitrag # 4 von 13
Beitrag ID: #477209
Bewertung:
(5024 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

erst kommt die Theorie, dann die Arbeit, und die überlasse ich gerne Dir. ;-)

Aber ich werde mich künftig bei Deinen Fragen zurückhalten. ;-)
Zitat Zu deiner ID-Vermutung: Ich hätte erwartet, dass wenn eine ID einmal am Rahmen klebt, dass diese sich dann nicht ändert. So verhält es sich zumindest in der Zusammenarbeit mit InCopy.


Mit Erwartungen kommt man nicht weiter, sondern mit
Prüfen und Urteilen.

Zitat Habe ich bereits gemacht. Was aber, wenn die tatsächliche Reihenfolge gewünscht wird?


Na ja, wenn Du's gemacht hast, bist Du doch fertig, oder? ;-)

Nein, ernsthaft, wonach hast Du denn sortiert und welche Reihenfolge möchtest Du denn gerne.

Du musst natürlich zuerst nach der gewünschten Reihenfolge sortieren, das ist das Ergebnis meines Theoretisierens!

Zitat Das Suchergebnis ist z.B. object word oder text range


Und über das Suchergebnis kannst Du leicht alle notwendigen Informationen ermitteln, also ran an die Arbeit. ;-)


als Antwort auf: [#477208]

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

1. Aug 2011, 11:58
Beitrag # 5 von 13
Beitrag ID: #477212
Bewertung:
(5003 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vorweg: Ich habe für einen anderen User zu Übungszwecken ein Skript geschrieben. Falls hier sonst keiner eine Idee hat, hat der User eben Pech und wir können das Thema gerne beenden.

Zitat Aber ich werde mich künftig bei Deinen Fragen zurückhalten. ;-)

Solange du nicht weist was das Steuerungsbedienfeld ist oder deine Grep-Ausdrücke richtig formulierst, nehme ich dieses Angebot gerne an ;-)

Antwort auf: Nein, ernsthaft, wonach hast Du denn sortiert und welche Reihenfolge möchtest Du denn gerne.


Ich habe alphabetisch sortiert. Die Reihenfolge innerhalb der Rahmen passt ja bereits und es wäre kein Sortieren notwendig, bzw. viell. auch nicht gewünscht.

In InDesign wird eine Reihenfolge meist über den Index, bzw. das was in der Stapelreihenfolge oben liegt oder links oben nach rechts unten bestimmt. Das Vorgehen bei der Suche weicht jedoch von diesem Muster ab.


als Antwort auf: [#477209]
(Dieser Beitrag wurde von Kai Rübsamen am 1. Aug 2011, 12:00 geändert)

Reihenfolge bei der Suche

Gerald Singelmann
  
Beiträge gesamt: 6268

1. Aug 2011, 12:39
Beitrag # 6 von 13
Beitrag ID: #477217
Bewertung: ||
(4983 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Kai,

ich vermute, in der Zeit, die Werner hier zum Schwätzen verwendet hat, hätte er dir auch eben die Lösung programmieren können. So hat man halt seine Prioritäten.

Soweit ich das verstehe, brauchst du eine Routine, die die Suchergebnisse sortiert. Da das Suchergebnis ein Array ist, lässt sich das recht elegant machen. Hier eine Skizze, die nach Position auf der Seit / im Dokument sortiert.
Code
#target indesign 
main();

function main() {
var doc = app.activeDocument;

app.findTextPreferences = null;
app.findTextPreferences.findWhat = "e";

var what = doc.findText();

for (var n = 0; n < what.length; n++) {
$.writeln( what[n].words.firstItem().contents);
}

what.sort( byPosition );

$.writeln("\rsorted:\r");

for (var n = 0; n < what.length; n++) {
$.writeln( what[n].words.firstItem().contents);
}

function byPosition(a,b) {
// Falls im gleichen Textfluss, reicht der Index
if (a.parentStory.id == b.parentStory.id) {
if (a.index > b.index) return 1;
if (a.index == b.index) return 0;
return -1;
}

// Steckt eins im Übersatz?
if ( a.parentTextFrames.length == 0 && b.parentTextFrames.length == 0) return 0;
if ( a.parentTextFrames.length == 0 ) return 1;
if ( b.parentTextFrames.length == 0 ) return -1;

var aptf = a.parentTextFrames[0];
var bptf = b.parentTextFrames[0];

// Rahmen, die nicht auf einer Seite liegen, werden ignoriert
if (aptf.parentPage == null && bptf.parentPage == null ) return 0;
if (aptf.parentPage == null ) return 1;
if (bptf.parentPage == null ) return -1;

// Liegen die Rahmen auf der gleichen Seite?
if ( aptf.parentPage.documentOffset == bptf.parentPage.documentOffset ) {
if (a.textColumns[0].horizontalOffset > b.textColumns[0].horizontalOffset) return 1;
if (a.textColumns[0].horizontalOffset < b.textColumns[0].horizontalOffset) return -1;
// Die Spalten sind auf gleicher X
if (a.baseline > b.baseline) return 1;
if (a.baseline < b.baseline) return -1;
return 0;
} else {
if (aptf.parentPage.documentOffset > bptf.parentPage.documentOffset ) return 1;
return -1;
}
}
}



als Antwort auf: [#477212]

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

1. Aug 2011, 13:18
Beitrag # 7 von 13
Beitrag ID: #477227
Bewertung:
(4960 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Gero,
klasse u. danke.

Ich kanns mir leider erst später ansehen: Meine Frau hat kompliziert das Bein gebrochen u. ich fahr jetzt erstmal wieder ins Krankenhaus. Versuche dann heute Abend das Skript zu verstehen und mit meinem Teil zu kombinieren. Rückmeldung folgt.


als Antwort auf: [#477217]

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

1. Aug 2011, 23:06
Beitrag # 8 von 13
Beitrag ID: #477263
Bewertung:
(4919 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Soderle, Skript läuft wie gewünscht, ich habe aber noch ein paar Fragen:

1. Wieso what[n].words.firstItem().contents und nicht einfach what[n].contents? Es müsste ja auch ein Ausdruck wie Dr. Moritz Mabuse als Gesamtes berücksichtig werden!

2. Wieso a.parentStory.id? Würde nicht auch a.parentStory reichen?

3. Warum prüfe ich den Übersatz mit parentTextFrames.length == 0, aber ob parentPage vorhanden ist mit null? Letzteres ist klar, ersteres noch nicht!

4. parentPage.documentOffset: Ist es egal, ob ich mit documentOffset, id, index oder name eine Seite abfrage?

Danke


als Antwort auf: [#477227]

Reihenfolge bei der Suche

Gerald Singelmann
  
Beiträge gesamt: 6268

2. Aug 2011, 00:12
Beitrag # 9 von 13
Beitrag ID: #477266
Bewertung:
(4903 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
1. Meine Testdatei hatte ein paar Textrahmen mit "eins", "zwei" etc. und ich suchte nach "e". Wenn ich da nur what[n].contents in die Konsole schreibe, würde da e, e, e, e, ... stehen. MaW: das musst du natürlich an deine Bedürfnisse anpassen.

2. Ich habe schlechte Erfahrungen damit gemacht, zwei komplexe Dinge auf Gleichheit zu testen. Es ist quasi immer besser, einfache Datentypen, hier zwei Zahlen, miteinander zu vergleichen.

3. Ein Objekt hat eine oder keine Seite. Ein Text hat keinen bis beliebig viele Textrahmen. parentPage gibt also ein Objekt (Page oder null) zurück und parentTextFrames gibt immer ein Array zurück. Ggf. ein leeres, falls der Text im Übersatz steht.

4. Aaaaalso...
- documentOffset ist die absolute Nummerierung im Dokument
- name ist die logische Nummerierung. Ein Dokument kann beliebig viele "Seite 1" haben, aber nur eine erste Seite.
- id wird vergeben, sobald die Seite erzeugt wird und sagt m.E. nichts über die Position im Dok aus. Müsstest aber noch mal testen.
- index... Was macht noch mal der index... Die Position im Druckbogen, oder?
Für diesen Zweck schien mir daher der Offset die logische Wahl.


als Antwort auf: [#477263]

Reihenfolge bei der Suche

Uwe Laubender
Beiträge gesamt: 5298

2. Aug 2011, 08:45
Beitrag # 10 von 13
Beitrag ID: #477275
Bewertung:
(4873 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Gerald Singelmann ] - id wird vergeben, sobald die Seite erzeugt wird und sagt m.E. nichts über die Position im Dok aus. Müsstest aber noch mal testen.


Hallo, Gerald!
Also die id einer Seite hatte ich gestern aus anderem Anlass mal getestet. Auch die Reihenfolge der id-Zahlen.

Ergebnis:
1. Die id bleibt unverändert, auch wenn man die Seite noch und nöcher im Dokument herumschiebt.
2. Die Größe der id-Zahlen wächst, wenn man im Dokument neue Seiten anlegt (nicht überraschend). Aber die Zahlen liegen nicht unbedingt nebeneinander im Zahlenstrahl. Es kann durchaus zu "Löchern" kommen.

Beispiel: 1seitiges neues Dokument angelegt (Doppelseiten), 99 Seiten hinzugefügt
ids der Seiten in Reihenfolge 1-5 … 96-100:

Code
190 
452

453
454
455
...
546
547
548
549
555



Geprüft mit folgendem Script aus dem ESTK heraus:

Code
var _d = app.documents[0]; 
var _pages = _d.pages.everyItem().getElements();

for(var n=0;n<_pages.length;n++){
$.writeln(_pages[n].id);
};


MacBook Pro 2.4GHz | OS X 10.5.8 | Adobe CS3/CS4/CS5/CS5.5 Design Premium


als Antwort auf: [#477266]

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

2. Aug 2011, 09:07
Beitrag # 11 von 13
Beitrag ID: #477276
Bewertung:
(4867 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke, hab alles verstanden. Hier schon mal die erste -einfachere Variante-, die gefundene Stellen alphabetisch in die Zwischenablage kopiert.

Hierzu folgende Frage:
Kann ich prüfen, ob etwas in die Zwischenablage kopiert wurde und dem User dann ein alert geben, dass er den Text jetzt einfügen kann?

Code
var _zf = "meinZF"; 

// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.");
exit();
}
var _dok = app.activeDocument;

if (!_dok.characterStyles.item(_zf).isValid) {
alert ("Es existiert kein Zeichenformat " + _zf);
exit();
}

//S&E-Felder bereinigen
app.findGrepPreferences = null;
app.changeGrepPreferences = null;

//die Suche definieren
app.findGrepPreferences.appliedCharacterStyle = _zf;
app.findGrepPreferences.findWhat = ".+";
var _gefunden = _dok.findGrep();

// das Gefundene sortieren
var _a = new Array();
for( var n = 0; n < _gefunden.length; n++ ) {
_a.push(_gefunden[n].contents);
}

var _s = _a.sort(case_insensitive);
var _neuerString = _s.join("\r");

// die sortierte Variante mithilfe von Inhalt im Textrahmen in die Zwischenablage kopieren
var _textrahmen = _dok.textFrames.add();

_textrahmen.contents += _neuerString;
var _auswahl = _textrahmen.parentStory.texts[0];
app.select(_auswahl);
app.copy();

_textrahmen.remove();

// Groß- /Kleinschreibung ignorieren
function case_insensitive (a, b)
{
return a.toLowerCase() > b.toLowerCase()
}



als Antwort auf: [#477266]

Reihenfolge bei der Suche

Kai Rübsamen
Beiträge gesamt: 4679

2. Aug 2011, 23:48
Beitrag # 12 von 13
Beitrag ID: #477350
Bewertung:
(4824 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Gero,

Skript funktioniert fast. Anbei aktueller Stand + eine Testdatei.

Folgende Fehler:
1. Gefundene Stellen im ersten Rahmen, 2. Spalte werden falsch sortiert
2. Ein Text im Übersatz wird falsch sortiert (am Schluss drangehängt)

Kannst du einen Fehler erkennen? Danke.


als Antwort auf: [#477276]
Anhang:
test2.idml.zip (42.0 KB)   Zf_findenFast.jsx (2.64 KB)

Reihenfolge bei der Suche

Gerald Singelmann
  
Beiträge gesamt: 6268

2. Aug 2011, 23:59
Beitrag # 13 von 13
Beitrag ID: #477352
Bewertung:
(4815 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hai Kai,

1. Dann musst du mal Zeile 78 unter die Lupe nehmen und schauen, warum b.textColumns[0].horizontalOffset nicht den Offset der Spalte zurückgibt. Ich hatte zwar überlegt, dass die Spalte und nicht der Rahmen berücksichtigt werden müsste, aber nicht getestet. Kann sein, dass der Ausdruck komplizierter werden muss, um wirklich die Spalte zu bekommen.

2. Natürlich. Wo würdest du denn Übersatz einordnen? Auf der Seite, auf der der letzte Rahmen der Story ist? Fand ich unplausibel. Steckt aber in Zeile 66 und 67. Das solltest du hinkriegen können.


als Antwort auf: [#477350]
X