忍者ブログ

ぼんぷろぐ

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

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

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

[Photoshop]
Sppyのフォトショ版(ベータ)

ご要望があったので、Sppyのフォトショ版を作ってみました。


Sppyは、ExtendScriptで書かれたスクリプト(.jsx)をすばやく実行するためのツールです。AutoHotkeyで開発しています。イラレ版はこちら


しかし私自身はフォトショでスクリプトはほぼ使っておらず、皆さんがどんなスクリプトをどんなふうに使ってるのか、全く知りません。
ただ、イラレ版Sppyのソースコード内の'illustrator'を'photoshop'に変えるだけでできそうなので、せっかくだからやってみた、というものです。
そういうわけなので、これはベータ版(テスト版)ですが、何事もなければこのまま開発終了となります。


ダウンロード


[Sppy for Photoshop ver0.1]



Sppyの使い方

  1. SppyPs.exeを実行します。初回起動時にはフォルダ選択ダイアログが出るので、スクリプトが入ったフォルダを選択します。
  2. Sppyはタスクトレイに常駐します。タスクトレイアイコン をダブルクリックするとパネルが開きます。
  3. パネルにはフォルダ内のスクリプト(*.jsx , *.js)がツリー表示されます。ダブルクリックでスクリプトが実行できます。
  4. 終了するには、タスクトレイアイコンを右クリックして『終了』を選択します。

キーボードショートカットの設定

キーボードショートカットの設定は2つの方法があります。

方法1:

  1. スクリプトを選択して、『キー取得』ボタンを押します。
  2. キー入力欄にカーソルを置いてキーを入力します。このとき、Ctrl、Shift、Altキーを組み合わせることができます。
  3. 『その他の修飾キー』として、無変換キー、Winキーを設定することできます。たとえばキー入力欄に『A』、その他の修飾キーに『無変換』を選ぶと、『無変換 + A』のキーボードショートカットが実現できます。
    ※無変換キーはCtrl、Shift、Altと組み合わせることができません。Winキーはできます。
    ※無変換キーを使う場合、IMEで無変換キーに割り当てられた機能があれば事前にオフにしておきましょう。
  4. キー設定ダイアログでOKを押すとキー取得ボタンの右に変な文字列が表示されますが、気にせず『適用』を押します。
  5. 対象のスクリプトが太字になったら設定完了です。Photoshop上でキーを入力してみましょう。

方法2:

先ほどの『キー取得ボタンの右の変な文字列』は、AutoHotkeyスクリプトにおいてキーを指定するための文字列です。
ここでは、
Ctrlが『^』
Shiftが『+』
Altが『!』
無変換が『vk1D』
などと表記されます。

ここに直接キー文字列を入力して、『適用』を押してやるというのが2つ目の方法になります。
先ほどのキー取得ダイアログでは使えなかったキー(Esc、Tabなど)のほか、マウスの拡張ボタン、ジョイスティックなども登録できるはず。

キーの書き方はこちらを参照ください。
ホットキー - AutoHotkey Wiki
キーリスト - AutoHotkey Wiki


謝辞

フォトショのProgIDを教えてくれたお~まちさん、ありがとうございました。
PR

[イラレ]
上端からの距離に比例した移動量で下に動かすスクリプト

ご要望があったので、左端からの距離に比例した移動量で右に動かすスクリプトの「上から下」版を作りました。実は「左から右」版作ったときにこっちもほぼ完成してたんですが。

使い方は「左から右」版の方を見てくださーい

ダウンロード


ver1.0 - 2021/01/12

動いてるところ


[イラレ]
「Bridgeで参照」を使い物にする イラレ編

ファイルメニューの「Bridgeで参照」、Bridgeが起動するだけで何も参照してくれないんだけど、せめて今開いてるドキュメントくらい参照してくれるようにならんかなー

っていう思いで前回、InDesignの「Bridgeで参照」を改造する話をやったんですが、今回はそのイラレ編です。

しかしメニューコマンドの処理をスクリプトで書き換えるなんて大それたことをさせてくれるのはInDesignくらいのもので、イラレやフォトショのスクリプトではそこまでの自由度はありません。どうしよう。



