Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Textvariable ausgeben (CS4, WIN)

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

19. Jun 2011, 11:42
Bewertung:

gelesen: 6637

Beitrag als Lesezeichen
Hallo,

ich möchte gerne den Inhalt einer bestehenden Textvariablen ausgeben.

Soweit bin ich schon:
Code
var myVar = app.activeDocument.textVariables.item("meineVariable"); 


Wie erhalte ich nun den Klartext, den die Variable beinhaltet?

Gruß
Christoph

Textvariable ausgeben (CS4, WIN)

Gerald Singelmann
  
Beiträge gesamt: 6269

19. Jun 2011, 11:58
Bewertung: |

gelesen: 6620

Beitrag als Lesezeichen
Was sagt denn das OMV, welche Eigenschaften eine Variable hat?

Anhang:
Bildschirmfoto 2011-06-19 um 11.56.46.png (34.5 KB)   Bildschirmfoto 2011-06-19 um 11.58.29.png (23.8 KB)

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

19. Jun 2011, 13:51
Bewertung:

gelesen: 6585

Beitrag als Lesezeichen

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

20. Jun 2011, 07:37
Bewertung:

gelesen: 6522

Beitrag als Lesezeichen
Vielen lieben Dank für die Hilfe an
Gerald und Werner.

Schöne Grüße
Christoph

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

20. Jun 2011, 19:18
Bewertung:

gelesen: 6480

Beitrag als Lesezeichen
Hallo,
nun benötige doch noch mal Hilfe:

Irgendwie will mir das nicht gelingen. Ich muss den Inhalt einer Textvariablen weiterverarbeiten.
Hierzu soll der Inhalt an eine eine Variable übergeben werden:

Code
var myVarValue = textVariableInstances.item("meineVariable").resultText; 


Dies klappt leider nicht.

Wie komme ich denn da dran?
Auf der von Werner empfohlenen Website bin ich leider nicht weitergekommen.

Grüße Christoph

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

20. Jun 2011, 20:10
Bewertung:

gelesen: 6466

Beitrag als Lesezeichen
Hallo Christoph,

ich muss gestehen, dass ich die Tipps im Link nicht selbst ausprobiert habe, aber wenn ich alles richtig verstanden habe, hat Adobe so etwas wie Variable.Content als Property nicht vorgesehen.

An alle, die es besser wissen:Ich lasse mich da aber gerne korrigieren.

Wenn ich alles richtig verstanden habe, muss Du den Inhalt einer Varablen erst in einen Textrahmen einfügen, bevor Du an den Inhalt kommt.

Und darauf bezieht sich der Link:
Code
app.selection[0].texts[0].textVariableInstances.add({associatedTextVariable:"WpsVariable"}); 


Diese Zeile z. B. fügt den Inhalt Deiner Variablen an der Cursorposition inberhalb eines Textrahmens ein, und von da musst Du ihn dir abholen.

Beschreibe doch mal die Aufgabe, die Du lösen willst, vielleicht gibt es ja eine andere, einfachere Lösung, für Dein Problem.

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

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

20. Jun 2011, 20:25
Bewertung:

gelesen: 6459

Beitrag als Lesezeichen
Hallo Werner,

ich möchte mir einen eigenen lebenden Kolumnentitel bauen.
Das würde soweit auch schon funktionieren. Ich benötige lediglich für die switch-Abfrage den aktuellen Wert der Textvariable.
Hier müßte ich also "MeineVariable" mit dem Wert der Textvariable "abc" befüllen

