ドキュメント上のカラーはColorオブジェクトとして集約され、配列として取得します。

var docClr= app.activeDocument.colors;
for(var i=0; i<docClr.length; i++) {
    $.writeln ( docClr[i].name ); 
}

 

ドキュメントにエントリーされているカラーには、スウォッチに存在しないカラーも含まれています。

例えばオブジェクトに直接設定したカラーは、「無名Colorオブジェクト」としてエントリーされています。また、同じ色であっても、別々に設定したものはそれぞれ別個のオブジェクトとしてエントリーされています。

なお、それら無名Colorオブジェクトは、どこからも参照されない「未使用」の状態になっても、スウォッチのようにGUIパレットから消去することができません。

 

カラーに関するオブジェクトには、Colorオブジェクトに加えて、以下のようなオブジェクトも存在します。

 

混合インキ」はドキュメント上でMixedInkオブジェクトとして集約され、配列として取得します。

var docClr= app.activeDocument.mixedInks;
for(var i=0; i<docClr.length; i++) {
    $.writeln ( docClr[i].name ); 
}

 

濃淡」はドキュメント上でTintオブジェクトとして集約され、配列として取得します。

var docClr= app.activeDocument.tints;
for(var i=0; i<docClr.length; i++) {
    $.writeln ( docClr[i].name ); 
}

 

グラデーション」は、ドキュメント上でGradientオブジェクトとして集約され、配列として取得します。

var docClr= app.activeDocument.gradients;
for(var i=0; i<docClr.length; i++) {
    $.writeln ( docClr[i].name ); 
}

 

このようにカラーに関するオブジェクトは複数あるので、各オブジェクトのfillColorプロパティなどから取得したカラーは、それぞれに合わせて処理を分けなければなりません。

以下の例では、選択されたオブジェクトから塗りの情報を取得し、オブジェクト(塗り)の種類に合わせて取得するプロパティを変えています。

var selObj= app.activeDocument.selection[0].fillColor; //塗りのあるグラフィックオブジェクトが選択されているとして...
$.writeln ('object type= '+selObj.constructor.name); //オブジェクトのタイプ
if (selObj.name =='') {
    $.writeln ( 'direct color' );
} else {
    switch (selObj.constructor) {
        case Color:
            $.writeln ( 'model= '+selObj.model.toString() );
            $.writeln ( 'space= '+selObj.space.toString() );
            $.writeln ( 'colorValue= '+selObj.colorValue.toString() );
            break;
        case Tint: 
            $.writeln ( 'model= '+selObj.model.toString() );
            $.writeln ( 'space= '+selObj.space.toString() );
            $.writeln ( 'colorValue= '+selObj.colorValue.toString() );
            $.writeln ( 'baseColor= '+selObj.baseColor.toString() );
            $.writeln ( 'tintValue= '+selObj.tintValue.toString() );
            break;
        case MixedInk: 
            $.writeln ( 'model= '+selObj.model.toString() );
            $.writeln ( 'space= '+selObj.space.toString() );
            $.writeln ( 'inkList= '+selObj.inkList.toString() );
            $.writeln ( 'inkPercentages= '+selObj.inkPercentages.toString() );
            break;
        case Gradient: 
            $.writeln ( 'Gradient color' );
            break;
        case Swatche:
            $.writeln ( '[なし]' );
            break;
    }
}

カラーが[なし]の場合、オブジェクトからはSwatcheオブジェクトが返ります。なお、Gradientオブジェクト(グラデーション)のプロパティは処理が煩雑になるのでここでは割愛しました。

 

<プロパティについて>

 

nameプロパティはカラーの名称で、スウォッチで作成したときの名称が設定されています。前述のとおり、オブジェクトに直接設定したカラーは名前が空の状態になっています(無名Colorオブジェクト)。

なお、スウォッチにある基本色は、それぞれ「Black」「Registration」「Paper」という名前になっています。また、プロセスカラーの基本である「CMY」も、それぞれ暗示的に「Cyan」「Magenta」「Yellow」という名前で存在しています。

 

