mjk LISPその5
メニューバーのCommandsにabcという名前でHello Worldと表示させる命令を作成します。
(setq btn
(add-button *command-menu* "abc" '(info
"Hello World")))
#<X-widget>
Commands→abcを選択します。
Hello Worldと表示されました。
作成したメニューを消します。
(XtDestroyWidget btn)
nil
*command-menu*も消してみます。
(XtDestroyWidget *command-menu*)
nil
消えません。定数なので消せないっぽいです。
(constantp *command-menu*)
t
が、通常Commandsをクリックすると上記のようになるのですが、反応しなくなりました。
この状態で
(setq btn
(add-button *command-menu* "abc" '(info
"Hello World")))
を実行するとフリーズします。
もうちょっと複雑なのを作ってみます。
(progn
(setq
btn (make-menu *command-menu* "btn" "p"
:tear-off
'("abc" (info "abc"))
'("def" (info "def"))
:----
'("ghi" (info "ghi"))
'(kill (XtDestroyWidget
btn))
))
)
#<X-widget>
abcでabc、defでdefなどと表示されます。
killを選択します。
btnだけが残ってしまいます。
これをさらに消去すると・・・
(XtDestroyWidget btn)
Graphが強制終了して画面が消えてしまいます。
コマンドのあるメニューだけを消すのは以下のようにします。
(progn
(setq
btn (make-menu *command-menu* "btn" "p" :tear-off))
(setq
abc (add-button btn "abc" '(info "abc")))
(setq
def (add-button btn "def" '(info
"def")))
(setq
ghi (add-button btn "ghi" '(info "ghi")))
(setq
q (add-button btn "quit"
'(dolist (x (list abc def ghi q))(XtDestroyWidget x))))
)
#<X-widget>
quitを選択します。
メニューだけになります。
再度以下を実行すれば元に戻ります。
(progn
;(setq
btn (make-menu *command-menu* "btn" "p" :tear-off))
(setq
abc (add-button btn "abc" '(info "abc")))
(setq
def (add-button btn "def" '(info
"def")))
(setq
ghi (add-button btn "ghi" '(info "ghi")))
(setq
q (add-button btn "quit"
'(dolist (x (list abc def ghi q))(XtDestroyWidget x))))
)
#<X-widget>
GraphのメニューバーにはParametersというメニューがあります。
Graph特有の大域変数を使うときに用います。
コマンドラインでごちゃごちゃ定義するのではなく、Paramtersのメニューバーを用いて変数を使用する仕組みとしてGraphで準備されたものです。
Graphを起動して、以下を実行します。
(progn
(define-parameter-group 'my-scale "miscellaneous scales")
(defuserparameters
my-scale
(gra-scale 1e-15 "gradiometer scale [T/m]"
'number)
(mag-scale 1e-13 "magnetometer scale [T]" 'number)
(stim-scale 1e-6 "stim scale [V]" 'number)
(eeg-scale 1e-6 "EEG scale [V]" 'number)
(my-comment "nothing" "default" 'string)
)
)
my-comment
Parametersをクリックするとmy-scaleという項目が出現します。
my-scaleを選択します。
適当に数値を変えてOKを押します。
再度開いてみました。変更点がそのまま保持されています。
ここで定義した大域変数の値が変わるだけです。
この結果を反映させるには、plotterのスクロールバーか何かを操作するなど、何かの関数を経る必要があります。
以下のコードを実行します。add-buttonの関数は後で作ります。
(progn
(setq
filename "/neuro/data/case00/SEF_median_ave.fif")
(set-resource
(G-widget "file") :filename filename :dataname "")
(setq
pick (require-widget :pick "pick"))
(set-resource pick
:names
'("MEG0111" "MEG0112" "MEG0113"
"MEG0121" "MEG0122" "MEG0123" "STI001")
)
(link (G-widget
"file") pick)
(link pick (G-widget
"display"))
(set-resource
(G-widget "display") :ch-label-space 100)
(add-button
*command-menu* "change scale" '(change-scale))
)
#<X-widget>
スケールを反映させる関数は以下の通りです。実行します。
(defun change-scale()
(let ((w (G-widget
"display"))
(nch (resource w :channels))
(mtx (make-matrix nch 1 1.0))
)
(progn
(dotimes (ch nch)
(case (get-property w ch :kind)
(2 (vset mtx ch eeg-scale))
(3 (vset mtx ch stim-scale))
(1
(case (get-property w ch :y-unit-number)
(112 (vset mtx ch mag-scale))
(201 (vset mtx ch gra-scale))
)
)
)
)
(set-resource w :scales mtx)
)
)
)
change-scale
Commands→change scaleを選択します。
ScaleとOffsetを利用してgradiometer、magnetometer、stimの順で波形表示させます。
以下を実行します。
(progn
(set-resource
(G-widget "display") :superpose t)
(set-resource
(G-widget "pick") :names '("MEG*" "STI001"))
(link (G-widget
"pick")(G-widget "display"))
(add-button
*command-menu* "change scale & offset" '(change-scale-offset))
)
#<X-widget>
以下を実行します。
(defun
change-scale-offset()
(let ((w (G-widget
"display"))
(nch (resource w :channels))
(mtx1 (make-matrix nch 1 1.0))
(mtx2 (make-matrix nch 1 1.0))
(scl 1.0)
(ofs 0.0)
)
(progn
(dotimes (ch nch)
(case (get-property w ch :kind)
(2 (setq scl eeg-scale ofs 0.5))
(3 (setq scl
stim-scale ofs 0.5))
(1
(case (get-property w ch :y-unit-number)
(112 (setq scl
mag-scale ofs 0.0))
(201 (setq scl gra-scale ofs -0.5))
)
)
)
(vset mtx1 ch scl)
(vset mtx2 ch ofs)
)
(set-resource w :scales mtx1 :offsets mtx2)
)
)
)
change-scale-offset
Commandsからchange scale & offsetを選択します。
Parametersからmy-scaleを選択します。
スケールを以下のように変えて、change scale & offsetを実行しました。
上段がgradiometer、中央がmagnetometer、下段がトリガー信号です。