よろよろ帳

InDesign JavaScript 勉強中

Illustrator ランダムカラー(文字)

前回イラストレーター用です。CC2019で試しました。ダイレクト選択して実行。
SPAiから4回クリックした様子です。

//#target "illustrator"
var sel=app.activeDocument.selection[0].characters;
var len=sel.length;
var rc=[];//色用
for(var i=0; i<len; i++){
    C=getRandomI(0,100);
    M=getRandomI(0,100);
    Y=getRandomI(0,100);
    K=getRandomI(0,10);
    rc.push([C,M,Y,K])
    }
for(var i=0; i<len; i++){
    var C=new CMYKColor();
    C.cyan=rc[i][0];
    C.magenta=rc[i][1];
    C.yellow=rc[i][2];
    C.black=rc[i][3];
    //sel[i].filled=true;//falseにしても色は付く…何用??
    sel[i].fillColor=C;
    }
function getRandomI(min, max) {
  min=Math.ceil(min);
  max=Math.floor(max);
  return Math.floor(Math.random()*(max-min+1)+min);
}

参考:Illustrator_JavaScript_Scripting_Reference_2017.pdfのCMYKColor p.25

ランダムカラー(文字)

Variex | Adobe Fonts

1回再生でgif書き出しは無限ループになる?

ランダムカラーの文字バージョンです。文字かテキストフレーム選んで実行。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=app.activeDocument.selection[0].characters;
var len=sel.length;
if(app.selection[0].constructor.name=="TextFrame"){
    app.selection=sel[0];
    app.select(SelectAll.ALL)
    }
app.panels.item('$ID/Color').visible=true;
app.menuActions.itemByID(29189).invoke();//CMYK
var rc=[];//色用
for(var i=0; i<len; i++){
    C=getRandomI(0,100);
    M=getRandomI(0,100);
    Y=getRandomI(0,100);
    K=getRandomI(0,10);
    rc.push([C,M,Y,K])
    }
for(var i=0; i<len; i++){
    sel[i].fillColor.colorValue=[rc[i][0],rc[i][1],rc[i][2],rc[i][3]];
    sel[i].select();
    app.cut();
    app.pasteInPlace();
    }
app.select(app.selection[0].parentTextFrames[0])
}
function getRandomI(min, max) {
  min=Math.ceil(min);
  max=Math.floor(max);
  return Math.floor(Math.random()*(max-min+1)+min);
}

Photoshopで動画ファイルからGIFアニメを作る完全ガイド | ギズモード・ジャパン
↑参考(QuickTimePlayerの画面収録からgif書き出し)前回はスクリーンショットを重ねたのでした。

ランダムカラー

配色が決まらない時などに。塗りなしだとエラーになるので適当に色をつけて選択実行。
スウォッチ使わずカラー指定でapp.menuActions.itemByID(29189).invoke()なしでfillColor.colorValueを変更すると、選択したものだけでなくスウォッチの値ごと変わりましたが名称未設定カラーも同設定の色が変わるようです。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=app.activeDocument.selection;
var len=sel.length;
//app.panels.itemByName("カラー").visible=true;
app.panels.item('$ID/Color').visible=true;
app.menuActions.itemByID(29189).invoke();//CMYK
var rc=[];//色用
var d=[];//ペーストしたやつ用
for(var i=0; i<len; i++){
    C=getRandomI(0,100);//最小,最大
    M=getRandomI(0,100);
    Y=getRandomI(0,100);
    K=getRandomI(0,10);//黒は少なめ
    rc.push([C,M,Y,K])
    }
//$.writeln(rc)
for(var i=0; i<len; i++){
    sel[i].fillColor.colorValue=[rc[i][0],rc[i][1],rc[i][2],rc[i][3]];
    sel[i].select();
    app.cut();
    app.pasteInPlace();//カット&ペーストなしだと全部配列最後の色になる
    d.push(app.selection[0])
    }
for(var i=0; i<len; i++){
    d[i].select(SelectionOptions.addTo)
    }//いい具合になるまで繰り返したいので選択して終了
}
app.panels.item('$ID/Scripts').visible=true;//スクリプトパネル前面に