ExtendScriptにはBridgeTalkという、Adobeアプリ間でスクリプトを送り合えるしくみがあるんですが、イラレのファイルメニューの『Bridgeで参照』にはBridgeTalkが使われています。

具体的には、『Bridgeで参照』を実行すると、次のコードがBridgeにBridgeTalkを介して送られています。

app.bringToFront();
if (app.documents.length == 0) app.browseTo();
else app.document.thumbnail = new Thumbnail();

これをコードAと呼ぶことにしましょう。

ちなみにこのコード、ESTKからBridgeを対象に実行すると、なんとエラーが出ます。
3行目の new Thumbnail() が引数なしを許容してないんですね。
BridgeTalkから実行した場合もエラーになるんですが、「BridgeTalk内のエラーはアラートも何も表示されず、ただそこでスクリプトの実行が終わるだけ」という仕様と、1行目の app.bringToFront(); だけでBridgeを最前面に表示するという仕事が完了していることにより、これまで誰にもばれずにエラーを出し続けてきたんだと思われます。

それはともかくとして、『Bridgeで参照』を実行したときの通常の処理はこんなんです。

イラレで『Bridgeで参照』を実行

BridgeTalkでコードAがイラレからBridgeに送信される

Bridge上のBridgeTalk.onReceive関数がコードAを受け取る

onReceive関数内でコードAがevalされる

app.bringToFront();が実行された後、エラーが出て終わり

重要なのは、BridgeTalkで送られたコードというのは無条件で実行されるわけではなくて、BridgeTalk.onReceiveによって処理されるという点です。
んでBridgeTalk.onReceiveってどんな関数なのって言うと、ESTKからBridgeを対象に BridgeTalk.onReceive.toSource() してみると分かるんですが、次のようなコードです。

(function( msg ) {
 	app.lastSender = msg.sender;
 	app.displayDialogs = 'all';
 	var retval = eval( '$.level = 0; app.synchronousMode = false;\n' + msg.body );
 	app.displayDialogs = 'all';
 	app.synchronousMode = false;
 	return retval;
})

送られてきたコードを実行しているのは4行目のevalです。msg.bodyにコードが入っています。

他の行も見てみると、2行目はBridgeTalkを送りつけてきたアプリの名前をapp.lastSenderに代入しています。これによりファイルメニューの「〇〇に戻る」の〇〇がそのアプリになります。
イラレから「Bridgeで参照」した直後は「Illustratorに戻る」、フォトショから「Bridgeで参照」した直後は「PhotoShopに戻る」に変化するのはこういう仕組みだったんですね。


でー、このBridgeTalk.onReceiveなんですが、実は書き換え可です。
たとえば、送られてきたコードがコードAに完全に一致する場合のみ特別な処理を行い、それ以外の場合はデフォルトのBridgeTalk.onReceiveと同じ処理をする、ということもできちゃうわけです。
ここまでの説明は、「BridgeのBridgeTalk.onReceiveを書き換えることで、イラレの『Bridgeで参照』の挙動を変えてやろう」という企みを分かっていただくためのものだったのでした。




てことで、イラレの「Bridgeで参照」を、現在のドキュメントを参照するようにするBridge用スタートアップスクリプトです。

//    イラレの「Bridgeで参照」を、現在のドキュメントを参照するようにするBridge用スタートアップスクリプト
var aiBridgeDeSansho1="app.bringToFront();if%20(app.documents.length%20==%200)%20%20%20%20app.browseTo();else%20%20%20%20app.document.thumbnail%20=%20new%20Thumbnail();";
var aiBridgeDeSansho2="app.document.thumbnail%20=%20new%20Thumbnail();";//Bridgeが起動してないときはこっちになるっぽい

