2025-03-08

カラーチャート作成スクリプト/Illustrator




カラーチャートを作成することが多いので、選択したオブジェクトの色を基準としてカラーチャートを作成してくれるスクリプトをChatGPTちゃんにお手伝いしてもらいながら作成しました。

素人が作ったものなので、使ってみて何か問題が起こっても責任は取れません。

動作の正確性や安全性についても保証はできないので、使うのはあくまで自己責任でお願いします。


【使い方】


カラーモードをCMYKにし、基準にしたい色を塗ったオブジェクトを選択して、「カラーチャート作成_ALL_v8.1」スクリプトを起動する。







例)CM基準5ステップ K有


横軸がC、縦軸がM、ブロックごとにYが変化します。
K有にしておくと、アートボードごとに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;
}