My script is not working when defining spot colors in path-compliant mode
Here is my script: I want it to define the color of my selected objects as spot color, but currently it skips compound paths when the selected objects have compound path.
(function () {
if (!app.documents.length) {
alert("No active document.");
return;
}
var doc = app.activeDocument;
if (!doc.selection.length) {
alert("No active selection.");
return;
}
var sel = doc.selection;
var spotColorCount = 0;
var batchSize = 100;
function areColorsEqual(color1, color2) {
var c1 = Math.round(color1.cyan * 10000) / 10000;
var m1 = Math.round(color1.magenta * 10000) / 10000;
var y1 = Math.round(color1.yellow * 10000) / 10000;
var k1 = Math.round(color1.black * 10000) / 10000;
var c2 = Math.round(color2.cyan * 10000) / 10000;
var m2 = Math.round(color2.magenta * 10000) / 10000;
var y2 = Math.round(color2.yellow * 10000) / 10000;
var k2 = Math.round(color2.black * 10000) / 10000;
return c1 === c2 && m1 === m2 && y1 === y2 && k1 === k2;
}
function createSpotColor(targetFillColor) {
// alert("createSpotColor called with color: " + targetFillColor);
// alert("Color type: " + targetFillColor.typename);
var c = Math.round(targetFillColor.cyan * 100);
var m = Math.round(targetFillColor.magenta * 100);
var y = Math.round(targetFillColor.yellow * 100);
var k = Math.round(targetFillColor.black * 100);
var spotColorName = "C" + c + "M" + m + "Y" + y + "K" + k;
for (var i = 0; i < doc.spots.length; i++) {
var existingSpot = doc.spots[i];
if (existingSpot.name === spotColorName && areColorsEqual(existingSpot.color, targetFillColor)) {
var newSpotColor = new SpotColor();
newSpotColor.spot = existingSpot;
return newSpotColor;
}
}
var newSpot = doc.spots.add();
newSpot.colorType = ColorModel.SPOT;
newSpot.color = targetFillColor;
newSpot.name = spotColorName;
spotColorCount++;
// alert("Spot color created: " + newSpot.name);
var newSpotColor = new SpotColor();
newSpotColor.spot = newSpot;
return newSpotColor;
}
function processPageItem(item, newSpotColor) {
try {
if (!item.hasOwnProperty('fillColor') || !item.fillColor || item.fillColor.typename === "NoColor") {
return;
}
item.fillColor = newSpotColor;
} catch (e) {
// alert("Error processing item: " + item.typename);
if (item.name) {
// alert("Item name: " + item.name);
}
// alert("Error message: " + e);
}
}
for (var i = 0; i < sel.length; i += batchSize) {
var batch = sel.slice(i, Math.min(i + batchSize, sel.length));
// alert("Processing batch " + (i / batchSize + 1) + " of " + Math.ceil(sel.length / batchSize));
for (var j = 0; j < batch.length; j++) {
var item = batch[j];
if (item.typename === "GroupItem") {
for (var k = 0; k < item.pageItems.length; k++) {
if (item.pageItems[k].fillColor) {
var newSpotColor = createSpotColor(item.pageItems[k].fillColor);
processPageItem(item.pageItems[k], newSpotColor);
}
}
} else if (item.typename === "CompoundPathItem") {
// alert("Processing CompoundPathItem: " + item.name);
for (var k = 0; k < item.pathItems.length; k++) { // Tour sub-paths
var subPath = item.pathItems[k];
if (subPath.fillColor) {
// alert("CompoundPathItem sub-path fill color: " + subPath.fillColor);
var newSpotColor = createSpotColor(subPath.fillColor);
processPageItem(subPath, newSpotColor);
} else {
// alert("CompoundPathItem sub-path has no fill color.");
}
}
} else if (item.typename === "PathItem") {
if (item.fillColor) {
var newSpotColor = createSpotColor(item.fillColor);
processPageItem(item, newSpotColor);
}
} else if (item.typename === "TextFrame") {
if (item.fillColor) {
var newSpotColor = createSpotColor(item.fillColor);
processPageItem(item, newSpotColor);
}
} else if (item.typename === "ClippingMaskItem") {
for (var k = 0; k < item.clippedItems.length; k++) {
if (item.clippedItems[k].fillColor) {
var newSpotColor = createSpotColor(item.clippedItems[k].fillColor);
processPageItem(item.clippedItems[k], newSpotColor);
}
}
}
}
}
alert("Spot colors created: " + spotColorCount);
}());