Code
var _dok = app.activeDocument; 
_dok.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN; //Lineal umstellen
for (var i = 0 ; i < _dok.pages.length; i++) {
var _page = _dok.pages[i];
var _tf = _page.textFrames.add();

var Zahl = parseInt(_page.name);


if ( Zahl%2 == 0) {
//für linke Seiten
switch (MeineVariable) {

case "A": _tf.geometricBounds = [10,10,20,20];
break;

case "B": _tf.geometricBounds = [20,10,30,20];
break;

case "C": _tf.geometricBounds = [30,10,40,20];
break;

// Case bis Buchstabe Z
default: _tf.geometricBounds = [10,10,20,20];
}


//für rechte Seiten
}else{

switch (MeineVariable) {

case "A": _tf.geometricBounds = [10,140,20,150];
break;

case "B": _tf.geometricBounds = [20,140,30,150];
break;

case "C": _tf.geometricBounds = [30,140,40,150];
break;
// Case bis Buchstabe Z
default: _tf.geometricBounds = [10,10,20,20];
}
}

//Befüllung
var myVar = app.activeDocument.textVariables.item("abc");
_tf.texts[0].textVariableInstances.add({associatedTextVariable:myVar});
}


Unten wird der Wert bereits korrekt im Textrahmen ausgegeben.

Gruß
Christoph

(Dieser Beitrag wurde von cwenet am 20. Jun 2011, 20:26 geändert)

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12783

20. Jun 2011, 20:52
Bewertung:

gelesen: 6444

Beitrag als Lesezeichen
Antwort auf [ cwenet ] Hierzu soll der Inhalt an eine eine Variable übergeben werden:

Code
var myVarValue = textVariableInstances.item("meineVariable").resultText; 


Dies klappt leider nicht.

Wie komme ich denn da dran?


Die zitierte Zeile möchte vermutlich den Inhalt einer Instanz (Umsetzung im Text) der Textvariable 'meineVariable' ermitteln.

Die Zeile müßte dann richtigerweise so lauten:
Code
var myVarValue = app.activeDocument.textVariables.itemByName("meineVariable").associatedInstances[0].resultText; 


associatedInstances[0] reflektiert den Inhalt der ersten Instanz der Textvariable.

Die letzte Instanz wäre etwa folgendermaßen zu ermitteln:

Code
var myVarValue = app.activeDocument.textVariables.itemByName("meineVariable").associatedInstances[app.activeDocument.textVariables.itemByName("meineVariable").associatedInstances.length-1].resultText; 


Viele Grüße
Martin


Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12783

20. Jun 2011, 21:01
Bewertung:

gelesen: 6442

Beitrag als Lesezeichen
Antwort auf: Ich benötige lediglich für die switch-Abfrage den aktuellen Wert der Textvariable.


Der Inhalt der Textvariable wird von einer bestimmten Quelle bedient (z.B. Text mit bestimmtem AF oder bestimmtem ZF o.a.).
Wäre es da nicht sinnvoller, für Deine Zwecke nach der Quelle zu SUCHEN (findText()) und den Inhalt der Quelle aus dem Array der Fundstellen zu ermitteln?
Damit könntest Du den Weg über die Textvariablen komplett sparen.

Du könntest aber auch analysieren, über welche Quelle (AF oder ZF oder Anderes) eine bestimmte Textvariable bedient wird: variableOptions -> matchParagraphStylePreference.appliedParagraphStyle (Beispiel). Und darüber könntest Du die Parameter für die Suche ermitteln.

Das scheint mir allerdings etwas umständlich.


Wenn Du jedoch über die Umsetzung der Variable selbst gehen willst, mußt Du sie auch konkret umsetzen, um den Inhalt einer bestimmten Instanz zu ermitteln.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 20. Jun 2011, 21:06 geändert)

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

20. Jun 2011, 21:06
Bewertung:

gelesen: 6433

Beitrag als Lesezeichen
Vielen Dank Martin,

ja so hatte ich es erst versucht.
Sieh auch meine Versuche hier:
http://www.hilfdirselbst.ch/...;;page=unread#unread

Im Format U1 habe ich einfach ein verschachteltes Format für 1 Zeichen angelegt.

Diese Lösung war für mich irgendwie einfacher.

Gruß
Christoph

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12783

20. Jun 2011, 21:15
Bewertung:

gelesen: 6427

Beitrag als Lesezeichen
Hallo Christoph,

der Ansatz dort mit der SUCH-Funktion scheint mir im Hinblick auf die Aufgabenstellung mit dem Register erfolgversprechender zu sein.

