忍者ブログ

ぼんぷろぐ

InDesignとかイラレとかのスクリプトよもやま話

新しいブログに引っ越しました。

こちらのブログはもう更新しませんが、コメント欄は生きてますので疑問、ご指摘などありましたらどうぞ。

[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;
}


(2020.10.21 追記)ダイアログを出すようにしてみた。
var myDiag=app.dialogs.item("段落の行数減らす");
if(!myDiag.isValid){
    myDiag=app.dialogs.add({name:"段落の行数減らす"});
   var cl1=myDiag.dialogColumns.add();
    var rw1=cl1.dialogRows.add();
    rw1.staticTexts.add({staticLabel:"行数",minWidth:60});
    rw1.textEditboxes.add({editContents:"1",minWidth:100});
    var rw2=cl1.dialogRows.add();
    rw2.staticTexts.add({staticLabel:"比率MAX",minWidth:60});
    rw2.textEditboxes.add({editContents:"100",minWidth:100});
}
if (myDiag.show()) {
    var Gyousuu=myDiag.dialogColumns[0].dialogRows[0].textEditboxes[0].editContents-0;
    var MaxScale=myDiag.dialogColumns[0].dialogRows[1].textEditboxes[0].editContents-0;
    if(-1000) 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の恩恵は受けられなくなりますが

  • kawamoto_α
  • 2016/08/04(Thu.)

正常に動作しました

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

無題

スクリプト初心者なのでおかしな質問でしたらすいません。
Mac OS10.6.8、cs5で使用したいと思っています。
まず、スクリプトの記述ですが、「var Gyousuu=1;//何行にする? マイナスにしたら今の行数から減らす」から最後のカッコ閉じまでをコピーしてjsxの形式で保存すればいいのでしょうか。
上記で使用してみたのですが、「行数の指定と、水平(垂直)比率の最大値の指定」のメニューが出ることなく、一行になってしまいました。
バージョンが合っていない、もしくはコピペなどがおかしいのでしょうか。

Re:無題

なんかすいません。
何もメニューとか出ないのが仕様通りで、単にスクリプトの先頭部分を少し書き換えれば設定できるよ、ということなんですが、すごく分かりづらい書き方してますね。

このスクリプト書いたのは6年ほど前ですが自分にはプログラミング的なことをやり始めたばかりで、今見直すとお恥ずかしいことばかりです。
ダイアログ出す仕様にしたものも追記しましたのでお試しください。しかしこれ指定行数が6行以上になると正常に動かないっぽい?

  • kawamoto_α
  • 2020/10/21(Wed.)

無題

早速の対応ありがとうございました。
こちらで試してみます。
お手数をお掛けしました。

プロフィール

kawamoto_α
(あるふぁ(仮))


InDesignで新聞組版のようなことをしています。

ツイッタ

※ブラウザによっては当ブログからDLしたzipファイルが拡張子なしになることがあるようですが、.zipを補って開いてください。



イラレ用トーンカーブスクリプト(¥1500)



クロソイド式角丸長方形スクリプト(¥500)
Illustrator用
InDesign用



イラレスクリプトをキーボードショートカットで実行するやつ(Win用)