|
2.1以降のRunrevバージョンでは、このページに書いたスクリプトで働かないツールがあります。
3.0 用の修正版スタック
go stack url "http://www.kenjikojima.com/runrev/handbook/download/015_V3.rev"
今回はお絵描きツールです。今時この手のお絵描きツールで、アプリケーションのインターフェイスを作る人も少ないでしょうけれど、Tools メニューからは、Paint Tools が引き出せるようになっていますね。辞書を探ってみると、ペイント類もいろいろそろっていますから、一応古典的道具としてスクリプトで使えるように、工作型録に付け加えることにしました。ウインドウひとつでシンプルに作っています。
と、ほぼ 90パーセント完成したところで、Windows のスタンドアロン環境で、一部のツールが働かないことが判明しました。んーん、なかなか奥が深くて油断はできない!! 一応バグとして報告しました。と言うわけで、この015.rev ではWIndows版 RRPlayer から試した時に、アラートダイアログが出ますから悪しからず。
Mac OSX の RRPlayer、開発環境、またWindows の開発環境では問題ありません。

まずペイントをするイメージオブジェクトを用意します。015.rev ではすでにサンプル画像がイメージオブジェクトに入っています。このイメージの範囲内にペイントがされます。 ペイントする行程は、ひとつひとつのピクセルの色彩を、いくつかのツールで変えて行くという作業です。
左下にツールを切り替えるアイコンが並んでいます。左からブラウズ(browse)、ペンシル(pencil)、ブラシ(brush)、バケツ(bucket)、ケシゴム(eraser)、スプレイ(spray can)、虫メガネ(magnifier)です。カッコの中にあるのは、それぞれのイメージオブジェクトに付けた名前です。このアイコンはGIFで作って、メニューのFile>Import As Control>Image File...から取り込んでいます。
ツールがひとかたまりにまとまって見えるよう、アイコンを並べたサイズより少し大きなグレイのグラフィック(baseGrc) を下に敷いています。その後、すべてのアイコンとグレイのグラフィックを同時にセレクトして、メニューObject >Group Selected で、ひとつのグループにまとめました。グループの名前は「tools」です。
グループ「tools」のスクリプトには、アイコンをマウスオーバーした時に、変化がアイコンに現れるよう下のスクリプトを入れています。
on mouseEnter
if the short name of the target is not "baseGrc" then
set the showborder of the target to true
end if
end mouseEnter
on mouseLeave
set the showborder of the target to false
end mouseLeave
マウスがそれぞれのオブジェクト(the target ) に入った時、オブジェクトが"baseGrc"と言う名前でなかったら、そのターゲット(image object) のボーダーを見せます。またマウスがそのターゲットから出たら、そのターゲットのボーダーを隠します。アイコンはあらかじめ3D 表示でボーダーサイズを 2 としました。
アイコンのイメージのインスペクターにある、 Tool tip にツールの名前を書き込んでおくと、マウスオーバーになったとき、ツールの名前が表示されます(まだ日本語の表示はできません。リクエスト中です)。

Tool tip は、オブジェクトインスペクターでも、スクリプトででもできます。
スクリプトは以下、
set the toolTip of btn "bucket" to "Bucket Tool"
次にアイコンがクリックされた時のツールの切り替えです。上で説明したように、マウスクリックされた the target のショートネームで、どのアイコンがクリックされたかを判断して、その後は switch でどのツールをセットするか選り分けます。(下のスクリプトは上記のWindows のスタンドアロンで現れるダイアログ部分は省きました。このトラブルがなければ swicth での選り分けはもっとまとめることができるのですが、今回はすべてのツールをcase としています)
追加修正:RunRev2.8 などのバージョンでは、Tool のID のプロパティがデフォルトでセットされていないので、スクリプトで入れる必要があります。
global myToolID
on mouseUp
put the short name of the target into tTool
switch tTool
case "Magnifier"
choose pencil tool
set the magnify of image "myPainting" to true
set the penColor to the backgroundColor of grc "tColor"
break
case "pencil"
choose pencil tool
set the penColor to the backgroundColor of grc "tColor"
break
case "brush"
choose brush tool
set the brush to 7 -- (追加: 最近のバージョンはID をセットする必要があります)
set the brushColor to the backgroundColor of grc "tColor"
break
case "bucket"
choose bucket tool
set the brushColor to the backgroundColor of grc "tColor"
break
case "eraser" set the eraser to 12 -- (追加: 最近のバージョンはID をセットする必要があります)
choose eraser tool
break
case "spray can"
choose spray can tool set the spray to 34 -- (追加: 最近のバージョンはID をセットする必要があります)
set the brushColor to the backgroundColor of grc "tColor"
break
end switch
myTool
end mouseUp
on myTool
send "myTool" to me in 500 milliseconds
put the result into myToolID
if within(image "browse",the mouseLoc) then
choose browse tool
cancel myToolID
end if
end myTool
choose toolName tool
で、それぞれのツールの選択を行います。ツール pencil とmagnifier と eraser 以外は set the brushColor to で色彩を設定します。
case "Magnifier" と最後にある myTool は後から説明します。
カラーは右下にある、tColor としているグラフィックの backgoroundColorと同色が、ツールで使えるようにしてあります。(grc "tColor" のほとんどの面積で見えている色が backgoroundColor です。リンカクはグレー foregroundColor です)
015.rev ではツールで使うカラーは二通りの選択方にしました。ひとつはOS のカラーパレットから選びます。grc "tColor" をクリックすると下のスクリプトが働いてカラーパレットが現れます。
on mouseUp
answer color with backColor of me
if the result is "Cancel" then
put the backgroundColor of me into fld "tColor"
else
set the backgroundColor of me to it
put it into fld "tColor"
end if
end mouseUp

