hilfdirselbst.ch
Facebook Twitter gamper-media
« « 1 2 » »  
Kurt Gold  M 
Beiträge: 2366
25. Apr 2004, 18:36
Beitrag #1 von 22
Bewertung:
(3640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hallo Skripter :-)

jetzt sind hier massenweise Dateien gelandet, die ich entweder mit Engelsgeduld bearbeiten oder vor denen ich kapitulieren werde...

...oder aber ein Skript rettet alles :-)

-> Beschreibung einer Musterdatei und Aufgabenstellung:

Neben Infografiken enthält jedes Dokument hunderte/tausende Dezimalzahlen mit 3 Stellen hinterm Komma (der überwiegende Teil als Punkttext, Rahmentext selten, Schriftgröße 6 Pt bis 10 Pt, 100 k).

Aufgabe ist es, bestimmte Zahlenwerte (Intervalle) unterschiedlich zu färben.

Beispiel:

Alle Zahlen zwischen 12,001 und 14,999 in 100 % Magenta färben
Alle Zahlen zwischen 32,201 und 48,499 in 100 % Cyan färben
usw

In der Javascript Reference gibt es ein Beispielskript, das nach definierten Wörtern/Zahlen sucht und sie nach Vorgabe einfärbt. Im Beispiel wäre es die Zahl 14.

----------------------------------------

// Example of how to color certain words
// Create the color to apply to the words
if(documents.length >0 &&activeDocument.textArtItems.length >0)
{
wordColor = new RGBColor();
newColor = new Color();
wordColor.red = 255;
wordColor.green = 0;
wordColor.blue = 255;
newColor.rgb = wordColor;
//Set thevalue of theword to look for
searchWord = "14";
// Iterate through all words in the document
// and color the words that macth searchWord
for (i=0; i<activeDocument.textArtItems.length; i++)
{
textArt = activeDocument.textArtItems;
textArtRange = textArt.textRange();
for (j=0; j<textArtRange.words.length; j++)
{
theWord = textArtRange.words[j];
if (theWord.contents == searchWord)
{
theWord.filled = true;
theWord.fillColor = newColor;
}
}
}
}
else
{
alert("there are no text art items");

----------------------------------------

Das ist schonmal gut, trifft aber noch nicht das, was erforderlich ist. Wie passe ich das Skript an, damit alle Zahlen zwischen x und y so wie oben beschrieben eine bestimmte Farbe erhalten? Mein Skriptwissen reicht dafür noch nicht aus... :-)

Gruß

Kurt Gold Top
 