Kennst Du die Diskussion Register «automatisieren»?

Dort werden verschiedene Lösungswege zur Umsetzung von Registermarken vorgestellt und diskutiert.

Ich könnte mir vorstellen, daß Du z.B. mit der von Bernd skizzierten Lösung auf Musterseiten weiterkommst (zunächst ohne Skript Musterseiten für die Registermarken A-Z anlegen; diese können auf einer anderen Musterseite basieren, um gemeinsame Inhalte übergeordnet steuern zu können).
Dann müßtest Du per Skript lediglich die Seitenbereiche für die Registermarken ermitteln und den jeweiligen Bereichen die entsprechenden Musterseiten zuweisen.

Es geht doch um Registertabs A, B, C ... Z, die fortlaufend bestimmten Seitenbereichen zugeordnet werden sollen?

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 20. Jun 2011, 21:21 geändert)

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

20. Jun 2011, 22:21
Bewertung:

gelesen: 6380

Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für den Link zu einer weiteren Diskussion.
Ja, es geht um Registertabs. Diese sollen abhängig vom ersten Zeichen im Absatzformat U1 sein.
Ich habe mich mit der Lösung über ein verschachteltes Format (über 1 Zeichen) schon angefreundet.
Hoffe da läuft dann im Ernstfall nichts schief.

Gruß
Christoph

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

21. Jun 2011, 06:18
Bewertung:

gelesen: 6348

Beitrag als Lesezeichen
Christoph,

ich sehe, dass Du jetzt einen anderen Lösungsweg gehst, aber das Problem hat mich beschäftigt und bei mir funktioniert folgendes:

Code
 

main();

function main()
{
alert(GetTextVariableContent("meineVariable"));
}

function GetTextVariableContent(variableName)
{
var variableContent = "";
try
{
// create a temporary textframe
var tempFrame = app.activeDocument.textFrames.add({geometricBounds:[0,0,20,20]});
// insert the variable
variableContent = tempFrame.texts[0].textVariableInstances.add({associatedTextVariable:variableName}).resultText;
}
catch (error)
{
alert("Error: " + error.message + "\n" + "in line: " + error.line);
}
finally
{
// delete tempory used frame in any case
tempFrame.remove();
}
return variableContent ;
}


Ein wenig tricky, aber ich hoffe, es funktioniert.

Es wäre schön, Feedback zu bekommen, ob es generell funktioniert, oder in welchen Situationen nicht.

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

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12783

21. Jun 2011, 08:20
Bewertung:

gelesen: 6329

Beitrag als Lesezeichen
Im Grunde genommen ist dieser Weg raffiniert und Werner Perplies gebührt Anerkennung.

Allerdings steckt im Detail ein Fehler.
Es kommt (für das Ergebnis) darauf an, wo der temporäre Textrahmen erzeugt wird. Mit app.activeDocument.textFrames.add() wird er stets auf der ersten Seite des Dokuments erzeugt. Damit wird immer die Instanz der Textvariable auf dieser (ersten) Seite ermittelt und nicht z.B. die Instanz auf der aktiven Seite.

Außerdem könnte die Breite des temporären Textrahmens mit 20 Einheiten etwas knapp bemessen sein (abhängig vom Einzug des aktiven Textformats).

Hier eine kleine Modifikation, welche einen bestimmten Platz, hier die erste Seite des aktiven Layoutfensters, im Aufruf der Funktion mit berücksichtigt.

Code
main(); 

function main()
{
alert(GetTextVariableContent("meineVariable", app.layoutWindows.firstItem().activePage));
}

function GetTextVariableContent(variableName, _location)
{
var variableContent = "";
try
{
// create a temporary textframe
var tempFrame = _location.textFrames.add({geometricBounds:[0,0,20,200]});
// insert the variable
variableContent = tempFrame.texts[0].textVariableInstances.add({associatedTextVariable:variableName}).resultText;
}
catch (error)
{
alert("Error: " + error.message + "\n" + "in line: " + error.line);
}
finally
{
// delete tempory used frame in any case
tempFrame.remove();
}
return variableContent ;
}



