[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Textabschnitt platzieren und verknüpfen

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

Textabschnitt platzieren und verknüpfen

Kai Rübsamen
Beiträge gesamt: 4684

29. Okt 2011, 14:16
Beitrag # 1 von 15
Bewertung:
(5061 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Ich möchte mehrere Textabschnitte mit Textrahmen auf unterschiedlichen Seiten platzieren und verknüpfen.

Zum Dokumentaufbau:
Ebene 1: Allgemein
Ebene 2: Deutsch
Ebene 3: Englisch

Beispiel: Auf Seite 3 befinden sich drei verkettete Textrahmen. Der Inhalt dieses Textabschnitts soll jetzt mit bereits vorhandenen 3 leeren Textrahmen (sind ebenfalls innerhalb der Seite verkettet) auf den Seiten 5 + 7 verknüpft werden.

In einem Testdokument mit nur einer Ebene funktioniert folgendes:
Code
var _dok = app.activeDocument; 

var _elter = [3];
var _kinder = [5,7] ;

for ( j = 0 ; j < _elter.length ; j++ ) {

var _s = _dok.pages[_elter[j]-1].textFrames[0].parentStory;

for ( n = 0 ; n < _kinder.length ; n++ ) {
var _k = _dok.pages[_kinder[n]-1].textFrames[0];
_k.placeAndLink(_s);
}
}


In meinem echten Dokument, funktioniert das jedoch nicht und ich nehme an, dass ich den Rahmen genauer angeben muss? Denn:
Sobald weitere Ebenen mit Text hinzukommen, ist anscheinend nicht mehr klar, was textFrames[0] ist?!

In einer einfachen Variante des Skripts suche ich jetzt als erstes nach der Möglichkeit, einen Textrahmen auf Seite 3 zu finden, aber nur wenn er auf der Ebene Deutsch liegt. (Später sollen mehrere solche Verlinkungen über ein mehrdim. Array abgefrühstückt werden >> z.B. a – 6,80,
b – 8, 30, 55, 91, 102, c – 9, 57, 103 und wie das dann geht ist mir eigentlich klar).

Jetzt scheint erstmal weder _dok.pages[_elter[j]-1].textFrames[0].itemLayer("Deutsch"), noch _dok.pages[_elter[j]-1].layers.item("Deutsch").textFrames[0] zu funktionieren, da ich offensichtlich die Objekthierachie nicht einhalte??

Wo liegt mein Fehler?
Danke.

(Dieser Beitrag wurde von Kai Rübsamen am 29. Okt 2011, 14:34 geändert)
X

Textabschnitt platzieren und verknüpfen

Hans Haesler
  
Beiträge gesamt: 5826

29. Okt 2011, 17:33
Beitrag # 2 von 15
Beitrag ID: #483365
Bewertung:
(5020 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

die einfachste Lösung: die Rahmen benennen.

Gruss, Hans


als Antwort auf: [#483356]

Textabschnitt platzieren und verknüpfen

Kai Rübsamen
Beiträge gesamt: 4684

29. Okt 2011, 20:37
Beitrag # 3 von 15
Beitrag ID: #483371
Bewertung:
(5002 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke für deinen Beitrag. Das labeln von 100 Rahmen x 2 Sprachen erscheint mir gerade etwas umständlich, bzw. ich weis dann nicht, wie ich mehrere Kinder ansprechen kann?!

Ein Fehler bei mir war wohl, dass das Hauptdokument Teil eines Buches ist und nicht bei 1 beginnt. Folgendes ist sicherlich kein sauberer Code, verknüpft mir aber jetzt schon mal einen ersten Textabschnitt - mehrmals - auf der Ebene in Dt. und Engl.

Code
var _dok = app.activeDocument; 

var _elter = [6];
var _kinder = [80, 91];

for ( i = 0 ; i < _elter.length ; i++ ) {

var _sDeutsch = _dok.pages[_elter[i]-5].textFrames[0].parentStory;
var _sEnglisch = _dok.pages[_elter[i]-5].textFrames[3].parentStory;

for ( n = 0 ; n < _kinder.length ; n++ ) {
var _kDeutsch = _dok.pages[_kinder[n]-5].textFrames[0];
var _kEnglisch = _dok.pages[_kinder[n]-5].textFrames[3];

_kDeutsch.placeAndLink(_sDeutsch);
_kEnglisch.placeAndLink(_sEnglisch);
}
}


edit: Kann mir vielleicht noch jemand verraten, wie ich eine Seite 6 (durch die Nummerierung im Buch), die im Dokument eigentlich eine Seite 2 ist, als Seite 6 ansprechen kann (also mit dem Wert aus dem Array), OHNE sie um -5 reduzieren zu müssen?


als Antwort auf: [#483365]
(Dieser Beitrag wurde von Kai Rübsamen am 29. Okt 2011, 20:53 geändert)

Textabschnitt platzieren und verknüpfen

Hans Haesler
  
Beiträge gesamt: 5826

29. Okt 2011, 21:58
Beitrag # 4 von 15
Beitrag ID: #483373
Bewertung:
(4982 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

offensichtlich hatte ich die Aufgabe nicht verstanden. Aber ich sehe immer noch nicht klar.

Zu Deiner Adressierungsfrage. Falls die 6 die Seitennummer ist, dann kannst Du diese Zahl so benutzen: Anstelle der Index-Zahl (= 2) den Namen der Seite verwenden.

Dazu muss entweder die übergebene Zahl in einen String verwandelt werden ...
Code
var _dok = app.activeDocument; 
var _elter = [6];
var _sDeutsch = _dok.pages.itemByName(""+_elter[0]).textFrames[0].parentStory.contents;
alert (_sDeutsch);

... oder schon als String im Array stehen:
Code
var _dok = app.activeDocument; 
var _elter = ["6"];
var _sDeutsch = _dok.pages.itemByName(_elter[0]).textFrames[0].parentStory.contents;
alert (_sDeutsch);

Gruss, Hans


als Antwort auf: [#483371]

Textabschnitt platzieren und verknüpfen

Gerald Singelmann
  
Beiträge gesamt: 6269

30. Okt 2011, 01:50
Beitrag # 5 von 15
Beitrag ID: #483379
Bewertung:
(4949 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe nicht alle Verwicklungen verfolgt, verstehe das ursprüngliche Problem aber so, dass du den Textrahmen auf kind[1] suchst, mit dem du verketten willst.
Und das Problem besteht anscheinend darin, dass du mehrere Ebenen mit mehreren Textflüssen hast.
Auf der Ebene "Deutsch" gibt es aber nur einen Textfluss.
Das einfachste scheint mir da die Hauruck-Methode zu sein: Mach eine Schleife über alle Textrahmen der Seite und schaue für jeden einzelnen nach itemLayer und previousTextFrame. Wenn itemLayer.name == "Deutsch" und previousTextFrame == undefined (oder null?), dann hast du ihn gefunden.


als Antwort auf: [#483373]

Textabschnitt platzieren und verknüpfen

Martin Fischer
  
Beiträge gesamt: 12783

30. Okt 2011, 08:38
Beitrag # 6 von 15
Beitrag ID: #483380
Bewertung:
(4928 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Rübi,

von Gerald kennst Du inzwischen die Hauruck-Methode.

Unter bestimmten Bedingungen wäre jedoch auch die Labeling-Methode von Hans praktikabel und durchaus interessant.

Antwort auf: Das labeln von 100 Rahmen x 2 Sprachen erscheint mir gerade etwas umständlich, bzw. ich weis dann nicht, wie ich mehrere Kinder ansprechen kann?!

Wenn Du das über ein extra Skript oder eine extra Routine vornimmst - etwa eine Kombination aus Seite, Sprache und ggf. einen Zähler, falls es mehrere Textrahmen auf einer Ebenen-Seitenkombination gibt - kann es Dir egal sein, ob 10, 100 oder 1000 Rahmen zu benennen sind.

Es muß eben im Workflow Sinn machen.
Z.B. sollte bei den weiteren Schritten das Inventar der Textrahmen möglichst konstant bleiben und es sollten keine Seiten zwischen zwei alte geschoben werden, sonst ist Dein Skript mehr mit der Umbenennung als mit anderen Dingen beschäftigt.

Und es sollte einen Vorteil z.B. gegenüber Geralds Hauruck-Methode bringen. Dieser könnte etwa darin bestehen, dass Du bestimmte Textrahmen mehrfach und gezielt ansprechen mußt.

Außerdem hättest Du während der Entwicklung einen leichteren Überblick, welche Textrahmen denn nun konkret angesprochen werden. Wenn alles funktioniert, kannst Du Dich in einem Verallgemeinerungsschritt daran machen, das Labeling durch einen mehrdimensionalen Array zu ersetzen.

Eins verstehe ich noch nicht so richtig.
Was sind in Deinem Konzept Eltern und Kinder?


als Antwort auf: [#483371]
(Dieser Beitrag wurde von Martin Fischer am 30. Okt 2011, 09:15 geändert)

Textabschnitt platzieren und verknüpfen

Hans Haesler
  
Beiträge gesamt: 5826

30. Okt 2011, 09:24
Beitrag # 7 von 15
Beitrag ID: #483381
Bewertung:
(4906 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerald,

mir scheint, etwas weniger "Hau" würde schneller zum Ziel führen. :-)

Zu Beginn "ruck"elt es zwar noch: Eine Schleife durch die Rahmen der bestimmten Seite, aber nur die Ebene prüfen. Sobald ein Rahmen der Ebene "Deutsch" gefunden ist, kann der erste Rahmen der Textkette mit startTextFrame eruiert werden.

Ein Test mit previousTextFrame ist nicht notwendig. Zur Sicherheit könnte mit nextTextFrame geprüft werden, ob eine Verkettung vorhanden ist.

Gruss, Hans


als Antwort auf: [#483379]

Textabschnitt platzieren und verknüpfen

Uwe Laubender
Beiträge gesamt: 5316

30. Okt 2011, 13:30
Beitrag # 8 von 15
Beitrag ID: #483394
Bewertung:
(4866 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich würde eher mit den textContainers der jeweiligen Story arbeiten. Die sind in Reihe der Verkettung nach durchnummeriert. Hat deren length den Wert 1, handelt es sich um einen Textrahmen, der nicht verknüpft ist. Aber das ist eher Geschmackssache…

Aber ich hab die eigentliche Aufgabenstellung noch nicht so ganz durchschaut. Eine Beispieldatei könnte Wunder wirken.


als Antwort auf: [#483381]

Textabschnitt platzieren und verknüpfen

Kai Rübsamen
Beiträge gesamt: 4684

30. Okt 2011, 13:57
Beitrag # 9 von 15
Beitrag ID: #483395
Bewertung:
(4862 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ihr Vier, danke für eure Beiträge :)

@ Martin: Das man das labeln besser auch über ein Skript macht, hatte ich mir schon fast gedacht.

@ Hans: Das mit dem Umwandeln der Seitenzahl in einen String funktioniert, macht den Code aber auch nicht übersichtlicher.

@Gero: Es gibt auf jeder Ebene nur einen Textfluss. Daher scheint mein obiges Skript hier ausnahmsweise zu funktionieren und ich muss den Rahmen doch nicht extra suchen?! Welcher Fehler könnte passieren, wenn ich die Rahmen NICHT gezielt anspreche?

Sehe ich es richtig, dass ich keine Möglichkeit habe, alle Textrahmen auf Seite 6, die in der Ebene "Deutsch" liegen, direkt anzusprechen und man immer alle Textrahmen auf Seite 6 in einer Schleife fragen muss, auf welcher Ebene sie liegen? > Es gibt also keinen direkten Weg, der mir ohne Schleife alle gibt?

Anbei noch ein Testdokument u. der letzte Stand des Skripts.

@ Martin: Das Elternelement/die Mutter ist für mich der erste Eintrag. Der Kunde liefert mir eine Liste nach dem Motto: Der Text x kommt auf den Seiten 6, 8 und 10 vor. Demnach ist 6 für mich das Elternelement und 8 + 10 sind die Kinder.

Code
var _dok = app.activeDocument; 

var _euk= [ [6, 8, 10] , [7, 9, 11] ];

for ( j = 0 ; j < _euk.length ; j++ ) {
var _sDeutsch = _dok.pages.itemByName(""+_euk[j][0]).textFrames[0].parentStory;
var _sEnglisch = _dok.pages.itemByName(""+_euk[j][0]).textFrames[3].parentStory;

for ( n = 1 ; n < _euk[j].length ; n++ ) {
var _kDeutsch = _dok.pages.itemByName(""+_euk[j][n]).textFrames[0];
var _kEnglisch = _dok.pages.itemByName(""+_euk[j][n]).textFrames[3];

_kDeutsch.placeAndLink(_sDeutsch);
_kEnglisch.placeAndLink(_sEnglisch);
}
}



als Antwort auf: [#483381]
(Dieser Beitrag wurde von Kai Rübsamen am 30. Okt 2011, 14:00 geändert)

Anhang:
linkedStories_test1.idml.zip (51.2 KB)

Textabschnitt platzieren und verknüpfen

Kai Rübsamen
Beiträge gesamt: 4684

30. Okt 2011, 14:59
Beitrag # 10 von 15
Beitrag ID: #483398
Bewertung:
(4846 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So: Skript gerade mal am scharfen Dokument probiert. Das Skript bricht mit einem Fehler ab, scheint aber trotzdem das zu machen, was ich brauche ;-)

D.h. ich habe jetzt in 30 Sekunden 300 Verknüpfungen x 2 Sprachen erstellt. Skripte sind Klasse :):)


als Antwort auf: [#483395]

Textabschnitt platzieren und verknüpfen

Kai Rübsamen
Beiträge gesamt: 4684

31. Okt 2011, 20:15
Beitrag # 11 von 15
Beitrag ID: #483479
Bewertung:
(4785 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Ich würde eher mit den textContainers der jeweiligen Story arbeiten. Die sind in Reihe der Verkettung nach durchnummeriert. Hat deren length den Wert 1


Als ich das gestern gelesen hab, hab ich gedacht: Was will der?! ;-)

Heute hab ich eine Möglichkeit gesucht, den letzten Textrahmen in einem Textabschnitt auf der Ebene "Deutsch" an seinen Inhalt anzupassen. Da dort mittlerweile mehrere Rahmen liegen, konnte ich mich also nicht auf die Ebene allein beschränken.

Vielleicht geht es einfacher, aber ich hab es mit Uwes Tipp (danke!!) so gelöst:
Code
var _dok = app.activeDocument; 
var _tFrames = _dok.textFrames;

for ( var i = 0; i < _tFrames.length; i++ ) {
if (_tFrames[i].itemLayer.name == 'Deutsch' && _tFrames[i].parentStory.textContainers.length != 1)
_tFrames[i].fit(FitOptions.frameToContent);
}


Das dauert allerdings seine Zeit, weil offensichtlich 3000 Textrahmen erst Mal gefragt werden, wo sie liegen und ob sie da verkettet sind.


als Antwort auf: [#483398]
(Dieser Beitrag wurde von Kai Rübsamen am 31. Okt 2011, 20:16 geändert)

Textabschnitt platzieren und verknüpfen

Hans Haesler
  
Beiträge gesamt: 5826

31. Okt 2011, 22:46
Beitrag # 12 von 15
Beitrag ID: #483485
Bewertung:
(4760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

wenn eine Textkette durch zehn Rahmen fliesst, dann wird das Anpassen des letzten Rahmes zehn Mal vorgenommen. Auch wenn dieser schon längst straff sitzt.

Vielleicht bringt es etwas, wenn die Schleife durch die Stories geht und zum Aufspüren des letzten Rahmens der Textkette endTextFrame verwendet wird?

Code
var _dok = app.activeDocument;  
var _stories = _dok.stories;

for (var i=0; i<_stories.length; i++) {
if (_stories[i].textContainers[0].itemLayer.name == "Deutsch") {
_stories[i].textContainers[0].endTextFrame.fit(FitOptions.frameToContent);
}
}

Dauert das auch seine Zeit? Oder ist ein Unterschied feststellbar?

Gruss, Hans


als Antwort auf: [#483479]

Textabschnitt platzieren und verknüpfen

Uwe Laubender
Beiträge gesamt: 5316

1. Nov 2011, 09:07
Beitrag # 13 von 15
Beitrag ID: #483492
Bewertung:
(4727 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans & Kai!
Antwort auf [ Hans Haesler ] Dauert das auch seine Zeit? Oder ist ein Unterschied feststellbar?

Das war wohl nur rhetorisch gemeint. Da muss ein Unterschied feststellbar sein!

Dazu kommt noch: der Textrahmen des letzten Textcontainers der Story könnte ja auch leer sein oder Textüberlauf haben. Beide Fälle sollten getestet werden.


als Antwort auf: [#483485]

Textabschnitt platzieren und verknüpfen

Kai Rübsamen
Beiträge gesamt: 4684

1. Nov 2011, 10:45
Beitrag # 14 von 15
Beitrag ID: #483500
Bewertung:
(4711 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Oder ist ein Unterschied feststellbar?

Och, nur ein ganz kleiner … ;-)

Meine Variante dauert 1 Minute 30 Sekunden. Hans, mit deiner Variante dauert es 11 Sekunden. Großes Kino!


als Antwort auf: [#483492]

Textabschnitt platzieren und verknüpfen

Hans Haesler
  
Beiträge gesamt: 5826

1. Nov 2011, 13:27
Beitrag # 15 von 15
Beitrag ID: #483501
Bewertung:
(4679 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

ach ... nur 79 Sekunden Differenz ... das ist doch nicht der Rede wert. ;-)

Nicht vegessen: Die von Uwe erwähnten Tests einbauen. Diese dürften nicht gross bremsen.

Gruss, Hans


als Antwort auf: [#483500]
X