Skip to main content
Known Participant
July 15, 2015
Answered

Render swatch Legend Script

  • July 15, 2015
  • 10 replies
  • 26882 views

I was wondering if someone could help me edit this Script Written by John Wundes. Its almost perfect for what i need, but my problem is the text box inside of the swatch when it is rendered is to small. Ideally i'd like it to be 90% the size of the actual swatch. I've copied and pasted it here if someone could help i'd greatly appreciate it. I tried asking John on his Blog a few times but i haven't gotten any response. Also i'd like to delete the CMYK values that it returns with just the PMS name only.

Render Swatch Legend v1.1 -- CS, CS2, CS3, CS4, CS5

//>=--------------------------------------

//

//  This script will generate a legend of rectangles for every swatch in the main swatches palette.

//  You can configure spacing and value display by configuring the variables at the top

//  of the script.

//   update: v1.1 now tests color brightness and renders a white label if the color is dark.

//>=--------------------------------------

// JS code (c) copyright: John Wundes ( john@wundes.com ) www.wundes.com

// copyright full text here:  http://www.wundes.com/js4ai/copyright.txt

//

//////////////////////////////////////////////////////////////////

    doc = activeDocument,

    swatches = doc.swatches,

    cols = 10,

    displayAs = "CMYKColor",  //or "RGBColor"

    rectRef=null,

    textRectRef=null,

    textRef=null,

    rgbColor=null,

    w=150;

    h=150,

    h_pad = 100,

    v_pad = 100,

    t_h_pad = 100,

    t_v_pad = 100,

    x=null,

    y=null,

    black = new GrayColor(),

    white = new GrayColor()

    ;

    black.gray = 100;

    white.gray = 0;

activeDocument.layers[0].locked= false;

var newGroup = doc.groupItems.add();

newGroup.name = "NewGroup";

newGroup.move( doc, ElementPlacement.PLACEATBEGINNING );

for(var c=2,len=swatches.length;c<len;c++)

{

        var swatchGroup = doc.groupItems.add();

        swatchGroup.name = swatches.name;

      

        x= (w+h_pad)*(c% cols);

        y=(h+v_pad)*(Math.floor((c+.01)/cols))*-1 ;

        rectRef = doc.pathItems.rectangle(y,x, w,h);

        rgbColor = swatches.color;

        rectRef.fillColor = rgbColor;

        textRectRef =  doc.pathItems.rectangle(y- t_v_pad,x+ t_h_pad, w-(2*t_h_pad),h-(2*t_v_pad));

        textRef = doc.textFrames.areaText(textRectRef);

        textRef.contents = swatches.name+ "\r" + getColorValues(swatches.color) ;

        textRef.textRange.fillColor = is_dark(swatches.color)? white : black;

        //

        rectRef.move( swatchGroup, ElementPlacement.PLACEATBEGINNING );    

        textRef.move( swatchGroup, ElementPlacement.PLACEATBEGINNING );

        swatchGroup.move( newGroup, ElementPlacement.PLACEATEND );

}

function getColorValues(color)

{

        if(color.typename)

        {

            switch(color.typename)

            {

                case "CMYKColor":

                    if(displayAs == "CMYKColor"){

                        return ([Math.floor(color.cyan),Math.floor(color.magenta),Math.floor(color.yellow),Math.floor(color.black)]);}

                    else

                    {

                        color.typename="RGBColor";

                        return  [Math.floor(color.red),Math.floor(color.green),Math.floor(color.blue)] ;

                      

                    }

                case "RGBColor":

                  

                   if(displayAs == "CMYKColor"){

                        return rgb2cmyk(Math.floor(color.red),Math.floor(color.green),Math.floor(color.blue));

                   }else

                    {

                        return  [Math.floor(color.red),Math.floor(color.green),Math.floor(color.blue)] ;

                    }

                case "GrayColor":

                    if(displayAs == "CMYKColor"){

                        return rgb2cmyk(Math.floor(color.gray),Math.floor(color.gray),Math.floor(color.gray));

                    }else{

                        return [Math.floor(color.gray),Math.floor(color.gray),Math.floor(color.gray)];

                    }

                case "SpotColor":

                    return getColorValues(color.spot.color);

            }   

        }

    return "Non Standard Color Type";

}

function rgb2cmyk (r,g,b) {

var computedC = 0;

var computedM = 0;

var computedY = 0;

var computedK = 0;

//remove spaces from input RGB values, convert to int

var r = parseInt( (''+r).replace(/\s/g,''),10 );

var g = parseInt( (''+g).replace(/\s/g,''),10 );

var b = parseInt( (''+b).replace(/\s/g,''),10 );

if ( r==null || g==null || b==null ||

     isNaN(r) || isNaN(g)|| isNaN(b) )

{

   alert ('Please enter numeric RGB values!');

   return;

}

if (r<0 || g<0 || b<0 || r>255 || g>255 || b>255) {

   alert ('RGB values must be in the range 0 to 255.');

   return;

}

// BLACK

if (r==0 && g==0 && b==0) {

  computedK = 1;

  return [0,0,0,1];

}

computedC = 1 - (r/255);

computedM = 1 - (g/255);

computedY = 1 - (b/255);

var minCMY = Math.min(computedC,

              Math.min(computedM,computedY));

computedC = (computedC - minCMY) / (1 - minCMY) ;

computedM = (computedM - minCMY) / (1 - minCMY) ;

computedY = (computedY - minCMY) / (1 - minCMY) ;

computedK = minCMY;

return [Math.floor(computedC*100),Math.floor(computedM*100),Math.floor(computedY*100),Math.floor(computedK*100)];

}

