Changeset 5101
- Timestamp:
- Mar 8, 2015 3:23:52 AM (6 years ago)
- Location:
- branches/1.4/gui/scripts
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/1.4/gui/scripts/flowvisviewer.tcl
r5095 r5101 1 # -*- mode: tcl; indent-tabs-mode: nil -*- 1 # -*- mode: tcl; indent-tabs-mode: nil -*- 2 2 # ---------------------------------------------------------------------- 3 3 # COMPONENT: flowvisviewer - 3D flow rendering 4 #5 4 # 6 5 # This widget performs volume and flow rendering on 3D scalar/vector datasets. … … 65 64 public method limits { cname } 66 65 public method overMarker { m x } 67 public method parameters {title args} { 68 # do nothing 66 public method parameters {title args} { 67 # do nothing 69 68 } 70 69 public method removeDuplicateMarker { m x } … … 89 88 private method CurrentVolumeIds {{what -all}} 90 89 private method Disconnect {} 91 private method EventuallyResize { w h } 92 private method EventuallyGoto { nSteps } 93 private method EventuallyResizeLegend { } 90 private method EventuallyResize { w h } 91 private method EventuallyGoto { nSteps } 92 private method EventuallyResizeLegend { } 94 93 private method FlowCmd { dataobj comp nbytes extents } 95 private method GetDatasetsWithComponent { cname } 94 private method GetDatasetsWithComponent { cname } 96 95 private method GetFlowInfo { widget } 97 96 private method GetMovie { widget width height } … … 103 102 private method ParseLevelsOption { tf levels } 104 103 private method ParseMarkersOption { tf markers } 105 private method QuaternionToView { q } { 104 private method QuaternionToView { q } { 106 105 foreach { _view(-qw) _view(-qx) _view(-qy) _view(-qz) } $q break 107 106 } … … 117 116 private method Slice {option args} 118 117 private method SlicerTip {axis} 119 private method ViewToQuaternion {} { 118 private method ViewToQuaternion {} { 120 119 return [list $_view(-qw) $_view(-qx) $_view(-qy) $_view(-qz)] 121 120 } 122 121 private method WaitIcon { option widget } 123 122 private method Zoom {option} 124 private method arrows { tag name } 125 private method box { tag name } 126 private method millisecs2str { value } 127 private method particles { tag name } 128 private method str2millisecs { value } 129 private method streams { tag name } 123 private method arrows { tag name } 124 private method box { tag name } 125 private method millisecs2str { value } 126 private method particles { tag name } 127 private method str2millisecs { value } 128 private method streams { tag name } 130 129 131 130 private variable _arcball "" … … 133 132 private variable _allDataObjs 134 133 private variable _obj2ovride ;# maps dataobj => style override 135 private variable _serverObjs ;# maps dataobj-component to volume ID 134 private variable _serverObjs ;# maps dataobj-component to volume ID 136 135 # in the server 137 private variable _recvObjs ;# list of data objs to send to server136 private variable _recvObjs ;# list of data objs to send to server 138 137 private variable _obj2style ;# maps dataobj-component to transfunc 139 private variable _style2objs ;# maps tf back to list of 138 private variable _style2objs ;# maps tf back to list of 140 139 # dataobj-components using the tf. 141 private variable _obj2flow; 142 143 private variable _reset 1 ; # Connection to server has been reset140 private variable _obj2flow; # Maps dataobj-component to a flow. 141 142 private variable _reset 1 ;# Connection to server has been reset 144 143 private variable _click ;# info used for rotate operations 145 144 private variable _limits ;# autoscale min/max for all axes 146 145 private variable _view ;# view params for 3D view 147 private variable _isomarkers 146 private variable _isomarkers ;# array of isosurface level values 0..1 148 147 private common _settings 149 148 private variable _activeTf "" ;# The currently active transfer function. 150 149 private variable _first "" ;# This is the topmost volume. 151 private variable _volcomponents ; # Array of components found152 private variable _componentsList ; # Array of components found150 private variable _volcomponents ;# Array of components found 151 private variable _componentsList ;# Array of components found 153 152 private variable _nextToken 0 154 153 private variable _icon 0 155 154 private variable _flow 156 # This157 # indicates which isomarkers and transfer158 # function to use when changing markers,159 # opacity, or thickness.160 155 private common _downloadPopup ;# download options from popup 161 156 … … 198 193 $_dispatcher register !play 199 194 $_dispatcher dispatch $this !play "[itcl::code $this flow next]; list" 200 195 201 196 # Draw legend event 202 197 $_dispatcher register !goto … … 239 234 $this-qy $_view(-qy) 240 235 $this-qz $_view(-qz) 241 $this-zoom $_view(-zoom) 236 $this-zoom $_view(-zoom) 242 237 $this-xpan $_view(-xpan) 243 238 $this-ypan $_view(-ypan) … … 346 341 [itcl::code $this EventuallyResizeLegend] 347 342 348 # Hack around the Tk panewindow. The problem is that the requested 343 # Hack around the Tk panewindow. The problem is that the requested 349 344 # size of the 3d view isn't set until an image is retrieved from 350 345 # the server. So the panewindow uses the tiny size. … … 354 349 0,0 $itk_component(3dview) -fill both -reqwidth $w \ 355 350 1,0 $itk_component(legend) -fill x 356 blt::table configure $itk_component(plotarea) r1 -resize none 351 blt::table configure $itk_component(plotarea) r1 -resize none 357 352 # Create flow controls... 358 353 359 354 itk_component add flowcontrols { 360 frame $itk_interior.flowcontrols 355 frame $itk_interior.flowcontrols 361 356 } { 362 357 usual … … 405 400 -offimage [Rappture::icon flow-play] \ 406 401 -variable [itcl::scope _settings($this-play)] \ 407 -command [itcl::code $this flow toggle] 402 -command [itcl::code $this flow toggle] 408 403 } 409 404 set fg [option get $itk_component(hull) font Font] … … 457 452 } { 458 453 usual 459 ignore -highlightthickness 454 ignore -highlightthickness 460 455 rename -background -controlbackground controlBackground Background 461 456 } … … 466 461 } { 467 462 usual 468 ignore -highlightthickness 463 ignore -highlightthickness 469 464 rename -background -controlbackground controlBackground Background 470 465 } … … 476 471 } { 477 472 usual 478 ignore -highlightthickness 473 ignore -highlightthickness 479 474 rename -background -controlbackground controlBackground Background 480 475 } … … 493 488 0,4 $itk_component(dial) -fill x -padx {2 0 } \ 494 489 0,5 $itk_component(duration) -padx { 0 0} \ 495 0,7 $itk_component(speed) -padx {2 3} 496 497 # 0,6 $itk_component(speedlabel) -padx {2 0} 490 0,7 $itk_component(speed) -padx {2 3} 491 492 # 0,6 $itk_component(speedlabel) -padx {2 0} 498 493 blt::table configure $itk_component(flowcontrols) c* -resize none 499 494 blt::table configure $itk_component(flowcontrols) c4 -resize both … … 695 690 # If anything changed, then rebuild the plot 696 691 if {$changed} { 697 # Repair the reverse lookup 692 # Repair the reverse lookup 698 693 foreach tf [array names _style2objs] { 699 694 set list {} … … 728 723 -opacity 0.5 729 724 } 730 array unset _limits 731 array unset _volcomponents 725 array unset _limits 726 array unset _volcomponents 732 727 foreach dataobj $args { 733 728 if { ![$dataobj isvalid] } { … … 873 868 return 0 874 869 } 875 set _reset 1 870 set _reset 1 876 871 set result [VisViewer::Connect $_hosts] 877 872 if { $result } { … … 883 878 set info {} 884 879 set user "???" 885 880 if { [info exists env(USER)] } { 886 881 set user $env(USER) 887 882 } 888 883 set session "???" 889 884 if { [info exists env(SESSION)] } { 890 885 set session $env(SESSION) 891 886 } 892 887 lappend info "version" "$Rappture::version" 893 888 lappend info "build" "$Rappture::build" … … 990 985 $_image(plot) configure -data $bytes 991 986 #puts stderr "image received [image width $_image(plot)] by [image height $_image(plot)]" 992 } 987 } 993 988 "print" { 994 989 set tag $this-$info(-token) 995 990 set _hardcopy($tag) $bytes 996 } 991 } 997 992 "movie" { 998 993 set tag $this-$info(-token) … … 1010 1005 # The procedure is the response from the render server to each "legend" 1011 1006 # command. The server sends back a "legend" command invoked our 1012 # the slave interpreter. The purpose is to collect data of the image 1007 # the slave interpreter. The purpose is to collect data of the image 1013 1008 # representing the legend in the canvas. In addition, the isomarkers 1014 1009 # of the active transfer function are displayed. 1015 1010 # 1016 1011 # I don't know is this is the right place to display the isomarkers. 1017 # I don't know all the different paths used to draw the plot. There's 1012 # I don't know all the different paths used to draw the plot. There's 1018 1013 # "Rebuild", "add", etc. 1019 1014 # … … 1100 1095 # Called automatically whenever something changes that affects the data 1101 1096 # in the widget. Clears any existing data and rebuilds the widget to 1102 # display new data. 1097 # display new data. 1103 1098 # 1104 1099 itcl::body Rappture::FlowvisViewer::Rebuild {} { … … 1113 1108 # Turn on buffering of commands to the server. We don't want to 1114 1109 # be preempted by a server disconnect/reconnect (which automatically 1115 # generates a new call to Rebuild). 1110 # generates a new call to Rebuild). 1116 1111 StartBufferingCommands 1117 1112 … … 1461 1456 record { 1462 1457 if { [$itk_component(rewind) cget -relief] != "sunken" } { 1463 $itk_component(rewind) configure -relief sunken 1464 $itk_component(stop) configure -relief raised 1465 $itk_component(play) configure -relief raised 1458 $itk_component(rewind) configure -relief sunken 1459 $itk_component(stop) configure -relief raised 1460 $itk_component(play) configure -relief raised 1466 1461 set inner $itk_component(settingsFrame) 1467 1462 set frames [$inner.framecnt value] … … 1473 1468 stop { 1474 1469 if { [$itk_component(stop) cget -relief] != "sunken" } { 1475 $itk_component(rewind) configure -relief raised 1476 $itk_component(stop) configure -relief sunken 1477 $itk_component(play) configure -relief raised 1470 $itk_component(rewind) configure -relief raised 1471 $itk_component(stop) configure -relief sunken 1472 $itk_component(play) configure -relief raised 1478 1473 _pause 1479 1474 set cmds "flow reset" … … 1484 1479 if { [$itk_component(play) cget -relief] != "sunken" } { 1485 1480 $itk_component(rewind) configure -relief raised 1486 $itk_component(stop) configure -relief raised 1481 $itk_component(stop) configure -relief raised 1487 1482 $itk_component(play) configure \ 1488 1483 -image [Rappture::icon flow-pause] \ 1489 -relief sunken 1484 -relief sunken 1490 1485 bind $itk_component(play) <ButtonPress> \ 1491 1486 [itcl::code $this _pause] … … 1527 1522 $itk_component(play) configure \ 1528 1523 -image [Rappture::icon flow-start] \ 1529 -relief raised 1524 -relief raised 1530 1525 bind $itk_component(play) <ButtonPress> \ 1531 1526 [itcl::code $this Flow movie play toggle] … … 1555 1550 switch -- $what { 1556 1551 colormap { 1557 set color [$itk_component(colormap) value] 1558 set _settings(colormap) $color 1559 #ResetColormap $color 1552 set color [$itk_component(colormap) value] 1553 set _settings(colormap) $color 1554 #ResetColormap $color 1560 1555 } 1561 1556 light { … … 1622 1617 blt::table $itk_component(plotarea) \ 1623 1618 0,0 $itk_component(3dview) -fill both \ 1624 1,0 $itk_component(legend) -fill x 1619 1,0 $itk_component(legend) -fill x 1625 1620 blt::table configure $itk_component(plotarea) r1 -resize none 1626 1621 } else { … … 1639 1634 set bool $_settings($this-$what) 1640 1635 if { [isconnected] } { 1641 set vols [CurrentVolumeIds -cutplanes] 1636 set vols [CurrentVolumeIds -cutplanes] 1642 1637 SendCmd "cutplane state $bool $axis $vols" 1643 1638 } … … 1743 1738 # reference. 1744 1739 # 1745 # FIXME: The current way we generate transfer-function names completely 1746 # ignores the -markers option. The problem is that we are forced 1747 # to compute the name from an increasing complex set of values: 1740 # FIXME: The current way we generate transfer-function names completely 1741 # ignores the -markers option. The problem is that we are forced 1742 # to compute the name from an increasing complex set of values: 1748 1743 # color, levels, marker, opacity. I think the cow's out of the 1749 1744 # barn on this one. … … 1891 1886 $itk_component(legend) itemconfigure labels -fill $itk_option(-plotforeground) 1892 1887 $m relval $x 1893 lappend _isomarkers($tf) $m 1888 lappend _isomarkers($tf) $m 1894 1889 } 1895 1890 } else { … … 1898 1893 $itk_component(legend) itemconfigure labels -fill $itk_option(-plotforeground) 1899 1894 $m relval $x 1900 lappend _isomarkers($tf) $m 1895 lappend _isomarkers($tf) $m 1901 1896 } 1902 1897 } … … 1905 1900 # 1906 1901 # The -markers option takes a list of zero or more values (the values 1907 # may be separated either by spaces or commas) that have the following 1902 # may be separated either by spaces or commas) that have the following 1908 1903 # format: 1909 1904 # … … 1921 1916 set n [scan $marker "%g%s" value suffix] 1922 1917 if { $n == 2 && $suffix == "%" } { 1923 # ${n}% : Set relative value. 1918 # ${n}% : Set relative value. 1924 1919 set value [expr {$value * 0.01}] 1925 1920 set m [Rappture::IsoMarker \#auto $c $this $tf] … … 1938 1933 1939 1934 # ---------------------------------------------------------------------- 1940 # USAGE: UndateTransferFuncs 1935 # USAGE: UndateTransferFuncs 1941 1936 # ---------------------------------------------------------------------- 1942 1937 itcl::body Rappture::FlowvisViewer::updateTransferFunctions {} { … … 1948 1943 error "active transfer function isn't set" 1949 1944 } 1950 set tf $_activeTf 1945 set tf $_activeTf 1951 1946 set c $itk_component(legend) 1952 1947 set m [Rappture::IsoMarker \#auto $c $this $tf] … … 2107 2102 2,0 $inner.outline -cspan 2 -anchor w \ 2108 2103 3,0 $inner.volume -cspan 2 -anchor w \ 2109 4,0 $inner.legend -cspan 2 -anchor w 2104 4,0 $inner.legend -cspan 2 -anchor w 2110 2105 2111 2106 bind $inner <Map> [itcl::code $this GetFlowInfo $inner] … … 2157 2152 label $inner.thick -text "Thick" -font $fg 2158 2153 2159 label $inner.colormap_l -text "Colormap" -font "Arial 9" 2154 label $inner.colormap_l -text "Colormap" -font "Arial 9" 2160 2155 itk_component add colormap { 2161 2156 Rappture::Combobox $inner.colormap -width 10 -editable no … … 2292 2287 $inner configure -borderwidth 4 2293 2288 2294 label $inner.view_l -text "view" -font "Arial 9" 2295 set f [frame $inner.view] 2296 foreach side { front back left right top bottom } { 2289 label $inner.view_l -text "view" -font "Arial 9" 2290 set f [frame $inner.view] 2291 foreach side { front back left right top bottom } { 2297 2292 button $f.$side -image [Rappture::icon view$side] \ 2298 -command [itcl::code $this SetOrientation $side] 2299 Rappture::Tooltip::for $f.$side "Change the view to $side" 2300 pack $f.$side -side left 2293 -command [itcl::code $this SetOrientation $side] 2294 Rappture::Tooltip::for $f.$side "Change the view to $side" 2295 pack $f.$side -side left 2301 2296 } 2302 2297 2303 2298 blt::table $inner \ 2304 2299 0,0 $inner.view_l -anchor e -pady 2 \ 2305 0,1 $inner.view -anchor w -pady 2 2300 0,1 $inner.view -anchor w -pady 2 2306 2301 blt::table configure $inner r0 -resize none 2307 2302 2308 set row 1 2303 set row 1 2309 2304 set labels { qw qx qy qz xpan ypan zoom } 2310 2305 foreach tag $labels { … … 2360 2355 blt::table $inner \ 2361 2356 1,0 $inner.showstreams -anchor w \ 2362 2,0 $inner.showarrows -anchor w 2357 2,0 $inner.showarrows -anchor w 2363 2358 blt::table configure $inner c0 c1 -resize none 2364 2359 blt::table configure $inner c2 -resize expand … … 2383 2378 -font "Arial 9" 2384 2379 Rappture::Tooltip::for $inner.part$row $info(description) 2385 blt::table $inner $row,0 $inner.part$row -anchor w 2380 blt::table $inner $row,0 $inner.part$row -anchor w 2386 2381 if { !$_settings($this-particles-$name) } { 2387 2382 $inner.part$row select 2388 } 2383 } 2389 2384 incr row 2390 2385 } … … 2410 2405 if { !$_settings($this-box-$name) } { 2411 2406 $inner.box$row select 2412 } 2407 } 2413 2408 incr row 2414 2409 } … … 2416 2411 blt::table configure $inner r$row -resize expand 2417 2412 blt::table configure $inner c3 -resize expand 2418 event generate [winfo parent [winfo parent $w]] <Configure> 2413 event generate [winfo parent [winfo parent $w]] <Configure> 2419 2414 } 2420 2415 … … 2510 2505 } 2511 2506 2512 # camera -- 2507 # camera -- 2513 2508 itcl::body Rappture::FlowvisViewer::camera {option args} { 2514 switch -- $option { 2509 switch -- $option { 2515 2510 "show" { 2516 2511 puts [array get _view] … … 2597 2592 append cmd " -corner1 {$info(corner1)} " 2598 2593 append cmd " -corner2 {$info(corner2)}\n" 2599 } 2594 } 2600 2595 append cmd "$tag data follows $nbytes $extents\n" 2601 2596 return $cmd … … 2665 2660 "stop" { 2666 2661 if { $_flow(state) } { 2667 flow off 2662 flow off 2668 2663 flow reset 2669 2664 } … … 2671 2666 "pause" { 2672 2667 if { $_flow(state) } { 2673 flow off 2668 flow off 2674 2669 } 2675 2670 } … … 2684 2679 set _settings($this-step) 1 2685 2680 SendCmd "flow reset" 2686 } 2681 } 2687 2682 flow next 2688 2683 } … … 2691 2686 if { $_settings($this-play) } { 2692 2687 flow play 2693 } else { 2688 } else { 2694 2689 flow pause 2695 2690 } … … 2716 2711 } 2717 2712 $_dispatcher event -after $_flow(delay) !play 2718 } 2713 } 2719 2714 default { 2720 2715 error "bad option \"$option\": should be play, stop, toggle, or reset." … … 2767 2762 1,0 $inner.please -anchor w \ 2768 2763 1,1 $inner.icon -anchor e \ 2769 2,0 $inner.cancel -cspan 2 2770 blt::table configure $inner r0 -pady 4 2771 blt::table configure $inner r2 -pady 4 2764 2,0 $inner.cancel -cspan 2 2765 blt::table configure $inner r0 -pady 4 2766 blt::table configure $inner r2 -pady 4 2772 2767 bind $inner.cancel <KeyPress-Return> [list $inner.cancel invoke] 2773 2768 } else { … … 2785 2780 update idletasks 2786 2781 update 2787 # We wait here for either 2788 # 1) the png to be delivered or 2789 # 2) timeout or 2782 # We wait here for either 2783 # 1) the png to be delivered or 2784 # 2) timeout or 2790 2785 # 3) user cancels the operation. 2791 2786 tkwait variable $var … … 2826 2821 1,0 $inner.please -anchor w \ 2827 2822 1,1 $inner.icon -anchor e \ 2828 2,0 $inner.cancel -cspan 2 2829 blt::table configure $inner r0 -pady 4 2830 blt::table configure $inner r2 -pady 4 2823 2,0 $inner.cancel -cspan 2 2824 blt::table configure $inner r0 -pady 4 2825 blt::table configure $inner r2 -pady 4 2831 2826 bind $inner.cancel <KeyPress-Return> [list $inner.cancel invoke] 2832 2827 } else { 2833 2828 set inner [$popup component inner] 2834 2829 } 2835 update 2830 update 2836 2831 # Timeout is set to 10 minutes. 2837 2832 $_dispatcher event -after 600000 !movietimeout … … 2839 2834 grab set $inner 2840 2835 focus $inner.cancel 2841 2836 2842 2837 flow duration 2843 2838 flow speed … … 2851 2846 set start [clock seconds] 2852 2847 SendCmd "flow video $token -width $w -height $h -numframes $nframes " 2853 2848 2854 2849 $popup activate $widget below 2855 update idletasks 2850 update idletasks 2856 2851 update 2857 2852 # We wait here until 2858 # 1. the movie is delivered or 2859 # 2. we've timed out or 2853 # 1. the movie is delivered or 2854 # 2. we've timed out or 2860 2855 # 3. the user has canceled the operation.b 2861 2856 tkwait variable $var … … 2872 2867 2873 2868 # This will both cancel the movie generation (if it hasn't already 2874 # completed) and reset the flow. 2869 # completed) and reset the flow. 2875 2870 SendCmd "flow reset" 2876 2871 if { $_hardcopy($this-$token) != "" } { … … 2906 2901 } 2907 2902 2908 itcl::body Rappture::FlowvisViewer::SetOrientation { side } { 2909 array set positions { 2910 front "1 0 0 0" 2911 back "0 0 1 0" 2912 left "0.707107 0 -0.707107 0" 2913 right "0.707107 0 0.707107 0" 2914 top "0.707107 -0.707107 0 0" 2915 bottom "0.707107 0.707107 0 0" 2916 } 2917 foreach name { -qw -qx -qy -qz } value $positions($side) { 2903 itcl::body Rappture::FlowvisViewer::SetOrientation { side } { 2904 array set positions { 2905 front "1 0 0 0" 2906 back "0 0 1 0" 2907 left "0.707107 0 -0.707107 0" 2908 right "0.707107 0 0.707107 0" 2909 top "0.707107 -0.707107 0 0" 2910 bottom "0.707107 0.707107 0 0" 2911 } 2912 foreach name { -qw -qx -qy -qz } value $positions($side) { 2918 2913 set _view($name) $value 2919 } 2914 } 2920 2915 set q [ViewToQuaternion] 2921 2916 $_arcball quaternion $q 2922 SendCmd "camera orient $q" 2917 SendCmd "camera orient $q" 2923 2918 SendCmd "camera reset" 2924 2919 set _view(-xpan) 0.0 … … 2931 2926 2932 2927 # Reset global settings from dataset's settings. 2933 itcl::body Rappture::FlowvisViewer::BuildVolumeComponents {} { 2928 itcl::body Rappture::FlowvisViewer::BuildVolumeComponents {} { 2934 2929 $itk_component(volcomponents) choices delete 0 end 2935 2930 foreach name $_componentsList { … … 2941 2936 2942 2937 # Reset global settings from dataset's settings. 2943 itcl::body Rappture::FlowvisViewer::GetDatasetsWithComponent { cname } { 2938 itcl::body Rappture::FlowvisViewer::GetDatasetsWithComponent { cname } { 2944 2939 if { ![info exists _volcomponents($cname)] } { 2945 2940 return "" -
branches/1.4/gui/scripts/nanovisviewer.tcl
r5095 r5101 1 # -*- mode: tcl; indent-tabs-mode: nil -*- 1 # -*- mode: tcl; indent-tabs-mode: nil -*- 2 2 # ---------------------------------------------------------------------- 3 3 # COMPONENT: nanovisviewer - 3D volume rendering … … 19 19 # 20 20 # FIXME: 21 # Need to Add DX readers this client to examine the data before 21 # Need to Add DX readers this client to examine the data before 22 22 # it's sent to the server. This will eliminate 90% of the insanity in 23 # computing the limits of all the volumes. I can rip out all the 23 # computing the limits of all the volumes. I can rip out all the 24 24 # "receive data" "send transfer function" event crap. 25 25 # … … 29 29 # when a new volume is drawn (using the default transfer function) and 30 30 # then when the correct transfer function has been sent and linked to 31 # the volume. 31 # the volume. 32 32 # 33 33 option add *NanovisViewer.width 4i widgetDefault … … 75 75 public method isconnected {} 76 76 public method limits { tf } 77 public method parameters {title args} { 78 # do nothing 77 public method parameters {title args} { 78 # do nothing 79 79 } 80 80 public method scale {args} … … 83 83 # The following methods are only used by this class. 84 84 85 private method AddNewMarker { x y } 85 private method AddNewMarker { x y } 86 86 private method AdjustSetting {what {value ""}} 87 87 private method BuildCameraTab {} … … 90 90 private method BuildVolumeComponents {} 91 91 private method BuildVolumeTab {} 92 private method ComputeAlphamap { cname } 92 private method ComputeAlphamap { cname } 93 93 private method ComputeTransferFunction { cname } 94 94 private method Connect {} … … 97 97 private method DoResize {} 98 98 private method DrawLegend { cname } 99 private method EventuallyRedrawLegend { } 100 private method EventuallyResize { w h } 99 private method EventuallyRedrawLegend { } 100 private method EventuallyResize { w h } 101 101 private method FixLegend {} 102 private method GetAlphamap { cname color } 103 private method GetColormap { cname color } 104 private method GetDatasetsWithComponent { cname } 102 private method GetAlphamap { cname color } 103 private method GetColormap { cname color } 104 private method GetDatasetsWithComponent { cname } 105 105 private method GetVolumeInfo { w } 106 private method HideAllMarkers {} 107 private method InitComponentSettings { cname } 106 private method HideAllMarkers {} 107 private method InitComponentSettings { cname } 108 108 private method InitSettings { args } 109 private method NameToAlphamap { name } 109 private method NameToAlphamap { name } 110 110 private method NameTransferFunction { dataobj comp } 111 111 private method Pan {option x y} … … 113 113 private method ParseLevelsOption { cname levels } 114 114 private method ParseMarkersOption { cname markers } 115 private method QuaternionToView { q } { 115 private method QuaternionToView { q } { 116 116 foreach { _view(-qw) _view(-qx) _view(-qy) _view(-qz) } $q break 117 117 } … … 128 128 private method Slice {option args} 129 129 private method SlicerTip {axis} 130 private method SwitchComponent { cname } 130 private method SwitchComponent { cname } 131 131 private method ToggleVolume { tag name } 132 private method ViewToQuaternion {} { 132 private method ViewToQuaternion {} { 133 133 return [list $_view(-qw) $_view(-qx) $_view(-qy) $_view(-qz)] 134 134 } … … 137 137 private variable _arcball "" 138 138 139 private variable _dlist "" ;# list of data objects140 private variable _obj2ovride ;# maps dataobj => style override141 private variable _serverDatasets ;# contains all the dataobj-component 142 ;# to volumes in the server139 private variable _dlist "" ;# list of data objects 140 private variable _obj2ovride ;# maps dataobj => style override 141 private variable _serverDatasets ;# contains all the dataobj-component 142 ;# to volumes in the server 143 143 private variable _recvdDatasets; # list of data objs to send to server 144 144 private variable _dataset2style; # maps dataobj-component to transfunc 145 private variable _style2datasets; # maps tf back to list of 145 private variable _style2datasets; # maps tf back to list of 146 146 # dataobj-components using the tf. 147 147 148 private variable _reset 1; 148 private variable _reset 1; # Connection to server has been reset. 149 149 private variable _click; # Info used for rotate operations. 150 150 private variable _limits; # Autoscale min/max for all axes … … 156 156 157 157 private variable _first "" ; # This is the topmost volume. 158 private variable _current ""; # Currently selected component 159 private variable _volcomponents ; # Array of components found160 private variable _componentsList ; # Array of components found158 private variable _current ""; # Currently selected component 159 private variable _volcomponents ;# Array of components found 160 private variable _componentsList ;# Array of components found 161 161 private variable _cname2style 162 162 private variable _cname2transferFunction … … 319 319 -offimage [Rappture::icon cutbutton] \ 320 320 -variable [itcl::scope _settings(-cutplanesvisible)] \ 321 -command [itcl::code $this AdjustSetting -cutplanesvisible] 321 -command [itcl::code $this AdjustSetting -cutplanesvisible] 322 322 } 323 323 Rappture::Tooltip::for $itk_component(cutplane) \ … … 331 331 BuildCameraTab 332 332 } errs] != 0 } { 333 333 global errorInfo 334 334 puts stderr "errs=$errs errorInfo=$errorInfo" 335 335 } … … 351 351 [list focus $itk_component(legend)] 352 352 353 # Hack around the Tk panewindow. The problem is that the requested 353 # Hack around the Tk panewindow. The problem is that the requested 354 354 # size of the 3d view isn't set until an image is retrieved from 355 355 # the server. So the panewindow uses the tiny size. … … 358 358 blt::table $itk_component(plotarea) \ 359 359 0,0 $itk_component(3dview) -fill both -reqwidth $w \ 360 1,0 $itk_component(legend) -fill x 360 1,0 $itk_component(legend) -fill x 361 361 blt::table configure $itk_component(plotarea) r1 -resize none 362 362 … … 433 433 } 434 434 catch { blt::arcball destroy $_arcball } 435 array unset _settings 435 array unset _settings 436 436 } 437 437 … … 567 567 -markers "" 568 568 } 569 array unset _limits 570 array unset _volcomponents 569 array unset _limits 570 array unset _volcomponents 571 571 foreach dataobj $args { 572 572 if { ![$dataobj isvalid] } { … … 636 636 # to the BLT picture image it won't be necessary to decode the 637 637 # image data. 638 if { [image width $_image(plot)] > 0 && 638 if { [image width $_image(plot)] > 0 && 639 639 [image height $_image(plot)] > 0 } { 640 640 set bytes [$_image(plot) data -format "jpeg -quality 100"] … … 662 662 return 0 663 663 } 664 set _reset 1 664 set _reset 1 665 665 set result [VisViewer::Connect $_hosts] 666 666 if { $result } { … … 753 753 ReceiveEcho <<line "<read $info(-bytes) bytes" 754 754 if { $info(-type) == "image" } { 755 ReceiveEcho "for [image width $_image(plot)]x[image height $_image(plot)] image>" 755 ReceiveEcho "for [image width $_image(plot)]x[image height $_image(plot)] image>" 756 756 $_image(plot) configure -data $bytes 757 757 } elseif { $info(-type) == "print" } { … … 804 804 # The colormap may have changed. Resync the slicers with the colormap. 805 805 InitSettings -cutplanesvisible -xcutplanevisible -ycutplanevisible \ 806 -zcutplanevisible 806 -zcutplanevisible 807 807 } 808 808 … … 813 813 # The procedure is the response from the render server to each "legend" 814 814 # command. The server sends back a "legend" command invoked our 815 # the slave interpreter. The purpose is to collect data of the image 815 # the slave interpreter. The purpose is to collect data of the image 816 816 # representing the legend in the canvas. In addition, the 817 817 # active transfer function is displayed. … … 896 896 # Turn on buffering of commands to the server. We don't want to 897 897 # be preempted by a server disconnect/reconnect (which automatically 898 # generates a new call to Rebuild). 898 # generates a new call to Rebuild). 899 899 StartBufferingCommands 900 900 … … 952 952 set _first [lindex [get] 0] 953 953 if { $_reset } { 954 955 956 954 # 955 # Reset the camera and other view parameters 956 # 957 957 set _settings(-qw) $_view(-qw) 958 958 set _settings(-qx) $_view(-qx) 959 959 set _settings(-qy) $_view(-qy) 960 960 set _settings(-qz) $_view(-qz) 961 962 963 961 set _settings(-xpan) $_view(-xpan) 962 set _settings(-ypan) $_view(-ypan) 963 set _settings(-zoom) $_view(-zoom) 964 964 965 965 set q [ViewToQuaternion] … … 967 967 SendCmd "camera orient $q" 968 968 SendCmd "camera reset" 969 970 971 969 PanCamera 970 SendCmd "camera zoom $_view(-zoom)" 971 972 972 #cutplane state 0 all 973 973 foreach axis {x y z} { … … 979 979 -isosurfaceshading -gridvisible -axesvisible \ 980 980 981 982 983 984 985 986 987 988 989 990 981 if {"" != $_first} { 982 set axis [$_first hints updir] 983 if { "" != $axis } { 984 SendCmd "up $axis" 985 } 986 set location [$_first hints camera] 987 if { $location != "" } { 988 array set _view $location 989 } 990 } 991 991 } 992 992 … … 994 994 SendCmd "volume state 0" 995 995 if {"" != $_first} { 996 set datasets [array names _serverDatasets $_first-*] 996 set datasets [array names _serverDatasets $_first-*] 997 997 if { $datasets != "" } { 998 998 SendCmd "volume state 1 $datasets" … … 1076 1076 } 1077 1077 } 1078 set q [ViewToQuaternion] 1078 set q [ViewToQuaternion] 1079 1079 $_arcball quaternion $q 1080 1080 SendCmd "camera orient $q" … … 1227 1227 "-background" { 1228 1228 set bgcolor [$itk_component(background) value] 1229 1230 1231 1232 "grey""black"1233 1229 array set fgcolors { 1230 "black" "white" 1231 "white" "black" 1232 "grey" "black" 1233 } 1234 1234 configure -plotbackground $bgcolor \ 1235 1236 1235 -plotforeground $fgcolors($bgcolor) 1236 DrawLegend $_current 1237 1237 } 1238 1238 "-colormap" { … … 1273 1273 blt::table $itk_component(plotarea) \ 1274 1274 0,0 $itk_component(3dview) -fill both \ 1275 1,0 $itk_component(legend) -fill x 1275 1,0 $itk_component(legend) -fill x 1276 1276 blt::table configure $itk_component(plotarea) r1 -resize none 1277 1277 } else { … … 1313 1313 # have to synchronize each of the local controls (see below) with 1314 1314 # this. 1315 set datasets [CurrentDatasets] 1315 set datasets [CurrentDatasets] 1316 1316 set bool $_settings($what) 1317 1317 SendCmd "volume data state $bool $datasets" … … 1329 1329 } 1330 1330 "-volumevisible" { 1331 # This is the component specific control. It changes the 1331 # This is the component specific control. It changes the 1332 1332 # visibility of only the current component. 1333 1333 set _settings($_current${what}) $_settings($what) … … 1340 1340 set bool $_settings($what) 1341 1341 # We only set cutplanes on the first dataset. 1342 set datasets [CurrentDatasets -cutplanes] 1342 set datasets [CurrentDatasets -cutplanes] 1343 1343 set tag [lindex $datasets 0] 1344 1344 if { $_settings(-cutplanesvisible) } { … … 1452 1452 ParseLevelsOption $cname $styles(-levels) 1453 1453 } 1454 1454 1455 1455 } 1456 1456 set wmap [ComputeAlphamap $cname] … … 1473 1473 } 1474 1474 # Add a new marker to the current transfer function 1475 $_transferFunctionEditors($_current) deleteMarker $x $y 1475 $_transferFunctionEditors($_current) deleteMarker $x $y 1476 1476 } 1477 1477 … … 1498 1498 SendCmd "grid axiscolor $rgb" 1499 1499 SendCmd "grid linecolor $rgb" 1500 $itk_component(legend) itemconfigure labels -fill $color 1501 $itk_component(legend) itemconfigure limits -fill $color 1500 $itk_component(legend) itemconfigure labels -fill $color 1501 $itk_component(legend) itemconfigure limits -fill $color 1502 1502 } 1503 1503 } … … 1546 1546 # 1547 1547 # The -markers option takes a list of zero or more values (the values 1548 # may be separated either by spaces or commas) that have the following 1548 # may be separated either by spaces or commas) that have the following 1549 1549 # format: 1550 1550 # … … 1564 1564 set n [scan $marker "%g%s" value suffix] 1565 1565 if { $n == 2 && $suffix == "%" } { 1566 # $n% : Set relative value (0..1). 1566 # $n% : Set relative value (0..1). 1567 1567 lappend list [expr {$value * 0.01}] 1568 1568 } else { … … 1577 1577 1578 1578 # ---------------------------------------------------------------------- 1579 # USAGE: UndateTransferFuncs 1579 # USAGE: UndateTransferFuncs 1580 1580 # ---------------------------------------------------------------------- 1581 1581 itcl::body Rappture::NanovisViewer::updateTransferFunctions {} { … … 1604 1604 if { $min != "" } { 1605 1605 set _limits(min) $min 1606 } 1606 } 1607 1607 if { $max != "" } { 1608 1608 set _limits(max) $max … … 1658 1658 -font "Arial 9" 1659 1659 1660 label $inner.background_l -text "Background" -font "Arial 9" 1660 label $inner.background_l -text "Background" -font "Arial 9" 1661 1661 itk_component add background { 1662 1662 Rappture::Combobox $inner.background -width 10 -editable no … … 1665 1665 "black" "black" \ 1666 1666 "white" "white" \ 1667 "grey" "grey" 1667 "grey" "grey" 1668 1668 1669 1669 $itk_component(background) value $_settings(-background) … … 1729 1729 label $inner.thick -text "Thick" -font $fg 1730 1730 1731 # Colormap 1731 # Colormap 1732 1732 label $inner.colormap_l -text "Colormap" -font $fg 1733 1733 itk_component add colormap { … … 1984 1984 } 1985 1985 1986 # camera -- 1986 # camera -- 1987 1987 # 1988 1988 itcl::body Rappture::NanovisViewer::camera {option args} { 1989 switch -- $option { 1989 switch -- $option { 1990 1990 "show" { 1991 1991 puts [array get _view] … … 2061 2061 -font "Arial 9" 2062 2062 Rappture::Tooltip::for $inner.vol$row $info(description) 2063 blt::table $inner $row,0 $inner.vol$row -anchor w 2063 blt::table $inner $row,0 $inner.vol$row -anchor w 2064 2064 if { !$_settings(-volume-$name) } { 2065 2065 $inner.vol$row select 2066 } 2066 } 2067 2067 incr row 2068 2068 } … … 2070 2070 blt::table configure $inner r$row -resize expand 2071 2071 blt::table configure $inner c3 -resize expand 2072 event generate [winfo parent [winfo parent $w]] <Configure> 2072 event generate [winfo parent [winfo parent $w]] <Configure> 2073 2073 } 2074 2074 … … 2078 2078 } 2079 2079 2080 itcl::body Rappture::NanovisViewer::SetOrientation { side } { 2080 itcl::body Rappture::NanovisViewer::SetOrientation { side } { 2081 2081 array set positions { 2082 2082 front "1 0 0 0" … … 2089 2089 foreach name { -qw -qx -qy -qz } value $positions($side) { 2090 2090 set _view($name) $value 2091 } 2091 } 2092 2092 set q [ViewToQuaternion] 2093 2093 $_arcball quaternion $q 2094 SendCmd "camera orient $q" 2094 SendCmd "camera orient $q" 2095 2095 SendCmd "camera reset" 2096 2096 set _view(-xpan) 0 … … 2110 2110 # time we try to switch to a given component in SwitchComponent below. 2111 2111 # 2112 itcl::body Rappture::NanovisViewer::InitComponentSettings { cname } { 2112 itcl::body Rappture::NanovisViewer::InitComponentSettings { cname } { 2113 2113 foreach {key value} { 2114 2114 -colormap "default" … … 2133 2133 # with the settings of the new current component. 2134 2134 # 2135 itcl::body Rappture::NanovisViewer::SwitchComponent { cname } { 2135 itcl::body Rappture::NanovisViewer::SwitchComponent { cname } { 2136 2136 if { ![info exists _settings($cname-light)] } { 2137 2137 InitComponentSettings $cname … … 2164 2164 # volume settings tab. 2165 2165 # 2166 itcl::body Rappture::NanovisViewer::BuildVolumeComponents {} { 2166 itcl::body Rappture::NanovisViewer::BuildVolumeComponents {} { 2167 2167 $itk_component(volcomponents) choices delete 0 end 2168 2168 foreach name $_componentsList { … … 2174 2174 if { [llength $_componentsList] <= 1 } { 2175 2175 # Unpack the components label and dropdown if there's only one 2176 # component. 2176 # component. 2177 2177 blt::table forget $parent.volcomponents_l $parent.volcomponents 2178 2178 } else { 2179 # Pack the components label and dropdown into the table there's 2180 # more than one component to select. 2179 # Pack the components label and dropdown into the table there's 2180 # more than one component to select. 2181 2181 blt::table $parent \ 2182 2182 0,0 $parent.volcomponents_l -anchor e -cspan 2 \ 2183 0,2 $parent.volcomponents -cspan 3 -fill x 2183 0,2 $parent.volcomponents -cspan 3 -fill x 2184 2184 } 2185 2185 } … … 2193 2193 # volumes that have the current component. 2194 2194 # 2195 itcl::body Rappture::NanovisViewer::GetDatasetsWithComponent { cname } { 2195 itcl::body Rappture::NanovisViewer::GetDatasetsWithComponent { cname } { 2196 2196 if { ![info exists _volcomponents($cname)] } { 2197 2197 return "" … … 2214 2214 # created, deleted, or moved markers. 2215 2215 # 2216 itcl::body Rappture::NanovisViewer::HideAllMarkers {} { 2216 itcl::body Rappture::NanovisViewer::HideAllMarkers {} { 2217 2217 foreach cname [array names _transferFunctionEditors] { 2218 $_transferFunctionEditors($cname) hideMarkers 2219 } 2220 } 2221 2222 itcl::body Rappture::NanovisViewer::GetColormap { cname color } { 2218 $_transferFunctionEditors($cname) hideMarkers 2219 } 2220 } 2221 2222 itcl::body Rappture::NanovisViewer::GetColormap { cname color } { 2223 2223 if { $color == "default" } { 2224 2224 return $_cname2defaultcolormap($cname) … … 2227 2227 } 2228 2228 2229 itcl::body Rappture::NanovisViewer::GetAlphamap { cname name } { 2229 itcl::body Rappture::NanovisViewer::GetAlphamap { cname name } { 2230 2230 if { $name == "default" } { 2231 2231 return $_cname2defaultalphamap($cname) … … 2234 2234 } 2235 2235 2236 itcl::body Rappture::NanovisViewer::ResetColormap { cname color } { 2236 itcl::body Rappture::NanovisViewer::ResetColormap { cname color } { 2237 2237 # Get the current transfer function 2238 2238 if { ![info exists _cname2transferFunction($cname)] } { … … 2246 2246 } 2247 2247 2248 itcl::body Rappture::NanovisViewer::ComputeAlphamap { cname } { 2248 itcl::body Rappture::NanovisViewer::ComputeAlphamap { cname } { 2249 2249 if { ![info exists _transferFunctionEditors($cname)] } { 2250 2250 return [list 0.0 0.0 1.0 1.0] … … 2265 2265 # Scale values between 0.00001 and 0.01000 2266 2266 set delta [expr {double($_settings($cname-thickness)) * 0.0001}] 2267 2267 2268 2268 set first [lindex $isovalues 0] 2269 2269 set last [lindex $isovalues end] … … 2312 2312 switch -- $name { 2313 2313 "ramp-up" { 2314 set wmap { 2315 0.0 0.0 2316 1.0 1.0 2314 set wmap { 2315 0.0 0.0 2316 1.0 1.0 2317 2317 } 2318 2318 } 2319 2319 "ramp-down" { 2320 set wmap { 2321 0.0 1.0 2322 1.0 0.0 2320 set wmap { 2321 0.0 1.0 2322 1.0 0.0 2323 2323 } 2324 2324 } 2325 2325 "vee" { 2326 set wmap { 2327 0.0 1.0 2328 0.5 0.0 2329 1.0 1.0 2326 set wmap { 2327 0.0 1.0 2328 0.5 0.0 2329 1.0 1.0 2330 2330 } 2331 2331 } 2332 2332 "tent-1" { 2333 set wmap { 2334 0.0 0.0 2335 0.5 1.0 2336 1.0 0.0 2333 set wmap { 2334 0.0 0.0 2335 0.5 1.0 2336 1.0 0.0 2337 2337 } 2338 2338 } 2339 2339 "tent-2" { 2340 set wmap { 2341 0.0 0.0 2342 0.25 1.0 2343 0.5 0.0 2344 0.75 1.0 2345 1.0 0.0 2340 set wmap { 2341 0.0 0.0 2342 0.25 1.0 2343 0.5 0.0 2344 0.75 1.0 2345 1.0 0.0 2346 2346 } 2347 2347 } 2348 2348 "tent-3" { 2349 set wmap { 2350 0.0 0.0 2349 set wmap { 2350 0.0 0.0 2351 2351 0.16666 1.0 2352 2352 0.33333 0.0 … … 2354 2354 0.66666 0.0 2355 2355 0.83333 1.0 2356 1.0 0.0 2356 1.0 0.0 2357 2357 } 2358 2358 } 2359 2359 "tent-4" { 2360 set wmap { 2361 0.0 0.0 2360 set wmap { 2361 0.0 0.0 2362 2362 0.125 1.0 2363 2363 0.25 0.0 2364 2364 0.375 1.0 2365 0.5 0.0 2365 0.5 0.0 2366 2366 0.625 1.0 2367 2367 0.75 0.0 2368 2368 0.875 1.0 2369 1.0 0.0 2369 1.0 0.0 2370 2370 } 2371 2371 } 2372 2372 "sinusoid-1" { 2373 2373 set wmap { 2374 0.0 0.000 0.600 0.800 2375 0.14285714285714285 0.400 0.900 1.000 2376 0.2857142857142857 0.600 1.000 1.000 2377 0.42857142857142855 0.800 1.000 1.000 2378 0.5714285714285714 0.900 0.900 0.900 2379 0.7142857142857143 0.600 0.600 0.600 2380 0.8571428571428571 0.400 0.400 0.400 2374 0.0 0.000 0.600 0.800 2375 0.14285714285714285 0.400 0.900 1.000 2376 0.2857142857142857 0.600 1.000 1.000 2377 0.42857142857142855 0.800 1.000 1.000 2378 0.5714285714285714 0.900 0.900 0.900 2379 0.7142857142857143 0.600 0.600 0.600 2380 0.8571428571428571 0.400 0.400 0.400 2381 2381 1.0 0.200 0.200 0.200 2382 2382 } 2383 2383 } 2384 2384 "sinusoid-2" { 2385 set wmap { 2386 0.0 0.900 1.000 1.000 2387 0.1111111111111111 0.800 0.983 1.000 2388 0.2222222222222222 0.700 0.950 1.000 2389 0.3333333333333333 0.600 0.900 1.000 2390 0.4444444444444444 0.500 0.833 1.000 2391 0.5555555555555556 0.400 0.750 1.000 2392 0.6666666666666666 0.300 0.650 1.000 2393 0.7777777777777778 0.200 0.533 1.000 2394 0.8888888888888888 0.100 0.400 1.000 2385 set wmap { 2386 0.0 0.900 1.000 1.000 2387 0.1111111111111111 0.800 0.983 1.000 2388 0.2222222222222222 0.700 0.950 1.000 2389 0.3333333333333333 0.600 0.900 1.000 2390 0.4444444444444444 0.500 0.833 1.000 2391 0.5555555555555556 0.400 0.750 1.000 2392 0.6666666666666666 0.300 0.650 1.000 2393 0.7777777777777778 0.200 0.533 1.000 2394 0.8888888888888888 0.100 0.400 1.000 2395 2395 1.0 0.000 0.250 1.000 2396 2396 } … … 2398 2398 "sinusoid-6" { 2399 2399 set wmap { 2400 0.0 0.200 0.100 0.000 2401 0.09090909090909091 0.400 0.187 0.000 2402 0.18181818181818182 0.600 0.379 0.210 2403 0.2727272727272727 0.800 0.608 0.480 2404 0.36363636363636365 0.850 0.688 0.595 2405 0.45454545454545453 0.950 0.855 0.808 2406 0.5454545454545454 0.800 0.993 1.000 2407 0.6363636363636364 0.600 0.973 1.000 2408 0.7272727272727273 0.400 0.940 1.000 2409 0.8181818181818182 0.200 0.893 1.000 2410 0.9090909090909091 0.000 0.667 0.800 2411 1.0 0.000 0.480 0.600 2400 0.0 0.200 0.100 0.000 2401 0.09090909090909091 0.400 0.187 0.000 2402 0.18181818181818182 0.600 0.379 0.210 2403 0.2727272727272727 0.800 0.608 0.480 2404 0.36363636363636365 0.850 0.688 0.595 2405 0.45454545454545453 0.950 0.855 0.808 2406 0.5454545454545454 0.800 0.993 1.000 2407 0.6363636363636364 0.600 0.973 1.000 2408 0.7272727272727273 0.400 0.940 1.000 2409 0.8181818181818182 0.200 0.893 1.000 2410 0.9090909090909091 0.000 0.667 0.800 2411 1.0 0.000 0.480 0.600 2412 2412 } 2413 2413 } 2414 2414 "sinusoid-10" { 2415 2415 set wmap { 2416 0.0 0.000 0.480 0.600 2417 0.09090909090909091 0.000 0.667 0.800 2418 0.18181818181818182 0.200 0.893 1.000 2419 0.2727272727272727 0.400 0.940 1.000 2420 0.36363636363636365 0.600 0.973 1.000 2421 0.45454545454545453 0.800 0.993 1.000 2422 0.5454545454545454 0.950 0.855 0.808 2423 0.6363636363636364 0.850 0.688 0.595 2424 0.7272727272727273 0.800 0.608 0.480 2425 0.8181818181818182 0.600 0.379 0.210 2426 0.9090909090909091 0.400 0.187 0.000 2427 1.0 0.200 0.100 0.000 2416 0.0 0.000 0.480 0.600 2417 0.09090909090909091 0.000 0.667 0.800 2418 0.18181818181818182 0.200 0.893 1.000 2419 0.2727272727272727 0.400 0.940 1.000 2420 0.36363636363636365 0.600 0.973 1.000 2421 0.45454545454545453 0.800 0.993 1.000 2422 0.5454545454545454 0.950 0.855 0.808 2423 0.6363636363636364 0.850 0.688 0.595 2424 0.7272727272727273 0.800 0.608 0.480 2425 0.8181818181818182 0.600 0.379 0.210 2426 0.9090909090909091 0.400 0.187 0.000 2427 1.0 0.200 0.100 0.000 2428 2428 } 2429 2429 } … … 2463 2463 set wmap { 2464 2464 "#EE82EE" 2465 "#4B0082" 2466 "blue" 2467 "#008000" 2468 "yellow" 2469 "#FFA500" 2470 "red" 2465 "#4B0082" 2466 "blue" 2467 "#008000" 2468 "yellow" 2469 "#FFA500" 2470 "red" 2471 2471 } 2472 2472 }
Note: See TracChangeset
for help on using the changeset viewer.