
指定した色周辺のカラーチャートを作るスクリプトを作りました。
素人が作ったものなので、使ってみて何か問題が起こっても責任は取れません。
動作の正確性や安全性についても保証はできないので、使うのはあくまで自己責任でお願いします。
【使い方】
カラーモードをCMYKにし、基準にしたい色を塗ったオブジェクトを選択して、「カラーチャート作成_ALL_v8.1」スクリプトを起動する。

例)CM基準5ステップ K有
【ダウンロード】
Googleドライブです。右上のダウンロードボタンからDLしてください。
#target "illustrator"
/*
===============================================================
カラーチャートを作成します。
カラーモードがCMYKじゃないと動きません。
基準にしたい色を「塗り」に設定して、選択してからスクリプトを実行してください。
===============================================================
*/
//選択中のオブジェクトを取得
var sel = app.activeDocument.selection;
//カラーモードを確認
var colorType = sel[0].fillColor.typename
if(colorType!="CMYKColor"){
alert("カラーモードがCMYKではありません");
sel = 0;
}
//1個を選択した場合のみ動作
if(sel.length == 1){
//ダイアログを表示
var dialog = new Window("dialog","カラーチャートを作りますか?",[0,0,220,200]); //位置、横幅、縦幅
dialog.add ("statictext", [80,5,170,50], "ステップで作成");
var steptext = dialog.add("edittext",[15,15,70,40],"2");//ステップ数
var radioCM= dialog.add("radiobutton", [10, 70, 150, 90], "CM基準");
var radioMY= dialog.add("radiobutton", [10, 90, 150, 110], "MY基準");
var radioCY= dialog.add("radiobutton", [10, 110, 150, 130], "CY基準");
radioCM.value = true;
var btnOK = dialog.add("button",[10,150,80,180],"OK",{name:'ok'});//OK 左、上、右、下の位置
var btnCancel = dialog.add("button",[100,150,170,180],"cancel",{name:'cancel'});//CANCEL
// Kの有無を選択するチェックボックスを追加
var checkK = dialog.add("checkbox", [10, 130, 150, 150], "Kを含める");
checkK.value = true;
//キャンセルの処理
btnCancel.onClick = function(){ dialog.close(); }
//OKの処理…ここから最後まで
btnOK.onClick = function(){
dialog.close(); //ダイアログを閉じる
//テキストを数値に変換
var steps = parseInt(steptext.text);
//元の色情報を四捨五入して保存
var cColor = Math.round(sel[0].fillColor.cyan);
var mColor = Math.round(sel[0].fillColor.magenta);
var yColor = Math.round(sel[0].fillColor.yellow);
var kColor = Math.round(sel[0].fillColor.black);
var kInput =[];
//新しいA3ドキュメントを作成
//プリセットを設定
var preset = new DocumentPreset()
//単位をミリで計算したほうが扱いやすいので、変換機能をつけてあげる。
var w = 297;
var h = 420;
var pt=25.4/72
var W=w/pt;
var H=h/pt;
var mW=W+20;//マージン付きワイド
// プリセットオブジェクトの各プロパティに値を設定
preset.units = RulerUnits.Millimeters // 単位をミリに指定
preset.width = W // アートボードの幅
preset.height = H // アートボードの高さ
preset.colorMode = DocumentColorSpace.CMYK // カラーモードをCMYKに
preset.title = "カラーチャート" ; // タイトルを指定
preset.rasterResolution = DocumentRasterResolution.HighResolution; //ドキュメントのラスタライズ効果 高(300ppi)
//新規ドキュメントを作成
var DOC = app.documents.addDocument("",preset)
DOC.activate();
DOC.defaultStroked = false; //ドキュメントのデフォルトで線をなしに。
var ABD = DOC.artboards[DOC.artboards.getActiveArtboardIndex()];
RCT = ABD.artboardRect; //アートボードの位置
//基準となる色を置いておく
var base= DOC.pathItems.rectangle(40/pt,20/pt,13/pt,13/pt);
base.fillColor =sel[0].fillColor;
baseT = app.activeDocument.textFrames.add();
baseT.contents = 'C='+base.fillColor.cyan.toFixed(2)+'\nM='+base.fillColor.magenta.toFixed(2)+'\nY='+base.fillColor.yellow.toFixed(2)+'\nK='+base.fillColor.black.toFixed(2);
baseT.translate(40/pt,40/pt);
//基準となる座標
var x1 = 50; //左
var y1 = H-100; //上
var x2 = 50+(13/pt); //右
var y2 = H-100-(13/pt); //下
var n = 7; //複製個数
var m = 2/pt; //マージン
var movex = (13/pt)+m; //xの移動距離
var movey = (-13/pt)-m //yの移動距離
//移動距離用
var movez = 1;
var movek = 1;
//アートボード移動距離
var artB = 0;
//各アートボードの基準となるチップ
var OBJ = [];
//上下左右に並べたい色を確認
if(radioCM.value==true){radioCK = "CM"}
if(radioMY.value==true){radioCK = "MY"}
if(radioCY.value==true){radioCK = "CY"}
switch(radioCK){ //縦・横・ブロックの色指定
case "CM":
sideColor = cColor;
verColor = mColor;
blockColor = yColor;
sideCP = "C";
verCP = "M";
blockCP = "Y";
break;
case "MY":
sideColor = mColor;
verColor = yColor;
blockColor = cColor;
sideCP = "M";
verCP = "Y";
blockCP = "C";
break;
case "CY":
sideColor = cColor;
verColor = yColor;
blockColor = mColor;
sideCP = "C";
verCP = "Y";
blockCP = "M";
break;
default:
alert("エラー"); //念のため
}
//function。色を上下限内に収める
var sideInputBase = colorT(sideColor,steps,3);
var verInputBase = colorT(verColor,steps,3);
var blockInputBase = colorT(blockColor,steps,2);
var artInputBase = colorT(kColor,steps,2);
var ww = -2; // artbord loop
var howArt = 1; //何個目のアートボードか。
var text = []; //基準値テキスト
var textK = [];//右側のKのテキスト
//アートボード複製開始 N loop K
var maxArtboards = checkK.value ? 5 : 1; // Kを含める場合は5、含めない場合は1
for ( N=0 ; N < maxArtboards ; N++ ) {
kInput[N] = artInputBase[N];
//アートボードが必要数以上の時は新規作成しない
if(howArt > app.activeDocument.artboards.length && checkK.value){
NewArt = app.activeDocument.artboards.add([ artB , H , artB+W, 0 ]);
}
//loop用カウントリセット
movez = -50;
movek = 50;
//カラーチャート開始
//ブロックの複製
for(k=0; k<5; k++){
//3つめになったらブロックの行を変える。
if(k == 2){
movek = movex * n + 100 ;
movez = movey - movey -50;
}
//縦方向への複製
for(j=0; j<n; j++){
//横方向への複製
for (i=0; i<n; i++){
//縦横ブロックの色をCMYKに入力
switch(radioCK){
case 'CM':
cInput = sideInputBase[i];
mInput = verInputBase[j];
yInput = blockInputBase[k];
break;
case 'MY':
cInput = blockInputBase[k];
mInput = sideInputBase[i];
yInput = verInputBase[j];
break;
case 'CY':
cInput = sideInputBase[i];
mInput = blockInputBase[k];
yInput = verInputBase[j];
break;
} //switch end
//チップを書く。Y位置、X位置、大きさ
dpi = DOC.pathItems.rectangle(H+movey*[j+1]+movez,(movex*[i+1]+movek)+artB,13/pt,13/pt);
//色をcmykで指定
dpi.fillColor = setCMYKColor(cInput,mInput,yInput,kInput[N]);
//基準となるものに線
if(cColor==cInput && mColor==mInput&&yColor==yInput&&kColor==kInput[N]){
dpi.stroked = true;
dpi.strokeColor=setCMYKColor(0,0,0,50);//灰色の線
dpi.strokeWidth = 0.5/pt; // 線幅0.5mm
} //基準線end
} //i loop 横方向の複製 end
} //j loop 縦方向の複製 end
movez = movez + (movey * n) -50 ; //ブロック分の移動
} //ブロックk loop end
//Kの色情報だけ先に書いておく
//色情報をテキストで入力
text[N] = app.activeDocument.textFrames.add();
text[N].contents = 'C='+cColor+'/M='+mColor+'/Y='+yColor+'/K='+kInput[N];
text[N].paragraphs[0].size = 16;
text[N].translate(32/pt+artB,405/pt);
//右側にKの値を表示
textK[N] = app.activeDocument.textFrames.add();
textK[N].contents = 'K='+kInput[N];
textK[N].paragraphs[0].size = 20;
textK[N].translate( 247/pt+artB,402/pt);
//次回アートボード複製用にカウントアップしておく
if(checkK.value) {
artB=artB+W+20;
howArt++;
}
//Kの値を変更するためのカウントアップ
ww = ww + 1; //ブロックカウント
} //for N アートボード複製 loop end
//テキスト表示設定
var textBlock1 = []; //各色数値のコピー用
var textBlock2 = [];
var textSide1 = [];
var textSide2 = [];
var textVer1 = [];
var textVer2 = [];
var blockText = [];
var sideText = [];
var verText = [];
//---テキスト表示開始---
//CMYのテキスト用計算
//2桁で表示
for(E=0; E<7; E++){
verText[E] = ('00' + verInputBase[E] ).slice(-2);
sideText[E] = ('00' + sideInputBase[E] ).slice(-2);
blockText[E] = ('00' +blockInputBase[E] ).slice(-2);
}
//左下に基準値をテキスト入力
var textbase = app.activeDocument.textFrames.add();
textbase.contents = '基準値';
textbase.paragraphs[0].size = 16;
textbase.translate(20/pt,65/pt);
//基準値
textbase2 = app.activeDocument.textFrames.add();
textbase2.contents = 'C='+cColor+'/M='+mColor+'/Y='+yColor+'/K='+kColor;
textbase2.paragraphs[0].size = 16;
textbase2.translate(45/pt,65/pt);
//sideのテキスト表示
var textSide = app.activeDocument.textFrames.add();
textSide.contents = sideCP + sideText[0]+' '+sideText[1]+' '+sideText[2]+' '+sideText[3]+' '+sideText[4]+' '+sideText[5]+' '+sideText[6];
textSide.paragraphs[0].size = 19 ;
textSide.translate(132/pt,390/pt);
textSide.paragraphs[0].paragraphAttributes.justification = Justification.RIGHT;
textSide.textRange.kerning=40;
//右ブロックにもコピー
var textSide2 = textSide.duplicate();
textSide2.translate(123/pt,0);
//verticalのテキスト表示
var textVer = app.activeDocument.textFrames.add();
textVer.contents = verCP +verText[0]+'\n'+verText[1]+'\n'+verText[2]+'\n'+verText[3]+'\n'+verText[4]+'\n'+verText[5]+'\n'+verText[6];
textVer.translate(29/pt,378/pt);
//blockのテキスト表示
var textBlock1 = app.activeDocument.textFrames.add();
var textBlock2 = app.activeDocument.textFrames.add();
textBlock1.contents = blockCP +blockText[0]+'\n'+blockCP+blockText[1];
textBlock2.contents = blockCP +blockText[2]+'\n'+blockCP+blockText[3]+'\n'+blockCP+blockText[4];
textBlock1.translate(151/pt ,332/pt);
textBlock2.translate(273/pt,332/pt);
//テキストのサイズと位置を調整
for(E=0;E<7;E++){
//verticalの位置調整
textVer.paragraphs[E].size = 19;
textVer.paragraphs[E].paragraphAttributes.justification = Justification.RIGHT;
textVer.paragraphs[E].autoLeading = false; // 行間指定時はfalseにする
textVer.paragraphs[E].leading = 42;
//block1は2行まで
if(E<2){
textBlock1.paragraphs[E].size = 19;
textBlock1.paragraphs[E].paragraphAttributes.justification = Justification.RIGHT;
textBlock1.paragraphs[E].autoLeading = false; // 行間指定時はfalseにする
textBlock1.paragraphs[E].leading = 350;
}
//block2は3行まで
if(E<3){
textBlock2.paragraphs[E].size = 19;
textBlock2.paragraphs[E].paragraphAttributes.justification = Justification.RIGHT;
textBlock2.paragraphs[E].autoLeading = false; // 行間指定時はfalseにする
textBlock2.paragraphs[E].leading = 350;
}//YのIF終了
}//テキスト調整loop終了
//調整済みのverticalを下ブロックにもコピー
var textVer2 = textVer.duplicate();
textVer2.translate(0,-122/pt);
//複製したものだけLoopで回す
var textCopyCount = checkK.value ? howArt - 1 : 1;
for(N=1; N < textCopyCount; N++){
//sideをコピー
textSide1[N] = textSide.duplicate();
textSide2[N] = textSide2.duplicate();
textSide1[N].translate(mW*N,0);
textSide2[N].translate(mW*N,0);
//verticalをコピー
textVer1[N] = textVer.duplicate();
textVer2[N] = textVer2.duplicate();
textVer1[N].translate(mW*N,0);
textVer2[N].translate(mW*N,0);
//blockをコピー
textBlock1[N] = textBlock1.duplicate();
textBlock1[N].translate(mW*N,0);
textBlock2[N] = textBlock2.duplicate();
textBlock2[N].translate(mW*N,0);
} //text用 N loop end
} //OK function end
dialog.center();//ウインドウ表示位置をモニターの中心に移動
dialog.show();//作成したウインドウを表示
} else { //オブジェクトを選択しなかった場合
alert('作りたい色をCMYKで塗りにし、選択してから起動してください');
}
//-----------以下、function----------------
//CMYKカラー設定
function setCMYKColor(c,m,y,k){
var tmpColor = new CMYKColor();
tmpColor.cyan = c;
tmpColor.magenta = m;
tmpColor.yellow = y;
tmpColor.black = k;
return tmpColor;
}//function end
//side、ver、blockの色をマイナスのぞいた配列にする
function colorT(ckColor,steps,loopCount){
var inputBox=[];
//上下限超えた分を範囲内に抑える
if(ckColor-steps*loopCount<=0){ //下限が0以下になるとき
ckColor=ckColor-steps*loopCount;
while(ckColor+steps<=0){ckColor = ckColor+ steps;} //0以上の値まで上げる
}else if(ckColor+steps*loopCount>=100){ //上限が100を超えるとき
ckColor = ckColor+steps*loopCount;
while(ckColor-steps>=100){ckColor = ckColor- steps;} //100-stepsまで下げる
}else{ //それ以外の時、通常
ckColor=ckColor-steps*loopCount;
}
//配列に色情報を収納
if( ckColor<0){ //0以下のとき
inputBox[0]=0;
for(i=1;i<loopCount*2+1;i++){inputBox[i]=ckColor+steps*i;}
}else if(ckColor+steps*loopCount>100){ //100超えたら上限100にする
inputBox[loopCount*2]=100;
for(i=1;i<loopCount*2+1;i++){
inputBox[loopCount*2-i]=ckColor-steps*i;
}
}else{ //それ以外の時、通常
for(i=0;i<loopCount*2+1;i++){inputBox[i]=ckColor+steps*i;}
} //end if
return inputBox;
}