In der Praxis wird der Ort des temporären Textrahmens anders adressiert werden müssen. Es könnte z.B. eine Seite innerhalb einer Schleife durch die Seiten sein, oder eine Seite, auf welcher ein bestimmtes Element gefunden wurde ...

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 21. Jun 2011, 08:30 geändert)

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

21. Jun 2011, 08:38
Bewertung:

gelesen: 6316

Beitrag als Lesezeichen
Hallo Martin,

zuerst einmal vielen Dank für Deine Informationen, ich bin immer noch ein Anfänger, was InDesign angeht, da ich selbst eigentlich nur programmiere, bin ich dankbar für jede Information über das Arbeiten mit InDesign.

Wenn ich Dich richtig verstehe, müsste meine Funktion immer auf der gerade aktiven Seite ausgeführt werden.

Diese aktive Seite müsste doch als Info unterhalb der app verfügbar sein. Wenn das so ist, bräuchte doch die Location nicht an die Funktion übergeben werden, sondern die Funktion könnte die Location doch direkt ermitteln.

Oder mache ich da einen Denkfehler?

Wenn meine Überlegung richtig ist, müsste sich damit auch dieses Problem

Zitat In der Praxis wird der Ort des temporären Textrahmens anders adressiert werden müssen. Es könnte z.B. eine Seite innerhalb einer Schleife durch die Seiten sein, oder eine Seite, auf welcher ein bestimmtes Element gefunden wurde ...


erledigen, oder?

Ergänzung:

Das hatte ich vergessen:
Zitat Außerdem könnte die Breite des temporären Textrahmens mit 20 Einheiten etwas knapp bemessen sein (abhängig vom Einzug des aktiven Textformats).

Wäre das relevant? Kann man bei eventuell entstehenden Übersatz den Inhalt der Variable nicht einfügen?

Hilft eventuell Frame.fit(FitOptions.frameToContent)?

Noch eine Frage, die mich beschäftigt:


Bleibt durch die Funktion die aktuell Position erhalten, oder muss die am Anfang der Funktion gerettet und am Ende wieder restauriert 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

(Dieser Beitrag wurde von WernerPerplies am 21. Jun 2011, 08:47 geändert)

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12783

21. Jun 2011, 08:54
Bewertung:

gelesen: 3056

Beitrag als Lesezeichen
Antwort auf: Diese aktive Seite müsste doch als Info unterhalb der app verfügbar sein.


Die aktive Seite ist z.B. Kind eines Layoutfensters (s. Beispiel oben).
Eine Seite kann aber auch Elter eines Textrahmens/Seitenobjekts sein.
Oder – spezifischer – Elter eines Textrahmens, in dem ein Text mit einem bestimmten Attribut zu finden ist.


Ich denke, dass es eher die Ausnahme ist, dass der Inhalt einer Instanz einer Textvariable auf einer aktiven Seite ermittelt werden muss.
Die aktive Seite war in meinem Beispiel oben nur exemplarisch angegeben.

Häufiger dürften die beiden o.g. genannten Fälle sein:
1. eine bestimmte Seite in einer Schleife durch mehrere/alle Seiten eines Dokuments;
2. eine Seite mit einem bestimmten Objekt (von dem aus die Seite, auf welcher es liegt, ermittelt wird).

Deswegen habe ich die Lokation bewusst in den Aufruf der Funktion integriert.

Für Christoph dürfte Fall 1 der nächstliegende sein: auf jeder Seite soll (in einer Schleife) ermittelt werden, welchen Registerbuchstaben sie tragen soll. Und abhängig vom Ergebnis wird der Textrahmen mit bestimmten Koordinaten und einem bestimmten Inhalt erzeugt.

Nichtsdestotrotz meine ich, daß der weiter oben vorgeschlagene Weg über die Zuweisung von präparierten Musterseiten für diesen Zweck (Bestückung von Seiten mit Registermarken) besser geeignet ist, da später bei Änderungen im Umbruch von Hand flexibler, also leichter und schneller, zu korrigieren.