modelプロパティは、colorValueプロパティが「どういうデータ形式なのか」を表しています。返り値はColorModel定数で、先の例ではtoString関数で文字列化しています。この値を参照することで、そのカラーがプロセスカラーなのか、特色なのかといったことを知ることができます。

 

spaceプロパティはcolorValueプロパティの掛け合わせ値が「どのようなカラースペースなのか」を表しています。これを見れば配列がCMYKかRGBかといったことがわかります。返り値はColorSpace定数で、上の例ではtoString関数で文字列化しています。

 

colorValueプロパティはカラーの掛け合わせ値が配列として記録されています。PROCESS(プロセスカラー)であればCMYKやRGBの値であり、SPOT(特色)であればCMYK分解したときの値になっています。

 

baseColorプロパティとtintValueプロパティは「濃淡」に存在します。例えば「黒」50%いうカラーのプロパティは以下のようになっています。

object type= Tint
model= PROCESS
space= CMYK
colorValue= 0,0,0,100
baseColor= [object Color]
tintValue= 75

 

inkListプロパティとinkPercentagesプロパティは「混合インキ」に存在します。例えば特色A=50%、特色B=100%というカラーのプロパティは以下のようになっています。

object type= MixedInk
model= MIXEDINKMODEL
space= MIXEDINK
inkList= [object Ink],[object Ink]
inkPercentages= 50,100

 

<カラーの追加>

 

カラーの追加はadd関数を使い、それぞれのオブジェクトをドキュメントに追加します。

//Colorオブジェクト作成
//colorValue= [C,M,Y,K]
var clrObj= app.activeDocument.colors.add({
    name:'TEST',
    colorValue:[20,20,0,0]
    });

//Tintオブジェクト作成
var tntObj= app.activeDocument.tints.add({
    name:'[黒] 50%',
    baseColor: app.activeDocument.colors.item('Black'), 
    tintValue: 50
    });

//MixedInkオブジェクト作成
var inkA= app.activeDocument.inks.item('DIC 2160s'); //あらかじめ存在するものとして
var inkB= app.activeDocument.inks.item('DIC 2539s'); //あらかじめ存在するものとして
var mxdObj= app.activeDocument.mixedInks.add({
    name:'mixedTest',
    inkList: [inkA, inkB], 
    inkPercentages: [50, 50]
    });

こうしてカラーが作られると、自動的に同名のスウォッチが作成されます。

 

◇スウォッチとの関係

「自動的に同名のスウォッチが作成されます」と書きましたが、実は正しい表現ではありません。
通常InDesignで新たにカラーを作る場合、まず新規名称のスウォッチを作成し、そこへ様々な設定を施していきます。そうした経験から、カラーは "スウォッチありき" と思ってしまいます。
しかし、実際はスウォッチ自体に実体はありません。ColorオブジェクトやMixedInkオブジェクトの目録に過ぎず、パレットに表示されるときや、スクリプトから呼ばれたときに、各カラーの名称を動的に返しているだけなのです。
つまり、スクリプト上では「スウォッチは作るものではない」ということです。

 

<カラーの削除>

 

カラーの削除はremove関数を使います。

var clr= app.activeDocument.colors.item('TEST');
clr.remove();

このとき、このカラーを参照していたスウォッチがあればそれも同時に削除されます。

 

<注意点>

カラー名などをドキュメントから取得するとき、存在しないものを指定しても表面上は取得できたことになってしまいます。。

var clrs= app.activeDocument.colors.item('ぐんじょう色'); //存在しないカラー名
$.writeln (clrs.constructor.name); //存在しなくてもColorとなり、エラーは出ない

このような場合、for文で配列から総当たり検索するのがセオリーですが、以下のような方法でも確認することができます。

var clrs= app.activeDocument.colors.item('ぐんじょう色');
try {
    if (clrs.name) { $.writeln ('存在します'); }
} catch (err){
    $.writeln ('存在しません');
}

※参照:try~catchの積極的な使い方

 

 

Joomla templates by a4joomla