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
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