Antwort auf: Wäre das relevant? Kann man bei eventuell entstehenden Übersatz den Inhalt der Variable nicht einfügen?

Es kommt – überraschenderweise – darauf an, wodurch der Übersatz erzeugt wurde:
– zu niedriger Textrahmen, da Schriftgröße bzw. Zeilenabstand höher als Textrahmen -> nicht unbedingt ein Problem.
– Einzug des Absatzes größer Breite des Textrahmens -> ein Problem

Antwort auf: Hilft eventuell Frame.fit(FitOptions.frameToContent)?

Nur wenn zusätzlich zur Variable noch ein anderes Zeichen (z.B. ein Punkt) nach der Textvariable in den Textrahmen eingefügt wird.

Antwort auf: Bleibt durch die Funktion die aktuell Position erhalten, oder muss die am Anfang der Funktion gerettet und am Ende wieder restauriert werden?

Die Funktion macht nichts, was die Position der Seite verändern würde.
Deswegen muss deren Position nicht restauriert werden.
Oder war eine andere Position gemeint?

Der temporäre Textrahmen, der u.U. wg. einer voreingestellten Verdrängung den Textumbruch in einem Textrahmen auf der betroffenen Seite verändern könnte, wird am Ende wieder gelöscht. Im schlimmsten Fall stört er das Ergebnis, das es zu ermitteln galt.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 21. Jun 2011, 09:12 geändert)

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

21. Jun 2011, 09:07
Bewertung:

gelesen: 3046

Beitrag als Lesezeichen
Hallo Martin,

Zitat Ich denke, dass es eher die Ausnahme ist, dass der Inhalt einer Instanz einer Textvariable auf einer aktiven Seite ermittelt werden muss.

Gut, anders gefragt, gibt es eine generelle Möglichkeit der Abfrage, wo man sich gerade befindet, die man auswerten kann?

Was ist z. B. mit app.selection

Und wenn das nicht geht, welche Locations könnte es geben? Verschiedene Locations erfordern ja eventuell ein unterschiedliches Handling, oder.

Zitat Für Christoph dürfte Fall 1 der nächstliegende sein: auf jeder Seite soll (in einer Schleife) ermittelt werden, welchen Registerbuchstaben sie tragen soll. Und abhängig vom Ergebnis wird der Textrahmen mit bestimmten Koordinaten und einem bestimmten Inhalt erzeugt.

Nichtsdestotrotz meine ich, daß der weiter oben vorgeschlagene Weg über die Zuweisung von präparierten Musterseiten für diesen Zweck (Bestückung von Seiten mit Registermarken) besser geeignet ist, da später bei Änderungen im Umbruch von Hand flexibler, also leichter und schneller, zu korrigieren.


Ich versuche immer möglichst universelle Funktionen zu erstellen, die man immer wieder benutzen kann.

Wenn Christoph das gebrauchen kann, oder nutzen will, ist das ok, aber mir geht es um ei
ne möglichst universelle Anwendbarkeit.

Zitat Nur wenn zusätzlich zur Variable noch ein anderes Zeichen (z.B. ein Punkt) nach der Textvariable in den Textrahmen eingefügt wird.


;-)
na ja, wenn's hilft, mache ich das doch und entferne es wieder, bevor den erhaltenen Wert zurückgebe.

Danke für den Input.

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

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12783

21. Jun 2011, 09:20
Bewertung:

gelesen: 3038

Beitrag als Lesezeichen
Antwort auf: Was ist z. B. mit app.selection

Von der Auswahl müsste bis zu einem bestimmten Textrahmen hochgeklettert werden, dessen übergeordnete Seite (Elter/parent) zu ermittlen wäre (ist in CS5 inzwischen mit parentPage etwas anders gelöst).

Antwort auf: Und wenn das nicht geht, welche Locations könnte es geben?

All die Orte, wo eine Textvariable eingefügt ist bzw. werden kann, also in der Regel insertionPoints.

Antwort auf: na ja, wenn's hilft, mache ich das doch und entferne es wieder, bevor den erhaltenen Wert zurückgebe.

