NamgraphView.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:15k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #Copyright (C) 1998 by USC/ISI
  2. # All rights reserved.
  3. #
  4. # Redistribution and use in source and binary forms are permitted
  5. # provided that the above copyright notice and this paragraph are
  6. # duplicated in all such forms and that any documentation, advertising
  7. # materials, and other materials related to such distribution and use
  8. # acknowledge that the software was developed by the University of
  9. # Southern California, Information Sciences Institute.  The name of the
  10. # University may not be used to endorse or promote products derived from
  11. # this software without specific prior written permission.
  12. #
  13. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  14. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  15. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16. #
  17. Class NamgraphView -superclass Observer
  18. NamgraphView set WinWidth  600
  19. NamgraphView set WinHeight 400
  20. NamgraphView instproc init { title ob minx maxx miny maxy tag } {
  21.     $self next
  22.     $self instvar id_ title_ modelobj_ winname_ minx_ maxx_ miny_ maxy_
  23.     $self instvar slidetag_ timeslider
  24.     set title_ $title
  25.     set modelobj_ $ob
  26.     set slidetag_ $tag
  27.     #window's name
  28.     set winname_ .namgraph-$id_
  29.     set minx_ $minx
  30.     set miny_ $miny
  31.     set maxx_ $maxx
  32.     set maxy_ $maxy
  33.     if { $slidetag_ != 1 } {
  34.        set timeslider(swidth) [$modelobj_ set timeslider_swidth_]
  35.     }
  36.     $self formwindow
  37. }
  38. NamgraphView instproc formwindow {} {
  39.     $self instvar title_ winname_ minx_ maxx_ miny_ maxy_ id_ modelobj_
  40.     $self instvar slidetag_ timeslider
  41.     toplevel $winname_
  42.     set s $winname_
  43.     wm title $s "$title_-$id_"
  44.     set welcome [Animator set welcome]
  45.  
  46.     #
  47.     # Menubar
  48.     #
  49.     set width_ [NamgraphView set WinWidth]
  50.     set height_ [NamgraphView set WinHeight]
  51.     frame $s.menubar -bd 2 -width $width_ -relief raised
  52.     menubutton $s.menubar.file -underline 0 -text "File" 
  53.         -menu $s.menubar.file.menu
  54.     menu $s.menubar.file.menu
  55.     $s.menubar.file.menu add command -label "Save As ..." 
  56.         -underline 0 -command "puts OJ" 
  57.         -state disabled
  58.     # collect garbage ???
  59.     $s.menubar.file.menu add command -label "Close" 
  60.         -underline 1 -command "destroy $winname_" 
  61.     menubutton $s.menubar.edit -underline 0 -text "Edit" 
  62.         -menu $s.menubar.edit.menu -state disabled
  63.     menu $s.menubar.edit.menu
  64.     $s.menubar.edit.menu add command -label "Preferences" 
  65.         -underline 0 -command "puts OJ" -state disabled
  66.     # find menu items in the model
  67.     menubutton $s.menubar.view -underline 0 -text "View" 
  68.         -menu $s.menubar.view.menu
  69.     menu $s.menubar.view.menu
  70.     foreach menuindex_ [$modelobj_ array names dataname] {
  71.         set menuname_ [$modelobj_ set dataname($menuindex_)]
  72. $self tkvar $menuindex_
  73.    set $menuindex_ 1
  74.         $s.menubar.view.menu add checkbutton -label $menuname_ 
  75.     -variable [$self tkvarname $menuindex_] 
  76.     -command "$self RefreshWin $menuindex_"
  77.     }
  78.     # Mix old pack with new grid
  79.     pack $s.menubar.file -side left
  80.     pack $s.menubar.edit -side left
  81.     pack $s.menubar.view -side left
  82.     #
  83.     # keyboard shortcuts
  84.     #
  85.     bind $s <Control-w> "destroy $s"
  86.     bind $s <Control-W> "destroy $s"
  87.     bind $s <Control-q> "[AnimControl instance] done"
  88.     bind $s <Control-Q> "[AnimControl instance] done"
  89.     #   
  90.     # Main Area
  91.     #
  92.     
  93.     frame $s.main -bd 2
  94.     canvas $s.main.c -width $width_ -height $height_ -background #ffffff
  95.     # bind action for zoom etc.
  96.     $s.main.c bind clickable <Button-1> "$self startclick %W %x %y"
  97.     $s.main.c bind clickable <Enter> "$self showclick %W %x %y"
  98.     $s.main.c bind clickable <Leave> "$self endshow %W %x %y"
  99.     $s.main.c bind clickable <ButtonRelease-1> "$self endclick %W %x %y"
  100.     bind $s.main.c <Button-1> "$self startrect %W %x %y"
  101.     bind $s.main.c <B1-Motion> "$self dragrect %W %x %y"
  102.     bind $s.main.c <ButtonRelease-1> "$self endrect %W %x %y"
  103.     canvas $s.main.c.cl -width 16 -height 400 -background #6b7787
  104.     canvas $s.main.c.cr -width 16 -height 400 -background #6b7787
  105.     pack $s.main.c.cl -side left -fill y
  106.     pack $s.main.c.cr -side right -fill y
  107.     pack $s.main.c -side left -fill both -expand yes
  108.     $self build.c0 $s.main.c
  109.     # Synchronize timerslider
  110. #    if { $slidetag_ == 1 } {
  111. #  set an_id [$modelobj_ set animator_id_]
  112. #        frame $s.slider -bd 1 -relief flat
  113. #        frame $s.slider.timer -bd 1 -relief flat
  114. #        $an_id build-slider $s.slider.timer
  115. #        pack  $s.slider.timer -side left -expand true -fill x
  116. #    }
  117.     if { $slidetag_ == 1 } {
  118.         frame $s.slider -bd 1 -relief flat
  119.         set an_id [$modelobj_ set animator_id_]
  120.         set mslider [$an_id getmainslidermodel]
  121.         set vslider [new TimesliderNamgraphView $s.slider $mslider]
  122.         $vslider setattachedView $self
  123.         set timeslider(swidth) [$vslider set timeslider(swidth)]
  124.         $modelobj_ set timeslider_swidth_ $timeslider(swidth)
  125.         $mslider addObserver $vslider
  126.     }
  127.     # Status Area
  128.     
  129.     frame $s.status -relief flat -borderwidth 1  -background #6b7787
  130.     label $s.status.rem -text $welcome -textvariable 
  131.         remark -relief sunken
  132.     pack $s.status.rem -side left -fill both -expand yes
  133.     # All widgets are in the same column;
  134.     # and each take up one row.
  135.     #
  136.     # Each widget is sticky to all four edges
  137.     #   so that it expands to fit.
  138.     #
  139.     grid config $s.menubar -column 0 -row 0 
  140.             -columnspan 1 -rowspan 1 -sticky "snew"
  141.     grid config $s.main    -column 0 -row 1 
  142.             -columnspan 1 -rowspan 1 -sticky "snew"
  143. #    set slidetag_ 1
  144.     if { $slidetag_ == 1 } {
  145.         grid config $s.slider  -column 0 -row 2 
  146.             -columnspan 1 -rowspan 1 -sticky "snew"
  147.         grid config $s.status  -column 0 -row 3 
  148.             -columnspan 1 -rowspan 1 -sticky "snew"
  149.     } else {
  150.         grid config $s.status  -column 0 -row 2 
  151.             -columnspan 1 -rowspan 1 -sticky "snew"
  152.     }
  153.     #
  154.     # Set up grid for resizing.
  155.     #
  156.     # Column 0 (the only one) gets the extra space.
  157.     grid columnconfigure $s 0 -weight 1
  158.     # Row 2 (the main area) gets the extra space.
  159.     grid rowconfigure $s 1 -weight 1
  160. }
  161. NamgraphView instproc RefreshWin { indexname } {
  162. #    $self tkvar $indexname
  163. #    $self instvar modelobj_
  164.  
  165.     $self instvar current_win_
  166.     
  167.     $self view_callback $current_win_
  168. #    set index_ [set $indexname]
  169. #    set plotdata [$modelobj_ set dataname($indexname)]
  170. #    if { $index_ == 1 } {
  171. #  puts "plot data - $plotdata"
  172. #    } else {
  173. # puts "delete data - $plotdata"
  174. #    }
  175. }
  176. NamgraphView instproc build.c0 { w } {
  177.     $self instvar current_win_ $w
  178.     set current_win_ $w
  179.      
  180.     bind $w <Configure> "$self view_callback $w"
  181. }   
  182. NamgraphView instproc view_callback { w } {
  183.     $self instvar modelobj_ slidetag_ 
  184.     $self instvar minx_ maxx_ miny_ maxy_
  185.     $w delete all
  186.     foreach menuindex_ [$modelobj_ array names dataname] {
  187.         $self tkvar $menuindex_
  188. set menuvalue [set $menuindex_]
  189. if { $menuvalue == 1 } {
  190.     set plotx [$modelobj_ set dataplotx($menuindex_)]
  191.     set ploty [$modelobj_ set dataploty($menuindex_)]
  192.     set plotcolor [$modelobj_ set plotcolor($menuindex_)]
  193.     set plotmark [$modelobj_ set plotmark($menuindex_)]
  194.     set cnt 0
  195.     foreach xvalue $plotx {
  196. if { $xvalue > $minx_ && $xvalue < $maxx_ } {
  197.     $self plot_xy $w $xvalue 
  198. [lindex $ploty $cnt] $minx_ $maxx_ 
  199. $miny_ $maxy_ $plotcolor 
  200. $plotmark &slidetag_
  201. }
  202. incr cnt
  203.     }
  204. }
  205.     }
  206.     $self draw_scale_xy 0
  207. }
  208. NamgraphView instproc plot_xy { c x y minx maxx miny maxy colorname markname traceflag} {
  209.     $self instvar timeslider
  210. #    if { $x<$minx || $x>$maxx || $y<$miny || $y>$maxy } {
  211. #        $self draw_traceline $c $now $minx $maxx
  212. #        return
  213. #    }   
  214.     set scrxr [winfo width $c]
  215.     set scryb [winfo height $c] 
  216.     #adjust the width
  217.     set scrxr [expr $scrxr-$timeslider(swidth)]
  218.     set yloc [expr $scryb-(($y-$miny)*$scryb/($maxy-$miny))]
  219.     set xloc [expr $timeslider(swidth)/2 + (($x-$minx)*$scrxr/($maxx-$minx))]
  220.     $c create bitmap $xloc $yloc -bitmap "$markname" -tag clickable 
  221.         -foreground $colorname
  222. #    if {$traceflag==1} {
  223. #        $self draw_traceline $c $x $minx $maxx
  224. #    }
  225. }
  226. NamgraphView instproc draw_traceline { t } {
  227.     # draw trace line
  228.     $self instvar timeslider minx_ maxx_ current_win_ 
  229.     $self tkvar traceline
  230.     set c $current_win_
  231.     if { ($t < $minx_ ) || ($t > $maxx_) } {
  232.         $c delete traceline
  233.         return
  234.     }
  235.     
  236.     set scrxl [expr $timeslider(swidth)/2]
  237.     set scryt 0
  238.     
  239.     set scrxr [winfo width $c]
  240.     set scryb [winfo height $c]
  241.     set scrxr [expr $scrxr-$timeslider(swidth)]
  242.     #redraw the data on the screen 
  243.     
  244.     set traceline_x [expr $scrxl + ($t-$minx_)*$scrxr/($maxx_-$minx_)]
  245.     $c delete traceline
  246.     $c addtag traceline withtag 
  247.         [$c create line $traceline_x 0 $traceline_x $scryb -fill red]
  248.     
  249. }
  250. NamgraphView instproc startclick {w x y} {
  251.     $self instvar draglocation
  252.     
  253.     catch {unset draglocation}
  254.     set draglocation(obj) [$w find closest $x $y]
  255.     
  256.     set draglocation(origx) $x
  257.     set draglocation(origy) $y
  258. }   
  259.     
  260.     
  261. # set time to the current point
  262. NamgraphView instproc endclick { w x y } {
  263.     
  264.     $self instvar draglocation timeslider maxx_ minx_ modelobj_
  265.     
  266.     if { $x == $draglocation(origx) && $y == $draglocation(origy)} {
  267.     
  268.         #decide current time
  269.         set width [winfo width $w]
  270.         #adjust the width
  271.         set width [expr $width-$timeslider(swidth)]
  272.         set x [expr $x-$timeslider(swidth)/2]
  273.         set t [expr $minx_+($maxx_-$minx_)*$x/$width]
  274.         # user control part, good solution ?
  275.   set animator [$modelobj_ animator]
  276.         $animator settime $t
  277.     }
  278.     
  279. }
  280. #show current packet info
  281. NamgraphView instproc showclick { w x y } {
  282.     set z [$self viewloc_proc $w $x $y]
  283.     set show_msg "Packet # [lindex $z 1] at time [lindex $z 0]"
  284.     catch {destroy $w.f}
  285.     frame $w.f -relief groove -borderwidth 2
  286.     message $w.f.msg -width 8c -text $show_msg
  287.     pack $w.f.msg
  288.     pack $w.f
  289.     catch {place_frame $w $w.f [expr $x+10] [expr $y+10]}
  290. }
  291. NamgraphView instproc endshow { w x y } {
  292.     catch {destroy $w.f}
  293. }
  294. #Utilities: obj location processing
  295. NamgraphView instproc viewloc_proc  { w x y } {
  296.     $self instvar timeslider 
  297.   minx_ maxx_ miny_ maxy_
  298.     #map the x,y to time and seqno range
  299.     set width [winfo width $w]
  300.     set height [winfo height $w]
  301.     #adjust the width
  302.     set width [expr $width-$timeslider(swidth)]
  303.     set x [expr $x-$timeslider(swidth)/2]
  304.     set x [expr $minx_+($maxx_-$minx_)*$x/$width]
  305.     set y  [expr $miny_+1.0*($maxy_-$miny_)*($height-$y)/$height]
  306.     set z [format "%7.5f %10.0f" $x $y ]
  307.     return $z
  308. }
  309. #define zoom space 
  310.     
  311. NamgraphView instproc startrect {w x y} { 
  312.     $self instvar rectlocation
  313.     catch {unset rectlocation} 
  314.     
  315.     set rectlocation(xorig) $x
  316.     set rectlocation(yorig) $y
  317.     set tx [expr $x + 1] 
  318.     set ty [expr $y + 1]
  319.     set rectlocation(obj) 
  320.         [$w create rect $x $y $tx $ty -outline gainsboro]
  321. }
  322.     
  323. NamgraphView instproc dragrect {w x y} {
  324.     $self instvar rectlocation
  325.     $w delete $rectlocation(obj)
  326.     set rectlocation(obj) 
  327.         [$w create rect $rectlocation(xorig) $rectlocation(yorig) 
  328.                 $x $y -outline gainsboro]
  329. }   
  330. NamgraphView instproc endrect {w x y} {
  331.     $self instvar timeslider title_ modelobj_ rectlocation
  332.     $self instvar minx_ maxx_ miny_ maxy_
  333.     $w delete $rectlocation(obj)
  334.     if { $x == $rectlocation(xorig) || $y == $rectlocation(yorig)} {return}
  335.     #map the x,y to time and seqno range
  336.     set width [winfo width $w]
  337.     set height [winfo height $w]
  338.  
  339.     #adjust the width
  340.     set width [expr $width-$timeslider(swidth)]
  341.     set x [expr $x-$timeslider(swidth)/2]
  342.     set rectlocation(xorig) [expr $rectlocation(xorig)-$timeslider(swidth)/2]
  343.     # XXX adjust the value
  344.     set timestart [expr $minx_+($maxx_-$minx_)*$rectlocation(xorig)/$width]
  345.     set timeend   [expr $minx_+($maxx_-$minx_)*$x/$width]
  346.     set seqstart  [expr $miny_+1.0*($maxy_-$miny_)* 
  347.         ($height-$rectlocation(yorig))/$height]
  348.     set seqend    [expr $miny_+1.0*($maxy_-$miny_)*($height-$y)/$height]
  349.     if { $timestart > $timeend } {
  350. set tmpt $timestart
  351. set timestart $timeend
  352. set timeend $tmpt
  353.     }
  354.     if { $seqstart > $seqend } {
  355. set tmpt $seqstart
  356. set seqstart $seqend
  357. set seqend $tmpt
  358.     }
  359.     #create a new NamgraphView (zoomed)
  360.     set zoomview [new NamgraphView $title_ $modelobj_ $timestart 
  361.      $timeend $seqstart $seqend "ZOOM"]
  362.     $modelobj_ addObserver $zoomview
  363. }
  364. NamgraphView instproc startmove {w o x y} {
  365.     $self instvar rectlocation
  366.     scan [$w coords $o] "%f %f %f %f" x1 y1 x2 y2
  367.     set rectlocation(x) [expr abs($x - $x1)]
  368.     set rectlocation(y) [expr abs($y - $y1)]
  369. }
  370. NamgraphView instproc moverect {w o x y} {
  371.     $self instvar rectlocation
  372.     scan [$w coords $o] "%f %f %f %f" x1 y1 x2 y2
  373.     set dx [expr $x - $x1 - $rectlocation(x)]
  374.     set dy [expr $y - $y1 - $rectlocation(y)]
  375.     $w move $o $dx $dy
  376. }
  377. #
  378. # mode = 0: Draw scale in free mode
  379. # mode = 1: Draw scale in integer (fully) mode
  380. # mode = 2: Draw scale in integer (evenly) mode
  381. #
  382. NamgraphView instproc draw_scale_xy { mode } {
  383.     $self instvar timeslider minx_ maxx_ miny_ maxy_ current_win_
  384.     $self instvar modelobj_
  385.     set c $current_win_
  386.     set scrxl [expr $timeslider(swidth)/2]
  387.     set scryt 0
  388.     set scrxr [winfo width $c]
  389.     set scryb [winfo height $c]
  390.     #adjust the width
  391.     set scrxr [expr $scrxr-$timeslider(swidth)]
  392.     set nxpoints 8
  393.     set nypoints 6
  394.     set yincr [expr ($maxy_-$miny_)/$nypoints.0]
  395.     set xincr [expr ($maxx_-$minx_)/$nxpoints.0]
  396.     for {set i 1} {$i<$nypoints} {incr i} {
  397.         #set ypos [expr $scryb-($scryb/$nypoints.0)*$i]
  398. set yval [expr $miny_+$i*$yincr]
  399. set yval [expr int($yval)]
  400.         set ypos [expr $scryb-($scryb*($yval-$miny_)/($maxy_-$miny_))]
  401. set yval [$modelobj_ verifyymark $yval]
  402.         #set yval [format "%+15.5f" [expr $miny_+$i*$yincr]]
  403.         $c create line $scrxl $ypos [expr $scrxl+10] $ypos -fill #6725a0
  404.         $c create text [expr $scrxl+15] [expr $ypos-7] -text $yval -anchor nw 
  405.             -justify left -fill #6725a0 
  406.             -font "-adobe-new century schoolbook-medium-r-normal--10-100-75-75-p-60-iso8859-1"
  407.    }
  408.     for {set i 1} {$i<$nxpoints} {incr i} {
  409.         set xpos [expr ($scrxr/$nxpoints.0)*$i + $scrxl]
  410.         set xval [format "%+7.5f" [expr $minx_+($i*$xincr)]]
  411.         $c create line $xpos 0 $xpos 10 -fill #6725a0
  412.         $c create text  $xpos 15 -text $xval -anchor n
  413.             -justify left -fill #6725a0 
  414.         -font "-adobe-new century schoolbook-medium-r-normal--10-100-75-75-p-60-iso8859-1"
  415.    }
  416. }
  417. #-----------------------------------------------------------------------
  418. # NamgraphView instproc update { time }
  419. #   - extracts the time value from a nam event
  420. #     and updates the trace line on a namGraph to that point 
  421. #
  422. #-----------------------------------------------------------------------
  423. NamgraphView instproc update { time } {
  424.     $self instvar now_ winname_ modelobj_
  425.     if ![winfo exists $winname_ ] {
  426. $modelobj_ deleteObserver $self
  427. $self destroy
  428. return
  429.     }
  430.     if { [string compare $time "*"] != 0 } {
  431. set now_ $time
  432.         $self draw_traceline $now_
  433.     }
  434. }