[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Finde Textrahmen mit größter Schriftgröße

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

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

12. Mai 2021, 17:48
Beitrag # 1 von 28
Bewertung:
(6601 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich stehe vor einem Problem bei dem ich leider nicht weiterkomme.

Ich möchte aus einer Anzahl an ausgewählten Textrahmen denjenigen ermitteln der die größte Schriftgröße hat.

Aber aus irgendeinem Grund durchläuft die ForSchleife nicht die einzelnen Schriftgrößen:

Code
var sel = app.selection; 

for (i=0; i<sel.length; i++)
{
var char1size = sel[i].characters[0].pointSize;

};

alert (char1size);



Ich bekomme immer nur einen Wert statt der Anzahl an Werten die eben meiner Auswahl entsprechen.

Ziel ist den Textrahmen mit der größten Schriftgröße zu ermitteln. Das habe ich auch schon mit Math.max versucht aber das Ergebnis war NaN.

Habt ihr eine Idee? Wie würdet ihr vorgehen? Vielen Dank im Voraus
X

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12778

12. Mai 2021, 19:02
Beitrag # 2 von 28
Beitrag ID: #579859
Bewertung:
(6577 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

hast Du Dir mal vor Augen geführt, was Dein Code macht?

Die Zuweisung der Auswahl an eine Variable sel zur einfacheren Adressierung ist soweit klar.

In der Schleife wird (ungeprüft, ob das ausgewählte Objekt überhaupt Zeichen/characters beinhaltet) der Reihe nach jeweils die Schriftgröße des ersten Zeichens der ausgewählten Objekte ermittelt und in die Variable char1size geschrieben.

Am Ende wird der Inhalt der Variable car1size ausgegeben.

Weil der aber in der Schleife jeweils überschrieben wurde, wird am Ende nur der Wert des letzten Objekts ausgegeben. Die anderen Werte sind bis dahin längst vergessen.

Du solltest während dem Schleifendurchgang die Werte z.B. in einem Array festhalten und am Ende zusammengefasst ausgeben.

Hier ein Beispiel mit Prüfung auf Zeichen in den ausgewählten Objekten:

Code
var sel = app.selection; 
var arr = []; // Array zum Sammeln der Werte
var str = ''; // Initialisierung einer Variable für einen String

for (var i = 0; i < sel.length; i++)
{
if (sel[i].hasOwnProperty('characters') && sel[i].characters.length > 0)
{
arr.push(String(sel[i].characters[0].pointSize)); // Schriftgröße sammeln
}
else // kein Zeichen im ausgewählten Objekt
{
arr.push('-'); // Platzhalter für nix sammeln (oder auch einfach ignorieren)
}
};

str = arr.join('\n'); // Zusammenfügen der Werte im Array zu einem String mit Zeilenschaltung als Trennzeichen

alert('Meine Schriftgrößen:\n' + str); // Ausgabe des Strings



Antwort auf: Ziel ist den Textrahmen mit der größten Schriftgröße zu ermitteln. Das habe ich auch schon mit Math.max versucht aber das Ergebnis war NaN.


Math.max(???) von was?

Wie würdest Du zu Fuß oder händisch zur Bestimmung des gewünschten Rahmens vorgehen?
Was würdest Du tun, wenn der höchste Wert zwei oder mehrere Male vertreten wäre?
Und was wäre die Konsequenz der Ermittlung des Maximums? Einfach darauf hinweisen?


als Antwort auf: [#579858]
(Dieser Beitrag wurde von Martin Fischer am 12. Mai 2021, 19:25 geändert)

Finde Textrahmen mit größter Schriftgröße

Uwe Laubender
Beiträge gesamt: 5314

12. Mai 2021, 20:20
Beitrag # 3 von 28
Beitrag ID: #579860
Bewertung:
(6553 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Und noch eine Anregung:
Arbeite mit textStyleRanges, anstatt mit einzelnen Zeichen.

https://www.indesignjs.de/...#TextStyleRange.html


Geht, je nach formatiertem Text, sehr viel schneller.
Vor allem dann, wenn Du große Textmengen hast.


als Antwort auf: [#579858]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2759

13. Mai 2021, 07:42
Beitrag # 4 von 28
Beitrag ID: #579861
Bewertung:
(6473 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Faxinger,

ein wenig Overkill :-) - mein Vorschlag:
Code
// by Werner Perplies, EDV-Anwendungsberatung, 
// https://www.weepee.de, email: werner.perplies@weepee.de
main();

/*Void*/function main(){
// load Prototypes
try{
loadPrototypes();
var /*TextFrame*/tF = getTextFramesWithLargestPointSize(/*Array*/app.selection[0]);
if (tF !== null)
tF.select();
/*Array*/function getTextFramesWithLargestPointSize(/*Array*/selection){
try{
var /*Int*/l = app.selection.length, /*Array*/tSrs = [];

if (l < 1)
throw Error("Sie haben keine Auswahl getroffen!");
for (var i = 0; i < l; i++){
// gather all textRanges
if ("textStyleRanges" in app.selection[i]){
tSrs = tSrs.concat(app.selection[i].textStyleRanges.everyItem().getElements())
}
}
// alert(tSrs.length.toString() + " gefundene Textbereiche");
// sort textranges for pointSize
if (tSrs.length > 0){
tSrs.sortThis("pointSize", true, true);
return tSrs[0].parentTextFrames[0];
}
}
catch (error){
// alert("Fehler: " + error.message + "\nfehlernummer: " + error.number + "\nin Zeile: " + error.number);
throw error;
}
return;
}
}
catch (error){
alert("Fehler: " + error.message + "\nfehlernummer: " + error.number + "\nin Zeile: " + error.number);
}
}
/*Void*/function loadPrototypes(){
// DESCRIPTION sorts an Array for a field content
// Dateiname: wpsPrototypesArraySortThis.jsx
// © 2017 - 2021 by Werner Perplies, EDV-Anwendungsberatung,
// https://www.weepee.de, email: werner.perplies@weepee.de
// created: Mon May 01 2017 08:19:21 GMT+0200
/*array*/Array.prototype.sortThis=function(/*String*/field, /*Boolean*/reverse,
/*Boolean*/numeric, /*Boolean*/localized) // /*Boolean*/localized: for future usage
{
try
{
if (numeric == undefined)
numeric = false;
if (reverse == undefined)
reverse = false;
if (reverse)
if (numeric)
return this.sort(sortthisDownN);
else
return this.sort(sortthisDownS);
else
if (numeric)
return this.sort(sortthisUpN);
else
return this.sort(sortthisUpS);
}
catch (error)
{
throw error;
}
return this;

/*int*/function sortthisUpS(e1, e2)
{
try
{
if (field==null)
{
if (e1<e2) return -1;
if (e1>e2) return 1;
return 0;
}
else
{
if (e1[field]<e2[field]) return -1;
if (e1[field]>e2[field]) return 1;
return 0;
}
}
catch (error)
{
throw error;
}
}
/*int*/function sortthisDownS(e1, e2)
{
try
{
if (field==null)
{
if (e1>e2) return -1;
if (e1<e2) return 1;
return 0;
}
else
{
if (e1[field]>e2[field]) return -1;
if (e1[field]<e2[field]) return 1;
return 0;
}
}
catch (error)
{
throw error;
}
}
/*int*/function sortthisUpN(e1, e2)
{
try
{
if (field==null)
{
return e1 - e2;
}
else
{
return e1[field] - e2[field];
}
}
catch (error)
{
throw error;
}
}
/*int*/function sortthisDownN(e1, e2)
{
try
{
if (field==null)
{
return (e2 - e1);
}
else
{
return (e2[field] - e1[field]);
}
}
catch (error)
{
throw error;
}
}
}
}


Falls Du mehrere Textrahmen mit gleich größter Schriftgröße erwarten kannst, müsstest Du das Ergebnisarray noch einmal entsprechend filtern.


als Antwort auf: [#579858]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12778

13. Mai 2021, 08:05
Beitrag # 5 von 28
Beitrag ID: #579862
Bewertung:
(6468 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen Herr Perplies,

Zitat ein wenig Overkill :-)


Sozusagen eine "Hinrichtung".

Der Job dürfte damit erledigt. sein.
Der Fragesteller aber auch.

Was ist das Ziel dieser Diskussion?


als Antwort auf: [#579861]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2759

13. Mai 2021, 08:16
Beitrag # 6 von 28
Beitrag ID: #579863
Bewertung:
(6464 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen Herr Fischer,

Aufgabestellung:
Finde Textrahmen mit größter Schriftgröße

Mein Skript tut genau das.

Und es zeigt außerdem:
1. Wie man die Sichtbarkeit von Variablen einschränkt
2. Den Einsatz von Prototypen
3. Wie man Fehler behandelt
4. liefert eine Sortierroutine für Arrays und Collections.

Also kurz, wen nur die Aufgabenstellung interessiert, kann die Routine als Funktion benutzen, wer das Skript verstehen will, sollte die einzelnen Schritte am Besten im Einzelschrittverfahren durchgehen.

Ich bevorzuge halt wiederverwendbaren Codde, den man in vielen ähnlichen Aufgabenstellungen einsetzen kann.


als Antwort auf: [#579862]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 08:01
Beitrag # 7 von 28
Beitrag ID: #579874
Bewertung:
(6375 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,

vielen herzlichen Dank erstmal für di Antworten.

@Werner: Das ist der totale Overkill :-) So viele Prüfungen benötige ich gar nicht. Aber trotzdem Danke, der Code zeigt auf wie viele Umstände man berücksichtigen kann.

@Martin: Hier geht es schon in die richtige Richtung. Vielen Dank.
Die Prüfung ob die Auswahl characters enthält ist aber in meinem Fall auch nicht notwendig, da nur Textrahmen mit Inhalt ausgewählt werden. Ziel ist nach wie vor zu ermitteln, welcher Textrahmen als erstes Zeichen das mit der größten Schriftgröße enthält. Das wird dann wohl mit einer Math.max Abfrage im neu erstellten Array funktionieren oder? Mit diesem Textrhamen soll dann in weiterer Folge auch etwas passieren.

Herzlichen Dank nochmal.
LG
faxinger


als Antwort auf: [#579863]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 08:17
Beitrag # 8 von 28
Beitrag ID: #579875
Bewertung:
(6369 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Uwe für die Anregung,
textStyleRanges sind aber in diesem Fall nicht von Belang.

Alles Liebe.
LG
faxinger


als Antwort auf: [#579860]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2759

14. Mai 2021, 08:47
Beitrag # 9 von 28
Beitrag ID: #579876
Bewertung:
(6353 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Faxinger,

hast Du denn mal mein Skript ausprobiert, Du brauchst nur die Funktion
Code
getTextFramesWithLargestPointSize(/*Array*/Deine Selection) 

aufrufen und schon wird Dir der Textrahmen selektiert, der irgendwo die größte Schriftgröße enthält.

Einfacher geht es doch wirklich nicht, oder?

Dafür sind keinerlei Kenntnisse über mein Skript notwendig.


als Antwort auf: [#579874]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12778

14. Mai 2021, 08:57
Beitrag # 10 von 28
Beitrag ID: #579877
Bewertung:
(6341 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

es führen mehrere Wege zum Ziel.

Persönlich würde ich in einem Array die ausgewerteten Textrahmen und ihre Schriftgrößen ermitteln und anschließend nach den Schriftgrößen sortieren und daraus den Textrahmen mit der maximalen Schriftgröße ermitteln:

Code
arr = {tf_id: null, pointsize: 0}; 


Aber Du kannst auch beim Durchgang durch die Schleife den aktuellen Wert der Schriftgröße (sel[i].characters[0].pointSize) mit dem bislang ermittelten Maximum (max) vergleichen und ggf. den alten Maximumswert ersetzen durch den aktuellen und den neuen Favoriten (fav) festhalten.

Code
var sel = app.selection; 
var arr = []; // Array mit Schriftgrößen
var str = ''; // String für Zusammenfassung der Schriftgrößen
var max = 0; // Maximum
var fav = 0; // Favorit

for (var i = 0; i < sel.length; i++)
{
if (sel[i].hasOwnProperty('characters') && sel[i].characters.length > 0)
{
arr.push(String(sel[i].characters[0].pointSize));
if (sel[i].characters[0].pointSize > max)
{
max = sel[i].characters[0].pointSize;
fav = i;
}
}
else
{
arr.push('-');
}
};

app.select(sel[fav]);

str = arr.join('\n');
str = 'Mein Favorit: ' + sel[fav].characters[0].pointSize + '\n' + str;
alert(str);



als Antwort auf: [#579875]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2759

14. Mai 2021, 09:00
Beitrag # 11 von 28
Beitrag ID: #579878
Bewertung:
(6340 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Faxinger,
Zitat textStyleRanges sind aber in diesem Fall nicht von Belang.


löst aber Dein Problem.

Du solltest weniger über "diesen Fall" nachdenken, sondern was hast Du für ein Problem, und wie löst man so etwas.

WiederverwendbarerCode heißt das Zauberwort, das Entwicklungs- und vor allen Dingen Testzeit spart.


als Antwort auf: [#579875]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 09:03
Beitrag # 12 von 28
Beitrag ID: #579880
Bewertung:
(6338 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,
ja dein Skript habe ich ausprobiert und es funktioniert auch wunderbar. Vielen Dank dafür! Aber leider ist dieses Skript für mich zu kompliziert um es nachvollziehen zu können.
Und das ist es auch worum es mir geht.

Ich möchte auch verstehen was hier vor sich geht. :-) Und das geht nur bei einfach gestrickten Skripten, bei denen nicht alle möglichen Szenarien abgefragt werden.

Ich bin was Skripten anbelangt wirklich Anfänger und weit davon entfernt für andere zu programmieren. Das ist auch nicht mein Ziel :-) Für mich muss ein Skript nachvollziehbar und so einfach/kurz wie möglich sein. Mir ist die Gefahr durchaus bewußt, dass es zu Abstürzen kommen kann, falls gewisse Abfragen nicht durchgeführt werden, aber ich schreibe diese kleinen Helferlein nur für mich und ich weiß ja was z.B. ausgewählt ist. Würde ich für andere schreiben müsste ich an meine Skripte ganz anders herangehen.

Vielen Dank nochmal Werner. Alles Gute.
LG
faxinger


als Antwort auf: [#579876]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2759

14. Mai 2021, 09:03
Beitrag # 13 von 28
Beitrag ID: #579881
Bewertung:
(6336 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Herr Fischer,

Zitat Persönlich würde ich in einem Array die ausgewerteten Textrahmen und ihre Schriftgrößen ermitteln und anschließend nach den Schriftgrößen sortieren und daraus den Textrahmen mit der maximalen Schriftgröße ermitteln:

Danke, Sie kurz und prägnant die Funktion meines Skriptes beschrieben. :-)


als Antwort auf: [#579877]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2759

14. Mai 2021, 09:06
Beitrag # 14 von 28
Beitrag ID: #579882
Bewertung:
(6332 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

Zitat ja dein Skript habe ich ausprobiert und es funktioniert auch wunderbar. Vielen Dank dafür! Aber leider ist dieses Skript für mich zu kompliziert um es nachvollziehen zu können.
Und das ist es auch worum es mir geht.


Dann frage doch einfach!

Aber musst Du wirklich den Source-Code von InDesign kennen, um die Funktion zu verstehen?


als Antwort auf: [#579880]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 09:10
Beitrag # 15 von 28
Beitrag ID: #579883
Bewertung:
(6330 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für deine Antwort.

Wo ich mit meiner Denkweise scheitere ist: es wird zuerst ein Array mit den Werten der Schriftgrößen erzeugt.

Wieso kann ich nicht danach (sobald der Array fertig generiert wurde)den größten Wert aus diesem Array ermitteln?
Hier habe ich den Knopf in meiner Denkweise.
Für mich wäre das der logische Ablauf:
Erstelle Array und dann liefere den größten Wert aus den einzelnen Werten des Arrays.

Denke ich zu umständlich?

Ich glaube Programmierer denken anders :-)

LG
faxinger


als Antwort auf: [#579877]
X