Nicht nötig, da es ja nur auf den Inhalt der Textvariable ankommt.
Drumherum kann Zeugs drinstehen, wie Du lustig bist.
Das wird über die Funktion schließlich nicht ermittelt und der Textrahmen wird nach Ermittlung des aktuellen Inhalts der Textvariable wieder gelöscht.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 21. Jun 2011, 09:21 geändert)

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

21. Jun 2011, 09:26
Bewertung:

gelesen: 3031

Beitrag als Lesezeichen
Hallo Martin,

Danke.
Ich schaue mir das demnächst noch mal alles genauer an.

Code
Nicht nötig, da es ja nur auf den Inhalt der Textvariable ankommt. 
Drumherum kann Zeugs drinstehen, wie Du lustig bist.
Das wird über die Funktion schließlich nicht ermittelt und der Textrahmen wird nach Ermittlung des aktuellen Inhalts der Textvariable wieder gelöscht.


Ach stimmt ja, ich lese ja nicht den Inhalt des Rahmens sondern Inhalts der Variable aus.
Alles klar!

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

Textvariable ausgeben (CS4, WIN)

drerol74
Beiträge gesamt: 507

21. Jun 2011, 13:44
Bewertung:

gelesen: 2991

Beitrag als Lesezeichen
Hallo,

vielleicht hilft das weiter: Inhalt der Textvariablen ist in der Variablen _inhalt gespeichert. Hier als Beispiel der lebende Kolumnentitel, der als Text auf jeder Seite ausgegeben wird.

Die Reihenfolge in _inhalt richtet sich nach dem Zeitpunkt des Erstellens der Textvariablen. Wenn die Textvariablen also mittels Script nacheinander generiert werden, müsste es klappen?!

Code
var _dok = app.activeDocument; 
var _textVar = _dok.textVariables.itemByName("Lebender Kolumnentitel");
var _inhalt = _textVar.getElements ();
_ende = _inhalt[0].associatedInstances.length;
for (var i = 0; i < _ende; i++) {
_tf = _dok.pages[i].textFrames.add();
_tf.contents = _inhalt[0].associatedInstances[i].resultText;
_tf.geometricBounds = [5, 5, 20, 50];
}

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

21. Jun 2011, 15:26
Bewertung:

gelesen: 2979

Beitrag als Lesezeichen
Auch Hallo,

danke für Deinen Beitrag.

Ich denke, so funktioniert das nicht.

Wenn ich das jetzt richtig verstanden habe, hat eine Variable, die definiert ist, aber noch nirgends eingefügt wurde, keine associatedInstance.

Und damit ist associatedInstances.length = 0!

Sobald ich eine associatedInstance habe, ist auch eine location festgelegt.

Ich selbst habe keine Erfahrung mit Textvariablen in InDesign, ich muss mich jetzt zuerst einmal schlau machen, wie die Werte von existierenden Textvariablen verändert werden können.

Für bereits eingefügte Variable scheint es mir überhaupt kein Problem zu sein, den Inhalt zu ermitteln.

Ich denke, Christoph hatte ein Problem, weil er die entsprechende Variable zwar definiert, aber noch nie eingefügt hatte.



Ich bleibe dran;

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

Textvariable ausgeben (CS4, WIN)

drerol74
Beiträge gesamt: 507

21. Jun 2011, 20:54
Bewertung:

gelesen: 2939

Beitrag als Lesezeichen
Du hast recht, so ein direktes Auslesen geht offenbar nicht. Ich hab es jetzt aber doch noch mal probiert. Es geht über (zwei) Umwege. Wer es probieren möchte, Testdokument ist angehängt. (1. Textvariable wird eingefügt -> 2. Dokument wird unter neuem Namen gespeichert -> 3. Register wird erstellt -> 4. Textvariable wird wieder entfernt.)

Vielleicht findet sich noch ein eleganterer Weg, würde mich interessieren.

Schöne Grüße
Roland Dreger

