Copy link to clipboard
Copied
Is there a way of coloring a font with a RGB, Lab or CMYK color without adding the color to the document swatches.
The only way I know is to add a color to the swatches or use one that already exists.
like
app.selection[0].characters[0].fillColor=document.colors.add({colorValue: [255, 53, 160], space: ColorSpace.RGB});}
This has the undesired effect of cluttering up the swatches when using a lot of colors.
any ideas?
Good Morning Uwe!
After 3am by me 2am by you
I had tried the link and it did download but I have cs5 cs6 and cc but not cs5.5 and all the scripts worked on them may because of the file conversion.
So it looks like the following summary is all correct
All documents new contain
Swatches (Black, Registration, Paper and None) the index order will be the order that the swatches appear in the swatches panel
And colors in an alphabetical index order
named color "A" first "Z" last and then the unnamed colors.
...Copy link to clipboard
Copied
InDesign Tagged Text?
In short: no, not really, seems like a limitation.
Copy link to clipboard
Copied
Using standard methods, the only way to add colors is by adding a swatch.
If you have an unnamed color in your document, you can apply it to another object using obj1.fillColor = obj2.fillColor.
So, if you can get the unnamed color in your document somehow, you can apply it via scripting.
One way to do that would be to write a snippet programmatically with the desired color, import that, apply the color and remove the placed snippet.
You can check if the color exists already in the doc before doing that...
Harbs
Copy link to clipboard
Copied
Definitely easier with InDesign Tagged Text:
<ASCII-MAC>
color test
<cColor:COLOR\:CMYK\:Process\:0.75\,0.5\,0.53\,0.10>seventy<cColor:>
nocolor test
Copy link to clipboard
Copied
Good idea.
Copy link to clipboard
Copied
Sounds to me like a good idea as well but unlike Harbs I don't have a clue how to apply XML attributes to text in the document.
Please can you show me how to do this.
Take for example I want to make the second character or word in my current selection the color CMYK\:Process\:0.75\,0.5\,0.53\,0.10
how would I script that?
Copy link to clipboard
Copied
Okay...
Here's a multi-purpose function which takes an array of three or four values and returns an unnamed color (either RGB or CMYK) using the methods we discussed here:
function GetUnnamedColor(values){
if( !(values instanceof Array) ){
throw("Values must be an array of three or four values");
}
var fileString = "<ASCII-MAC>\r" +
"<pstyle:><cc:COLOR\:";
if(values.length == 3){
fileString = fileString + "RGB\:Process\:";
for(var i=0;i<values.length;i++){
values = values/255 * 100;
}
}
else if(values.length == 4){
fileString = fileString + "CMYK\:Process\:";
}
else {
throw("Values must be an array of three or four values");
}
for(var i=0;i<values.length;i++){
if(values >= 100){
fileString = fileString + "1";
} else {
values = values.toString();
var tempSplit = values.split(".");
while(tempSplit[0].length<2){
tempSplit[0] = "0" + tempSplit[0];
}
values = tempSplit.join("");
fileString = fileString + "0."+values;
}
if(i<values.length-1){
fileString = fileString + "\,";
}
}
fileString = fileString + ">Just Some Text<cc:>";
var file = File(Folder.temp+"color_import.txt");
file.open('w');
file.write(fileString);
file.close();
var story = app.documents[0].pages[0].place(file)[0];
var color = story.fillColor;
story.textContainers[0].remove();
return color;
}
alert(GetUnnamedColor([
75,0.5,53,10
]).colorValue);
Harbs
[Edit] It assumes a document to be open. I have real work to do, so I can't make it more robust right now...
Copy link to clipboard
Copied
Wow, thanks a lot as I wrote "unlike Harbs I don't have a clue how to apply XML attributes to text in the document" !
I was expecting between 1 and 2 lines of script! (what an Am HaAretz!)
I shall go over the the script to analyse the methods.
Much appreciated, please get on with some real work and have a Kesiva VeHaSima Tova.
Copy link to clipboard
Copied
Hi all, I am trying to accomplish the same goal (except color a textFrame not text) and I am using Harbs method but am only getting black boxes.
var r=0;
var g=102;
var b=255;
var elemBox = currentPage.textFrames.add(); //Add box
var addedColor = GetUnnamedColor([r,g,b]);
elemBox.fillColor = addedColor;
The filestring that gets written to the temp. file is:
<ASCII-MAC>
<pstyle:><cc:COLOR:RGB:Process:0.00,0.40,1>Just Some Text<cc:>
the addedColor.colorValue is 0,0,0,100
Is anyone else experiencing the same results?
Copy link to clipboard
Copied
I get the expected results—addedColor.colorValue is [0,102,255]—in CS5 and CS4 on the Mac. I don't have any good theories about why you're seeing what you're seeing. Have you tried with a fresh document or after trashing or temporarily moving your prefs and defaults?
Jeff
Copy link to clipboard
Copied
You input RGB and you get *four* values in return...?
Copy link to clipboard
Copied
@Jongware - Yes that is correct. I copied the function verbatum and that is what I get in return. I Have also tried putting in dummy values for a CMYK [50,50,20,0] and I get the same result.
@absqua - I am running CS5.5 on a PC. Does that effect the <ASCII-MAC> maybe?
Copy link to clipboard
Copied
You saw this same problem before, without using Harbs's function, right? (Your other thread?) So I don't think it has anything to do with the tagged text. I know it seems like grasping at straws, but, in the absence of any other ideas, can you try clearing your defaults and starting with a new document?
Copy link to clipboard
Copied
Well, my other thread is a similiar problem and I'm hoping that this solution is a work-around for that (since I was grasping at straws over there as well). I'm actually using an entirely new document (created by script) and am adding rectangles that each have a color assigned to them. So it works using:
var addedColor = myDoc.colors.add({space:ColorSpace.RGB,colorValue:[r,g,b]});
elemBox.fillColor = addedColor;
It just adds them all to the swatches fly-out which I need to avoid as well. So I'm hoping by finding a solution to this problem, it will also solve my other threads problem which is slightly different. Fingers crossed.
Copy link to clipboard
Copied
Ah the solution! After researching tagged text, I found that on a windows platform you must have <ASCII-WIN>. The colors come through as expected. I will post on my other thread if this solution works to solve that as well. Except I wont be able to test that until tomorrow.
Just on more question. Harbs says above that "You can check if the color exists already in the doc before doing that..." and by that he means executing that method. But how do you check for the unnamed color?
Message was edited by: bduffy323
Copy link to clipboard
Copied
Ok some years late coming from this thread base on Uwe's discovery that a doc always has a color in it we can just use.
var myUnnamedColor = app.activeDocument.colors[-1].duplicate();
myUnnamedColor.properties = {colorValue:[10,50,70,0]}; // space, model etc.
// var newRectangleWithUnnamedColor = app.activeDocument.rectangles.add({geometricBounds:[0,0,100,100],fillColor: myUnnamedColor});
Regards to all
Trevor
Copy link to clipboard
Copied
@Trevor – sorry to say, but that would not always work.
After testing a lot, I found, that there are cases where this cannot work. Mostly incidents where a user was working with spot colors and removed that spot color to a unnamed one.
You can try your snippet on the following file (CS5.5):
AddingUnnamedColorDoesNotWork.zip
AddingUnnamedColorDoesNotWork_TREVOR-SNIPPET.idml
AddingUnnamedColorDoesNotWork_TREVOR-SNIPPET.indd
Download the zip from my dropbox account here:
https://www.dropbox.com/s/pl1za6fw9v3bc04/AddingUnnamedColorDoesNotWork.zip
(EDIT: Link did not work as expected)
I think, we cannot assume, that colors[-1] is always the right one for duplication.
However, what is working with the file you can download is the following snippet (if our goal is a unnamed process color in CMYK):
//AddingUnnamedCMYKcolorToDocument.jsx
//Uwe Laubender
/**
* @@@BUILDINFO@@@ AddingUnnamedCMYKcolorToDocument.jsx !Version! Tue Mar 18 2014 18:43:44 GMT+0100
*/
//Is working, if document is of type PRINT or WEB.
var myColors = app.activeDocument.colors;
var myID;
//Catch the standard unnamed color with colorValue [0,0,0,0]
for(var n=0;n<myColors.length;n++){
if(
myColors
.colorValue.length == 4 && myColors
.colorValue[0] == 0 && myColors
.colorValue[1] == 0 && myColors
.colorValue[2] == 0 && myColors
.colorValue[3] == 0 && myColors
.name == "" ){
myID = myColors
.id; break;
};
};
if(myID == null){alert("No color found.");exit()};
var myUnnamedColor = app.documents[0].colors.itemByID(myID).duplicate();
myUnnamedColor.colorValue = [100,0,0,20];
var newRectangleWithUnnamedColor = app.activeDocument.rectangles.add
({
geometricBounds:[0,0,100,100],
fillColor: myUnnamedColor
});
Adding an unnamed RGB color will work with the following snippet.
However I cannot tell, if in all circumstances:
//AddingUnnamedRGBcolorToDocument.jsx
//Uwe Laubender
/**
* @@@BUILDINFO@@@ AddingUnnamedRGBcolorToDocument.jsx !Version! Tue Mar 18 2014 19:10:38 GMT+0100
*/
//Is working, if document is of type PRINT or WEB.
var myColors = app.activeDocument.colors;
var myID;
//Catch the standard unnamed color with colorValue [0,0,0,0]
for(var n=0;n<myColors.length;n++){
if(
myColors
.colorValue.length == 4 && myColors
.colorValue[0] == 0 && myColors
.colorValue[1] == 0 && myColors
.colorValue[2] == 0 && myColors
.colorValue[3] == 0 && myColors
.name == "" ){
myID = myColors
.id; break;
};
};
if(myID == null){alert("No color found.");exit()};
var myUnnamedColor = app.documents[0].colors.itemByID(myID).duplicate();
myUnnamedColor.properties = {
model:ColorModel.PROCESS,
space:ColorSpace.RGB,
colorValue:[255,255,10]
};
var newRectangleWithUnnamedColor = app.activeDocument.rectangles.add
({
geometricBounds:[0,0,100,100],
fillColor: myUnnamedColor
});
Again: sorry…
Uwe
Message was edited by: Laubender | Link to dropbox did not work as expected.
Message was edited by: Laubender | Link did not work as expected
Copy link to clipboard
Copied
Hi Again
Uwe,
I think (pretty sure) your color value test it not needed and also the length is not and as such you are failing to produce unamed colors in cases where you could.
I think as long as you check that the swatch name is "" then it should be enough it seems that all unnamed colors are process and can't be mixed ink, gradient or spot.
Can you find a case where this won't work? I.e. were there is no such available unnamed color around that we can duplicate?
I am pretty tired here but I still don't understand in which case colors[-1] won't be a duplicatable unnamed swatch from which we can create other unnamed colors.
As the link didn't work as expected can you make the case clearer?
I think you might have been misled from our other post (link in 19) to think that the unnamed color was not being created because is wasn't appearing the correct color but it was it just with the wrong color value to it because of the attempt to make it a spot color.
You can see this by running this snippet before and after running your remove function there
var doc = app.activeDocument,
cols = doc.colors.everyItem().getElements().slice(0),
l = cols.length;
while (l--) $.writeln(l+")\t"+cols
.properties.toSource());
Interested in hearing your findings
Trevor
Copy link to clipboard
Copied
Good Morning, Trevor!
(At least in my part of the world it's around 9 am)
Did you try the link using the forum?
I edited and tested it; seems alright now.
At least from my side using Firefox 27.0.1 on Mac OSX.
I used your snippet above and it always produced the same color over and over again.
Without throwing an error.
Now, after some testing I do know why.
You always have to set the properties for space and corresponding colorValue. No more, no less. Not the model.
You are right. An unnamed color would always be ColorModel.PROCESS.
Despite my attempts that cannot be changed…
If one is using the UI to generate an unnamed color, a SPOT color will be transfered into a PROCESS color. Always. In case of a spot color with LAB color values (my downloadable example) the above code snippet has to fail, because LAB has 3 color values.
I was using 4 values without setting the corresponding space to ColorSpace.CMYK.
My problem was: it failed silently.
The new colorValue was not assigned, the duplicated color was using the old ones.
So I come to the conclusion:
Your snippet will work as is, if both, space and colorValue are declared!
var myUnnamedColor = app.activeDocument.colors[-1].duplicate();
//NEEDED: space AND colorValue
//WILL THROW ERROR: model OTHER than ColorModel.PROCESS
myUnnamedColor.properties = {
space:ColorSpace.CMYK,
colorValue:[10,50,70,0]
};
var newRectangleWithUnnamedColor = app.activeDocument.rectangles.add({
geometricBounds:[0,0,100,100],
fillColor: myUnnamedColor
});
I'm glad this is sorted out now… 🙂
PS. it seems that a mixedInk color will fall back to PROCESS CMYK when set to unnamed in the UI.
Even in a dedicated WEB document. But this is not proven. Just an observation after experimenting a bit.
Uwe
Copy link to clipboard
Copied
Good Morning Uwe!
After 3am by me 2am by you
I had tried the link and it did download but I have cs5 cs6 and cc but not cs5.5 and all the scripts worked on them may because of the file conversion.
So it looks like the following summary is all correct
All documents new contain
Swatches (Black, Registration, Paper and None) the index order will be the order that the swatches appear in the swatches panel
And colors in an alphabetical index order
named color "A" first "Z" last and then the unnamed colors.
A such all new documents colors[-1] will be an unnamed color which we can duplicated to produce other unnamed colors taking note that the duplication must be process and not spot colors.
So far so good, (not for long )
Unnamed colors are not read only so if we make a positive effort to remove them we can do that.
while (app.activeDocument.colors[-1].name == "") app.activeDocument.colors[-1].remove()
We now won't have any unnamed swatches to duplicate and will have to resort to John's tagged text file method in 3 above.
If there were no unnamed swatches and we try to duplicate colors[-1] and it was a color like "Yellow" then it seem's to crash indesign.
Anyway the below method should always work (for regular non tint etc. type colors).
// optimized for easy of use but not efficiency !!!
var doc = app.documents.add();
var p = doc.pages[0];
p.textFrames.add({contents: "RGB", geometricBounds: ["0mm", "0mm", "30mm", "30mm"], fillColor: addUnnamedColor([0, 0,255])}); // will be a RGB
p.textFrames.add({contents: "RGB", geometricBounds: ["0mm", "30mm", "30mm", "60mm"], fillColor: addUnnamedColor([0, 255,0], 1666336578)}); // will be a RGB because of value
p.textFrames.add({contents: "RGB", geometricBounds: ["0mm", "60mm", "30mm", "90mm"], fillColor: addUnnamedColor([65, 50, 102], ColorSpace.RGB)}); // will be a RGB
p.textFrames.add({contents: "RGB", geometricBounds: ["0mm", "90mm", "30mm", "120mm"], fillColor: addUnnamedColor([84, 90,40],"r")}); // will be a RGB
p.textFrames.add({contents: "RGB", geometricBounds: ["0mm", "120mm", "30mm", "150mm"], fillColor: addUnnamedColor([232, 0, 128],1)}); // will be a RGB
p.textFrames.add({contents: "Lab", geometricBounds: ["30mm", "0mm", "60mm", "30mm"], fillColor: addUnnamedColor([29.5, 67.5, -112])}); // will be a Lab because of -
p.textFrames.add({contents: "Lab", geometricBounds: ["30mm", "30mm", "60mm", "60mm"], fillColor: addUnnamedColor([100, -128, 127], 1665941826)}); // will be a Lab because of value
p.textFrames.add({contents: "Lab", geometricBounds: ["30mm", "60mm", "60mm", "90mm"], fillColor: addUnnamedColor([24.5, 16, -29], ColorSpace.LAB)}); // will be a Lab
p.textFrames.add({contents: "Lab", geometricBounds: ["30mm", "90mm", "60mm", "120mm"], fillColor: addUnnamedColor([36.8, -9, 27],"l")}); // will be a Lab
p.textFrames.add({contents: "Lab", geometricBounds: ["30mm", "120mm", "60mm", "150mm"], fillColor: addUnnamedColor([51, 78, 0], -1)}); // will be a Lab because of the 1
p.textFrames.add({contents: "CMYK", geometricBounds: ["60mm", "0mm", "90mm", "30mm"], fillColor: addUnnamedColor([82, 72, 0, 0])}); // will be a CMYK because there are 4 color values
p.textFrames.add({contents: "CMYK", geometricBounds: ["60mm", "30mm", "90mm", "60mm"], fillColor: addUnnamedColor([60, 0, 100, 0], 1129142603)}); // will be a CMYK because of value
p.textFrames.add({contents: "CMYK", geometricBounds: ["60mm", "60mm", "90mm", "90mm"], fillColor: addUnnamedColor([84, 90,40, 0], ColorSpace.CMYK)}); // will be a CMYK
p.textFrames.add({contents: "CMYK", geometricBounds: ["60mm", "90mm", "90mm", "120mm"], fillColor: addUnnamedColor([67, 53, 97.6, 21.7], "c")}); // will be a CMYK
p.textFrames.add({contents: "CMYK", geometricBounds: ["60mm", "120mm", "90mm", "150mm"], fillColor: addUnnamedColor([0, 100, 0, 0], 0)}); // will be a CMYK
function addUnnamedColor (cValue, space, docToAddColor) {
docToAddColor = app.documents.length && (docToAddColor || (app.properties.activeDocument && app.activeDocument) || app.documents[0]);
if (!docToAddColor) return;
var lastColor = docToAddColor.colors[-1];
if (!cValue) cValue = [0,0,0,0];
if (space == 1129142603 || cValue && cValue.length == 4) space = ColorSpace.CMYK;
else if ((space && space < 0) || space && space == 1665941826 || (space && /L|-/i.test(space.toString())) || (cValue && /-/.test(cValue ))) space = ColorSpace.LAB;
else if ((space && space > 0) || space && space == 1666336578 || (space && /R/i.test(space.toString())) || (cValue && cValue.length == 3)) space = ColorSpace.RGB;
else space = ColorSpace.CMYK;
app.doScript (
"""
var newUnnamedColor = (lastColor.name == "") ? lastColor.duplicate() : taggedColor();
newUnnamedColor.properties = {space: space, colorValue: cValue};
""",
ScriptLanguage.javascript,
undefined,
UndoModes.FAST_ENTIRE_SCRIPT
);
function taggedColor() { // need to use this if no unnamed exists
var tagString = "<ASCII-" + ($.os[0] == "M" ? "MAC>\r " : "WIN>\r ") + "<cColor:COLOR\:CMYK\:Process\:0.1\,0.95\,0.3\,0.0><cColor:>"; // would make more sense to apply the correct value in the tagged text file but I can't be bothered !
var tempFile = new File (Folder (Folder.temp) + "/ " + (new Date).getTime() + ".txt");
tempFile.open('w');
tempFile.write(tagString);
tempFile.close();
var tempFrame = docToAddColor.pages[-1].textFrames.add();
$.sleep(250);
tempFrame.place(tempFile);
tempFrame.remove();
tempFile.remove();
return docToAddColor.colors[-1];
}
return newUnnamedColor;
}
Shall apply the function to delete and replace swatch on the other thread at a more sane time
Regards
Trevor
Copy link to clipboard
Copied
@Trevor – great. Had no time yet testing your code, but it's looking very promising!
You wrote:
Unnamed colors are not read only so if we make a positive effort to remove them we can do that.
True. So going the IDMS route or the TAGGED TEXT route would be a safe thing to do.
On the other hand, we could have added a new document and procede with duplicating the last unnamed color. Provided someone did not remove all unnamed colors in InDesign when no document was open.
A slim chance, that this would happen ( a scripter playing around maybe ) 😉
For obvious reasons I will not test this scenario.
You'll hear from me after having my first pot of morning coffee 😉
Uwe
Copy link to clipboard
Copied
@Uwe; @Trevor
It is fascinating to watch what two "possitive obsessed with their hobbies" people can achieve
I tested another way to reach unnamed color regardless of user/scripter is playing around.
It works on my side (Windows, CS5). Assuming searching for unnamed color in doc fails:
if (app.colors[-1].name !="") {
app.documents.everyItem().close(SaveOptions.NO); // watch this; is dangerous
for (var id = 29188; id < 29191;id++)
if (!app.menuActions.itemByID(id).checked)
{app.menuActions.itemByID(id).invoke(); break;}
var myUnnamed = app.colors[-1];
}
else var myUnnamed = app.colors[-1];
Did you consider this way?
Jarek
Copy link to clipboard
Copied
Jump_Over wrote:
It is fascinating to watch what two "possitive obsessed with their hobbies" people can achieve
Yep!
Your script look very dangerous
What are the menu items?
Trevor
Copy link to clipboard
Copied
Hi,
3 menuActions associated to Panel Color menuItems ==> "Lab", "CMYK", "RGB".
Checking them looks like creating a new unnamed color... (with no doc opened)
Can you see another danger than closing doc and not saving them?
Jarek
Copy link to clipboard
Copied
No but I think that closing the documents without saving them is very dangerous!
Also it's not going to help add a swatch to the open document, is it!