2012年6月15日金曜日

Photoshopのバーズアイ暴発バグを解消するAHKスクリプト

最近のPhotoshopにはバーズアイビューとかいうビデオカードのOpenGL機能で動かす機能が搭載されております。どんなかというと、一度キャンバスを縮小表示して、キャンバスの全体を見れる状態にしてから、キャンバス移動位置を指定する、すると指定された場所が再び拡大表示される、というもんです。
この動画の三分あたりで紹介されてます。

"Photoshop Tips: Spring-loaded Tools, Bird's Eye View and Interactive Brush Sizing"
http://vimeo.com/18202320

この機能を発動させるには本来、手のひらツールを使用中に手のひらツールのショートカットキー(デフォルトはHキー)を押しながら左クリックをすることが必要、なのだけれどしかしこの機能を使うのとは全く関係ない動作でバーズアイビューが発動してしまうことがあるようで。2chの書き込みなどを見ると何度か言及されていました。たとえばこれとか。

23 : 名無しさん@お腹いっぱい。 : 2010/03/07(日) 12:41:54 ID:uiinlbkt
前スレで出てたバーズアイビュー暴発防止の話ってそもそも起こる理由が違ってないか?
別にRの回転多用しなくても別の全然使わないキーを回転にしてもやっぱり起こるぞ。
やっぱりCS4になってツールシフト(長押しの間だけ別ツール)が導入されたせいで
スペースキーで拡縮やスクロールしたいだけでも手のひらツールに認識されてるからなんじゃないのか?
ツールシフトかバーズアイビューだけでも切れるオプションがありゃいんだが、
任意に発動できりゃ使いみちもあるだろうに今のとこ邪魔な機能にしかなってないな・・・


このバグの原因を探っていた時にいろいろぐぐっていたのだけれど明解な原因や解決策は見つからず。色々試しているうちに暴発の理由がわかったのだけれど、暴発する条件は

ショートカットキー長押しをしそのショートカットキーに割り当てられたツールを一時使用(ツールシフト機能を使用している状態。)し、そのまま
スペースバーを押して一時的に手のひらツールを使える状態にし
このままキャンバス上で左クリックをする。


といった感じ。
押しているボタンは、ツールシフト用のショートカットキーと一時手のひらツール切り替え用のスペースバーと左クリックの3つ。
多分フォトショップがこの動作の、ツールシフトの部分で現在使用中のツールが手のひらツールであると誤認識し、そのままスペースバー押し下げを手のひらツールのショートカットを押しているものと更に誤認識し、そのまま左クリック→「なるほどお前はバーズアイビュー使いたいのだな。あいわかった、皆まで言うでない。」とバーズアイを暴発させてくれているのだと思う。

フォトショップ側ではとりあえずツールシフトを無効にすることはできないが、バーズアイビューなら、設定のパフォーマンスの項目から、OpenGL描画を有効のチェックをオフにし、OpenGL支援をなくせば無効にすることができる。ただしそれをしてしまうとOpenGL支援で動く、ピクセルグリッドやキャンバスの回転などの機能が使用できなくなる、といったものすごい弊害が発生する。とまあどうにもならない状況ですがまあ上記のような、誤認識を招くショートカット操作をしなければなんとかなるとは思う。例えば、ブラシツールを使用中に、指先ツールにツールシフトし、そのままスペースバーを押して手のひらツールに一時切り替えしキャンバスを動かす、みたいなことはしてはいけない、みたいな。
しかし、高速にショートカット切り替えをしてキャンバスをしょっちゅう動かす人はバーズアイビューの暴発は不可避なんじゃないかと。自分も、ブラシから消しゴムに切り替えてそのままスペースバー押してキャンバス動かす、みたいなことを速攻でやるから、そのときに指がしっかりショートカットキーからはなれていないので、ツールシフト状態のままになってしまっていてそのままスペースバー+左クリックを押した状態に気づかず陥っていてバーズアイがこんにちは、ってのが何度もあった。

ただ、このAHKのスクリプトを使えば、上記のような誤動作が起きる動作を行なっても、ツールシフトが無効化される用な感じになるのでバーズアイビューの暴発は減った。(なくなった、と言えないのは、ものすごく速くショートカットキーの切り替えを行うとこれでもまだ暴発はするからです。)


#ifWinActive, ahk_class Photoshop
Space::
send {a up}
send {space down}
KeyWait,space
send {space up}
return


このスクリプトを使うと、例えば、使用中のツールがブラシツールの状態で、指先ツールに変更するためにショートカットキーを押し、そのままそのショートカットキーを押したままで、スペースバーを押す、という動作を行うと、ツールシフト状態が解除され、ブラシツールから指先ツールに切り替わり、結果問題なく一時的に手のひらツールが使えるようになる、といった感じになる。ツールシフト状態ではないのでバーズアイは暴発しないという感じ。

このスクリプトではスペースキーを押すとまず
send,{a up}
という、aキーの押し上げの動作ををまっさきに送っているのだけれど、ここでツールシフトが無効化され、ショートカットの変更が確定する。(ここはaキーでなくても他のツールに割り当てられているショートカットキーならなんでも可。)適当にスクリプト書いてたらうまくいったので、どうしてこれでうまくいったのかはよくわからないけれど、多分、キーの押し上げの判定がきているため、ショートカットキー長押しの判定がなくなり、そのままツールの切り替えが行われているからだと思う。あとこのスクリプトを使っても、今回のようなキー操作を行わない場合は普通にツールシフト機能は使えます。
まあ困ってる人は適当に調べて使ってみてください。多分動きます。多分。


このバーズアイバグはCS6でもなおってないみたい。このバグに遭遇するようなキーボード操作をしている人が人が少ないから放置されてるんだろうか。

追記
Photoshop CC 体験版をいじってみたがやっぱりこのバグそのままでした。スゲー。

1 件のコメント:

  1. 改造して特定のキーでツールシフトを無効にするスクリプトを作ってみました ttp://www1.axfc.net/uploader/so/3042556 NキーとMキーに割り当てたツールでツールシフトが一切無効になります。 つまりNキーとMキーを押したときにバーズアイバグが起きる事がなくなります。 僕はツールシフトをスペースキー(手のひらツール)で画面をドラッグする時はよく使うのですが、ブラシツールや消しゴムツールを使うときは必要としないのでこういう感じになりました。 バーズアイバグとは別に、意図しない場面でツールシフトが誤動作して意図しないツールに切り替わる事があったような気がしたので特定のキーに関してツールシフトを無効にするという感じです。

    返信削除