Changeset 1342 for trunk/gui/scripts/deviceViewer1D.tcl
- Timestamp:
- Mar 18, 2009 2:59:21 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/scripts/deviceViewer1D.tcl
r782 r1342 40 40 public method controls {option args} 41 41 public method download {option args} 42 42 43 43 protected method _loadDevice {} 44 44 protected method _loadParameters {frame path} … … 62 62 private variable _marker ;# marker currently being edited 63 63 } 64 64 65 65 itk::usual DeviceViewer1D { 66 66 } … … 75 75 76 76 itk_component add tabs { 77 78 79 77 blt::tabset $itk_interior.tabs -borderwidth 0 -relief flat \ 78 -side bottom -tearoff 0 \ 79 -selectcommand [itcl::code $this _changeTabs] 80 80 } { 81 82 83 84 85 86 87 81 keep -activebackground -activeforeground 82 keep -background -cursor -font 83 rename -highlightbackground -background background Background 84 keep -highlightcolor -highlightthickness 85 keep -tabbackground -tabforeground 86 rename -selectbackground -background background Background 87 rename -selectforeground -foreground foreground Foreground 88 88 } 89 89 pack $itk_component(tabs) -expand yes -fill both 90 90 91 91 itk_component add -protected inner { 92 92 frame $itk_component(tabs).inner 93 93 } 94 94 95 95 itk_component add top { 96 96 frame $itk_component(inner).top 97 97 } 98 98 pack $itk_component(top) -fill x 99 99 100 100 itk_component add layout { 101 101 Rappture::DeviceLayout1D $itk_component(inner).layout 102 102 } 103 103 pack $itk_component(layout) -side top -fill x -pady 4 104 104 105 105 itk_component add graph { 106 107 106 blt::graph $itk_component(inner).graph \ 107 -highlightthickness 0 -plotpadx 0 -plotpady 0 108 108 } { 109 109 keep -background -foreground -cursor -font 110 110 } 111 111 pack $itk_component(graph) -expand yes -fill both … … 113 113 114 114 bind $itk_component(graph) <Configure> " 115 116 115 [list after cancel [list catch [itcl::code $this _align]]] 116 [list after 100 [list catch [itcl::code $this _align]]] 117 117 " 118 118 119 119 itk_component add geditor { 120 121 122 123 120 Rappture::Editor $itk_component(graph).editor \ 121 -activatecommand [itcl::code $this _marker activate] \ 122 -validatecommand [itcl::code $this _marker validate] \ 123 -applycommand [itcl::code $this _marker apply] 124 124 } 125 125 126 126 itk_component add devcntls { 127 127 Rappture::Notebook $itk_component(inner).devcntls 128 128 } 129 129 pack $itk_component(devcntls) -side bottom -fill x … … 141 141 set _device "" 142 142 foreach name [array names _tab2fields] { 143 143 eval itcl::delete object $_tab2fields($name) 144 144 } 145 145 after cancel [list catch [itcl::code $this _fixAxes]] … … 158 158 itcl::body Rappture::DeviceViewer1D::add {dataobj {settings ""}} { 159 159 array set params { 160 161 162 163 164 165 166 160 -color auto 161 -brightness 0 162 -width 1 163 -raise 0 164 -linestyle solid 165 -description "" 166 -param "" 167 167 } 168 168 foreach {opt val} $settings { 169 170 171 172 169 if {![info exists params($opt)]} { 170 error "bad settings \"$opt\": should be [join [lsort [array names params]] {, }]" 171 } 172 set params($opt) $val 173 173 } 174 174 … … 176 176 177 177 if {$pos < 0} { 178 179 180 181 182 183 184 185 186 178 if {![Rappture::library isvalid $dataobj]} { 179 error "bad value \"$dataobj\": should be Rappture::library object" 180 } 181 182 lappend _dlist $dataobj 183 set _dobj2raise($dataobj) $params(-raise) 184 185 after cancel [list catch [itcl::code $this _loadDevice]] 186 after idle [list catch [itcl::code $this _loadDevice]] 187 187 } 188 188 } … … 198 198 set dlist $_dlist 199 199 foreach obj $dlist { 200 201 202 203 204 205 206 200 if {[info exists _dobj2raise($obj)] && $_dobj2raise($obj)} { 201 set i [lsearch -exact $dlist $obj] 202 if {$i >= 0} { 203 set dlist [lreplace $dlist $i $i] 204 lappend dlist $obj 205 } 206 } 207 207 } 208 208 return $dlist … … 217 217 itcl::body Rappture::DeviceViewer1D::delete {args} { 218 218 if {[llength $args] == 0} { 219 219 set args $_dlist 220 220 } 221 221 … … 223 223 set changed 0 224 224 foreach dataobj $args { 225 226 227 228 229 230 225 set pos [lsearch -exact $_dlist $dataobj] 226 if {$pos >= 0} { 227 set _dlist [lreplace $_dlist $pos $pos] 228 catch {unset _dobj2raise($dataobj)} 229 set changed 1 230 } 231 231 } 232 232 233 233 # if anything changed, then rebuild the plot 234 234 if {$changed} { 235 236 235 after cancel [list catch [itcl::code $this _loadDevice]] 236 after idle [list catch [itcl::code $this _loadDevice]] 237 237 } 238 238 } … … 248 248 itcl::body Rappture::DeviceViewer1D::controls {option args} { 249 249 switch -- $option { 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 250 insert { 251 if {[llength $args] != 3} { 252 error "wrong # args: should be \"controls insert pos xmlobj path\"" 253 } 254 set pos [lindex $args 0] 255 set xmlobj [lindex $args 1] 256 set path [lindex $args 2] 257 if {[string match *structure.parameters* $path]} { 258 } elseif {[string match structure.components* $path]} { 259 $itk_component(layout) controls insert $pos $xmlobj $path 260 } 261 } 262 default { 263 error "bad option \"$option\": should be insert" 264 } 265 265 } 266 266 } … … 279 279 itcl::body Rappture::DeviceViewer1D::download {option args} { 280 280 switch $option { 281 282 283 284 285 286 287 288 289 290 291 292 293 281 coming { 282 # nothing to do 283 } 284 controls { 285 # no controls for this download yet 286 return "" 287 } 288 now { 289 return "" ;# not implemented yet! 290 } 291 default { 292 error "bad option \"$option\": should be coming, controls, now" 293 } 294 294 } 295 295 } … … 308 308 # 309 309 foreach name [array names _tab2fields] { 310 310 eval itcl::delete object $_tab2fields($name) 311 311 } 312 312 catch {unset _tab2fields} … … 314 314 315 315 if {[winfo exists $itk_component(top).cntls]} { 316 316 $itk_component(top).cntls delete 0 end 317 317 } 318 318 … … 322 322 # 323 323 if {$_device != ""} { 324 325 326 327 328 329 330 331 332 324 foreach nn [$_device children fields] { 325 set name [$_device get fields.$nn.about.label] 326 if {$name == ""} { 327 set name $nn 328 } 329 330 set fobj [Rappture::Field ::#auto $_device fields.$nn] 331 lappend _tab2fields($name) $fobj 332 } 333 333 } 334 334 set tabs [lsort [array names _tab2fields]] 335 335 336 336 if {[$itk_component(tabs) size] > 0} { 337 337 $itk_component(tabs) delete 0 end 338 338 } 339 339 340 340 if {[llength $tabs] <= 0} { 341 342 343 344 345 346 347 348 349 350 351 352 341 # 342 # No fields? Then we don't need to bother with tabs. 343 # Just pack the inner frame directly. If there are no 344 # fields, get rid of the graph. 345 # 346 pack $itk_component(inner) -expand yes -fill both 347 if {[llength $tabs] > 0} { 348 pack $itk_component(graph) -expand yes -fill both 349 } else { 350 pack forget $itk_component(graph) 351 $itk_component(layout) configure -leftmargin 0 -rightmargin 0 352 } 353 353 } else { 354 355 356 357 358 359 360 361 362 363 364 365 366 354 # 355 # Two or more fields? Then create a tab for each field 356 # and select the first one by default. Make sure the 357 # graph is packed. 358 # 359 pack forget $itk_component(inner) 360 pack $itk_component(graph) -expand yes -fill both 361 362 foreach name $tabs { 363 $itk_component(tabs) insert end $name \ 364 -activebackground $itk_option(-background) 365 } 366 $itk_component(tabs) select 0 367 367 } 368 368 … … 375 375 # 376 376 if {$_device != ""} { 377 377 _loadParameters $itk_component(top) parameters 378 378 } 379 379 … … 388 388 # 389 389 $itk_component(graph) configure \ 390 390 -rightmargin [$itk_component(layout) extents bar3D] 391 391 392 392 after cancel [list catch [itcl::code $this _fixSize]] … … 404 404 itcl::body Rappture::DeviceViewer1D::_loadParameters {frame path} { 405 405 foreach cname [$_device children $path] { 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 406 set handled 0 407 set type [$_device element -as type $path.$cname] 408 if {$type == "about"} { 409 continue 410 } 411 if {$type == "number"} { 412 set name [$_device element -as id $path.$cname] 413 414 # look for a field that uses this parameter 415 set found "" 416 foreach fname [$_device children fields] { 417 foreach comp [$_device children fields.$fname] { 418 set v [$_device get fields.$fname.$comp.constant] 419 if {[string equal $v $name]} { 420 set found "fields.$fname.$comp" 421 break 422 } 423 } 424 if {"" != $found} break 425 } 426 427 if {"" != $found} { 428 set _field2parm($found) $name 429 set handled 1 430 } 431 } 432 433 # 434 # Any parameter that was not handled above should be handled 435 # here, by adding it to a control panel above the device 436 # layout area. 437 # 438 if {!$handled} { 439 if {![winfo exists $frame.cntls]} { 440 Rappture::Controls $frame.cntls $_owner 441 pack $frame.cntls -expand yes -fill both 442 } 443 $frame.cntls insert end $path.$cname 444 445 # 446 # If this is a group, then we must add its children 447 # recursively. 448 # 449 if {$type == "group"} { 450 set gr [$frame.cntls control -value end] 451 _loadParameters [$gr component inner] $path.$cname 452 } 453 } 454 454 } 455 455 } … … 470 470 set i [$itk_component(tabs) index select] 471 471 if {$i != ""} { 472 473 474 472 set name [$itk_component(tabs) get $i] 473 $itk_component(tabs) tab configure $name \ 474 -window $itk_component(inner) -fill both 475 475 } else { 476 476 set name [lindex [array names _tab2fields] 0] 477 477 } 478 478 … … 485 485 foreach {zmin zmax} [$itk_component(layout) limits] { break } 486 486 if {$zmin != "" && $zmin < $zmax} { 487 487 $graph axis configure x -min $zmin -max $zmax 488 488 } 489 489 490 490 if {$_device != ""} { 491 492 493 494 495 496 491 set units [$_device get units] 492 if {$units != "arbitrary"} { 493 $graph axis configure x -hide no -title "Position ($units)" 494 } else { 495 $graph axis configure x -hide yes 496 } 497 497 } else { 498 498 $graph axis configure x -hide no -title "Position" 499 499 } 500 500 … … 504 504 set flist "" 505 505 if {[info exists _tab2fields($name)]} { 506 506 set flist $_tab2fields($name) 507 507 } 508 508 509 509 set n 0 510 510 foreach fobj $flist { 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 511 catch {unset hints} 512 array set hints [$fobj hints] 513 514 if {[info exists hints(units)]} { 515 set _units $hints(units) 516 $graph axis configure y -title "$name ($hints(units))" 517 } else { 518 set _units "" 519 $graph axis configure y -title $name 520 } 521 522 if {[info exists hints(scale)] 523 && [string match log* $hints(scale)]} { 524 $graph axis configure y -logscale yes 525 } else { 526 $graph axis configure y -logscale no 527 } 528 529 foreach comp [$fobj components] { 530 # can only handle 1D meshes here 531 if {[$fobj components -dimensions $comp] != "1D"} { 532 continue 533 } 534 535 set elem "elem[incr n]" 536 set xv [$fobj mesh $comp] 537 set yv [$fobj values $comp] 538 539 $graph element create $elem -x $xv -y $yv \ 540 -color black -symbol "" -linewidth 2 541 542 if {[info exists hints(color)]} { 543 $graph element configure $elem -color $hints(color) 544 } 545 546 foreach {path x y val} [$fobj controls get $comp] { 547 if {$path != ""} { 548 set id "control[incr n]" 549 $graph marker create text -coords [list $x $y] \ 550 -text $val -anchor s -name $id -background "" 551 $graph marker bind $id <Enter> \ 552 [itcl::code $this _marker enter $id] 553 $graph marker bind $id <Leave> \ 554 [itcl::code $this _marker leave $id] 555 $graph marker bind $id <ButtonPress> \ 556 [itcl::code $this _marker edit $id $fobj/$path] 557 } 558 } 559 } 560 560 } 561 561 … … 590 590 set graph $itk_component(graph) 591 591 if {![winfo ismapped $graph]} { 592 593 594 592 after cancel [list catch [itcl::code $this _fixAxes]] 593 after 100 [list catch [itcl::code $this _fixAxes]] 594 return 595 595 } 596 596 … … 607 607 608 608 if {$log} { 609 610 609 set min [expr {0.9*$min}] 610 set max [expr {1.1*$max}] 611 611 } else { 612 613 614 615 616 617 618 619 620 621 612 if {$min > 0} { 613 set min [expr {0.95*$min}] 614 } else { 615 set min [expr {1.05*$min}] 616 } 617 if {$max > 0} { 618 set max [expr {1.05*$max}] 619 } else { 620 set max [expr {0.95*$max}] 621 } 622 622 } 623 623 … … 626 626 set h [expr {[font metrics $fnt -linespace] + 5}] 627 627 foreach mname [$graph marker names] { 628 629 630 631 632 628 set xy [$graph marker cget $mname -coord] 629 foreach {x y} [eval $graph transform $xy] { break } 630 set y [expr {$y-$h}] ;# find top of text in pixels 631 foreach {x y} [eval $graph invtransform [list 0 $y]] { break } 632 if {$y > $max} { set max $y } 633 633 } 634 634 635 635 if {$log} { 636 637 636 set min [expr {pow(10.0,floor(log10($min)))}] 637 set max [expr {pow(10.0,ceil(log10($max)))}] 638 638 } else { 639 640 639 set min [expr {0.1*floor(10*$min)}] 640 set max [expr {0.1*ceil(10*$max)}] 641 641 } 642 642 … … 685 685 itcl::body Rappture::DeviceViewer1D::_marker {option {name ""} {path ""}} { 686 686 switch -- $option { 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 687 enter { 688 $itk_component(graph) marker configure $name -background #e5e5e5 689 # 690 # BE CAREFUL: Need an update here to force the graph to 691 # refresh itself or else a subsequent click on the 692 # marker will ignore the text that was recently changed, 693 # and fail to generate a <ButtonPress> event! 694 # 695 update idletasks 696 } 697 leave { 698 $itk_component(graph) marker configure $name -background "" 699 # 700 # BE CAREFUL: Need an update here to force the graph to 701 # refresh itself or else a subsequent click on the 702 # marker will ignore the text that was recently changed, 703 # and fail to generate a <ButtonPress> event! 704 # 705 update idletasks 706 } 707 edit { 708 set _marker(name) $name 709 set _marker(fobj) [lindex [split $path /] 0] 710 set _marker(path) [lindex [split $path /] 1] 711 $itk_component(geditor) activate 712 } 713 activate { 714 set g $itk_component(graph) 715 set val [$g marker cget $_marker(name) -text] 716 foreach {x y} [$g marker cget $_marker(name) -coords] { break } 717 foreach {x y} [$g transform $x $y] { break } 718 set x [expr {$x + [winfo rootx $g] - 4}] 719 set y [expr {$y + [winfo rooty $g] - 5}] 720 721 set fnt $itk_option(-font) 722 set h [expr {[font metrics $fnt -linespace] + 2}] 723 set w [expr {[font measure $fnt $val] + 5}] 724 725 return [list text $val \ 726 x [expr {$x-$w/2}] \ 727 y [expr {$y-$h}] \ 728 w $w \ 729 h $h] 730 } 731 validate { 732 if {$_units != ""} { 733 if {[catch {Rappture::Units::convert $name \ 734 -context $_units -to $_units} result] != 0} { 735 if {[regexp {^bad.*: +(.)(.+)} $result match first tail] 736 || [regexp {(.)(.+)} $result match first tail]} { 737 set result "[string toupper $first]$tail" 738 } 739 bell 740 Rappture::Tooltip::cue $itk_component(geditor) $result 741 return 0 742 } 743 } 744 if {[catch {$_marker(fobj) controls validate $_marker(path) $name} result]} { 745 bell 746 Rappture::Tooltip::cue $itk_component(geditor) $result 747 return 0 748 } 749 return 1 750 } 751 apply { 752 if {$_units != ""} { 753 catch {Rappture::Units::convert $name \ 754 -context $_units -to $_units} value 755 } else { 756 set value $name 757 } 758 759 $_marker(fobj) controls put $_marker(path) $value 760 $_owner changed $_marker(path) 761 event generate $itk_component(hull) <<Edit>> 762 763 _changeTabs 764 } 765 765 } 766 766 } … … 776 776 set presets "" 777 777 foreach pre [$libObj children -type preset $path] { 778 779 780 778 lappend presets \ 779 [$libObj get $path.$pre.value] \ 780 [$libObj get $path.$pre.label] 781 781 } 782 782 … … 784 784 set units [$libObj get $path.units] 785 785 if {$units != ""} { 786 787 788 789 786 set desc [Rappture::Units::description $units] 787 if {[string match temperature* $desc]} { 788 set type Rappture::TemperatureGauge 789 } 790 790 } 791 791 … … 793 793 set w "$container.gauge[incr counter]" 794 794 while {[winfo exists $w]} { 795 795 set w "$container.gauge[incr counter]" 796 796 } 797 797 … … 811 811 812 812 if {$type == "Rappture::Gauge" && "" != $min && "" != $max} { 813 814 815 816 817 818 819 820 821 822 813 set color [$libObj get $path.color] 814 if {$color == ""} { 815 set color blue 816 } 817 if {$units != ""} { 818 set min [Rappture::Units::convert $min -to $units -units off] 819 set max [Rappture::Units::convert $max -to $units -units off] 820 } 821 $w configure -spectrum [Rappture::Spectrum ::#auto [list \ 822 $min white $max $color] -units $units] 823 823 } 824 824 825 825 set str [$libObj get $path.label] 826 826 if {$str != ""} { 827 828 829 830 831 832 833 834 835 827 set help [$libObj get $path.help] 828 if {"" != $help} { 829 append str "\n$help" 830 } 831 if {$units != ""} { 832 set desc [Rappture::Units::description $units] 833 append str "\n(units of $desc)" 834 } 835 Rappture::Tooltip::for $w $str 836 836 } 837 837 838 838 set str [$libObj get $path.icon] 839 839 if {$str != ""} { 840 840 $w configure -image [image create photo -data $str] 841 841 } 842 842 } … … 864 864 itcl::configbody Rappture::DeviceViewer1D::device { 865 865 if {$itk_option(-device) != ""} { 866 867 868 866 if {![Rappture::library isvalid $itk_option(-device)]} { 867 error "bad value \"$itk_option(-device)\": should be Rappture::Library" 868 } 869 869 } 870 870 871 871 delete 872 872 if {"" != $itk_option(-device)} { 873 873 add $itk_option(-device) 874 874 } 875 875 _loadDevice
Note: See TracChangeset
for help on using the changeset viewer.