function is_dark(color){

       if(color.typename)

        {

            switch(color.typename)

            {

                case "CMYKColor":

                    return (color.black>50 || (color.cyan>50 &&  color.magenta>50)) ? true : false;

                case "RGBColor":

                    return (color.red<100  && color.green<100 ) ? true : false;

                case "GrayColor":

                    return color.gray > 50 ? true : false;

                case "SpotColor":

                    return is_dark(color.spot.color);

               

                return false;

            }

        }

}

Correct answer W_J_T

Natesroom1 wrote:

1. text is to small

2. delete the CMYK values that it returns with just the PMS name only

Just a quick glance at the code, try the following:

1.) For the Size, after this line:

textRef = doc.textFrames.areaText(textRectRef);

Add the following line, change the numeric value to whatever size suits you:

textRef.textRange.characterAttributes.size = 20;

2.) Regarding removing the CMYK values for for PMS colors, change this line:

textRef.contents = swatches.name+ "\r" + getColorValues(swatches.color);

To this:

textRef.contents = swatches.name;

... again just a quick glance, but maybe it will help your efforts.

10 replies

paulflong
Inspiring
April 10, 2024

for some reason when i run his script, the hex value is always wrong...

Participating Frequently
May 14, 2020

Can someone help me change this to display the RGB values instead of the CMYK values?

Disregard! I figured it out 🙂

Charu Rajput
Community Expert
Community Expert
May 15, 2020

Hi,

So you would like to have as per below screenshot?

 

 

If yes, then easy way is Open the document in RGB mode, the script will automatically display the RGB  values.

 

Thanks

 

Best regards
Known Participant
October 31, 2018

As I do to eliminate the 2 blank spaces where it should not appear (none and registration) example this is what appears.

And I want it to look more like this.

Can someone make this possible please?

CarlosCanto
Community Expert
Community Expert
November 1, 2018

check BenMason's answer to that in post#26

Known Participant
November 1, 2018

It does not work for me or I'm not placing it in the right place.

Can you tell me if it worked or you tried it?

Design_and_Animation
Participant
August 27, 2018

Hello. I was wondering if there is a way I can make this script render just the names of the PMS colors in the actual color of the PMS and not in black ?

I don’t need the box with color in it. Just the names in their respective colors.

Also. Is there a script that will render the name of the file that illustrator puts in outside the marks in the size I want it.  Bigger. And bolder.

Participating Frequently
March 28, 2018

Can anyone help me with the code to remove the 'Registration Black' & 'None' swatches?

Silly-V
Legend
March 28, 2018

You can't remove those, unless you want Illustrator to crash immediately. They are apparently required.

Participating Frequently
March 30, 2018

i just want to remove them from showing up when the swatch palette is created using RenderSwatchLegend. I don't want to delete them from the swatch panel...

Participant
November 8, 2017

I'm trying to use this code to create a spot color colorbar across the page.  How can I add a step and repeat to this code?

Participant
August 17, 2016

I have been trying to figure out this script for months now. I've worked with the original script posted as well as the script posted by holic2014 and the edited one from Qwertyfly.

All I need is pictured below. An ellipse W:0.3956in. x H:0.2019in. with the text at Arial regular 14.54pts to the right.

I would like it to have just the Pantone color number and positioned at X:9.6538in. & Y:4.889in. The artboard size is  11.162in. x 6in.

If anyone can help me out that would be awesome.

Thank You in advance!!!

RodrigoPM
Participant
August 6, 2015

Hi. Could anyone help me edit this script, so i can put all my text below (outside) the box, like in the image?

Thank you

Inspiring
August 6, 2015

RodrigoPM wrote: Could anyone help me edit this script, so i can put all my text below (outside) the box, like in the image?

A few basic modifications should do it:

// Change this to the desired gap between the boxes where the text will go between:

v_pad = 50, // change size as desired to work with the characterAttributes.size number below and the [position] number(s) below

// Find this and comment out

//textRectRef =  doc.pathItems.rectangle(y- t_v_pad,x+ t_h_pad, w-(2*t_h_pad),h-(2*t_v_pad)); // Comment out

// Add this

textRef.textRange.characterAttributes.size = 8 // change size as desired to work with the v_pad number above and the [position] number(s) below

// Find this and comment out

//textRef.textRange.fillColor = is_dark(swatches.color)? white : black; // Comment out

textRef.textRange.fillColor = black; // changed to just use black assuming it will be on white artboard, otherwise use above

