[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: 161

12. Mai 2021, 15:48
Beitrag # 1 von 28
Bewertung:
(1781 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: 12475

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

Viele Grüße
Martin




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

Finde Textrahmen mit größter Schriftgröße

Uwe Laubender
Beiträge gesamt: 4922

12. Mai 2021, 18:20
Beitrag # 3 von 28
Beitrag ID: #579860
Bewertung:
(1733 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.
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#579858]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2628

13. Mai 2021, 05:42
Beitrag # 4 von 28
Beitrag ID: #579861
Bewertung:
(1653 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: [email protected]
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: [email protected]
// 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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign Alle neuen Skripte mit
neu: WpsProjectHandler 31.05.2020, Version 3.XX, neue Funktionen.
MultiSave ist Bestandteil meines WpsProjecthandlers
Kundenstimmen


als Antwort auf: [#579858]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12475

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

Viele Grüße
Martin




als Antwort auf: [#579861]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2628

13. Mai 2021, 06:16
Beitrag # 6 von 28
Beitrag ID: #579863
Bewertung:
(1644 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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign Alle neuen Skripte mit
neu: WpsProjectHandler 31.05.2020, Version 3.XX, neue Funktionen.
MultiSave ist Bestandteil meines WpsProjecthandlers
Kundenstimmen


als Antwort auf: [#579862]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 161

14. Mai 2021, 06:01
Beitrag # 7 von 28
Beitrag ID: #579874
Bewertung:
(1555 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: 161

14. Mai 2021, 06:17
Beitrag # 8 von 28
Beitrag ID: #579875
Bewertung:
(1549 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: 2628

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

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign Alle neuen Skripte mit
neu: WpsProjectHandler 31.05.2020, Version 3.XX, neue Funktionen.
MultiSave ist Bestandteil meines WpsProjecthandlers
Kundenstimmen


als Antwort auf: [#579874]

Finde Textrahmen mit größter Schriftgröße

Martin Fischer
  
Beiträge gesamt: 12475

14. Mai 2021, 06:57
Beitrag # 10 von 28
Beitrag ID: #579877
Bewertung:
(1521 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);


Viele Grüße
Martin




als Antwort auf: [#579875]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2628

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

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign Alle neuen Skripte mit
neu: WpsProjectHandler 31.05.2020, Version 3.XX, neue Funktionen.
MultiSave ist Bestandteil meines WpsProjecthandlers
Kundenstimmen


als Antwort auf: [#579875]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 161

14. Mai 2021, 07:03
Beitrag # 12 von 28
Beitrag ID: #579880
Bewertung:
(1518 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: 2628

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

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign Alle neuen Skripte mit
neu: WpsProjectHandler 31.05.2020, Version 3.XX, neue Funktionen.
MultiSave ist Bestandteil meines WpsProjecthandlers
Kundenstimmen


als Antwort auf: [#579877]

Finde Textrahmen mit größter Schriftgröße

WernerPerplies
Beiträge gesamt: 2628

14. Mai 2021, 07:06
Beitrag # 14 von 28
Beitrag ID: #579882
Bewertung:
(1512 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?

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign Alle neuen Skripte mit
neu: WpsProjectHandler 31.05.2020, Version 3.XX, neue Funktionen.
MultiSave ist Bestandteil meines WpsProjecthandlers
Kundenstimmen


als Antwort auf: [#579880]

Finde Textrahmen mit größter Schriftgröße

faxinger666
Beiträge gesamt: 161

14. Mai 2021, 07:10
Beitrag # 15 von 28
Beitrag ID: #579883
Bewertung:
(1510 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

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
05.02.2021 - 05.11.2021

Digicomp Academy AG, Limmatstrasse 50, 8005 Zürich
Freitag, 05. Feb. 2021, 13.00 Uhr - Freitag, 05. Nov. 2021, 17.00 Uhr

Lehrgang

Bilden Sie sich zum zertifizierten Publishing-Multimedia-Profi aus. Neben Fotografie und Video befassen Sie sich mit der Medienproduktion, digitalen Publikationen und dem Webdesign für Desktop- und mobile Endgeräte.

Preis: CHF 10'500.-
Dauer: 30 Tage (ca. 210 Lektionen) – Unterricht findet jeweils am Freitag von 13 - 19 Uhr und Samstag von 09 - 17 Uhr statt

Ja

Organisator: Digicomp Academy AG

Kontaktinformation: Kundenberater-Team, E-Mailkundenberatung AT digicomp DOT ch

digicomp.ch/d/9PM

Veranstaltungen
12.03.2021 - 16.07.2021

Digicomp Academy AG, Zürich oder virtuell
Freitag, 12. März 2021, 13.00 Uhr - Freitag, 16. Juli 2021, 17.00 Uhr

Lehrgang

Steigen Sie in die Welt des Publishings ein und erlangen Sie die Zertifizierung von publishingNETWORK. Lernen Sie in diesem Lehrgang Druckmedien professionell zu erarbeiten, druckfertige PDFs zu erstellen und CI/CD-Vorgaben umzusetzen.

Preis: CHF 6'300.-
Dauer: 18 Tage (ca. 126 Lektionen) – Unterricht findet jeweils am Freitag von 13 - 19 Uhr und Samstag von 09 - 17 Uhr statt.

Ja

Organisator: Digicomp Academy AG

Kontaktinformation: Kundenberater-Team, E-Mailkundenberatung AT digicomp DOT ch

digicomp.ch/d/9PBAS