[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Textvariable ausgeben (CS4, WIN)

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

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1092

19. Jun 2011, 11:42
Beitrag # 1 von 25
Bewertung:
(6470 mal gelesen)
URL zum Beitrag
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
X

Textvariable ausgeben (CS4, WIN)

Gerald Singelmann
  
Beiträge gesamt: 6264

19. Jun 2011, 11:58
Beitrag # 2 von 25
Beitrag ID: #473978
Bewertung: |
(6453 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Was sagt denn das OMV, welche Eigenschaften eine Variable hat?


als Antwort auf: [#473977]
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: 2711

19. Jun 2011, 13:51
Beitrag # 3 von 25
Beitrag ID: #473983
Bewertung:
(6418 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Christoph,

vielleicht hilft Dir ja auch dieser Link:
http://indisnip.wordpress.com/...iable-to-text-frame/


als Antwort auf: [#473977]

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1092

20. Jun 2011, 07:37
Beitrag # 4 von 25
Beitrag ID: #474000
Bewertung:
(6355 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielen lieben Dank für die Hilfe an
Gerald und Werner.

Schöne Grüße
Christoph


als Antwort auf: [#473983]

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1092

20. Jun 2011, 19:18
Beitrag # 5 von 25
Beitrag ID: #474085
Bewertung:
(6313 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#474000]

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2711

20. Jun 2011, 20:10
Beitrag # 6 von 25
Beitrag ID: #474088
Bewertung:
(6299 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#474085]

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1092

20. Jun 2011, 20:25
Beitrag # 7 von 25
Beitrag ID: #474089
Bewertung:
(6292 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#474088]
(Dieser Beitrag wurde von cwenet am 20. Jun 2011, 20:26 geändert)

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

20. Jun 2011, 20:52
Beitrag # 8 von 25
Beitrag ID: #474091
Bewertung:
(6277 mal gelesen)
URL zum Beitrag
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; 



als Antwort auf: [#474085]

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

20. Jun 2011, 21:01
Beitrag # 9 von 25
Beitrag ID: #474093
Bewertung:
(6275 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#474089]
(Dieser Beitrag wurde von Martin Fischer am 20. Jun 2011, 21:06 geändert)

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1092

20. Jun 2011, 21:06
Beitrag # 10 von 25
Beitrag ID: #474094
Bewertung:
(6266 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#474093]

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

20. Jun 2011, 21:15
Beitrag # 11 von 25
Beitrag ID: #474095
Bewertung:
(6260 mal gelesen)
URL zum Beitrag
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?


als Antwort auf: [#474094]
(Dieser Beitrag wurde von Martin Fischer am 20. Jun 2011, 21:21 geändert)

Textvariable ausgeben (CS4, WIN)

cwenet
Beiträge gesamt: 1092

20. Jun 2011, 22:21
Beitrag # 12 von 25
Beitrag ID: #474098
Bewertung:
(6213 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#474095]

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2711

21. Jun 2011, 06:18
Beitrag # 13 von 25
Beitrag ID: #474104
Bewertung:
(6181 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#473977]

Textvariable ausgeben (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

21. Jun 2011, 08:20
Beitrag # 14 von 25
Beitrag ID: #474108
Bewertung:
(6162 mal gelesen)
URL zum Beitrag
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 ...


als Antwort auf: [#474104]
(Dieser Beitrag wurde von Martin Fischer am 21. Jun 2011, 08:30 geändert)

Textvariable ausgeben (CS4, WIN)

WernerPerplies
Beiträge gesamt: 2711

21. Jun 2011, 08:38
Beitrag # 15 von 25
Beitrag ID: #474109
Bewertung:
(6149 mal gelesen)
URL zum Beitrag
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?


als Antwort auf: [#474108]
(Dieser Beitrag wurde von WernerPerplies am 21. Jun 2011, 08:47 geändert)
X