[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:
(6659 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: 12783

12. Mai 2021, 19:02
Beitrag # 2 von 28
Beitrag ID: #579859
Bewertung:
(6635 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: 5316

12. Mai 2021, 20:20
Beitrag # 3 von 28
Beitrag ID: #579860
Bewertung:
(6611 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: 2762

13. Mai 2021, 07:42
Beitrag # 4 von 28
Beitrag ID: #579861
Bewertung:
(6531 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: 12783

13. Mai 2021, 08:05
Beitrag # 5 von 28
Beitrag ID: #579862
Bewertung:
(6526 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: 2762

13. Mai 2021, 08:16
Beitrag # 6 von 28
Beitrag ID: #579863
Bewertung:
(6522 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:
(6433 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:
(6427 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: 2762

14. Mai 2021, 08:47
Beitrag # 9 von 28
Beitrag ID: #579876
Bewertung:
(6411 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: 12783

14. Mai 2021, 08:57
Beitrag # 10 von 28
Beitrag ID: #579877
Bewertung:
(6399 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: 2762

14. Mai 2021, 09:00
Beitrag # 11 von 28
Beitrag ID: #579878
Bewertung:
(6398 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:
(6396 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: 2762

14. Mai 2021, 09:03
Beitrag # 13 von 28
Beitrag ID: #579881
Bewertung:
(6394 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: 2762

14. Mai 2021, 09:06
Beitrag # 14 von 28
Beitrag ID: #579882
Bewertung:
(6390 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:
(6388 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]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2762

14. Mai 2021, 09:40
Beitrag # 16 von 28
Beitrag ID: #579884
Bewertung:
(4874 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

Zitat Wieso kann ich nicht danach (sobald der Array fertig generiert wurde)den größten Wert aus diesem Array ermitteln?

Doch kannst Du!

Annahme: Array austeigend:
array.pop() -> letztes Element mit dem größten Wert

Annhame: Array absteigend:
array.shift() -> erstes Element mit dem größten Wert

Das Element wird aus dem Array entfernt.


als Antwort auf: [#579883]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12783

14. Mai 2021, 09:41
Beitrag # 17 von 28
Beitrag ID: #579885
Bewertung:
(4873 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Ich glaube Programmierer denken anders :-)


Bin auch kein Programmierer, sondern ein an Automatisierung interessierter Schriftsetzer.

Antwort auf: Wieso kann ich nicht danach (sobald der Array fertig generiert wurde)den größten Wert aus diesem Array ermitteln?


Das geht schon.
Code
var max = Math.max(arr); 


Aber dann kennst Du zwar den maximalen Wert, weißt aber (noch) nicht, in welchem Textrahmen der nun steckt, weil er - skripttechnisch - noch keine Verbindung zum Textrahmen hat.

Nun könntest Du hingehen, und die Schleife nochmal durchgehen und prüfen, wo dieser Wert (zum ersten Mal) vorkommt. Das ist recht umständlich (und frißt ggf. Zeit).
Oder Du kannst die Position des höchsten Wertes im Array ermitteln und von dort auf den entsprechenden Textrahmen in der Auswahl schließen.

In meinem einfachen Code oben habe ich versucht, beim ersten Durchgang quasi das Ergebnis schon mitzunehmen: Was bei der Prüfung gleich richtig einsortiert wird, braucht nicht nachher neu herausgefunden werden.

Aber wie oben angegeben: Es führen viele Wege nach Rom.


als Antwort auf: [#579883]
(Dieser Beitrag wurde von Martin Fischer am 14. Mai 2021, 09:42 geändert)

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 09:42
Beitrag # 18 von 28
Beitrag ID: #579886
Bewertung:
(4869 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für dein Skript, das kann ich logisch nachvollziehen, bis auf einen kleinen Punkt :-)
Code
                    arr.push(String(sel[i].characters[0].pointSize)); 


Warum wird hier ein String vor die Schriftgröße gesetzt?
Danke
LG
faxinger


als Antwort auf: [#579877]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2762

14. Mai 2021, 09:43
Beitrag # 19 von 28
Beitrag ID: #579887
Bewertung:
(4869 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

Zitat Wieso kann ich nicht danach (sobald der Array fertig generiert wurde)den größten Wert aus diesem Array ermitteln?

Doch kannst Du!

Annahme: Array austeigend:
array.pop() -> letztes Element mit dem größten Wert

Annhame: Array absteigend:
array.shift() -> erstes Element mit dem größten Wert

Das Element wird aus dem Array entfernt.

Mit meinem Prototypen würde das so aussehen:

ArrayMitTextStyleRanges.sortThis("pontSize", true, true).shift(); // , true -> absteigend, true -> numerisch


als Antwort auf: [#579883]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 09:54
Beitrag # 20 von 28
Beitrag ID: #579888
Bewertung:
(4856 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
var max = Math.max(arr);

Genau das hatte ich ja versucht mit 2 Durchgängen,
was zwar umständlicher ist als dein elegantes Vorgehen aber eben für mich durchschaubarer :-)

Aber math max lieferte mir nicht die größte pointsize von allen ausgewählten Textrahmen erstes Zeichen, sondern die pointsize des ersten ausgewählten Textrahmens (also die Größe des ersten Zeichens dieses Textrahmens) Und da bin ich gescheitert.

Meine Vorgehensweise wäre so, dass ich nachdem der maxWert ermittelt wurde, den Textrahmen adressieren würde. Wie genau muss ich mir noch überlegen. Vielleicht mit parentTextframe?

Vielen vielen Dank nochmal.


als Antwort auf: [#579885]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12783

14. Mai 2021, 10:10
Beitrag # 21 von 28
Beitrag ID: #579890
Bewertung:
(4868 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: arr.push(String(sel[i].characters[0].pointSize));


Im ersten Entwurf des Skripts oben sollten die Schriftgrößen am Ende als String ausgegeben werden. Zwar hätte die Umwandlung in Kombination mit einem anderen hinzuzufügenden String-Element (in JavaScript) automatisch funktioniert. Aber wo möglich, versuche ich die Kontrolle über diese Umwandlung zu behalten.

Und genau diese ausdrückliche Stringumwandlung sorgt bei Dir bei der späteren Sortierung für unerwartete Ergebnisse: im Array wird nicht nach nu merischen Schriftgrößen sortiert, sondern nach Strings.

Deswegen solltest Du auf die String-Umwandlung der Werte bei der Aufnahme in’s Array verzichten:

Code
arr.push(sel[i].characters[0].pointSize); 



als Antwort auf: [#579888]
(Dieser Beitrag wurde von Martin Fischer am 14. Mai 2021, 10:20 geändert)

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12783

14. Mai 2021, 10:14
Beitrag # 22 von 28
Beitrag ID: #579891
Bewertung:
(4862 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Meine Vorgehensweise wäre so, dass ich nachdem der maxWert ermittelt wurde, den Textrahmen adressieren würde. Wie genau muss ich mir noch überlegen. Vielleicht mit parentTextframe?


parentTextFrames[0] würde passen, wenn es denn eine Verbindung von der ermittelten Zahl zu dem Textrahmen, in dem sie enthalten ist, geben würde.
Aber genau diese Verbindung fehlt Dir.
Du hast die maximale Zahl und kannst sie benennen. Aber zu diesem Zeitpunkt wissen Du und das Skript nicht mehr, aus welchem Textrahmen die Zahl entnommen ist, da sie nur noch nackert als Zahl da steht, ohne den Container, aus dem sie ermittelt wurde.


als Antwort auf: [#579888]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

14. Mai 2021, 10:46
Beitrag # 23 von 28
Beitrag ID: #579893
Bewertung:
(4845 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke für die Erklärung, jetzt habe ich es geschnallt.

Schönen Tag noch.

Alles Liebe
faxinger


als Antwort auf: [#579891]

Finde Textrahmen mit größter Schriftgröße

Uwe Laubender
Beiträge gesamt: 5316

14. Mai 2021, 15:00
Beitrag # 24 von 28
Beitrag ID: #579897
Bewertung:
(4824 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
ein Array kann ja nicht nur Strings speichern, man könnte auch den zugehörigen character oder textStyleRange mit dazu speichern. In einem Aufwasch.

Oder man macht das in einem Objekt.

Eine Schleife durch alle textStyleRanges, die PointSize wird ermittelt, übersteigt sie die PointSize im gespeicherten Objekt oder Array, werden die Werte dort einfach neu zugewiesen.

Hier ein Beispiel mit einem Array als Resultat.
Voraussetzung ist ein ausgewählter Textrahmen:

Code
var selectedTextFrame = app.selection[0]; 

var allTextStyleRanges =
selectedTextFrame.textStyleRanges.everyItem().getElements();

var resultArray =
[
[
0.001 ,
"Default"
]
];

for( var n=0; n<allTextStyleRanges.length; n++ )
{
if( resultArray[0][0] < allTextStyleRanges[n].pointSize )
{
resultArray[0][0] = allTextStyleRanges[n].pointSize;
resultArray[0][1] = allTextStyleRanges[n];
}
};


app.select( resultArray[0][1] );
alert( "PointSize:" +"\r"+ resultArray[0][0] );



als Antwort auf: [#579893]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12783

14. Mai 2021, 15:39
Beitrag # 25 von 28
Beitrag ID: #579899
Bewertung:
(4813 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

zum Einen hatten Herr Perplies und ich oben auf die Möglichkeit eines Arrays mit Objekten und anschließender Sortierung bereits hingewiesen. Auf eine Ausführung dieses Ansatzes hatte ich jedoch bewusst verzichtet, um es Faxinger nicht zu kompliziert zu machen.

Zum Anderen geht es Faxinger nicht um die Ermittlung der textStyleRanges eines ausgewählten Textrahmens, sondern um die Bestimmung desjenigen Textrahmens (aus einer Auswahl von mehreren - ausdrücklich mit Inhalt), dessen erstes Zeichen (oder erster TextStyleRange) den höchsten Schriftgrad hat.

Oder hast Du für Deine Idee mit dem zweidimensionalen Array bewusst eine geänderte Aufgabenstellung verwendet?



Ferner hätte ich noch eine Frage zu Deiner Feststellung oben:
Zitat Arbeite mit textStyleRanges, anstatt mit einzelnen Zeichen.
[..]
Geht, je nach formatiertem Text, sehr viel schneller.
Vor allem dann, wenn Du große Textmengen hast.


Ist dem bei der gegebenen Aufgabenstellung tatsächlich so, dass die Auswertung des ersten textStyleRanges statt des ersten characters in mehreren ausgewählten Textrahmen einen zeitlichen Unterschied macht?
Kann mir das eigentlich nicht vorstellen, habe das aber auch nicht nachgemessen, weil ich vermute, dass bei ein paar Textrahmen der zeitliche Unterschied nicht ins Gewicht fallen dürfte und auf einem Druckbogen erwarte ich eine überschaubare Zahl an zu prüfenden Textrahmen, und nicht hunderte oder gar tausende.

Aber ich weiß, Du bist ein Perfektionist. ;-)


als Antwort auf: [#579897]
(Dieser Beitrag wurde von Martin Fischer am 14. Mai 2021, 16:05 geändert)

Finde Textrahmen mit größter Schriftgröße

Uwe Laubender
Beiträge gesamt: 5316

14. Mai 2021, 16:09
Beitrag # 26 von 28
Beitrag ID: #579902
Bewertung:
(4796 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,
ich hoffe, ich habe ein für faxinger lesbares und verstehbares Skript geschrieben, das nach seiner sehr eng formulierten Aufgabenstellung etwas mehr Perspektive zeigt.


als Antwort auf: [#579899]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12783

14. Mai 2021, 16:23
Beitrag # 27 von 28
Beitrag ID: #579903
Bewertung:
(4784 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

dem ist gewiss so.
Mich verwundert lediglich etwas die Konzentration auf die textStyleRanges.
Und da dachte ich, ich könnte ja mal nachfragen, weil ich es mir nicht so recht vorstellen kann, dass/wie die Auswertung der jeweils ersten textStyleRanges von vielen Textrahmen performanter sein soll als die Auswertung von den jeweils ersten characters.

Werde gelegentlich mal eine Versuchsanordnung anlegen und dem nachspüren ob und ab wann das messbar wird.


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

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 167

18. Mai 2021, 15:54
Beitrag # 28 von 28
Beitrag ID: #579920
Bewertung:
(4146 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe und Martin,

nochmals herzlichen Dank für eure Anregungen.
@Uwe: der Weg über die textstyleRanges wäre mir deshalb nicht in den Sinn gekommen, weil es ja nur um die Ermittlung des ersten Zeichens bzw. dessen Schriftgröße aus einer Auswahl an Textrahmen ging. Bei textstyleRanges denke ich eher an wechselnde Formatierungen innerhalb eines Textabschnittes und das wäre in diesem Fall für mich kein Unterscheidungsmerkmal mit dem ich arbeiten würde.

Die Laufdauer des Skripts ist in meinem Fall auch nebensächlich, da meistens eine überschaubere Anzahl an Textrahmen (meist unter 10) ausgewählt ist. Ob die Ermittlung des Textrahmens mit dem größten ersten Zeichens dabei 0,05 Sekunden oder 0,04 Sekunden dauert ist mir schlichtweg Banane :-)

Alles Liebe
faxinger


als Antwort auf: [#579897]
X