忍者ブログ

ぼんぷろぐ

InDesign、イラレ、フォトショ(CS6 Win)の勉強中。。。(旧まとめいみブログ)

[InDesign]
再描画せずに長体(平体)をかけて1段落をn行に収めるスクリプト

またindesignスクリプトの話ですが
app.scriptPreferences.enableRedrawっていうのを見つけました。
「スクリプト実行中に再描画する?」って意味で、値はtrue/false。
falseにしといたらモノによっては実行速度が速くなりそう。

なお、いったんapp.scriptPreferences.enableRedraw=falseにしたらスクリプトが終了してもその値がアプリの設定として保持されるので、その後実行するすべてのスクリプトで再描画なしになる模様。それが問題あるならスクリプトの最後でtrueに戻せばいいだけだけど、まあ問題あることなんてなさそうだからそこまでしない。

てことで、これ(長体(平体)をかけて1段落を1行に収めるスクリプト)を改良。
上記の高速化に加え、
よそのスクリプトを真似て行数の指定と、水平(垂直)比率の最大値の指定ができるようにしました。
あと前のやつだと「横書きテキストフレーム中の縦書きセル」でうまくできなかったのでそれも修正。セル内にカーソルを置いて使用できます。

ホントはセルを選択した場合も使えるようにしたかったけど、スクリプトでのセルの扱いがさっぱり分からん。複数セルを選択してるのにselection.lengthは1、selection[0].constructor.nameはCellsじゃなくてCellってどゆこと???
以下ソース
//(2014.08.03 グループに空のテキストフレームがあったらエラーが出るのを修正)

var Gyousuu=1;//何行にする? マイナスにしたら今の行数から減らす
var MaxScale=100;//水平比率(縦書なら垂直比率)の最大値
app.scriptPreferences.enableRedraw=false;
app.doScript(main,ScriptLanguage.JAVASCRIPT,[],UndoModes.FAST_ENTIRE_SCRIPT);

function main(){
    var Sel=app.activeDocument.selection;
    if(Sel.length==0) exit();
    if(isTextObj(Sel[0])){
        for(var i=0;i<Sel[0].paragraphs.length;i++){
            Para1gyou(Sel[0].paragraphs[i]);
        }
        exit();
    }
    for (var i=0;i<Sel.length;i++){
        if (Sel[i].constructor.name=="TextFrame") {
            Para1gyou(Sel[i].paragraphs[0]);
        } else if (Sel[i].constructor.name=="Group") {
            GroupPara1gyou(Sel[i]);
        }
    }
}
function GroupPara1gyou(myGroup){
    for (var i=0;i<myGroup.groups.length;i++){
        GroupPara1gyou(myGroup.groups[i]);
    }
    for (i=0;i<myGroup.textFrames.length;i++){
        if (myGroup.textFrames[i].paragraphs.length>0) Para1gyou(myGroup.textFrames[i].paragraphs[0]);
    }
}
function Para1gyou(myPara) {
    var myGyousuu=(Gyousuu>0)?(Gyousuu):(myPara.lines.length+Gyousuu);
    if((myPara.parent.constructor.name=="Cell" && myPara.parent.writingDirection==HorizontalOrVertical.VERTICAL)
      || (myPara.parent.constructor.name=="Story" && myPara.parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.VERTICAL)){
        myPara.verticalScale=MaxScale;
        if(myPara.lines.length<=myGyousuu) return;
        myPara.verticalScale-=32;
        for(var i=16;i>=1;i=i/2) {
            myPara.verticalScale+=((myPara.lines.length==myGyousuu)?(+1):(-1))*i;
        }
        if(myPara.lines.length>myGyousuu) myPara.verticalScale-=1;
    } else if((myPara.parent.constructor.name=="Cell" && myPara.parent.writingDirection==HorizontalOrVertical.HORIZONTAL)
      || (myPara.parent.constructor.name=="Story" && myPara.parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.HORIZONTAL)){
        myPara.horizontalScale=MaxScale;
        if(myPara.lines.length<=myGyousuu) return;
        myPara.horizontalScale-=32;
        for(var i=16;i>=1;i=i/2) {
            myPara.horizontalScale+=((myPara.lines.length==myGyousuu)?(+1):(-1))*i;
        }
        if(myPara.lines.length>myGyousuu) myPara.horizontalScale-=1;
    }
}
function isTextObj(obj){
    var s=obj.constructor.name;
    if (s=="Text"||s=="Character"||s=="Word"||s=="Line"||s=="TextColumn"||s=="Paragraph"||s=="TextStyleRange"||s=="InsertionPoint") return true;
    return false;
}
PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

無題

スクリプトを使用後に、アンドゥを実行すると複数回実施されます。その結果、最後に保存した状態にまで戻ります。
Mac OSX 10.6.8、CS4で発生します。
なんらかの不具合でしょうか。
なお、CS5ではなぜか発生しないようです。

Re:無題

うーん、分かりませんけど、
app.doScript(main,ScriptLanguage.JAVASCRIPT,[],UndoModes.FAST_ENTIRE_SCRIPT);
のところを
main();
に書き換えたら普通に使えるようにはなるんじゃないかと思います。
FAST_ENTIRE_SCRIPTの恩恵は受けられなくなりますが

  • あるふぁ(仮)
  • 2016/08/04(Thu.)

正常に動作しました

早速の回答をいただき、ありがとうございます。
ご教示の通り書き換えしたところ、正常に動作するようになりました。
InDesign CS4には、FAST_ENTIRE_SCRIPTに関するバグが潜んでいるんですかね?
あるふぁさんのスクリプトは縦組みに対応しているので重宝しています。実務でよく使うので、今回のアドバイスは大変助かりました。
本当にありがとうございました。

プロフィール

あるふぁ(仮)
InDesignで新聞組版のようなことをしてる人です。

InDesignスクリプトについて

つくったInDesignスクリプトのまとめ

twitter

フリーエリア