Changeset 6228 for branches


Ignore:
Timestamp:
Mar 31, 2016, 12:31:35 PM (8 years ago)
Author:
ldelgass
Message:

merge r6182 from trunk (custom range support for vtkglyphviewer)

Location:
branches/1.7
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/1.7

    • Property svn:mergeinfo changed
      /trunkmerged: 6182
  • branches/1.7/gui/scripts/vtkglyphviewer.tcl

    r6213 r6228  
    7272    private method Connect {}
    7373    private method CurrentDatasets {args}
     74    private method DisableMouseRotationBindings {}
    7475    private method Disconnect {}
    7576    private method DoResize {}
     
    8687    private method IsValidObject { dataobj }
    8788    private method LeaveLegend {}
     89    private method LegendPointToValue { x y }
     90    private method LegendRangeAction { option args }
     91    private method LegendRangeValidate { widget which value }
    8892    private method LegendTitleAction { option }
    8993    private method MotionLegend { x y }
     94    private method MouseOver2Which {}
    9095    private method Pan {option x y}
    9196    private method PanCamera {}
     
    103108    private method SetCurrentFieldName { dataobj }
    104109    private method SetLegendTip { x y }
     110    private method SetMinMaxGauges { min max }
    105111    private method SetObjectStyle { dataobj comp }
    106112    private method SetOrientation { side }
     
    110116    private method SetupMouseZoomBindings {}
    111117    private method Slice {option args}
     118    private method ToggleCustomRange { args }
    112119    private method ViewToQuaternion {} {
    113120        return [list $_view(-qw) $_view(-qx) $_view(-qy) $_view(-qz)]
     
    149156    private variable _curFldName ""
    150157    private variable _curFldLabel ""
     158    private variable _curFldComp 3
     159    private variable _mouseOver "";     # what called LegendRangeAction:
     160                                        # vmin or vmax
     161    private variable _customRangeClick 1; # what called ToggleCustomRange
    151162
    152163    private common _downloadPopup;      # download options from popup
     
    228239        -colormap               BCGYR
    229240        -colormapvisible        1
     241        -customrange            0
     242        -customrangemin         0
     243        -customrangemax         1
    230244        -cutplaneedges          0
    231245        -cutplanelighting       1
     
    304318    }
    305319
     320    # add an editor for adjusting the legend min and max values
     321    itk_component add editor {
     322        Rappture::Editor $itk_interior.editor \
     323            -activatecommand [itcl::code $this LegendRangeAction activate] \
     324            -validatecommand [itcl::code $this LegendRangeAction validate] \
     325            -applycommand [itcl::code $this LegendRangeAction apply]
     326    }
     327
    306328    set c $itk_component(view)
    307329    bind $c <Configure> [itcl::code $this EventuallyResize %w %h]
     
    441463    bind $itk_component(view) <ButtonRelease-1> \
    442464        [itcl::code $this Rotate release %x %y]
     465}
     466
     467itcl::body Rappture::VtkGlyphViewer::DisableMouseRotationBindings {} {
     468    # Bindings for rotation via mouse
     469    bind $itk_component(view) <ButtonPress-1> ""
     470    bind $itk_component(view) <B1-Motion> ""
     471    bind $itk_component(view) <ButtonRelease-1> ""
    443472}
    444473
     
    717746            if { ![info exists _limits($fname)] } {
    718747                set _limits($fname) $lim
     748
     749                # set reasonable defaults for
     750                # customrangevmin and customrangevmax
     751                foreach {min max} $lim break
     752                SetMinMaxGauges $min $max
     753                set _settings(-customrangemin) $min
     754                set _settings(-customrangemax) $max
     755
    719756                continue
    720757            }
    721758            foreach {min max} $lim break
    722759            foreach {fmin fmax} $_limits($fname) break
     760            if { ! $_settings(-customrange) } {
     761                SetMinMaxGauges $fmin $fmax
     762            }
    723763            if { $fmin > $min } {
    724764                set fmin $min
     
    10411081        # These are settings that rely on a dataset being loaded.
    10421082        InitSettings \
    1043             -field \
     1083            -field -range \
    10441084            -glyphedges -glyphlighting -glyphnormscale -glyphopacity \
    10451085            -glyphorient -glyphscale -glyphscalemode -glyphshape -glyphwireframe
     
    10661106        set _reset 0
    10671107    }
     1108    #DrawLegend
    10681109
    10691110    # Actually write the commands to the server socket.  If it fails, we don't
     
    14121453                set _curFldName $fname
    14131454                set _curFldLabel $label
     1455                set _curFldComp $components
    14141456            } else {
    14151457                puts stderr "unknown field \"$fname\""
    14161458                return
    14171459            }
    1418             #if { ![info exists _limits($_curFldName)] } {
    1419             #    SendCmd "dataset maprange all"
    1420             #} else {
    1421             #    SendCmd "dataset maprange explicit $_limits($_curFldName) $_curFldName"
    1422             #}
     1460            if { ![info exists _limits($_curFldName)] } {
     1461                SendCmd "dataset maprange all"
     1462            } else {
     1463                if { $_settings(-customrange) } {
     1464                    set vmin [$itk_component(min) value]
     1465                    set vmax [$itk_component(max) value]
     1466                } else {
     1467                    foreach { vmin vmax } $_limits($_curFldName) break
     1468                    # set the min / max gauges with limits from the field
     1469                    # the legend's min and max text will be updated
     1470                    # when the legend is redrawn in DrawLegend
     1471                    SetMinMaxGauges $vmin $vmax
     1472                }
     1473                SendCmd "dataset maprange explicit $vmin $vmax $_curFldName point_data $_curFldComp"
     1474            }
    14231475            #SendCmd "cutplane colormode $_colorMode $_curFldName"
    14241476            SendCmd "glyphs colormode $_colorMode $_curFldName"
     
    15151567                }
    15161568            }
     1569        }
     1570        "-range" {
     1571            if { $_settings(-customrange) } {
     1572                set vmin [$itk_component(min) value]
     1573                set vmax [$itk_component(max) value]
     1574            } else {
     1575                foreach { vmin vmax } $_limits($_curFldName) break
     1576            }
     1577            SendCmd "dataset maprange explicit $vmin $vmax $_curFldName point_data $_curFldComp"
     1578            DrawLegend
    15171579        }
    15181580        "-xcutplanevisible" - "-ycutplanevisible" - "-zcutplanevisible" {
     
    17761838    bind $inner.colormap <<Value>> \
    17771839        [itcl::code $this AdjustSetting -colormap]
     1840
     1841    # add widgets for setting a custom range on the legend
     1842
     1843    itk_component add crange {
     1844        checkbutton $inner.crange \
     1845            -text "Use Custom Range:" \
     1846            -variable [itcl::scope _settings(-customrange)] \
     1847            -command [itcl::code $this ToggleCustomRange] \
     1848            -font "Arial 9"
     1849    }
     1850
     1851    itk_component add l_min {
     1852        label $inner.l_min -text "Min" -font "Arial 9"
     1853    }
     1854    itk_component add min {
     1855        Rappture::Gauge $inner.min -font "Arial 9" \
     1856            -validatecommand [itcl::code $this LegendRangeValidate "" vmin]
     1857    }
     1858    bind $itk_component(min) <<Value>> \
     1859        [itcl::code $this AdjustSetting -range]
     1860
     1861    itk_component add l_max {
     1862        label $inner.l_max -text "Max" -font "Arial 9"
     1863    }
     1864    itk_component add max {
     1865        Rappture::Gauge $inner.max -font "Arial 9" \
     1866            -validatecommand [itcl::code $this LegendRangeValidate "" vmax]
     1867    }
     1868    bind $itk_component(max) <<Value>> \
     1869        [itcl::code $this AdjustSetting -range]
     1870
     1871    $itk_component(min) configure -state disabled
     1872    $itk_component(max) configure -state disabled
    17781873
    17791874    blt::table $inner \
     
    17981893        12,0 $inner.legend      -anchor w -pady 2 \
    17991894        13,0 $inner.opacity_l   -anchor w -pady 2 \
    1800         13,1 $inner.opacity     -anchor w -pady 2 -fill x
     1895        13,1 $inner.opacity     -anchor w -pady 2 -fill x \
     1896        14,0 $inner.crange      -anchor w -pady 2 -cspan 2 \
     1897        15,0 $inner.l_min       -anchor w -pady 2 \
     1898        15,1 $inner.min         -anchor w -pady 2 -fill x \
     1899        16,0 $inner.l_max       -anchor w -pady 2 \
     1900        16,1 $inner.max         -anchor w -pady 2 -fill x \
    18011901
    18021902    blt::table configure $inner r* c* -resize none
    1803     blt::table configure $inner r14 c1 -resize expand
     1903    blt::table configure $inner r17 c1 -resize expand
    18041904}
    18051905
     
    24052505}
    24062506
     2507# ----------------------------------------------------------------------
     2508# USAGE: LegendPointToValue <x> <y>
     2509#
     2510# Convert an x,y point on the legend to a numeric field value.
     2511# ----------------------------------------------------------------------
     2512itcl::body Rappture::VtkGlyphViewer::LegendPointToValue { x y } {
     2513    set fname $_curFldName
     2514
     2515    set font "Arial 8"
     2516    set lineht [font metrics $font -linespace]
     2517
     2518    set ih [image height $_image(legend)]
     2519    set iy [expr $y - ($lineht + 2)]
     2520
     2521    # Compute the value of the point
     2522    if { [info exists _limits($fname)] } {
     2523        if { $_settings(-customrange) } {
     2524            set vmin [$itk_component(min) value]
     2525            set vmax [$itk_component(max) value]
     2526        } else {
     2527            foreach { vmin vmax } $_limits($fname) break
     2528        }
     2529        set t [expr 1.0 - (double($iy) / double($ih-1))]
     2530        set value [expr $t * ($vmax - $vmin) + $vmin]
     2531    } else {
     2532        set value 0.0
     2533    }
     2534    return $value
     2535}
     2536
    24072537#
    24082538# SetLegendTip --
     
    24492579
    24502580    # Compute the value of the point
    2451     if { [info exists _limits($_curFldName)] } {
    2452         foreach { vmin vmax } $_limits($_curFldName) break
    2453         set t [expr 1.0 - (double($iy) / double($ih-1))]
    2454         set value [expr $t * ($vmax - $vmin) + $vmin]
    2455     } else {
    2456         set value 0.0
    2457     }
     2581    set value [LegendPointToValue $x $y]
     2582
     2583    # Setup the location of the tooltip
    24582584    set tx [expr $x + 15]
    24592585    set ty [expr $y - 5]
     2586
     2587    # Setup the text for the tooltip
    24602588    Rappture::Tooltip::text $c [format "$title %g" $value]
     2589
     2590    # Show the tooltip
    24612591    Rappture::Tooltip::tooltip show $c +$tx,+$ty
    24622592}
     
    25862716    $c itemconfigure title -text $title
    25872717    if { [info exists _limits($_curFldName)] } {
    2588         foreach { vmin vmax } $_limits($_curFldName) break
     2718        if { $_settings(-customrange) } {
     2719            set vmin [$itk_component(min) value]
     2720            set vmax [$itk_component(max) value]
     2721        } else {
     2722            foreach { vmin vmax } $_limits($_curFldName) break
     2723        }
    25892724        $c itemconfigure vmin -text [format %g $vmin]
    25902725        $c itemconfigure vmax -text [format %g $vmax]
     
    26042739    $c raise sensor
    26052740    $c coords vmin $x [expr {$h - 2}]
     2741
     2742    $c bind vmin <ButtonPress> [itcl::code $this LegendRangeAction popup vmin]
     2743    $c bind vmin <Enter> [itcl::code $this LegendRangeAction enter vmin]
     2744    $c bind vmin <Leave> [itcl::code $this LegendRangeAction leave vmin]
     2745
     2746    $c bind vmax <ButtonPress> [itcl::code $this LegendRangeAction popup vmax]
     2747    $c bind vmax <Enter> [itcl::code $this LegendRangeAction enter vmax]
     2748    $c bind vmax <Leave> [itcl::code $this LegendRangeAction leave vmax]
    26062749}
    26072750
     
    26442787            error "bad option \"$option\": should be post, enter, leave or save"
    26452788        }
     2789    }
     2790}
     2791
     2792# ----------------------------------------------------------------------
     2793# USAGE: LegendRangeValidate <widget> <which> <value>
     2794#
     2795# Used internally to validate a legend range min/max value.
     2796# Returns a boolean value telling if <value> was accepted (1) or rejected (0)
     2797# If the value is rejected, a tooltip/warning message is popped up
     2798# near the widget that asked for the validation, specified by <widget>
     2799#
     2800# <widget> is the widget where a tooltip/warning message should show up on
     2801# <which> is either "vmin" or "vmax".
     2802# <value> is the value to be validated.
     2803# ----------------------------------------------------------------------
     2804itcl::body Rappture::VtkGlyphViewer::LegendRangeValidate {widget which value} {
     2805    #check for a valid value
     2806    if {[string is double $value] != 1} {
     2807        set msg "should be valid number"
     2808        if {$widget != ""} {
     2809            Rappture::Tooltip::cue $widget $msg
     2810        } else {
     2811            # error "bad value \"$value\": $msg"
     2812            error $msg
     2813        }
     2814        return 0
     2815    }
     2816
     2817    switch -- $which {
     2818        vmin {
     2819            # check for min > max
     2820            if {$value > [$itk_component(max) value]} {
     2821                set msg "min > max, change max first"
     2822                if {$widget != ""} {
     2823                    Rappture::Tooltip::cue $widget $msg
     2824                } else {
     2825                    # error "bad value \"$value\": $msg"
     2826                    error $msg
     2827                }
     2828                return 0
     2829            }
     2830        }
     2831        vmax {
     2832            # check for max < min
     2833            if {$value < [$itk_component(min) value]} {
     2834                set msg "max < min, change min first"
     2835                if {$widget != ""} {
     2836                    Rappture::Tooltip::cue $widget $msg
     2837                } else {
     2838                    # error "bad value \"$value\": $msg"
     2839                    error $msg
     2840                }
     2841                return 0
     2842            }
     2843        }
     2844        default {
     2845            error "bad option \"$which\": should be vmin, vmax"
     2846        }
     2847    }
     2848}
     2849
     2850itcl::body Rappture::VtkGlyphViewer::MouseOver2Which {} {
     2851    switch -- $_mouseOver {
     2852        vmin {
     2853            set which min
     2854        }
     2855        vmax {
     2856            set which max
     2857        }
     2858        default {
     2859            error "bad _mouseOver \"$_mouseOver\": should be vmin, vmax"
     2860        }
     2861    }
     2862    return $which
     2863}
     2864
     2865# ----------------------------------------------------------------------
     2866# USAGE: LegendRangeAction enter <which>
     2867# USAGE: LegendRangeAction leave <which>
     2868#
     2869# USAGE: LegendRangeAction popup <which>
     2870# USAGE: LegendRangeAction activate
     2871# USAGE: LegendRangeAction validate <value>
     2872# USAGE: LegendRangeAction apply <value>
     2873#
     2874# Used internally to handle the mouseover and popup entry for the field range
     2875# inputs.  The enter option is invoked when the user moves the mouse over the
     2876# min or max field range. The leave option is invoked when the user moves the
     2877# mouse away from the min or max field range. The popup option is invoked when
     2878# the user click's on a field range. The popup option stores internally which
     2879# widget is requesting a popup ( in the _mouseOver variable) and calls the
     2880# activate command of the widget. The widget's activate command calls back to
     2881# this method to get the xywh dimensions of the popup editor. After the user
     2882# changes focus or sets the value in the editor, the editor calls this methods
     2883# validate and apply options to set the value.
     2884# ----------------------------------------------------------------------
     2885itcl::body Rappture::VtkGlyphViewer::LegendRangeAction {option args} {
     2886    set c $itk_component(view)
     2887
     2888    switch -- $option {
     2889        enter {
     2890            set which [lindex $args 0]
     2891            $c itemconfigure $which -fill red
     2892        }
     2893        leave {
     2894            set which [lindex $args 0]
     2895            $c itemconfigure $which -fill $itk_option(-plotforeground)
     2896        }
     2897        popup {
     2898            DisableMouseRotationBindings
     2899            set which [lindex $args 0]
     2900            set _mouseOver $which
     2901            $itk_component(editor) activate
     2902        }
     2903        activate {
     2904            foreach { x1 y1 x2 y2 } [$c bbox $_mouseOver] break
     2905            set which [MouseOver2Which]
     2906            set info(text) [$itk_component($which) value]
     2907            set info(x) [expr $x1 + [winfo rootx $c]]
     2908            set info(y) [expr $y1 + [winfo rooty $c]]
     2909            set info(w) [expr $x2 - $x1]
     2910            set info(h) [expr $y2 - $y1]
     2911            return [array get info]
     2912        }
     2913        validate {
     2914            if {[llength $args] != 1} {
     2915                error "wrong # args: should be \"editor validate value\""
     2916            }
     2917
     2918            set value [lindex $args 0]
     2919            if {[LegendRangeValidate $itk_component(editor) $_mouseOver $value] == 0} {
     2920                return 0
     2921            }
     2922
     2923            # value was good, apply it
     2924            # reset the mouse rotation bindings
     2925            SetupMouseRotationBindings
     2926        }
     2927        apply {
     2928            if {[llength $args] != 1} {
     2929                error "wrong # args: should be \"editor apply value\""
     2930            }
     2931            set value [string trim [lindex $args 0]]
     2932
     2933            set which [MouseOver2Which]
     2934
     2935            # only set custom range if value changed
     2936            if {[$itk_component($which) value] != $value} {
     2937                # set the flag stating the custom range came from the legend
     2938                # change the value in the gauge
     2939                # turn on crange to enable the labels and gauges
     2940                # call AdjustSetting -range (inside ToggleCustomRange)
     2941                # to update drawing and legend
     2942                set _customRangeClick 0
     2943                $itk_component($which) value $value
     2944                $itk_component(crange) select
     2945                ToggleCustomRange
     2946            }
     2947        }
     2948        default {
     2949            error "bad option \"$option\": should be enter, leave, activate, validate, apply"
     2950        }
     2951    }
     2952}
     2953
     2954# ----------------------------------------------------------------------
     2955# USAGE: ToggleCustomRange
     2956#
     2957# Called whenever the custom range is turned on or off. Used to save
     2958# the custom min and custom max set by the user. When the -customrange
     2959# setting is turned on, the range min and range max gauges are set
     2960# with the last value set by the user, or the default range if no
     2961# previous min and max were set.
     2962#
     2963# When the custom range is turned on, we check how it was turned on
     2964# by querying _customRangeClick. If the variable is 1, this means
     2965# the user clicked the crange checkbutton and we should pull the
     2966# custom range values from our backup variables. If the variable is 0,
     2967# the custom range was enabled through the user manipulating the
     2968# min and max value in the legend.
     2969# ----------------------------------------------------------------------
     2970itcl::body Rappture::VtkGlyphViewer::ToggleCustomRange {args} {
     2971    if { ! $_settings(-customrange) } {
     2972        # custom range was turned off
     2973
     2974        # disable the min/max labels and gauge widgets
     2975        $itk_component(l_min) configure -state disabled
     2976        $itk_component(min) configure -state disabled
     2977        $itk_component(l_max) configure -state disabled
     2978        $itk_component(max) configure -state disabled
     2979
     2980        # backup the custom range
     2981        set _settings(-customrangemin) [$itk_component(min) value]
     2982        set _settings(-customrangemax) [$itk_component(max) value]
     2983
     2984        # set the gauges to dataset's min and max
     2985        foreach { vmin vmax } $_limits($_curFldName) break
     2986        SetMinMaxGauges $vmin $vmax
     2987    } else {
     2988        # custom range was turned on
     2989
     2990        # enable the min/max labels and gauge widgets
     2991        $itk_component(l_min) configure -state normal
     2992        $itk_component(min) configure -state normal
     2993        $itk_component(l_max) configure -state normal
     2994        $itk_component(max) configure -state normal
     2995
     2996        # if the custom range is being turned on by clicking the
     2997        # checkbox, restore the min and max gauges from the backup
     2998        # variables. otherwise, new values for the min and max
     2999        # widgets will be set later from the legend's editor.
     3000        if { $_customRangeClick } {
     3001            SetMinMaxGauges $_settings(-customrangemin) $_settings(-customrangemax)
     3002        }
     3003
     3004        # reset the click flag
     3005        set _customRangeClick 1
     3006    }
     3007    AdjustSetting -range
     3008}
     3009
     3010# ----------------------------------------------------------------------
     3011# USAGE: SetMinMaxGauges <min> <max>
     3012#
     3013# Set the min and max gauges in the correct order, avoiding the
     3014# error where you try to set the min > max before updating the max or
     3015# set the max < min before updating the min.
     3016#
     3017# There are five range cases to consider with our current range validation.
     3018# For example:
     3019# [2,3] -> [0,1]       : update min first, max last
     3020# [2,3] -> [4,5]       : update max first, min last
     3021# [2,3] -> [0,2.5]     : update min or max first
     3022# [2,3] -> [2.5,5]     : update min or max first
     3023# [2,3] -> [2.25,2.75] : update min or max first
     3024#
     3025# In 4 of the cases we can update min first and max last, so we only
     3026# need to check the case where old max < new min, where we update
     3027# max first and min last.
     3028# ----------------------------------------------------------------------
     3029itcl::body Rappture::VtkGlyphViewer::SetMinMaxGauges {min max} {
     3030
     3031    if { [$itk_component(max) value] < $min} {
     3032        # old max < new min
     3033        # shift range toward right
     3034        # extend max first, then update min
     3035        $itk_component(max) value $max
     3036        $itk_component(min) value $min
     3037    } else {
     3038        # extend min first, then update max
     3039        $itk_component(min) value $min
     3040        $itk_component(max) value $max
    26463041    }
    26473042}
     
    27213116                set _curFldName $fname
    27223117                set _curFldLabel $label
     3118                set _curFldComp $components
    27233119            }
    27243120        }
    27253121    }
    27263122    $itk_component(field) value $_curFldLabel
    2727 }
     3123    if { $_settings(-customrange) } {
     3124        set limits [list [$itk_component(min) value] [$itk_component(max) value]]
     3125        SendCmd "dataset maprange explicit $limits $_curFldName point_data $_curFldComp"
     3126    } else {
     3127        if { ![info exists _limits($_curFldName)] } {
     3128            SendCmd "dataset maprange all"
     3129        } else {
     3130            set limits $_limits($_curFldName)
     3131            SendCmd "dataset maprange explicit $limits $_curFldName point_data $_curFldComp"
     3132        }
     3133    }
     3134}
Note: See TracChangeset for help on using the changeset viewer.