[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Sonderfarben ansprechen / Farbwerte herausfinden

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

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

19. Feb 2014, 16:42
Beitrag # 1 von 13
Bewertung:
(5325 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich habe zwei Fragen, von denen ich vermute, dass sie zusammenpassen könnten:

1) Wie kann ich alle Farben, über die ID verfügt, auslesen? Ich benötige dies, da ich dem Scriptanwender eine bestimmte gefilterte Auswahl anzeigen will. Mit app.colors.length erhalte ich bei mir 14 (obwohl in der Farbpalette nur 10 angelegt sind). Beim Anlegen eines neuen Farbfeldes habe ich unterhalb der drei Farbmodi RGB, LAB und CMYK viele weitere Bibliotheken, die ich aber nicht über ColorSpace ansteuern kann. Wie komme ich da dran?

2) Gegeben ist ein Rectangle mit einem (durchaus aufwändigerem) Farbverlauf (Abmessungen 10 cm Breite). Aus diesem möchte ich nun in regelmäßigen Abständen die exakt an dieser Stelle bestehende Farbmischung abfragen. Ziel ist die Bestimmung von passenden Farben, die dann weiterhin im Layout benutzt werden können. Muss ich dort über fillColor.gradientStops gehen und diese dann umrechnen oder gibt es eine einfachere Lösung, die ich derzeit nicht sehe?

Wie immer dankbar für alle Tipps ...

Peter
X

Sonderfarben ansprechen / Farbwerte herausfinden

Ulrich Lüder
Beiträge gesamt: 2305

19. Feb 2014, 17:35
Beitrag # 2 von 13
Beitrag ID: #523853
Bewertung:
(5303 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo

zu 2.):

über die Separationsvorschau die Werte (mittels Hilfslinien für die Cursorpositionierung) zu ermitteln ist zu mühsam, weil es zu viele Stützpunkte sind trotz nur 10cm Strecke?


Ulrich


