
今回もScilabのIPCV「ツールボックス」に含まれるユーティリティ関数の練習を続けます。今回の関数はループでくるくる回っている最中にキーを叩いてループを脱出させるのに都合の良い関数です。画像処理のIPCVは時間かかるものが多そうだけれども、別にIPCVでなくても便利そうなツールです。若干クセ強な挙動です。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
今回練習してみるユーティリティツールども
今回は以下の2つですが、使用は「組」にしてです。さらに言うと breakloop という名の大域変数 も使用必須です。
-
- imbreakset()
- imbreakunset()
- breakloop、大域変数
上記の3つを使うと「ESCキー」を押すことでループから脱出することが可能となります。imbreakset()という関数を事前に実行しておくことで、「ESCキー」によってbreakloop大域変数に「真」を代入できるようになるようです。これをループの中で判定して、break文を実行すれば脱出ができると。そしてimbreakunset()関数でこの機能をディセーブルとして後片付け。
今回練習のテスト関数
imbreakset()関数のHelpページをみれば実施例があるのですが、10回ループ(1ループは約0.5秒)と短時間なので、手元が怪しい年寄が慌てている間に「ESCキー」が認識される前にループ終了してしまいます。そこでループ回数を引数にとり、何回目で脱出したかを返す関数に例を改造したのが以下です。
// test imbreakset() // rcnt: repeat count // lst: counts at break function lst=testBreak(rcnt) global breakloop; breakloop = %f; plot(0,0); imbreakset(); lst=0; for cnt = 1:rcnt sleep(500); disp(cnt); if breakloop == %t disp('User Break'); lst = cnt; break end end imbreakunset(); endfunction
ここで、以下のようにすれば、慌てることなくESCキーを押すことができます。
testBreak(100)
キー認識のクセ?
慌てることなくキーを押せるようになったお陰で、以下のようにループの途中で脱出することができてます。
しかし、このESCキーの認識がちょっとクセ強です。基本、プロットのウインドウにフォーカスがあたっていないとループ脱出はできないのですが、
手もとの環境では以下のような挙動を示しました。
-
- グラフエリア内(上記の緑の領域)をクリックしてフォーカスを得る分にはESCキーでブレークできる。
- 「タイトルバー」~「グラフィック・ウインドウ番号0」の領域(上記の赤の領域)をクリックしてウインドウにフォーカスすると ESCキーでブレークできない
知らないと慌てるぞ、これは。グラフィックハンドルとかの黒魔術?