function getRandomI(min, max) {
  min=Math.ceil(min);
  max=Math.floor(max);
  return Math.floor(Math.random()*(max-min+1)+min); //The maximum is inclusive and the minimum is inclusive
}

↓参考
InDesignのパネルメニューをJavaScriptから実行するときはパネルがvisibleな必要がある - chalcedony_htnの日記
Solved: invoking menu - language - Adobe Support Community - 8858935
Math.random() - JavaScript | MDN
イラストレーターならこちら
https://github.com/johnwun/js4ai/blob/master/vary_hues.js

スウォッチ使わずカラー指定

いわゆる名称未設定カラーでの指定。
スウォッチ
↓こうしたい
CMYK値

//選択して
var sel=app.activeDocument.selection[0];
app.menuActions.itemByID(29189).invoke();
//app.menuActions.item("$ID/CMYK").invoke();//これだと何故かエラー

ちなみに1つ選択して

var sel=app.activeDocument.selection[0];
sel.fillColor.colorValue=[0,0,100,0];

とすると適用スウォッチの値ごと変わってしまいました。ちょっと怖い。

//新しく
var Doc=app.activeDocument;
var Ov=Doc.ovals.add({geometricBounds: [0,0,50,50],fillColor:"Black"});//塗りなしだとエラーいったん何か色つける
Doc.selection=Ov;
app.menuActions.itemByID(29189).invoke();
Ov.fillColor.colorValue=[100,0,0,0];//[C,M,Y,K]

↓参考
https://indisnip.files.wordpress.com/2010/08/adobe-indesign-cs5-menuactions-items-list.pdf
javascript - Can't invoke menu items in InDesign CC script - Stack Overflow

環境にないフォントの置換

モリサワフォントのProとかPr5とか変更したくて検索と置換パネルから動かそうとしましたが、インストールしてないフォントはappliedFontに表示されない(昔のバージョンはできたのかも…CC2019でテストしてます)。

テキスト選択して

var sel=app.selection[0]; alert (sel.appliedFont.name)

とすると環境にないフォント名も取得できたのでcharacterから辿ってみました。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument;
var F=Doc.stories.everyItem().characters.everyItem().getElements();
while(f=F.shift()){
    if(/Pr.+(?=\t)|Std(?=\t)/.test(f.appliedFont.name))//タブ追加
    try{f.appliedFont=f.appliedFont.name.replace(/Pr.+(?=\t)/,"Pr6N").replace(/Std(?=\t)/,"StdN")
        }catch(e){}
    }
}

↓参考
Find/change missing font with scripting | IndiSnip [InDesign® Snippets]
InDesign(Javascrip)高速化について_everyItem()編

既存スタイルの名前変更

段落スタイルの名前まとめて変えようと繰り返しを0から始めるとエラー。"スタイル名にかぎ括弧は使用できません"。lengthを見るとパネルの表示数より1つ多いので2から始めるようにしました。0からtryを挟んでも動きましたがなるべく短くしたいです。

  • 文字スタイル[0][なし]
  • セルスタイル[0][なし]
  • 表スタイル[0][表スタイルなし],[1][基本表]
  • オブジェクトスタイル[0][なし],[1][基本グラフィックフレーム],[2][基本テキストフレーム],[3][基本グリッド]

……やっぱりtryの方がいいかも。

//段落スタイル
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var P=app.activeDocument.paragraphStyles;
//alert (app.activeDocument.paragraphStyles.length)
//alert (app.activeDocument.paragraphStyles[0].name)
//[0]は[段落スタイルなし],[1]は[基本段落]
for(var i=2; i<P.length; i++){
    P[i].name=P[i].name.replace(/段落スタイル/,"みだし")
    }
}
//オブジェクトスタイル
var O=app.activeDocument.objectStyles;
for(var i=0; i<O.length; i++){
    try{O[i].name=O[i].name.replace(/オブジェクトスタイル/,"かざり")
        }catch(e){}
    }