// Add the following:

textRef.position = [rectRef.left + 15, (rectRef.top - rectRef.height - 15)]; // This is now the positioning

// adjust the 15 as needed in reference to the v_pad number you use above and the characterAttributes.size from above

Which would result in the following:

RodrigoPM
Participant
August 6, 2015

Thank you very much W_J_T. It worked

holic2014
Participant
August 6, 2015

I want to ask one of the problems. I want to modify the appearance of cells under 5 column.

var docRef=app.activeDocument;

var SwatchBoxSize=Window.prompt("Enter the desired text size in points:", 20);

var swatchBoxSize=parseFloat(SwatchBoxSize);

var swatchBoxTop=swatchBoxSize;

var swatchXAnchor=42;

var swatchYAnchor=42;

for(var c=2,i=docRef.swatches.length;c<i;c++){

          var swatchRef=docRef.swatches;

          var swatchRefName=docRef.swatches.name;

          var swatchGroup=docRef.groupItems.add();

          var swatchBox=swatchGroup.pathItems.rectangle(swatchYAnchor, swatchXAnchor, swatchBoxSize, swatchBoxSize);

          swatchBox.fillColor=swatchRef.color;

          swatchBox.stroked=true;

          swatchBox.strokeWidth=.5

            var swatchLabelX= swatchBox.left+swatchBox.width+6;

            var swatchLabelY = swatchBox.top-10;

            var swatchLabel = swatchGroup.textFrames.pointText([swatchLabelX,swatchLabelY]);

          swatchLabel.contents = swatchRefName;

          swatchLabel.textRange.characterAttributes.size=swatchBoxSize/3;

          swatchLabel.textRange.characterAttributes.leading=swatchBoxSize/ 3;

          swatchLabel.textRange.characterAttributes.fillColor=docRef.swatches["C=0 M=0 Y=0 K=100" ].color;

          swatchBoxTop+=(swatchBoxSize*1.25);

          swatchXAnchor+=(100);

  }//end for

and the result is

and I want it to be so

Can you help me ?. thanks

Qwertyfly___
Legend
August 6, 2015

just a mater of re-setting the position after every fifth item

var docRef=app.activeDocument; 

var SwatchBoxSize=Window.prompt("Enter the desired text size in points:", 20); 

var swatchBoxSize=parseFloat(SwatchBoxSize); 

var swatchBoxTop=swatchBoxSize; 

var swatchXAnchor=42; 

var swatchYAnchor=42; 

var count = 0;

 

for(var c=2,i=docRef.swatches.length;c<i;c++){ 

          var swatchRef=docRef.swatches

          var swatchRefName=docRef.swatches.name; 

          var swatchGroup=docRef.groupItems.add(); 

          var swatchBox=swatchGroup.pathItems.rectangle(swatchYAnchor, swatchXAnchor, swatchBoxSize, swatchBoxSize); 

          swatchBox.fillColor=swatchRef.color; 

          swatchBox.stroked=true; 

          swatchBox.strokeWidth=.5 

            var swatchLabelX= swatchBox.left+swatchBox.width+6; 

            var swatchLabelY = swatchBox.top-10; 

            var swatchLabel = swatchGroup.textFrames.pointText([swatchLabelX,swatchLabelY]); 

          swatchLabel.contents = swatchRefName; 

          swatchLabel.textRange.characterAttributes.size=swatchBoxSize/3; 

          swatchLabel.textRange.characterAttributes.leading=swatchBoxSize/ 3; 

          swatchLabel.textRange.characterAttributes.fillColor=docRef.swatches["C=0 M=0 Y=0 K=100" ].color; 

          swatchBoxTop+=(swatchBoxSize*1.25);

          count++;

          if(count > 4){

              count = 0;

              swatchXAnchor=42; 

              swatchYAnchor-=(35);

          }else{

              swatchXAnchor+=(100); 

          }

  }

holic2014
Participant
August 6, 2015

thanks you so much.

W_J_TCorrect answer
Inspiring
July 15, 2015

Natesroom1 wrote:

1. text is to small

2. delete the CMYK values that it returns with just the PMS name only

Just a quick glance at the code, try the following:

1.) For the Size, after this line:

textRef = doc.textFrames.areaText(textRectRef);

Add the following line, change the numeric value to whatever size suits you:

textRef.textRange.characterAttributes.size = 20;

2.) Regarding removing the CMYK values for for PMS colors, change this line:

textRef.contents = swatches.name+ "\r" + getColorValues(swatches.color);

To this:

textRef.contents = swatches.name;

... again just a quick glance, but maybe it will help your efforts.

Known Participant
July 15, 2015

That worked perfectly. The only problem is the script makes an area text box that is very small inside the swatch so even when i change the value of the text from 20 to 30 it gets cut off (you know how area text boxes work with the red +)

How can i change the size of the area text box that is created to around 90 or 85% of the swatch?

Larry G. Schneider
Community Expert
Community Expert
July 15, 2015

Try changing the value of the declared variables t_h_pad and t_v_pad to a larger number like 135 instead of 100.