X
boskop  M  p
Beiträge: 3453
26. Apr 2004, 07:09
Beitrag #2 von 22
Beitrag ID: #81842
Bewertung:
(3642 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hallo Kurt
eine echte Knacknuss! Wende Dich doch mal an die Javascript-Spezialisten im entspr. Forum - Sabine scheint mir sehr kompetent!
Gruss und Dank
Urs
http://www.designersfactory.com
als Antwort auf: [#81795] Top
 
Wolfgang Reszel
Beiträge: 4170
26. Apr 2004, 08:58
Beitrag #3 von 22
Beitrag ID: #81858
Bewertung:
(3640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hi,

bin zwar kein JS-Crack, habe aber schon einige Illu-Skripts gefrickelt.

Ohne es getestet zu haben würde ich so abändern:

----------------------------------------

// Example of how to color certain words
// Create the color to apply to the words
if(documents.length >0 &&activeDocument.textArtItems.length >0)
{
wordColor = new RGBColor();
newColor = new Color();
wordColor.red = 255;
wordColor.green = 0;
wordColor.blue = 255;
newColor.rgb = wordColor;
//Set thevalue of theword to look for
searchWordmin = "12.001";
searchWordmax = "14.999";
// Iterate through all words in the document
// and color the words that macth searchWord
for (i=0; i<activeDocument.textArtItems.length; i++)
{
textArt = activeDocument.textArtItems;
textArtRange = textArt.textRange();
for (j=0; j<textArtRange.words.length; j++)
{
theWord = textArtRange.words[j];
if (parseFloat(theWord.contents) >= searchWordmin && parseFloat(theWord.contents) <= searchWordmax)
{
theWord.filled = true;
theWord.fillColor = newColor;
}
}
}
}
else
{
alert("there are no text art items");

----------------------------------------

Da ich's nicht getestet habe, kann ich nicht sagen, ob AI parseFloat kennt.

Wolfgang
als Antwort auf: [#81795] Top
 
Kurt Gold  M 
Beiträge: 2366
26. Apr 2004, 12:23
Beitrag #4 von 22
Beitrag ID: #81911
Bewertung:
(3653 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Danke für den Vorschlag... ...aber so läuft das Ding noch nicht :-)

Egal, ob die Zahlen mit Komma oder Punkt getrennt sind (12,555 <-> 12.555), es passiert nichts außer dem Hinweis:

----------------

Variable or value expected
Line: 33
-> alert("there are no text art items");

----------------

Also genauso als wäre kein Text vorhanden.

Soll ich gleich zu den Javascriptern gehen oder hast Du noch eine Idee, Wolfgang?

Gruß

Kurt Gold
als Antwort auf: [#81795] Top
 
Wolfgang Reszel
Beiträge: 4170
26. Apr 2004, 15:38
Beitrag #5 von 22
Beitrag ID: #81941
Bewertung:
(3640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hi Kurt,

es fehlte eine geschweifte Klammer, aber trotzdem war das Skript nicht lauffähig. Hier mal eins, was einigermaßen gut geht:

// Example of how to color certain words
// Create the color to apply to the words
if(documents.length >0 &&activeDocument.textArtItems.length >0)
{
wordColor = new RGBColor();
newColor = new Color();
wordColor.red = 255;
wordColor.green = 0;
wordColor.blue = 255;
newColor.rgb = wordColor;
//Set thevalue of theword to look for
searchWordmin = "12.001";
searchWordmax = "14.999";
searchWordLen = searchWordmin.length-1;
// Iterate through all words in the document
// and color the words that macth searchWord
for (i=0; i<activeDocument.textArtItems.length; i++)
{
textArt = activeDocument.textArtItems;
textArtRange = textArt.textRange();
textArtRLen = textArtRange.length-searchWordLen;
if (textArtRLen < 0 ) { textArtRLen = 0; }
for (j=0; j<textArtRLen;j++)
{
theWord = textArtRange.textRange(j,j+searchWordLen);
if (theWord.contents >= searchWordmin && theWord.contents <= searchWordmax )
{
theWord.filled = true;
theWord.fillColor = newColor;
}
}
}
}
else
{
alert("there are no text art items");
}



Wolfgang
als Antwort auf: [#81795] Top
 
Kurt Gold  M 
Beiträge: 2366
26. Apr 2004, 17:15
Beitrag #6 von 22
Beitrag ID: #81970
Bewertung:
(3640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Vielen Dank, Wolfgang. Die Version geht so langsam in die richtige Richtung, wenn ich den Wert für *searchWordmin* auf 11.999 setze. Steht er auf 12.001 werden die 12er Zahlen nicht berücksichtigt. Allerdings werden auch Werte (teilweise) gefärbt, die nicht gefärbt werden sollen.

Zum Beispiel:
122,566
1333,547
12232,086

Wenn ich

searchWordmin = "1.999";
searchWordmax = "3.999";

festlege, dann färbt das Skript mit folgenden Zahlen so gut wie alles ein:

2,566
222,555
3,658
133,588
4,222
4,666
444,287
1,258
0,369
1222,587

Der Ansatz stimmt also, nur die Käfer sind noch drin :-)

Gruß

Kurt Gold
als Antwort auf: [#81795] Top
 
oesi50  A  S
Beiträge: 2315
26. Apr 2004, 18:04
Beitrag #7 von 22
Beitrag ID: #81985
Bewertung:
(3640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hallo Kurt,

ich habe zwar keine ahnung vom Illustrator, aber wenn das ECMA Javascript ist, dann gibts auch reguläre Ausdrücke.

In Deinem Fall müsste das also etwa so gehen

re = /^(\d{2})[,.](\d{3})$/;
out = re.exec(theWord);

jetzt kannst Du prüfen, ob in out[1] und out[2] etwas enthalten ist(out[1] ist der teil vor ',' out[2] der Teil danach). Wenn ja, dann 'passt' der Ausdruck und kann weiterverarbeitet werden.

Nun muss nur noch

out[1] + '.' + out[2];

zusammengesetzt werden (weil Berechnungen nur mit . als Komma durchgeführt werden) und die min/max Prüfung kann erfolgen.

Erklärung des Ausdrucks:
/^(\d{2})[,.](\d{3})$/
/ Begrenzer
^ Anfang der Zeichenkette
(...) 1. Klammerung der Ausdrücke -> out[1]
\d{2} 2 Ziffern
[,.] . oder , möglich
(...) 2. Klammerung -> out[2]
\d{3} 3 Ziffern
$ Ende der Zeichenkette
/ Begrenzer
Wenn ^ fehlt ergibt:
123.456 --> out[1] 23 out[2] 456
Wenn $ fehlt ergibt:
12.3456 --> out[1] 12 out[2] 345
was ja falsch ist.

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)
als Antwort auf: [#81795]
(Dieser Beitrag wurde von oesi50 am 26. Apr 2004, 18:28 geändert)
Top
 
Kurt Gold  M 
Beiträge: 2366
26. Apr 2004, 18:46
Beitrag #8 von 22
Beitrag ID: #81990
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hallo oesi,

ich weiß nicht, ob sich Adobe an Standards hält. Soweit ich das sehe, steht davon nichts in der Javascript Reference für Illustrator.

Hier die PDF, die sich auf AI 11 bezieht. Zwischen AI 10 und AI 11 hat sich da aber nicht viel geändert:

-> http://partners.adobe.com/...aScriptReference.pdf

Dein Vorschlag, reguläre Ausdrücke ins Spiel zu bringen, hört sich interessant an. Der Haken an der Sache bin ich selbst. Ich kann zwar Deine Erklärung ganz grob nachvollziehen (mit der Betonung auf *grob*), weiß aber nicht, wie ich das jetzt in den vorhandenen (?) Code einbinden sollte. Wo müßte denn was genau hin? Oder müßte ein völlig anderes Skript geschrieben werden?

Also bis jetzt weiß ich, daß ich nix weiß :-)

Vielen Dank für Deine Auskunft.

Gruß

Kurt Gold
als Antwort auf: [#81795] Top
 
oesi50  A  S
Beiträge: 2315
26. Apr 2004, 19:12
Beitrag #9 von 22
Beitrag ID: #81998
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


versuch mal das:

// Example of how to color certain words
// Create the color to apply to the words
if(documents.length >0 &&activeDocument.textArtItems.length >0)
{
wordColor = new RGBColor();
newColor = new Color();
wordColor.red = 255;
wordColor.green = 0;
wordColor.blue = 255;
newColor.rgb = wordColor;
//Set thevalue of theword to look for
searchWordmin = "12.001";
searchWordmax = "14.999";
searchWordLen = searchWordmin.length-1;
// Iterate through all words in the document
// and color the words that macth searchWord
for (i=0; i<activeDocument.textArtItems.length; i++)
{
textArt = activeDocument.textArtItems;
textArtRange = textArt.textRange();
textArtRLen = textArtRange.length-searchWordLen;
if (textArtRLen < 0 ) { textArtRLen = 0; }
for (j=0; j<textArtRLen;j++)
{
theWord = textArtRange.textRange(j,j+searchWordLen);
re = /^(\d{2})[,.](\d{3})$/;
out = re.exec(theWord);
if(out[1] && out[2]){
tempWord = out[1] + '.' + out[2];
if (tempWord >= searchWordmin && tempWord <= searchWordmax )
{
theWord.filled = true;
theWord.fillColor = newColor;
}
}
}
}
}
else
{
alert("there are no text art items");
}

(ohne Garantie, ich habe keinen Illustrator zum Testen)


Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)
als Antwort auf: [#81795] Top
 
Kurt Gold  M 
Beiträge: 2366
26. Apr 2004, 19:29
Beitrag #10 von 22
Beitrag ID: #82001
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hallo oesi,

danke, habs versucht. Leider quittiert das Illustrator (10.0.3) mit dem Hinweis:

null(=null) is not an object
Line: 28
-> if(out[1] & out[2]{

Schönen Abend

Kurt Gold
als Antwort auf: [#81795] Top
 
oesi50  A  S
Beiträge: 2315
26. Apr 2004, 19:48
Beitrag #11 von 22
Beitrag ID: #82007
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


das ist doch ein gutes Zeichen, nun weiss ich, wie im Illustrator ein leeres Array aussieht. Ich versuch mal noch was. Aber jetzt ist erst Essen dran.

ersetze mal probehalber:

if(out[1] && out[2]){

durch

if(!(undefined == out[1]) && !(undefined == out[2]) ){

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)
als Antwort auf: [#81795]
(Dieser Beitrag wurde von oesi50 am 26. Apr 2004, 20:29 geändert)
Top
 
Wolfgang Reszel
Beiträge: 4170
27. Apr 2004, 11:09
Beitrag #12 von 22
Beitrag ID: #82133
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hi,

hier noch mal ein Versuch von mir:

//$.bp();
// v0.3
if(documents.length >0 && activeDocument.textArtItems.length >0)
{
wordColor = new CMYKColor();
newColor = new Color();
wordColor.cyan = 0;
wordColor.magenta = 0;
wordColor.yellow = 100;
wordColor.black = 0;
newColor.cmyk = wordColor;
//Set thevalue of theword to look for
searchWordmin = 1.001;
searchWordmax = 14.999;
// Iterate through all words in the document
// and color the words that macth searchWord
for (i=0; i<activeDocument.textArtItems.length; i++)
{
textArt = activeDocument.textArtItems;
textArtRange = textArt.textRange();
j=0;
while (j >= 0)
{
text = textArtRange.textRange(j).contents;
test = text.search(/\b(\d+)([,.])(\d+)\b?/);
x = j+test;
text = RegExp.$1+"."+RegExp.$3;
y = text.length-1;
if (test != -1) {j=x+y-1;} else {j=-1; break;}
theWord = textArtRange.textRange(x,x+y);
//alert (x + "," + y +":"+text+":"+theWord.contents);
if (parseFloat(text) >= searchWordmin && parseFloat(text) <= searchWordmax )
{
theWord.filled = true;
theWord.fillColor = newColor;
}

}
}
}
else
{
alert("there are no text art items");
}


Wolfgang
als Antwort auf: [#81795]
(Dieser Beitrag wurde von Wolfgang Reszel am 27. Apr 2004, 22:14 geändert)
Top
 
Kurt Gold  M 
Beiträge: 2366
27. Apr 2004, 13:55
Beitrag #13 von 22
Beitrag ID: #82201
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Hallo oesi,
Hallo Wolfgang,

wenn

if(out[1] && out[2]){

durch

if(!(undefined == out[1]) && !(undefined == out[2]) ){

ersetzt wird, veranlaßt das Illustrator zum Hinweis:

null (=null) is not an object
Line: 28
->if(!(undefined == out[1]) & !(undefined == out[2]) ){

Darüberhinaus passiert nichts.

Oesi, vielen Dank für den Ansatz. Wahrscheinlich würdest Du eine Lösung finden, wenn Du auch Illustrator zum testen hättest. So ist es halt schon sehr theoretisch.

Wolfgang,

die neue Version ist schon ziemlich gut, greift allerding nur bei mehrzeiligen Punkt- oder Rahmentext. Bestehen die Zahlenspalten aus einzeiligen Punkttext (das ist in den Dokumenten zu 90 % der Fall, ich vermute, die Zahlen stammen ursprünglich aus Excel), hat das Skript keinerlei Auswirkungen. Darüberhinaus bringt Illustrator in etwa 50 % der Fälle den Hinweis:

an internal error occurred
Line: 33
-> theWord.filled = true;

Wird das mit OK bestätigt, passiert entweder nichts (zu 80 %) oder es wird nur eine Zahl von beispielsweise 50 eingefärbt, die den Vorgaben entsprechen, also eigentlich auch gefärbt werden müßten.

Die Nuß ist wohl doch härter als ich dachte…:-)

Vielen Dank für Eure Vorschläge bis hierhin.

Gruß

Kurt Gold
als Antwort auf: [#81795] Top
 
oesi50  A  S
Beiträge: 2315
27. Apr 2004, 14:13
Beitrag #14 von 22
Beitrag ID: #82207
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


einen hab ich noch:

// Example of how to color certain words
// Create the color to apply to the words
if(documents.length >0 &&activeDocument.textArtItems.length >0)
{
wordColor = new RGBColor();
newColor = new Color();
wordColor.red = 255;
wordColor.green = 0;
wordColor.blue = 255;
newColor.rgb = wordColor;
//Set thevalue of theword to look for
searchWordmin = "12.001";
searchWordmax = "14.999";
// Iterate through all words in the document
// and color the words that macth searchWord
for (i=0; i<activeDocument.textArtItems.length; i++)
{
textArt = activeDocument.textArtItems;
textArtRange = textArt.textRange();
for (j=0; j<textArtRange.words.length; j++)
{
theWord = textArtRange.words[j];
re = /^(\d{2})[,.](\d{3})$/;
if (re.test(theWord.contents)){
out = re.exec(theWord.contents);
tempWord = parseFloat(out[1] + '.' + out[2]);
if (tempWord >= searchWordmin && tempWord <= searchWordmax )
{
theWord.filled = true;
theWord.fillColor = newColor;
}
}
}
}
}
else
{
alert("there are no text art items");

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)
als Antwort auf: [#81795]
(Dieser Beitrag wurde von oesi50 am 27. Apr 2004, 14:55 geändert)
Top
 
Kurt Gold  M 
Beiträge: 2366
27. Apr 2004, 14:34
Beitrag #15 von 22
Beitrag ID: #82213
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Textfarbe abhängig von Zahlenwerten


Danke, oesi. Diese Variante läuft zwar ohne (Fehler-)Hinweis, hat allerdings auch keinerlei Auswirkungen. Es wird kein Text gefärbt.

Gruß

Kurt Gold
als Antwort auf: [#81795] Top
 
« « 1 2 » »  
X