ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

選択しているオブジェクトのCMYK値を入れ替える 2012.10.28更新

TwitterでそんなのがないかなぁというTweetを見かけたので書いてみた。

 

感想。

しんどかった。

スウォッチとスポットを別で管理しているとか、文字を選択しているときはforで回しちゃいけないだとか、何度か放り投げようと思ったよ、マジで。

 

あと欲を出して以前から気になっていたscriptUIを使ったのも失敗。

未知の領域だからうんうん唸りながらググりながら一つ一つクリアしていった。

最小単位でテストコード書いて、テストして、エラー出して、潰して、実装って流れって大事ね。

 

<仕様>

●CMYK値を取得して新しいカラーを生成し、新規にスポットカラーを作成して適用させる

●新規スポットカラーは「NC C=0 M= Y= K=0」のように名前づけされる

●同名のスポットカラーが存在した場合はそのスポットカラーを適用する(ダブらない)

●レジストレーション、グラデーション、パターンなどはスキップ

●塗りと線を別々の色に入れ替えることが可能

●テキストも処理可能

●文字を選択した状態でも処理可能

 

 

デモ動画。

 

 

 

ちなみに公開、および配布はネット上では行いません。

理由はいくつかあります。

●うっかりさんが間違って使ってしまったら大問題になる(デザイン総崩れ)

●特色を10個以上使ったデータを平気で入稿してくる人がたくさんいるので、阿鼻叫喚になるのが怖い

●仕様として新規スウォッチを作成して適用しているので上記に書いたようなトラブルが起きること請け合い(特色はすべてプロセスに変換しちゃう仕様だけど、大量の未使用スウォッチなんて見たくないし、加工されるのも嫌)

●公開以降上記のような問題を私のせいにされたくないw

 

近しい人で責任を自分でとってくれる人、もしくはスクリプトを勉強したい人には配布してもいいとは思っています。

 

+++++2012.10.27更新

 

この記事を訪れる方が多いようなのでコード公開することにしました。

 

+++++以上

 

まぁこんなこともスクリプトなら可能だということなので、興味ある人は自分で書いてみるのも一興かと。

正味4日程度で書けましたお。

自己満足万歳!

 

/*
選択しているオブジェクトの色版を入れ替えるスクリプト
-CMYK値を取得して新しいカラーを生成し、新規にスポットカラーを作成して適用させる
-新規スポットカラーは「NC C=0 M= Y= K=0」のように名前づけされる
-同名のスポットカラーが存在した場合はそのスポットカラーを適用する(ダブらない)
-レジストレーション、グラデーション、パターンなどはスキップ
-塗りと線を別々の色に入れ替えることが可能
-テキストも処理可能
-文字を選択した状態でも処理可能
*/


//scriptUIでパレットを作成
var newPalette = new Window("palette", "colorChanger"); //パレットを作成
var title = newPalette.add("StaticText", undefined, "CMYK版を入れ替えるJavaScript"); //文字
var panel1 = newPalette.add("Panel",[0,0,225,110],"処理対象を選択") ;
var group1 = panel1.add("Group",[10,10,230,110]) ;
var selectListItems = ["変更しない","シアン←→マゼンタ", "シアン←→イエロー", "マゼンタ←→イエロー"]; //ドロップダウンリストの項目を配列に
var fillLabel = group1.add("StaticText", [0,3,40,20], "塗り:"); //文字
var selectList1 = group1.add("DropDownList", [50,0,200,40], selectListItems); //ドロップダウンリストを生成
selectList1.selection = 0 ; //ドロップダウンリストの初期値を設定(0が一番上の項目)
var strokeLabel = group1.add("StaticText", [0,28,100,70], "線:"); //文字
var selectList2 = group1.add("DropDownList", [50,25,200,40], selectListItems); //ドロップダウンリストを生成
selectList2.selection = 0 ; //ドロップダウンリストの初期値を設定(0が一番上の項目)
var cancelButton = group1.add("Button", [0,60,90,20], "キャンセル", { name:"cancel"}); //ボタンを生成
var runButton = group1.add("Button", [100,60,200,20], "実行", { name:"ok"}); //ボタンを生成
//var group2 = newPalette.add("Group",[10,10,230,40]) ;

runButton.onClick = function () { //ボタンをクリックしたら{}の中を実行
    var bt=new BridgeTalk(); //BridgeTalkしておく(動かないときがあるっぽい)
    bt.target = "Illustrator"; //ターゲットをIllustratorにする
    bt.body ="colorChanger()"; //実際のIllustratorの処理
    bt.send(); //BridgeTalkに送る
}
cancelButton.onClick = function () { newPalette.close()} ;//キャンセルボタン

newPalette.show(); //パレットを表示

