mjk LISPその5

メニューバー... 1

パラメータの設定.. 1

 

 

メニューバー

 

メニューバーのCommandsabcという名前でHello Worldと表示させる命令を作成します。

(setq btn (add-button *command-menu* "abc" '(info "Hello World")))

#<X-widget>

Commandsabcを選択します。

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>

abcabcdefdefなどと表示されます。

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

Commandschange scaleを選択します。

 

 

ScaleOffsetを利用してgradiometermagnetometerstimの順で波形表示させます。

以下を実行します。

(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、下段がトリガー信号です。