var btOnReceive2=(function(msg) {
    var body2=encodeURI(msg.body);
    if(msg.sender.slice(0,11)=="illustrator" && (body2==aiBridgeDeSansho1 || body2==aiBridgeDeSansho2)){
        app.bringToFront();
        app.lastSender = msg.sender;
        var bt=new BridgeTalk;
        bt.target=msg.sender;
        bt.body="app.documents.length==0?0:app.activeDocument.fullName";
        bt.onResult=function(res){
            if(res.body=="" || res.body=="0")return;
            app.document.thumbnail=new Thumbnail(File(res.body));
        }
        bt.send();
        return;
    }
    app.lastSender = msg.sender;
    app.displayDialogs = 'all';
    var retval = eval('$.level = 0; app.synchronousMode = false;\n' + msg.body);
    app.displayDialogs = 'all';
    app.synchronousMode = false;
    return retval;
});

BridgeTalk.onReceive=btOnReceive2;
BridgeTalk.watch("onReceive",function(){return btOnReceive2});//スタートアップスクリプトの後にonReceiveが初期化されるのを防ぐ

インストール方法

①Bridgeを開いて、環境設定からスタートアップスクリプトの『マイスタートアップスクリプトを表示』をクリック
②Startup Scriptsフォルダが開くので、ここに上記スクリプトを拡張子.jsxで保存したものを置きます
③Bridgeを再起動すると「新しい機能を有効にしますか?」みたいなダイアログが出るのでOKを押します

これでイラレから「Bridgeで参照」したとき、現在の(最前面の)ドキュメントがBridge上で選択されるようになってるはずです。(ダメだったら教えてください)


関連記事

イラレ&Bridgeの昔書いたネタ(超便利だと思うんだけど特に褒められなった…)
イラレの画像再リンクをBridgeから行うためのスクリプトをつくったー

[InDesign]
「Bridgeで参照」を使い物にする InDesign編


InDesignが近々20周年を迎えるそうで、おめでとうございます。その記念イベントのアカウントから流れてきたツイートに「スクリプトで、いかようにも染められる」ってなことが書いてあったんですが、これは本当にそうで、InDesignは「ほんとにここまでできちゃっていいの?」って思うようなことまでスクリプトでできてしまいます。

たとえば、あるメニューコマンドが呼び出されたとき、その実行をキャンセルして別の処理をさせる、なんてこともできます。

ということで、ファイルメニューの良い位置を占めておきながらほとんど使い道のない『Bridgeで参照』を、現在開いているドキュメントをBridgeで参照する機能に変えるスクリプトです。

#targetengine session
app.menuActions.item("$ID/FileForBrowse").addEventListener("beforeInvoke", function(ev) {
    ev.preventDefault();
    var d = app.documents[0];
    with(new BridgeTalk) target = "bridge", body = "app.bringToFront();" + (d.isValid && d.saved > 0 ? "app.document.thumbnail=new Thumbnail(File('" + d.fullName + "'))" : ""), send();
});


これはスタートアップスクリプト用のスクリプトです。
所定のフォルダに置いといて起動時に自動実行されるようにするのですが、その所定のフォルダを開く手っ取り早い方法は、InDesignでスクリプトパネルを開いて「ユーザー」フォルダの上で右クリックし、エクスプローラーで開く(MacはFinderで開く?)を選びます。
そこに「Startup Scripts」があればその中、なければ「Scripts Panel」と同じ階層に「Startup Scripts」というフォルダを作成して、上記スクリプトを拡張子jsxで保存したものを入れます。

あとは普通にInDesignを起動すれば、「Bridgeで参照」が現在のドキュメントを参照するようになってるはずです。




コードの解説もちょっと

1行目 #targetengine session
イベントリスナー登録する系のスクリプトは関数が保持されないといけないのでターゲットエンジンの指定が必要です。エンジン名はなんでもいいです。

2行目 app.menuActions.item("$ID/FileForBrowse")...
"$ID/FileForBrowse"は"Bridgeで参照"のkey stringです。Bridgeって言葉が入ってないのが意外ですけど。

3行目 ev.preventDefault();
本来のコマンド実行をキャンセルするおまじないです。evはEventオブジェクトです。

5行目 with(new BridgeTalk)...
BridgeにBridgeTalkを送ってます。

オワリ

プロフィール

kawamoto_α
(あるふぁ(仮))


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

ツイッタ

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



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



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



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