よろよろ帳

InDesign JavaScript 勉強中

文字のアウトライン

記号フォントをあしらいに使う時などに。一覧ストックからフレーム選んでアウトラインかけると全部グループ化されて、解除しても1行まるっと複合パスになってしまいます。1文字ずつバラしたい。

Big Cheese | Adobe Fonts

↑ 2つ目のスクリプトでアウトライン
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument
var sel=Doc.selection[0];//テキストフレーム選択
for(var i=0; i<sel.characters.length; i++){
    var Ot=sel.characters[i].createOutlines(false);//trueだとインラインになる/falseは元が残る
    Doc.selection=Ot;
    Doc.selection[0].overprintFill=false//元が黒だとオーバープリントにチェック入るの回避
    }
sel.remove()//元消去
}

上記だと改行やスペース混じりだとうまくいかないので検索でやってみました。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument
var sel=Doc.selection[0];//テキストフレーム選択
app.findGrepPreferences.findWhat = ".";//改行以外
var Res=sel.findGrep();
//alert (Res.length)
for(var i=0; i<Res.length; i++){
    try{var Ot=Res[i].createOutlines(false);
        Doc.selection=Ot;
        Doc.selection[0].overprintFill=false;
        }catch(e){}//tryはタブとかスペースあったらエラー出たので
        }
    sel.remove();
    }

コマンドZで戻れるから何にでも
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){命令}
を付け足してましたがこれは繰り返しの部分が効かなくなる…。

↓参考(FAST_をとる)
UndoModes.FAST_ENTIRE_SCRIPTとisValidのバグ(InDesignスクリプト)|InDesign|ぼんぷろぐ

選択にオブジェクト追加

選択したものの左上に共通のオブジェクトを追加します。追加するものは要グループ化。

クリップボードから(コピーかカットしてから実行)

var Doc=app.activeDocument;
var tempRuler = Doc.viewPreferences.rulerOrigin;
Doc.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN;
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=Doc.selection;
Doc.selection = null;
//レイヤー指定したいなら
//Doc.activeLayer= Doc.layers[0];//一番上
//Doc.activeLayer=Doc.layers.itemByName ("new");//名前指定
for(var i=0; i<sel.length; i++){
    var VB=sel[i].visibleBounds;
    app.paste();
    Doc.selection[0].move([VB[1],VB[0]])
    }
}
Doc.viewPreferences.rulerOrigin = tempRuler;

★ライブラリから

var Doc=app.activeDocument;
var tempRuler = Doc.viewPreferences.rulerOrigin;
Doc.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN;
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=Doc.selection;
Doc.selection = null;
for(var i=0; i<sel.length; i++){
    var VB=sel[i].visibleBounds;
    var lib = app.libraries.itemByName("test.indl");//ライブラリ指定
    var La=lib.assets.item("new").placeAsset(Doc);//アセット名指定
    Doc.selection =La;//選ばないとだめみたい
    Doc.selection[0].move([VB[1],VB[0]])
    }
}
Doc.viewPreferences.rulerOrigin = tempRuler;

右下用

var VB2=Doc.selection[0].visibleBounds;
Doc.selection[0].move([VB[3]-(VB2[3]-VB2[1]),VB[2]-(VB2[2]-VB2[0])])

中央用

var VB2=Doc.selection[0].visibleBounds;
var W=VB2[3]-VB2[1];
var H=VB2[2]-VB2[0];
Doc.selection[0].move([VB[1]+((VB[3]-VB[1]-W)/2),VB[0]+((VB[2]-VB[0]-H)/2)])

BoundsはY軸始まりでmoveがX軸始まり…嫌だ!
↓参考
1if-1for(4):複数のオブジェクトをあるオブジェクトに置き換えたい - DTPab

レイヤー操作

未使用と非表示を削除、全てのレイヤーをロック解除。

var Doc=app.activeDocument;
app.menuActions.item('$ID/Delete Unused Layers').invoke();//未使用レイヤーを削除
var Ly=Doc.layers;
for(var i=Ly.length-1; i>=0; i--){//削除は後ろから
    Ly[i].locked=false;//ロック解除
    if(Ly[i].visible==false)Ly[i].remove();//非表示削除
    }

背景オブジェクトのレイヤーはロックしたい。

var Doc=app.activeDocument;
var K=Doc.allPageItems
for(var i=0; i<K.length; i++){
    var VB=K[i].visibleBounds;
    if(Math.round(VB[0])==-3&&Math.round(VB[1])==-3)//左上座標-3
        K[i].itemLayer.locked=true;
        }

一番上に新規レイヤー追加。同じ名前があると無視。

var Doc=app.activeDocument;
Doc.activeLayer=Doc.layers[0];
try{Doc.layers.add({name: "レイヤー名"})
    }catch (e) {}
//名前不要ならDoc.layers.add();

白レイヤーやめてほしい。

var Ly=app.activeDocument.layers
for (var i=0; i<Ly.length; i++){
    if(Ly[i].layerColor==UIColors.WHITE)
    Ly[i].layerColor=UIColors.LIGHT_GRAY;
    }

↓参考
https://www.indesignjs.de/extendscriptAPI/indesign-latest/#UIColors.html#d1e87585

ついでにあやしい色名日本語と照合。

layerColorName

フレームサイズを丸める

選択したものを左上基準で端数を丸めます。2.5の倍数は横組み10Qベタ打ちキャプションがつく画像フレーム用に調べました。

var sel = app.activeDocument.selection;
for (i=0; i<sel.length; i++){
    var selG=sel[i].geometricBounds;
    var W=Math.round((selG[3] -selG[1])/2.5)*2.5;//2.5の倍数
    var H=Math.round((selG[2] -selG[0])*4)/4;//0.25刻み
    sel[i].geometricBounds = [selG[0],selG[1],selG[0]+H,selG[1]+W];
    }

次のオブジェクト

角丸の囲み文字の変更などに。フレーム1つにしたくてQ数半分、垂直水平比率200%を試すもオーバーフローはしないけど中央に揃わない。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc = app.activeDocument;
app.findGrepPreferences.findWhat = "^生地アップ$";
app.changeGrepPreferences.fillColor="Paper";
var Res = Doc.findGrep();
for(var i=0; i<Res.length; i++){
    if(Res[i].parentTextFrames[0].parent.constructor.name=="Group"){
        Res[i].changeGrep();
        Res[i].parentTextFrames[0].select();
        app.menuActions.item('$ID/Select Next Item').invoke();
        Doc.selection[0].fillColor="Black";
        }
    }
}


↓参考
menuActionTitleToString
for indesign select next item in group object · GitHub

字形検索置換

商標記号小さいのにして詰めます。tsume=100にしたら10000%になってびっくりしました。

changeGlyphDialogsample

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument;
app.findGrepPreferences.findWhat = "®";
var Res=Doc.findGrep();
app.findGlyphPreferences=app.changeGlyphPreferences=NothingEnum.nothing;
for(var i=0; i<Res.length; i++){
    var F=Res[i].appliedFont.name;
    app.findGlyphPreferences.appliedFont = app.fonts.itemByName(F);
    app.findGlyphPreferences.glyphID =154;
    app.changeGlyphPreferences.appliedFont = app.fonts.itemByName(F);
    Res[i].tsume=1;//文字ツメ100%
    if(Res[i].parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.VERTICAL){
        app.changeGlyphPreferences.glyphID =12105;//縦用
        Res[i].changeGlyph();
        }else{
            app.changeGlyphPreferences.glyphID =12104;//横用
            Res[i].changeGlyph();
        }
    }
}