From: Kikutani Makoto Date: 1997-09-11T19:11:15+09:00 Subject: [ruby-list:4272] [Q] tk ext... --AP2g/MAC+5xKAEJP Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit きくたにです。 そろそろ、rubyで実用プログラムを書きたいので、添削をお願いしようと 思います。 やりたいこと: VerilogシミュレータからPLI(Program Language Interface)で 外部波形ビューワを呼ぶ。波形ビューワはUCBが作った再配布可能な プログラムがあって、それ用のPLIのコードはできている。 VerilogシミュレータはUnixソケットを使って波形ビューワと通信する。 問題はUCBの波形ビューワが古典的なXツールキットで書いてあって、 私にゃさっぱりわからなく、手を加えることができない、ということです。 そこで、波形ビューワをTcl/Tkで書き換えようと思ったのですが、 TclはUnixソケットを扱えないようだ。そこでruby+tkの出番です。 添付のテストプログラムを書いてみました。 ----------------------------- Long_input_signal_name 100 0 100 1 100 0 100 1 100 1 100 0 100 1 100 0 100 1 ----------------------------- のようなdataファイルを書いておきます。第一項が時間の差分、二項が値です。 ruby tkwaviewer.rb < data とかすると、それらしい絵は出ます。 さて質問です。 1) 標準入力はいずれUnixソケットからの入力に置き換えますが、この調子で 膨大なデータを受けとっていって、TkのCanvasは問題ないですか? (あとズーム機能など入れなくちゃだめだし) 2) WViewerクラス中で使っている、$v, $c, $scrは最初インスタンス変数にして たのですが、大域変数にしないとだめでした。これはそういうものですか? 3) draw_scaleというメソッドでやっていることは、最初、 $v = TkCanvas.new(f){ ... } の直後でやってたのですが、表示が変でした。 これはなぜ? 4) その他直したほうがいい点 以上よろしくおねがいします。 -- 人生を背負い投げ 菊谷 誠(Kikutani Makoto) kikutani@eis.or.jp kikutani@jdc.ericsson.se hgf03701@niftyserve.or.jp http://www.eis.or.jp/muse/kikutani/ --AP2g/MAC+5xKAEJP Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="tkwaviewer.rb" #!/usr/bin/ruby # test program for WaveViewer which can be called from Verilog PLI require "tkclass" # initial window size $width = '500' $height = '100' $vwidth = 30 $pr_time_step = 100 class WViewer def initialize(signame) @high = $height.to_i * 0.2 @low = $height.to_i * 0.7 @pr_time = 0 @last_x = 0 @last_y = @low @frm = TkFrame.new{|f| TkLabel.new(f) { text signame pack('side' =>'top') } # canvas for vertical axis $v = TkCanvas.new(f) { relief 'sunken' bg 'LightCyan1' height $height width $vwidth.to_s pack('side' =>'left', 'fill'=>'y') } # canvas for plotting the points $c = TkCanvas.new(f) { xscrollcommand proc{|idx| $scr.set *idx } relief 'sunken' bg 'LightCyan1' height $height width $width closeenough '3' pack('side' =>'top', 'fill'=>'both', 'expand'=>'1') } $scr = TkScrollbar.new(f) { orient 'horizontal' command proc{|idx| $c.xview *idx } pack('side'=>'bottom', 'fill'=>'x') } pack } end def draw_scale # draw vertical scale TkcLine.new($v, $vwidth/2+10, @low, $vwidth/2+10, @high, 'fill'=>'blue') TkcLine.new($v, $vwidth/2, @low, $vwidth/2+10, @low, 'fill'=>'blue') TkcLine.new($v, $vwidth/2, @high, $vwidth/2+10, @high, 'fill'=>'blue') TkcText.new($v, 5, @high, 'text'=>'1', 'fill'=>'red') TkcText.new($v, 5, @low, 'text'=>'0', 'fill'=>'red') end def plot_bit(dt, b) x = @last_x + dt if b == 1 y = @high else y = @low end TkcLine.new($c, @last_x, @last_y, x, @last_y) TkcLine.new($c, x, @last_y, x, y) if x >= @pr_time TkcText.new($c, x, @low+10, 'text'=>x, 'fill'=>'green') @pr_time += $pr_time_step end @last_x = x @last_y = y end def set_scrarea $c.configure('scrollregion', "0 0 #@last_x #$height") end end # 1st line is the signal name signal = gets view = WViewer.new(signal) view.draw_scale # now plot points from stdin while gets dt, b = split view.plot_bit(dt.to_i, b.to_i) end # set scroll area view.set_scrarea Tk.mainloop --AP2g/MAC+5xKAEJP--