//Illustratorの処理
function colorChanger() {
    if (app.documents.length != 0) { //一応ドキュメントを開いてるか確認
        var selObj = activeDocument.selection ;
        if(selObj.length > 0){ //未選択をはじく
            for (i = 0 ; i < selObj.length ; i ++) {//選択してた分だけ繰り返す
                if (selObj[i] != undefined){//オブジェクトを選択してたら
                    if (selObj[i].typename== "TextFrame") {//テキストフレームだったら
                        for (j = 0 ; j < selObj[i].textRange.characters.length ; j ++) {//文字数分繰り返す
                            var myObj = selObj[i].textRange.characters[j];//j文字目を変数に代入
                            if (selectList1.selection.index != 0) {
                                fillColorChange(myObj) ;//塗りの版を入れ替える処理へ
                            }
                            if (selectList2.selection.index != 0) {
                                strokeColorChange(myObj) ;//線の版を入れ替える処理へ
                            }
                        }
                    } else {
                        var myObj = selObj[i] ;
                        if (selectList1.selection.index != 0) {
                            fillColorChange(myObj) ;//塗りの版を入れ替える処理へ
                        }
                        if (selectList2.selection.index != 0) {
                            strokeColorChange(myObj) ;//線の版を入れ替える処理へ
                        }
                    }
                }
            }
            if (selObj.typename == "TextRange") {
                for (k = 0 ; k < selObj.characters.length ; k ++) {//文字数分繰り返す
                    var myObj = selObj.characters[k];
                    if (selectList1.selection.index != 0) {
                        fillColorChange(myObj) ;//塗りの版を入れ替える処理へ
                    }
                    if (selectList2.selection.index != 0) {
                        strokeColorChange(myObj) ;//線の版を入れ替える処理へ
                    }
                }
            }
        } else {
            alert("オブジェクトが選択されていません") ;
        }
    } else {
        alert("ドキュメントが開かれていません") ;
    }
    app.redraw();
    alert("終了しました");
}

//塗りの版を入れ替える処理
function fillColorChange(myObj) {
    var regi = false ;//レジストレーションのフラグ
    if(myObj.fillColor.typename == "CMYKColor" || myObj.fillColor.typename == "SpotColor"){ //オブジェクトの塗りがCMYKかスポットだったら
        if (myObj.fillColor.typename == "CMYKColor") {//CMYK、またはスウォッチのとき
            var fillCol = myObj.fillColor ; //塗りのCMYKカラー設定を取得
            var fillColorArray = [Math.round(fillCol.cyan), Math.round(fillCol.magenta), Math.round(fillCol.yellow), Math.round(fillCol.black)] ; //現状のカラー設定を配列に(版名が必要)
        } else if (myObj.fillColor .spot.name != "[レジストレーション]") {//スポットカラーでレジストレーションじゃないとき
            var flag = true ;
            var fillCol = myObj.fillColor .spot.getInternalColor() ;//CMYKを配列に
            var tint = myObj.fillColor .tint ;//濃淡を変数に代入
            //var colorType = myObj.fillColor .spot.colorType ;//カラータイプ(PROCESSかSPOT)を変数に代入
            var fillColorArray = [Math.round(fillCol[0]), Math.round(fillCol[1]), Math.round(fillCol[2]), Math.round(fillCol[3])] ; //現状のカラー設定を配列に
        } else if (myObj.fillColor .spot.name == "[レジストレーション]") {
            //alert("レジストレーションはスキップします") ;
            var regi = true ;//フラグ立てる
        }

        if (! regi) { //レジストレーションじゃなかったら
            switch (selectList1.selection.index) {//ドロップダウンリストのindexを取得
                case 0 : break ;//変更しない
                case 1 : //シアン←→マゼンタ
                    var newfillColorArray = [fillColorArray[1], fillColorArray[0], fillColorArray[2], fillColorArray[3]] ;//入れ替えた配列を作成
                    break ;
                case 2 : //シアン←→イエロー
                    var newfillColorArray = [fillColorArray[2], fillColorArray[1], fillColorArray[0], fillColorArray[3]] ;
                    break ;
                case 3 : //マゼンタ←→イエロー
                    var newfillColorArray = [fillColorArray[0], fillColorArray[2], fillColorArray[1], fillColorArray[3]] ;
                    break ;
            }

            //スポットの名前を変数に
            var spotName = "NC C=" + newfillColorArray[0] + " M=" + newfillColorArray[1] + " Y=" + (newfillColorArray[2]) + " K=" + newfillColorArray[3] ;

            try { //スウォッチの重複をチェック
                myObj.filled = true ; //塗りをありに
                myObj.fillColor = activeDocument.swatches[spotName].color ;//スウォッチを適用
                if (flag) {
                    myObj.fillColor.tint = tint ;
                }
            } catch (e){//存在しなかったら
                //新しい配列を元にCMYKのスポットカラーを作成
                var spotColor = newSpotObjMake(newfillColorArray, spotName,) ;// colorType
                myObj.filled = true ;
                myObj.fillColor = spotColor ;
                if (flag) {
                    myObj.fillColor.tint = tint ;
                }
            }
        }
    }
}