選んだカラーは grc "tColor" のバックグラウンドカラーになって、fld "tColor" にはその RGB 値が入ります。015.rev ではすべてRGB 値を使っていますが、red、blueなど決められた色彩の名称も使用できます。
もうひとつのカラー選択は、すでに描かれたペインティング上から、マウスでカラーがピックアップされます。
on mouseMove
put the mouseColor into fld "tMouseColor"
set the backgroundColor of grc "tMouseColor" to the mouseColor
end mouseMove
on mouseLeave
put "" into fld "tMouseColor"
set the backgroundColor of grc "tMouseColor" to "255,255,255"
end mouseLeave
ペインティングのイメージ「myPainting」に入っているスクリプト the mouseColor で、マウスがペインティング内にある間は、ピクセルの RGB 値を常時取得して fld "tMouseColor" と grc "tMouseColor" に表示します。
ユーザーが切り替えるカラーを決定したら、そのカラーピクセルの上でオプション+マウスクリックすれば、grc "tColor" のバックグラウンドカラーがその色彩になって、ツールに指示が与えられるようになります。
on mouseUp
if the optionKey is down then
set the backgroundColor of grc "tColor" to the mouseColor
put the mouseColor into fld "tColor"
end if
end mouseUp
それでは上で保留にしていたツール magnifier を説明します。magnifier というツール名は Transcript にはありません。magnifier というキーワードはありますが、Revolution のインターナルでリザーブされている言葉で、実際にはツールのキーワードには使えません。ここでは単にイメージの名称に使っています。このアイコンをクリックすると図のような拡大パレットが現れます。

choose pencil tool
set the magnify of image "myPainting" to true
この拡大パレット(magnify)が現れた時に、ペンシルツールが選択してあれば、拡大パレット上で 1 ピクセルごとのカラーを変えることができます。オリジナルのイメージにある領域のワクをマウスで移動させれば、拡大された位置を動かことができます。これはペンシリツールを選んだ状態で、イメージをMac でしたらコマンド+クリック(Winでは コントロール+クリック)しても同じ状態が引き出せます。
注意:イメージをロックしていると拡大領域が動かせません。
グループ tools に書いたカスタムハンドラー myTool は、選ばれているペイント tool をブラウズツールに戻すためのものです。ペイント tool が選ばれている状態の時は、*通常のスタック上にツールの切り替えボタンがある場合マウスクリックが効かないので、 500 ミリセコンド毎にマウスの位置をチェックできるように、
send "myTool" to me in 500 milliseconds
を使って、ブラウズツールのアイコンの領域にマウスが入ったら、
if within(image "browse",the mouseLoc) then
choose browse tool
cancel myToolID
end if
ブラウズツールに切り替える指示を与えます。その後 send theHandlar to me in が終了するようにmyToolID をキャンセルします。010.rev でプログレスバーを動かす時にも同じ方法を取っていますから、そちらも参照してください。 010 のように pendingMessages のラインを使わないで ID でキャンセルさせたのは、the magnify of image でpendingMessages を使っているようなので、重複によるトラブルを避けました。
* ツール類切り替えをパレットまたはドロワーに置けば、マウスクリックを認識します。
ファイルに保存のスクリプトは以下です。
on mouseUp
ask file "" with "RevPaint.jpg"
if the result is not "cancel" then
export image "myPainting" to file IT as JPEG
if platForm() is "MacOS" then set the fileType to "prewJPEG"
end if
end mouseUp
作ったペインティングをファイルとしてエクスポートするのは、ask file "" でファイルを保存するディレクトリーのパスを取得して、 export image imageName でそのパスに保存します。プラットフォームが"MacOS" でしたらファイルタイプを設定すれば、ファイルにアイコンが表示されます。デスクトップに保存すると、うまくアイコンが表示されないようです。
|