Code
#target Indesign 
var _dok = app.activeDocument;
var _textVar = _dok.textVariables.itemByName("Lebender Kolumnentitel");
var _start = 3; // Startseite fuer das Register;
var m = _start - 1;
// Textvariable wird gesetzt
for (var j = m; j < _dok.pages.length; j++) {
var _seite = _dok.pages[j];
var _tf = _seite.textFrames.add();
_tf.name = "tf" + j;
var _tvarInstance = _tf.textVariableInstances.add();
_tvarInstance.associatedTextVariable = _textVar;
}

try {
// Dokument wird unter einen neuen Namen gespeichert
var _newName = File(_dok.filePath + "/2_" + _dok.name);
_dok.save(_newName);

var y1 = 10, x1 = 10, y2 = 30, x2 = 30;
var _textVar2 = _dok.textVariables.itemByName("Lebender Kolumnentitel"); // Der Textvariable Lebender Kolumnentitel wird das Zeichenformat abc zugewiesen

var _inhalt = _textVar2.getElements ();
_ende = _inhalt[0].associatedInstances.length;
for (var i = m; i < _dok.pages.length; i++) {
var _tf2 = _dok.pages[i].textFrames.add();
_tf2.contents = _inhalt[0].associatedInstances[i-m].resultText;
var _regI = _tf2.contents;
var _regF = _dok.paragraphStyles.itemByName("Register");
_tf2.paragraphs[0].applyParagraphStyle(_regF);
var n = i + 1;
_tf2.name = "tf2" + n ;
var _regI_1
var p = i - m;
if (i > m) {
_regI_1 = _inhalt[0].associatedInstances[p-1].resultText;
if ( _regI != _regI_1) {
y1 = y1+25; // Schrittweite für die Registertabs nach unten
y2 = y2+25; // Schrittweite für die Registertabs nach unten
_tf2.geometricBounds = [y1, x1, y2, x2];
} else {
_tf2.geometricBounds = [y1, x1, y2, x2];
}
} else {
_tf2.geometricBounds = [y1, x1, y2, x2];
}
}

} catch (_fehler) {
alert("Bei der Ausführung des Scipts ist ein Fehler! Fehlermeldung: " + _fehler.message);
}

// Textframe mit der ursprünglichen Textvariable wird wieder gelöscht.
for (var l = m; l < _dok.pages.length; l++) {
var _delTf = _dok.textFrames.itemByName ("tf" + l);
_delTf.remove();
}


Anhang:
registerTest.idml (68.2 KB)   register.jsx (2.23 KB)

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1139

23. Jun 2011, 14:35
Bewertung:

gelesen: 2881

Beitrag als Lesezeichen
Vielen Dank für die vielen Ideen.
Nun bin ich wieder zur Lösung mit den Musterseiten und ohne Textvariable gewechselt. Irgendwie läuft das mit der Textvariable nicht zuverlässig.
Das erlebe ich auch ab und an beim normalen Kolumnentitel mit Textvariablen.
Da kann es vorkommen, dass eine Variable plötzlich ohne ersichtlichen Grund einfach leer ist.
Hier meine Lösung mit Musterseiten:
Code
function replaceUmlauts(string, index){ 
var anArray = new Array(2);
anArray[0] = new Array("Ö", "ö", "Ä", "ä", "Ü", "ü");
anArray[1] = new Array("O", "O", "A", "A", "U", "U");

for (var i=0; i<anArray[index].length; i++){
myRegExp = new RegExp(anArray[index][i],"g");
string = string.replace(myRegExp, anArray[(index==0?1:0)][i]);
}
return string;
}



