Skip to main content
Participant
February 5, 2010
Question

Batch replace color with another color

  • February 5, 2010
  • 1 reply
  • 10654 views

Hi,

I would desperately need some assistance in trying to accomplish batch editing of ai-files via JavaScript.

What I would need to do, is go through a number (many!) of files, find items with certain swatch color (referenced by its name), and replace the item-fill with another swatch-color (also referenced by its name). Then save the document with another name.

Other parts I have managed to do, except find/compare/modify the fill color of an item.

I have gone through these forums and tried a number of things to a point where I am currently very confused and frustrated 

Some details (if it helps any), I'm using Illustrator CS3 and JavaScript.

Here's the closest where I got with trying to find a certain color and eventually changing it:

#target illustrator

var sourceFile, findColor, replaceColor;

sourceFile = new File().openDlg('Please select your Illustrator file…');

open(sourceFile);
var docRef = app.activeDocument;

findColor = docRef.swatches.getByName("vih");
// replaceColor not yet used anywhere
replaceColor = docRef.swatches.getByName("sin");

for(var obj = docRef.pageItems.length - 1; obj >= 0; obj--) {
    if(docRef.pageItems[obj].fillColor == findColor) {
        alert("Match found"); //It never seems to get here, so my comparison clearly is not working?
    }
    else {
        alert ("No specified color found!");
    }
}

docRef.close();

(and yes, I'm completely new with java-scripting, so even this is constructed from bits of sample-scripts and other scripts found from these forums)

Please, I would really appreciate any help, this can't really be such a difficult task to do... can it?

BR,

Johanna

This topic has been closed for replies.

1 reply

Inspiring
February 5, 2010

I don't think you can do a color comparison like this in script. In the GUI you can select an path item and if its fill matches a swatch then its associated with it. Your 'findColor' will return a [swatch Object] which you can't compare to fillColor as this returns [color Object] . Im fairly new to using JavaScript but think you need to dig down deeper to there values to compare? I made only the simplest of test files to try this.

Try something like…

#target illustrator

var docRef = app.activeDocument;

with (docRef) {

var findColor = swatches.getByName('vih').color;

var replaceColor = swatches.getByName('sin').color;

for (var i = 0; i < pathItems.length; i++) {

with (pathItems.fillColor) {

if (cyan == findColor.cyan && magenta == findColor.magenta && yellow == findColor.yellow && black == findColor.black) {

$.writeln('True');

cyan = replaceColor.cyan, magenta = replaceColor.magenta, yellow = replaceColor.yellow, black = replaceColor.black;

} else {

$.writeln('False');

}

}

}

//saveAs(filePath, saveOptions)

}

My example was just swapping on CMYK for another. You may want to check what pageItems you have as NOT all will return you a fillColor?

lohariAuthor
Participant
February 5, 2010

Thank you Mark for answering, I tried the code you proposed, and it failed at the 'if' -statement with error "cyan is undefined". After that, I tried adding 'pathItems.fillColor.' in front of each undefined color. It resulted to the script running through, but not changing anything. So.. I still don't know if the comparison works or not

Inspiring
February 6, 2010

I only tried a very basic test in my case ALL path items were filled with various CMYK swatches and the swap did take place so the comparison did work. I would suspect that you have a path item that contains NO fill so any of its properties would be undefined. You can also include this in your code too. This should work for both filled and stroked path items in CMYK art.

#target illustrator

var docRef = app.activeDocument;

with (docRef) {

var findColor = swatches.getByName('vih').color;

var replaceColor = swatches.getByName('sin').color;

for (var i = 0; i < pathItems.length; i++) {

if (pathItems.filled == true) {

with (pathItems.fillColor) {

if (cyan == findColor.cyan && magenta == findColor.magenta && yellow == findColor.yellow && black == findColor.black) {

$.writeln('True');

cyan = replaceColor.cyan, magenta = replaceColor.magenta, yellow = replaceColor.yellow, black = replaceColor.black;

} else {

$.writeln('False');

}

}

}

if (pathItems.stroked == true) {

with (pathItems.strokeColor) {

if (cyan == findColor.cyan && magenta == findColor.magenta && yellow == findColor.yellow && black == findColor.black) {

$.writeln('True');

cyan = replaceColor.cyan, magenta = replaceColor.magenta, yellow = replaceColor.yellow, black = replaceColor.black;

} else {

$.writeln('False');

}

}

}

}

//saveAs(filePath, saveOptions)

}