als Antwort auf: [#523845]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

19. Feb 2014, 17:42
Beitrag # 3 von 13
Beitrag ID: #523854
Bewertung:
(5284 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ulrich,

es soll automatisiert als Script geschehen. Am ehesten lässt es sich noch mit Kuler vergleichen: Man klickt das Rechteck mit dem Verlauf an, bestimmt die Anzahl der Farben und das Script "stanzt" diese dann automatisch an den gleichmäßig verteilten Stellen heraus.

Steht z. B. bei 3 cm ein Stop mit dem Wert C0M100, bei 6 cm ein Stop mit dem Wert C100M0, so würde die Farbe bei 4 cm dann C33M66 haben. (Ob das schön aussieht, mögen andere beurteilen).

Der Weg über die Hilfslinien sowie Separationsvorschau würde zu lange dauern.

Gruß

Peter


als Antwort auf: [#523853]

Sonderfarben ansprechen / Farbwerte herausfinden

Hans Haesler
  
Beiträge gesamt: 5826

19. Feb 2014, 19:47
Beitrag # 4 von 13
Beitrag ID: #523862
Bewertung:
(5240 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

die Namen der zehn Farben, welche Du im Bedienfeld "Farbfelder" zählst, bekommst Du mit swatches angezeigt:

Code
var allSwatchNames = app.swatches.everyItem().name; 
var nameString = allSwatchNames.join("\r")
alert (nameString);

Aber "None", "Registration", "Paper" und "Black" müssen übersetzt werden, bevor sie dem Anwender zur Auswahl angeboten werden. Und nachher, vor dem Zuweisen eines der Grundfarbfelder, muss dessen Name wieder ins Englische zurückverwandelt werden.

Die vierzehn Namen – hingegen – welche laut Dialog vorhanden sein sollen, kommen mit colors zum Vorschein:

Code
var allColorNames = app.colors.everyItem().name; 
var nameString = allColorNames.join("\r")
alert (nameString + "|");

Das Pipe-Zeichen (= | ) am Schluss stellt sicher, dass alles sichtbar wird. So gut wie möglich. Denn zuletzt befinden sich zwei "Farben" ohne Namen.

Sowohl "Cyan" als auch "Magenta" und "Yellow" (und "Gelb" und "Jaune" und "Giallo" usw.) sind fixe Farbnamen, welche beim Anlegen eines neuen Farbfeldes nicht akzeptiert werden.

Aber ein Scripter kann einem Objekt z.B. "Magenta" zuweisen, auch wenn dieses Farbfeld nicht existiert.

Gruss, Hans


als Antwort auf: [#523845]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

22. Feb 2014, 15:07
Beitrag # 5 von 13
Beitrag ID: #523984
Bewertung:
(5158 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So, ich bin immer noch an dem Thema Farben und komme trotz aller Hilfe nicht recht weiter bzw. renne vor neue Hürden. Ansatz ist, dass ich Farben zum Kopieren zwischen Dokumenten in JSON als Datei auf der Platte abspeichern und später wieder aufrufen will.

Mache ich dies, verheddert sich JSON.stringify in irgendwelchen Tiefen. Ich habe ein Logfile auf die Festplatte schreiben lassen und das JSON wird 25 KB groß. Ich vermute, dass man nicht alle Properties auf die folgende Art und Weise auslesen kann:

Code
#target indesign 
#include "~/....../json2.jsx";

var doc = app.activeDocument;
//bestehende Farbe auswählen
//"test" ist eine CMYK - PROCESS - Farbe
var col = doc.colors.item("test");
var colProps = JSON.stringify(col);


Nun gut, brauche eh nicht alle und beschränke mich daher auf eine Auswahl:

Code
var doc = app.activeDocument; 
//bestehende Farbe auswählen
//"test" ist eine CMYK - PROCESS - Farbe
var col = doc.colors.item("test");

//leeres Objekt anlegen
var colObj = {};

//Bestimmte Properties aus der Farbe kopieren und in colObj speichern
colObj.colorValue = col.colorValue;
colObj.label = col.label;
//Im Fenster wird PROCESS angegeben
alert(col.model);
colObj.model = col.model;
colObj.name = col.name + "_new";
colObj.space = col.space;

var colStri = JSON.stringify(colObj);

alert(colStri);


Beim Alert stehen nach model und space leere Bereiche, wobei dort auch eine Zeilenschaltung enthalten sein muss, da der Text in zwei Teile unterteilt ist.

Danach möchte ich den String wieder in ein Objekt zurückwandeln und lege dazu eine neue Farbe an, parse den String und loope danach durch die Properties. Dabei steigt das Script aus mit der Meldung: "Ungültiger Wert für Einrichtung der Eigenschaft "model". ColorModel enumerator erwartet, aber () erhalten."

Code
//neue Farbe im Dokument anlegen 
var newCol = doc.colors.add();

var colBack = JSON.parse(colStri);

//Versuch, alle Properties zu kopieren
for(var props in colBack) {
newCol[props] = colBack[props];
}


Hat jemand eine Idee, was da falsch läuft?

Peter


als Antwort auf: [#523862]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

22. Feb 2014, 16:50
Beitrag # 6 von 13
Beitrag ID: #523987
Bewertung:
(5131 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Dank eines Gemeinschaftsbeitrags in diesem Forum aus dem Januar dieses Jahres bin ich nun auch auf die Lösung gekommen (http://www.hilfdirselbst.ch/foren/Enumeration_%96_Value_als_String_P521887.html).

Man muss am besten die enumerators als Values ausgeben, was dann verkürzt so aussieht:

Code
colObj.model = parseInt(ColorModel[col.model]); 
colObj.space = parseInt(ColorSpace[col.space]);


Diese Werte schaffen es dann auch durch JSON.stringify und parse.


als Antwort auf: [#523984]

Sonderfarben ansprechen / Farbwerte herausfinden

Dirk Becker
Beiträge gesamt: 193

23. Feb 2014, 09:47
Beitrag # 7 von 13
Beitrag ID: #523995
Bewertung:
(5090 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Statt des Umwegs über parseInt() geht auch direkter Aufruf von .valueOf() - das hatte ich am Ende des zitierten Threads auch erwähnt. parseInt() macht auch nichts anderes, wenn es ein Objekt übergeben bekommt. Der Wert wird nur zusätzlich in einen String umgewandelt und dann wieder zurück.

JSON ist oft unnötig, wenn man keinen "Consumer" hat der auf striktes JSON Wert legt. Ansonsten reicht toSource() - eine von ExtendScript gelieferte Funktion - sowie das Gegenstück eval(). Eval ist zwar im Web verpönt, aber das ist m.E. zu sehr verallgemeinert. Wenn man die Daten selber produziert, ist es einfach nur praktisch.

Hier was zum Spielen:
Code
function objectify(o) 
{
if( o.hasOwnProperty("properties") ) {
o = o.properties;
delete o.index;
delete o.parent;
for( var n in o )
o[n] = objectify(o[n]);
} else if( o instanceof Enumerator )
o = o.valueOf();
return o;
}

$.writeln(app.colors.item(10).model.valueOf());
$.writeln(objectify(app.colors.item(10)).toSource());


Dirk


als Antwort auf: [#523987]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

23. Feb 2014, 19:44
Beitrag # 8 von 13
Beitrag ID: #524013
Bewertung:
(5060 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Dirk Becker ] Statt des Umwegs über parseInt() geht auch direkter Aufruf von .valueOf() - das hatte ich am Ende des zitierten Threads auch erwähnt. parseInt() macht auch nichts anderes, wenn es ein Objekt übergeben bekommt. Der Wert wird nur zusätzlich in einen String umgewandelt und dann wieder zurück.


Aktennotiz: Nicht gleich beim Finden des ersten Codeschnippsels gackernd über den Programmierhof rennen sondern Beitrag bis zum Ende lesen :-)


Antwort auf [ Dirk Becker ] JSON ist oft unnötig, wenn man keinen "Consumer" hat der auf striktes JSON Wert legt. Ansonsten reicht toSource() - eine von ExtendScript gelieferte Funktion - sowie das Gegenstück eval(). Eval ist zwar im Web verpönt, aber das ist m.E. zu sehr verallgemeinert. Wenn man die Daten selber produziert, ist es einfach nur praktisch.


Habe da mal einen Test laufen lassen: Das o. g. Objekt 10.000 mal mit toSource/eval laufen lassen, dass andere mal mit JSON.stringify/JSON.parse. Kommt ein Unterschied von 491 ms zu 5.821 ms raus. Die JSONs machen da wohl noch einiges zusätzlich, wer aber die übergebenen Werte in der Hand hat, sollte auf die erste Lösung setzen, wenn auch die Laufzeitunterschiede im tagtäglichen Geschäft eher marginal sind, da bei einmaligen Durchlauf der Unterschied nur eine halbe Millisekunde beträgt.

Antwort auf [ Dirk Becker ] Hier was zum Spielen:
Code
function objectify(o) 
{
if( o.hasOwnProperty("properties") ) {
o = o.properties;
delete o.index;
delete o.parent;
for( var n in o )
o[n] = objectify(o[n]);
} else if( o instanceof Enumerator )
o = o.valueOf();
return o;
}

$.writeln(app.colors.item(10).model.valueOf());
$.writeln(objectify(app.colors.item(10)).toSource());



Kannst Du mir hier noch ein paar Zusatzinfos geben? Soweit ich das blicke, geht es laut Funktionsname darum, aus einem String (oder JSON) ein Objekt zu machen. Mein Problem bestand aber darin, dass bei der Umwandlung in einen String der Value nicht gelesen wurde.

Gruß

Peter


als Antwort auf: [#523995]
(Dieser Beitrag wurde von peterhenrich am 23. Feb 2014, 19:46 geändert)

Sonderfarben ansprechen / Farbwerte herausfinden

Dirk Becker
Beiträge gesamt: 193

24. Feb 2014, 12:45
Beitrag # 9 von 13
Beitrag ID: #524037
Bewertung:
(5011 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

manchmal vergesse ich, dass nicht jeder in Vollzeit Code liest und schreibt.

Das Script ist eine sehr vereinfachte Funktion, die aus einem InDesign Objekt (e.g. Color) ein reines JavaScript Objekt macht. Also etwas, was mit JSON oder toSource() in einen String mit der {} Notation überführt werden kann.

Das Beispiel ruft dann unten auch toSource() auf dem Ergebnis auf, um den String auf der Konsole auszugeben.

Ich sage auch vereinfacht, weil die Funktion noch nicht für verschachtelte Objekte funktioniert. Wenn das Color Objekt also theoretisch ColorWhateverOptions enthalten würde, müsste man die Funktion aufbohren. Ebenso für ein theoretisches Gradient Objekt, welches evtl. 5 Colors referenzieren würde.

Wenn man den String mit eval wieder zurück umwandelt, hat man wieder so ein reines JavaScript Objekt.
Um dieses ins neue Dokument zu bringen, unterstützen die meisten add() Funktionen ein "withProperties" als letztes Argument ihrer Argument-Liste. withProperties erwartet genau unser JavaScript Objekt, und übernimmt die enthaltenen Eigenschaften in das neue InDesign Objekt.

Das folgende Beispiel liest die Eigenschaften einer der Applikations-Farben aus, wandelt sie in einen String und dann wieder in ein Objekt zurück. Der Name des Objekts wird noch geändert (einfach nur so), und das Objekt zum Aufbau einer neuen Farbe in einem neuen Dokument genutzt.

Code
var str = objectify(app.colors.item(8)).toSource(); 
var obj = eval(str);
obj.name = "Test";

var doc = app.documents.add();
doc.colors.add(obj);


Grüße,
Dirk


als Antwort auf: [#524013]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

24. Feb 2014, 19:10
Beitrag # 10 von 13
Beitrag ID: #524063
Bewertung:
(4910 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Dirk Becker ] Das Script ist eine sehr vereinfachte Funktion, die aus einem InDesign Objekt (e.g. Color) ein reines JavaScript Objekt macht. Also etwas, was mit JSON oder toSource() in einen String mit der {} Notation überführt werden kann.


Hallo Dirk,

vielen Dank für die erklärenden Worte.

Antwort auf [ Dirk Becker ] Ich sage auch vereinfacht, weil die Funktion noch nicht für verschachtelte Objekte funktioniert. Wenn das Color Objekt also theoretisch ColorWhateverOptions enthalten würde, müsste man die Funktion aufbohren. Ebenso für ein theoretisches Gradient Objekt, welches evtl. 5 Colors referenzieren würde.


Das ist auch das Problem von JSON.stringify. Es kommt vom Hölzchen aufs Stöckchen und schreibt das halbe ID in das Objekt. Ich hatte das Script mal so abgeändert, dass es bei jedem Aufruf das gerade Erledigte in eine Datei auf der Platte speichert. Ich hatte es zunächst mit Gradients versucht, was eigentlich mein Hauptverwendungszweck werden soll. Ich denke, dass ich nicht um eine spezielle Funktion hierfür herumkomme.

So ist es ja auch wenig sinnvoll, von einem Objekt die id abzufragen, da diese in einem neuen Dokument ja eh wieder eine andere wird.

Siehst Du denn eine andere Möglichkeit, Gradients von einem Dokument in ein anderes zu kopieren, ohne die Zwischenablage zu benutzen? Ich möchte meine Scripte server-ready haben. Bei einer Ein-Kern-Lösung vielleicht noch kein Problem, sobald man aber mehrere Kerne anspricht, kann es zu allenfalls "lustigen", eher aber falschen Ergebnissen kommen. Oder hat jeder Prozess auf einem Kern seine eigene Zwischenablage?

Gruß

Peter


als Antwort auf: [#524037]

Sonderfarben ansprechen / Farbwerte herausfinden

Uwe Laubender
Beiträge gesamt: 5316

24. Feb 2014, 20:06
Beitrag # 11 von 13
Beitrag ID: #524066
Bewertung:
(4884 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!
Ich verfolge diesen Thread mit Interesse, obwohl ich über keine InDesign-Server-Anwendung verfüge.

Ohne Zwischenablage Gradients von einem InDesign-Dokument ins andere zu transportieren?

Ich sehe da drei Möglichkeiten mal ohne JSON zu bemühen:

1. IDMS-Datei von Objekt exportieren und platzieren

2. Bibliothek-Datei mit dem Objekt erzeugen und aus der Bibliothek heraus platzieren

(Die Vorschläge 1 und 2 sind nicht ganz so praktisch)

3. Objekt von einem zum anderen InDesign-Dokument duplizieren

Kleines Experiment:
Zwei geöffnete Dokumente, 1 Rechteck im Dolument mit Index 0, leeres Dokument mit Index 1.

Code
var myObject = app.documents[0].pages[0].rectangles[0]; 
myObject.duplicate(app.documents[1].pages[0]);


Zitat von Peter So ist es ja auch wenig sinnvoll, von einem Objekt die id abzufragen, da diese in einem neuen Dokument ja eh wieder eine andere wird.


Dafür ließe sich per insertLabel(keyString,valueString) eine Spur legen, die man zurückverfolgen und auswerten kann: extractLabel(keyString). Zur Not geht in den valueString wahrscheinlich auch ein ganzes Objekt als String rein (hab's aber noch nicht ausprobiert):

Code
myObject = eval(myOtherObject.extractLabel(keyString)); 



als Antwort auf: [#524063]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

12. Mär 2014, 18:22
Beitrag # 12 von 13
Beitrag ID: #524794
Bewertung:
(4557 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich möchte jetzt eine MixedInk anlegen, was aber nicht so recht gelingen will. Voraussetzung ist, dass in dem Dokument eine Farbe names "HKS 5 K" angelegt ist.

Nun möchte ich eine neue Version dieser Farbe anlegen, die 20 % "Process Black" enthält.

Dieses Script ...

Code
var doc = app.activeDocument; 
var myInkList = [doc.inks.itemByName("Process Black"), doc.inks.itemByName("Process Magenta"), doc.inks.itemByName("HKS 5 K")];
var myInkPercentages = [20, 0, 100];

var newColor = doc.colors.add({inkList: myInkList, inkPercentages: myInkPercentages, space: ColorSpace.MIXEDINK, model: ColorModel.MIXEDINKMODEL});


... wirft den Fehler: "Mischdruckfarben-Farbfelder müssen mindestens zwei Druckfarben und mindestens eine Vollton-Druckfarbe enthalten."

Weiß jemand Rat?

Peter


als Antwort auf: [#524066]

Sonderfarben ansprechen / Farbwerte herausfinden

peterhenrich
Beiträge gesamt: 139

12. Mär 2014, 19:42
Beitrag # 13 von 13
Beitrag ID: #524799
Bewertung:
(4533 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Auf der Autobahn während der Heimfahrt eingefallen:

Es muss natürlich ...
Code
var newColor = doc.mixedInks.add( 

und nicht ...
Code
var newColor = doc.colors.add( 

... heißen.


als Antwort auf: [#524794]
X