eventListenerを利用してIndesignの挙動を変える

世はごーるでんうぃーくなるもののまっただ中。しかし、わたしのようにカレンダー通りの日程で粛々と作業をこなしている方も多々いらっしゃるでしょう。みなさま、おつかれさまでございます。
回りくどい話はこれ位にして、さんざん探しまわりました。結構単純な事でして、結局マニュアルを良く読んだら理解出来たという落ちです(英語読むの面倒くさかったから読んでなかった)。フォーラムにまで助けを求めてしまいましたが…ついでですのでフォーラムにも書いておきました。

#targetengine session

var listner = app.activeDocument.addEventListener (
    ‘afterPlace’,
    function (ev){
        var tg = ev.target;
        var mybnds = tg.geometricBounds;
        tg.geometricBounds = [mybnds[0],mybnds[1],mybnds[0]+30,mybnds[1]+30];
        tg.fit (FitOptions.proportionally);
        tg.fit (FitOptions.centerContent);
        });
listner.name = ‘testEvent’;

やりたかったのはこんな感じです。
配置処理をキャプチャして強制的にバウンズを設定し内容をフィットさせます。
配置コマンドの基本動作をオーバーライドする形ですので解除するか、当該ドキュメントを閉じるまではず〜っとこの動作をします。
しかしながら、このままでは少し利便性に欠けますので色々と付け足してみましょう。

#targetengine session

if (app.activeDocument.eventListeners.itemByName(‘placeEvent’)!=null){
    app.activeDocument.eventListeners.itemByName(‘placeEvent’).remove();
    }

var f = File(“/etc/estk/placeBounds.ini”);
if(f.open(‘r’)){
    var str = f.read();
    f.close();
    prf = str.split(‘:’);
    } else {
        prf = [30, 30];
        }

var d = new Window (‘dialog’, ‘input bounds size’, [100,100,360,290]);
    d.mp = d.add(‘panel’, [10,20,245,115], ‘input radius and radian’);
    d.mp.st1 = d.mp.add(‘statictext’, [50,24,100,40], ‘width = ‘);
    d.mp.et1 = d.mp.add(‘edittext’, [110,20,170,40],prf[0], {multiline:false});
    d.mp.st2 = d.mp.add(‘statictext’, [50,54,100,70], ‘height = ‘);
    d.mp.et2 = d.mp.add(‘edittext’, [110,50,170,70],prf[1], {multiline:false});
    d.bp = d.add(‘panel’, [10,130,245,175], ”);
    d.bp.submitBtn = d.bp.add(‘button’, [20,10,100,25], ‘OK’, {name:’ok’});
    d.bp.cancelBtn = d.bp.add(‘button’, [120,10,200,25], ‘cancel’, {name:’cancel’});
    d.bp.submitBtn.onClick = function (){
            var wdt = d.mp.et1.text – 0;
            var hgt = d.mp.et2.text – 0;
            if(f.open(‘w’)){
                var retStr = wdt + “:” + hgt;
                f.write(retStr);
                }
            setListener(wdt, hgt)};
    d.show();

function setListener(w,h){
    var listner = app.activeDocument.addEventListener (
        ‘afterPlace’,
        function (ev){
            var tg = ev.target;
            var mybnds = tg.geometricBounds;
            tg.geometricBounds = [mybnds[0],mybnds[1], mybnds[0]+h, mybnds[1]+w];
            tg.fit (FitOptions.proportionally);
            tg.fit (FitOptions.centerContent);
            });
    listner.name = ‘placeEvent’;
    d.close();
    }

インターフェース付けてごにょごにょしているだけなのであれなのですが、一応ご説明を

if (app.activeDocument.eventListeners.itemByName(‘placeEvent’)!=null){
    app.activeDocument.eventListeners.itemByName(‘placeEvent’).remove();
    }

リスナ自体がだぶるといやなので存在する場合はいったんリスナを削除します。

var f = File(“/etc/estk/placeBounds.ini”);
if(f.open(‘r’)){
    var str = f.read();
    f.close();
    prf = str.split(‘:’);
    } else {
        prf = [30, 30];
        }

この部分はプレファレンスを読み込む部分。わたし的な所ですが、前回のセッティングやコンフィグを保存しておきたい場合、「/etc」内にファイルを置いておいたりします。ここはUnix系でよくプレファレンス等を放り込んでおく所なので便乗している次第です。

var d = new Window (‘dialog’, ‘input bounds size’, [100,100,360,290]);
    d.mp = d.add(‘panel’, [10,20,245,115], ‘input radius and radian’);
    d.mp.st1 = d.mp.add(‘statictext’, [50,24,100,40], ‘width = ‘);
    d.mp.et1 = d.mp.add(‘edittext’, [110,20,170,40],prf[0], {multiline:false});
    d.mp.st2 = d.mp.add(‘statictext’, [50,54,100,70], ‘height = ‘);
    d.mp.et2 = d.mp.add(‘edittext’, [110,50,170,70],prf[1], {multiline:false});
    d.bp = d.add(‘panel’, [10,130,245,175], ”);
    d.bp.submitBtn = d.bp.add(‘button’, [20,10,100,25], ‘OK’, {name:’ok’});
    d.bp.cancelBtn = d.bp.add(‘button’, [120,10,200,25], ‘cancel’, {name:’cancel’});
    d.bp.submitBtn.onClick = function (){
            var wdt = d.mp.et1.text – 0;
            var hgt = d.mp.et2.text – 0;
            if(f.open(‘w’)){
                var retStr = wdt + “:” + hgt;
                f.write(retStr);
                }
            setListener(wdt, hgt)};
    d.show();

インターフェースはscriptUIです。基本的なエレメントしか無いので省略。
submit時に幅と高さを取得してセッティングを保存します。その後setListenerを呼び出します。

function setListener(w,h){
    var listner = app.activeDocument.addEventListener (
        ‘afterPlace’,
        function (ev){
            var tg = ev.target;
            var mybnds = tg.geometricBounds;
            tg.geometricBounds = [mybnds[0],mybnds[1], mybnds[0]+h, mybnds[1]+w];
            tg.fit (FitOptions.proportionally);
            tg.fit (FitOptions.centerContent);
            });
    listner.name = ‘placeEvent’;
    d.close();
    }

この部分は先のscriptとほぼ変わりません。イベントリスナを生成しハンドラを設定しています。

なお、解除は以下のスクリプト一行実行するだけです。

app.activeDocument.eventListeners.itemByName(‘testEvent’).remove();

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする

1件のコメント

コメントを残す