var _dok = app.activeDocument;
var _alleSeiten = _dok.pages;
for (var i = 2; i < _alleSeiten.length; i++) { // Beginne erst auf Seite 3
var _seite = _alleSeiten[i];
if (_seite.textFrames.length > 0) {
var _tf = _seite.textFrames[0];
if (_tf.paragraphs[0].appliedParagraphStyle.name == "U1") {

var myVarValue = _tf.paragraphs[0].contents; //der erste absatz auf der seite wird übernommen
myVarValue = myVarValue.slice(0,1); //nur erstes zeichen wird benötigt
myVarValue = replaceUmlauts(myVarValue, 0); //umlaute werden gewandelt


switch (myVarValue) {
case "A": var musterseite = "A-TAB";
break;

case "B": var musterseite = "B-TAB";
break;

case "C": var musterseite = "C-TAB";
break;

case "D": var musterseite = "D-TAB";
break;

case "E": var musterseite = "E-TAB";
break;

case "F": var musterseite = "F-TAB";
break;

case "G": var musterseite = "G-TAB";
break;

case "H": var musterseite = "H-TAB";
break;

case "I": var musterseite = "I-TAB";
break;

case "J": var musterseite = "J-TAB";
break;

case "K": var musterseite = "K-TAB";
break;

case "L": var musterseite = "L-TAB";
break;

case "M": var musterseite = "M-TAB";
break;

case "N": var musterseite = "N-TAB";
break;

case "O": var musterseite = "O-TAB";
break;

case "P": var musterseite = "P-TAB";
break;

case "Q": var musterseite = "Q-TAB";
break;

case "R": var musterseite = "R-TAB";
break;

case "S": var musterseite = "S-TAB";
break;

case "T": var musterseite = "T-TAB";
break;

case "U": var musterseite = "U-TAB";
break;

case "V": var musterseite = "V-TAB";
break;

case "W": var musterseite = "W-TAB";
break;

case "X": var musterseite = "X-TAB";
break;

case "Y": var musterseite = "Y-TAB";
break;

case "Z": var musterseite = "Z-TAB";
break;



default: var musterseite = "A-Vakat";
}
_seite.appliedMaster = _dok.masterSpreads.itemByName(musterseite);
var merker = musterseite;


}else{ // Wenn keine Überschrift auf der Seite steht
_seite.appliedMaster = _dok.masterSpreads.itemByName(merker);
}
}
}


Danke und Gruß
Christoph

Textvariable ausgeben (CS4, WIN)

Uwe Laubender
Beiträge gesamt: 5316

19. Jul 2011, 14:38
Bewertung:

gelesen: 2753

Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ] Außerdem könnte die Breite des temporären Textrahmens mit 20 Einheiten etwas knapp bemessen sein (abhängig vom Einzug des aktiven Textformats).


Hallo, Martin & Werner!
Der Thread ist zwar schon etwas älter, aber ich hätte zur Problematik des Textüberlaufs im neu erzeugten Hilfstextrahmen einen Vorschlag:

Code
var _tempTextFrame = app.activeDocument.textFrames.add({contents:"Mein Inhalt, der garantiert im Übersatz steht, da der neue Textrahmen nur 1 x 1 pt groß wird!"}); 
var _newContents = app.activeDocument.stories[-1].contents;

_tempTextFrame.remove();

alert(_newContents);


Es wird also der Inhalt der neuesten Story stories[-1].contents in eine Variable geschrieben. Der Hilfstextrahmen kann dann einfach entfernt werden. Übersatz ist dann überhaupt kein Problem, da nicht der Inhalt des Textrahmens ausgelesen wird, sondern der der zugehörigen Story.

MacBook Pro 2.4GHz | OS X 10.5.8 | Adobe CS3/CS4/CS5/CS5.5 Design Premium
*****
Mit herzlichem Gruß,
Uwe Laubender

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2762

19. Jul 2011, 15:30
Bewertung:

gelesen: 2739

Beitrag als Lesezeichen
Hallo Uwe,

Zitat Der Thread ist zwar schon etwas älter


Stimmt, aber das ändert ja nicht an der Problematik. Ich werde Deinen Tipp sicherlich bei Bedarf nutzen.

Danke.

Löse doch bitte gleich auch noch meine aktuelles Problem ;-), mit dem ich jetzt seit einigen Stunden kämpfe, allerdings habe ich zusätzlich auch noch das Problem, dass ich es nicht richtig beschreiben kann.

Also werde ich mal selbst weitersuchen.

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