//線の版を入れ替える処理
function strokeColorChange(myObj) {
    var regi = false ;//レジストレーションのフラグ
    if(myObj.strokeColor.typename == "CMYKColor" || myObj.strokeColor.typename == "SpotColor"){ //オブジェクトの塗りがCMYKかスポットだったら
        if (myObj.strokeColor.typename == "CMYKColor") {//CMYK、またはスウォッチのとき
            var strokeCol = myObj.strokeColor ; //塗りのCMYKカラー設定を取得
            var strokeColorArray = [Math.round(strokeCol.cyan), Math.round(strokeCol.magenta), Math.round(strokeCol.yellow), Math.round(strokeCol.black)] ; //現状のカラー設定を配列に(版名が必要)
        } else if (myObj.strokeColor .spot.name != "[レジストレーション]") {//スポットカラーでレジストレーションじゃないとき
            var flag = true ;
            var strokeCol = myObj.strokeColor .spot.getInternalColor() ;//CMYKを配列に
            var tint = myObj.strokeColor .tint ;//濃淡を変数に代入
            //var colorType = myObj.strokeColor .spot.colorType ;//カラータイプ(PROCESSかSPOT)を変数に代入
            var strokeColorArray = [Math.round(strokeCol[0]), Math.round(strokeCol[1]), Math.round(strokeCol[2]), Math.round(strokeCol[3])] ; //現状のカラー設定を配列に
        } else if (myObj.strokeColor .spot.name == "[レジストレーション]") {
            //alert("レジストレーションはスキップします") ;
            var regi = true ;//フラグ立てる
        }


        if (! regi) { //レジストレーションじゃなかったら
            switch (selectList2.selection.index) {//ドロップダウンリストのindexを取得
                case 0 : break ;//変更しない
                case 1 : //シアン←→マゼンタ
                    var newstrokeColorArray = [strokeColorArray[1], strokeColorArray[0], strokeColorArray[2], strokeColorArray[3]] ;//入れ替えた配列を作成
                    break ;
                case 2 : //シアン←→イエロー
                    var newstrokeColorArray = [strokeColorArray[2], strokeColorArray[1], strokeColorArray[0], strokeColorArray[3]] ;
                    break ;
                case 3 : //マゼンタ←→イエロー
                    var newstrokeColorArray = [strokeColorArray[0], strokeColorArray[2], strokeColorArray[1], strokeColorArray[3]] ;
                    break ;
            }

            //スポットの名前を変数に
            var spotName = "NC C=" + newstrokeColorArray[0] + " M=" + newstrokeColorArray[1] + " Y=" + newstrokeColorArray[2] + " K=" + newstrokeColorArray[3] ;

            try { //スウォッチの重複をチェック
                myObj.stroked = true ; //塗りをありに
                myObj.strokeColor = activeDocument.swatches[spotName].color ;//スウォッチを適用
                if (flag) {
                    myObj.strokeColor.tint = tint ;
                }
            } catch (e){//存在しなかったら
                //新しい配列を元にCMYKのスポットカラーを作成
                var spotColor = newSpotObjMake(newstrokeColorArray, spotName,) ;// colorType
                myObj.stroked = true ;
                myObj.strokeColor = spotColor ;
                if (flag) {
                    myObj.strokeColor.tint = tint ;
                }
            }
        }
    }
}

//スポットカラー生成
function newSpotObjMake(colorArray, spotName, colorType) {

    var cmykColor = new CMYKColor() ; //CMYKColor生成
    cmykColor.cyan = colorArray[0] ;//シアンの数値を指定
    cmykColor.magenta = colorArray[1] ;//マゼンタの数値を指定
    cmykColor.yellow = colorArray[2] ;//イエローの数値を指定
    cmykColor.black = colorArray[3] ; //ブラックの数値を指定

    var newSpotObj = activeDocument.spots.add();
    newSpotObj.color = cmykColor ;
    newSpotObj.name = spotName ;

    var spotColor = new SpotColor() ;
    spotColor.spot = newSpotObj ;
    //newSpotObj.colorType = colorType ;//カラータイプを設定(PROCESSかSPOT)

    return spotColor ;
}

 

ダウンロードはこちら。

colorChanger_ver1.00