[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Textrahmenbreite als Text-Variable

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

Textrahmenbreite als Text-Variable

Bernhard Werner
Beiträge gesamt: 5130

27. Jan 2011, 01:25
Beitrag # 1 von 24
Bewertung:
(13647 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ich würde gerne die Breite eines Textrahmens als Variable in selbigen anzeigen lassen. Ist das mit InDesign CS5 unter 10.6 möglich?

Ich mach' das bislang händisch - was an sich nicht das Problem ist. Nur frage ich mich, ob das auch anders möglich ist.

Dank und Gruß
Bernhard
X

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 08:08
Beitrag # 2 von 24
Beitrag ID: #463026
Bewertung:
(13575 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bernhard,

Antwort auf: Ich mach' das bislang händisch - was an sich nicht das Problem ist. Nur frage ich mich, ob das auch anders möglich ist.


Wie gehst Du dabei vor, wenn Du es händisch machst?
Was machst Du, wenn sich die Breite des Textrahmens ändert?


als Antwort auf: [#463011]

Textrahmenbreite als Text-Variable

Bernhard Werner
Beiträge gesamt: 5130

27. Jan 2011, 11:03
Beitrag # 3 von 24
Beitrag ID: #463039
Bewertung:
(13534 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

nun ja, ich ziehe den Rahmen entsprechend auf oder gebe die neue Breite in der Maßpalette ein. Danach ändere ich die Zahl im Textrahmen entsprechend. Oder auch in umgekehrter Reihenfolge.

Im Anhang ein Screenshot zur Verdeutlichung.

Dank und Gruß
Bernhard


als Antwort auf: [#463026]
Anhang:
RS.jpg (27.8 KB)

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 12:14
Beitrag # 4 von 24
Beitrag ID: #463055
Bewertung:
(13515 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bernhard,

das folgende Skript schreibt Dir die Breite in die ausgewählten Textrahmen.

Code
// widthOfTextframe2ItsContent.jsx  

if (app.selection.length > 0 )
{
for (var i = 0; i < app.selection.length; i++ )
{
if (app.selection[i].constructor.name == 'TextFrame')
{
var gb = app.selection[i].geometricBounds;
app.selection[i].parentStory.contents = round_num(gb[3]-gb[1], 2) + ' ' + get_units();
}
}
}

function round_num(aNum, aDec)
{
return String(Math.round(aNum * Math.pow(10, aDec))/Math.pow(10, aDec)).replace('.', ',') ;
}

function get_units()
{
switch (app.activeDocument.viewPreferences.horizontalMeasurementUnits)
{
case 2054187363:
return 'p';
break;
case 2054188905:
return 'Pt';
break;
case 2053729891:
return 'Zoll';
break;
case 2053729892:
return 'Zoll';
break;
case 2053991795:
return 'mm';
break;
case 2053336435:
return 'cm';
break;
case 2053335395:
return 'c';
break;
case 2051106676:
return 'ag';
break;
default:
return "";
break;
}
}



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

Textrahmenbreite als Text-Variable

Bernhard Werner
Beiträge gesamt: 5130

27. Jan 2011, 13:04
Beitrag # 5 von 24
Beitrag ID: #463060
Bewertung:
(13493 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke, Martin! Das ist wirklich sehr praktisch.

Über die Funktion "Textvariablen" lässt sich also nichts machen/aufbohren?

Gruß
Bernhard


als Antwort auf: [#463055]

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 13:11
Beitrag # 6 von 24
Beitrag ID: #463064
Bewertung:
(13491 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
> Über die Funktion "Textvariablen" lässt sich also nichts machen/aufbohren?

Über diesen Begriff von Dir bin ich gestolpert.
Deswegen hatte ich nachgehakt.

Wie könnte/sollte eine Lösung über Textvariablen Deiner Meinung nach aussehen?
Willst Du für jeden Textrahmen eine Variable anlegen und dieser den Wert der aktuellen Breit zuweisen?
Was wäre mit diesem (vergleichsweise großem) Aufwand gewonnen?


als Antwort auf: [#463060]
(Dieser Beitrag wurde von Martin Fischer am 27. Jan 2011, 13:39 geändert)

Textrahmenbreite als Text-Variable

Bernhard Werner
Beiträge gesamt: 5130

27. Jan 2011, 14:54
Beitrag # 7 von 24
Beitrag ID: #463074
Bewertung:
(13454 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ] Wie könnte/sollte eine Lösung über Textvariablen Deiner Meinung nach aussehen?

So? :-)

Antwort auf [ Martin Fischer ] Willst Du für jeden Textrahmen eine Variable anlegen und dieser den Wert der aktuellen Breit zuweisen?

Nur für einen einzigen Textrahmen pro Dokument.

Antwort auf [ Martin Fischer ] Was wäre mit diesem (vergleichsweise großem) Aufwand gewonnen?

Zum einen die Gefahr bannen, dass bei einer Breitenänderung der Wert im Textrahmen nicht aktualisiert wird, zum anderen die Häufigkeit.

Mit deinem Script ist natürlich schon viel Zeit gewonnen, wenn sich die Änderung jetzt noch "dynamisch" aktualisieren würde, wäre es perfekt. Das muss auch nicht für lau sein!

Dank und Gruß
Bernhard


als Antwort auf: [#463064]

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 15:28
Beitrag # 8 von 24
Beitrag ID: #463079
Bewertung:
(13444 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bernhard,

da der Inhalt einer Variable nicht direkt mit der Breite eines Textrahmens gekoppelt ist, wird dieser nach einer Größenänderung des Textrahmens auch nicht automatisch aktualisiert. Damit bleibt das Grundproblem bestehen.

Ich wüßte nicht, wie man die Breite eines Textrahmens direkt mit dem Inhalt einer Variablen koppeln könnte. Dazu wäre ein Event 'Änderung der Breite' eines Textrahmens nötig. Und eine solches ist mir nicht bekannt – was nicht viel heißen will, denn mit den Events in InDesign CS5 bin ich noch nicht so vertraut und dort könnte sich durchaus ein solches verstecken. Dort lässt sich einem Textrahmen ein Eventlistener (ein Horcher) hinzufügen. Möglicherweise wäre das die Lösung ...


als Antwort auf: [#463074]
(Dieser Beitrag wurde von Martin Fischer am 28. Jan 2011, 10:27 geändert)

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 15:38
Beitrag # 9 von 24
Beitrag ID: #463080
Bewertung:
(13438 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich glaube, am Angebot der Events selbst hat sich in CS5 nichts geändert:

Zitat beforeQuit, afterQuit,
beforeNew, afterNew,
beforeOpen, afterOpen,
beforeClose, afterClose,
beforeSave, afterSave,
beforeSaveAs, afterSaveAs,
beforeSaveACopy, afterSaveACopy,
beforeRevert, afterRevert,
beforePrint, afterPrint,
beforeExport, afterExport,
beforeImport, afterImport


Deswegen sehe ich schlechte Chancen hinsichtlich der Beobachtung der Änderung der Größe eines Textrahmens.


als Antwort auf: [#463079]

Textrahmenbreite als Text-Variable

gfellenz
Beiträge gesamt: 121

27. Jan 2011, 19:39
Beitrag # 10 von 24
Beitrag ID: #463100
Bewertung:
(13390 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hey martin,

in cs5 gibt’s ne ganze menge mehr events. für die oben genannten frage gäbe es z.b.

Code
AFTER_SELECTION_CHANGED 


und

Code
AFTER_SELECTION_ATTRIBUTE_CHANGED 


die triggern aber so oft, das man da eher vorsichtig sein sollte. ich persönlich würde vorsichtig sein. wobei die berechnung der textrahmenbreite noch vertrebar schnell geht.

gregor

zum testen:

Sind nicht alle Events dring, und vorsicht beim ausprobieren :-)

Code
#targetengine "session2" 

main();

function myafterActivate(myEvent){alert ("afterActivate");}
function myafterClose(myEvent){alert ("afterClose");}
function myafterContextChanged(myEvent){alert ("afterContextChanged");}
function myafterDelete(myEvent){alert ("afterDelete");}
function myafterEmbed(myEvent){alert ("afterEmbed");}
function myafterInvoke(myEvent){alert ("afterInvoke");}
function myafterLinksChanged(myEvent){alert ("afterLinksChanged");}
function myafterMove(myEvent){alert ("afterMove");}
function myafterNew(myEvent){alert ("afterNew");}
function myafterOpen(myEvent){alert ("afterOpen");}
function myafterPlace(myEvent){alert ("afterPlace");}
function myafterQuit(myEvent){alert ("afterQuit");}
function myafterSelectionAttributeChanged(myEvent){alert ("afterSelectionAttributeChanged");}
function myafterSelectionChanged(myEvent){alert ("afterSelectionChanged");}
function myafterUnembed(myEvent){alert ("afterUnembed");}
function myafterUpdate(myEvent){alert ("afterUpdate");}
function mybeforeClose(myEvent){alert ("beforeClose");}
function mybeforeDeactivate(myEvent){alert ("beforeDeactivate");}
function mybeforeDelete(myEvent){alert ("beforeDelete");}
function mybeforeDisplay(myEvent){alert ("beforeDisplay");}
function mybeforeEmbed(myEvent){alert ("beforeEmbed");}
function mybeforeInvoke(myEvent){alert ("beforeInvoke");}
function mybeforeMove(myEvent){alert ("beforeMove");}
function mybeforePlace(myEvent){alert ("beforePlace");}
function mybeforeQuit(myEvent){alert ("beforeQuit");}
function mybeforeUnembed(myEvent){alert ("beforeUnembed");}
function mybeforeUpdate(myEvent){alert ("beforeUpdate");}
function myonInvoke(myEvent){alert ("onInvoke");}


function main() {
app.activeDocument.addEventListener("afterActivate", myafterActivate);
app.activeDocument.addEventListener("afterClose", myafterClose);
app.activeDocument.addEventListener("afterContextChanged", myafterContextChanged);
app.activeDocument.addEventListener("afterDelete", myafterDelete);
app.activeDocument.addEventListener("afterEmbed", myafterEmbed);
app.activeDocument.addEventListener("afterInvoke", myafterInvoke);
app.activeDocument.addEventListener("afterLinksChanged", myafterLinksChanged);
app.activeDocument.addEventListener("afterMove", myafterMove);
app.activeDocument.addEventListener("afterNew", myafterNew);
app.activeDocument.addEventListener("afterOpen", myafterOpen);
app.activeDocument.addEventListener("afterPlace", myafterPlace);
app.activeDocument.addEventListener("afterQuit", myafterQuit);
app.activeDocument.addEventListener("afterSelectionAttributeChanged", myafterSelectionAttributeChanged);
app.activeDocument.addEventListener("afterSelectionChanged", myafterSelectionChanged);
app.activeDocument.addEventListener("afterUnembed", myafterUnembed);
app.activeDocument.addEventListener("afterUpdate", myafterUpdate);
app.activeDocument.addEventListener("beforeClose", mybeforeClose);
app.activeDocument.addEventListener("beforeDeactivate", mybeforeDeactivate);
app.activeDocument.addEventListener("beforeDelete", mybeforeDelete);
app.activeDocument.addEventListener("beforeDisplay", mybeforeDisplay);
app.activeDocument.addEventListener("beforeEmbed", mybeforeEmbed);
app.activeDocument.addEventListener("beforeInvoke", mybeforeInvoke);
app.activeDocument.addEventListener("beforeMove", mybeforeMove);
app.activeDocument.addEventListener("beforePlace", mybeforePlace);
app.activeDocument.addEventListener("beforeQuit", mybeforeQuit);
app.activeDocument.addEventListener("beforeUnembed", mybeforeUnembed);
app.activeDocument.addEventListener("beforeUpdate", mybeforeUpdate);
app.activeDocument.addEventListener("onInvoke", myonInvoke);
}



als Antwort auf: [#463080]

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 20:33
Beitrag # 11 von 24
Beitrag ID: #463104
Bewertung:
(13377 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gregor,

ich hatte es geahnt.
War allerdings auf die Schnelle nicht fündig geworden.

Kannst Du mir spontan sagen, wie man ein AFTER_SELECTION_CHANGED oder ein "nachdem ich geändert wurde" an einen Textrahmen hängt?
Bin gerade unterwegs und hab kein Werkzeug zum ausprobieren.


als Antwort auf: [#463100]

Textrahmenbreite als Text-Variable

gfellenz
Beiträge gesamt: 121

27. Jan 2011, 21:10
Beitrag # 12 von 24
Beitrag ID: #463106
Bewertung:
(13353 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo martin,

die kannst du meines wissens nur an Application oder Document hängen. deswegen meinte ich auch, dass es eher wenig resourcenfreundlich wäre.

habe mal deinen und meinen code zusammengehangen. ist natürlich noch relativ weit weg von einer echten textvariable. wobei ich eigentlich immer noch nicht verstanden habe wozu das gut sein soll... aber das muss ich ja auch nicht :-)

Code
#targetengine "session2"  

main();

function myafterSelectionAttributeChanged(myEvent){
if (app.selection.length > 0 && app.selection[0].constructor.name == 'TextFrame') {
var tf = app.selection[0];
var gb = tf.geometricBounds;
tf.parentStory.contents = round_num(gb[3]-gb[1], 2) + ' ' + get_units();
}
}


function main() {
app.activeDocument.addEventListener("afterSelectionAttributeChanged", myafterSelectionAttributeChanged);
}




function round_num(aNum, aDec)
{
return String(Math.round(aNum * Math.pow(10, aDec))/Math.pow(10, aDec)).replace('.', ',') ;
}

function get_units()
{
switch (app.activeDocument.viewPreferences.horizontalMeasurementUnits)
{
case 2054187363:
return 'p';
break;
case 2054188905:
return 'Pt';
break;
case 2053729891:
return 'Zoll';
break;
case 2053729892:
return 'Zoll';
break;
case 2053991795:
return 'mm';
break;
case 2053336435:
return 'cm';
break;
case 2053335395:
return 'c';
break;
case 2051106676:
return 'ag';
break;
default:
return "";
break;
}
}



als Antwort auf: [#463104]

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

27. Jan 2011, 21:18
Beitrag # 13 von 24
Beitrag ID: #463108
Bewertung:
(13350 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke für das Beispiel.
Aber es gibt doch auch diesen Befehl addEventListener() o.ä. bei textframe.
Hast Du ne Idee, wie der zu verwenden wäre?


als Antwort auf: [#463106]

Textrahmenbreite als Text-Variable

gfellenz
Beiträge gesamt: 121

27. Jan 2011, 21:26
Beitrag # 14 von 24
Beitrag ID: #463111
Bewertung:
(13343 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
soweit ich das verstanden habe, können an die klasse TextFrame nur die Events afterPlace und beforePlace. bzw. an die base class PageItem.

laut doku kann man die selectionChange-Events sogar nur an die Application packen - wobei indesign die auch mit Document verarbeitet.

insgesamt arbeite ich aber auch eher selten mit events...


als Antwort auf: [#463108]

Textrahmenbreite als Text-Variable

Martin Fischer
  
Beiträge gesamt: 12783

28. Jan 2011, 07:53
Beitrag # 15 von 24
Beitrag ID: #463119
Bewertung:
(13253 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gregor,

Antwort auf: soweit ich das verstanden habe, können an die klasse TextFrame nur die Events afterPlace und beforePlace. bzw. an die base class PageItem.


So ist es.
Konnte es inzwischen nachschlagen und bestätigen.
Für die obige Aufgabe – Aktualisierung des Inhalts eines bestimmten Textrahmens bei Größenänderung – ist hier (am textFrame selbst) also keine Lösung zu finden.

Es funktioniert, wie von Dir gezeigt, mit dem afterSelectionAttributeChanged-Event des documents.

Das dürfte für diesen Zweck aber auch dann noch übertrieben sein, wenn man in der aufgerufenen Funktion noch genauer differenziert, aufgrund welcher Kriterien der Inhalt des geänderten Textrahmens geändert werden soll.
Wg. dem ständigen Zurücktriggern liefe es auf eine Fahrt mit angezogener Handbremse hinaus.

Herzlichen Dank auch für Deine beeindruckende Übersicht einer Auswahl von Events und ihren Meldungen. Vor lauter (Meldungen) Wegklicken kommt man kaum mehr dazu, ein neues Event auszulösen. ;-)

Da ich InDesign CS5 in meiner Praxis (wissenschaftlicher Werksatz) nach wie vor nicht verwenden kann, konnte ich mich auch nicht beiläufig bzw. mitgehend in die neuen Angebote für's Skripten reinarbeiten. CS5 zu skripten wird mir damit wohl auch auf längere Sicht weitgehend fremd bleiben.
Schade, denn ich erahne dort großes Potential.


als Antwort auf: [#463111]
X