Ignore:
Timestamp:
Feb 14, 2008, 9:43:54 AM (17 years ago)
Author:
gah
Message:

fixes for isosurfaces, added experimental <opendx> tag handler

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/scripts/nanovisviewer.tcl

    r879 r885  
    4444    public method delete {args}
    4545    public method scale {args}
    46     public method getLimits { { option "-current"} } {
    47         if { $option == "-current" } {
    48             set dataobj [lindex [get] 0]
    49             return [list $_limits($dataobj-vmin) $_limits($dataobj-vmax)]
    50         }
    51         return [list $_limits(vmin) $_limits(vmax)]
     46    public method getLimits { { option ""} } {
     47        return [array get _limits]
    5248    }
    5349    public method download {option args}
     
    8480    public method update_transfer_function {}
    8581    public method remove_duplicate_isomarker { m x }
     82    public method over_isomarker { m x }
    8683    public method _addIsoMarker { x y }
    8784    protected method _initIsoMarkers {dataobj comp}
     
    110107    private variable _receiveids   ;# list of data objs to send to server
    111108    private variable _opacity
     109    private variable _thickness
    112110
    113111    private variable _click        ;# info used for _move operations
     
    130128    private variable _canvas    ""
    131129    private variable _nvobj     ""
    132     private common _normal_icon ""
    133     private common _active_icon ""
     130    private common _normalIcon ""
     131    private common _activeIcon ""
     132    private variable _active_motion   0
     133    private variable _active_press    0
    134134
    135135    constructor {c obj args} {
     
    137137        set _nvobj $obj
    138138       
    139         if { $_normal_icon == "" } {
     139        if { $_normalIcon == "" } {
    140140            set normal_icon_data {
    141141R0lGODlhBwATAOcxAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0N
     
    176176gEiSJk9+BDnSo8uAADs=
    177177            }
    178             set _normal_icon [image create photo -data $normal_icon_data]
    179             set _active_icon [image create photo -data $active_icon_data]
     178            set _normalIcon [image create photo -data $normal_icon_data]
     179            set _activeIcon [image create photo -data $active_icon_data]
    180180        }
    181181        set w [winfo width $_canvas]
    182182        set h [winfo height $_canvas]
    183183        set _tick [$c create image 0 $h \
    184                 -image $_normal_icon -anchor s \
     184                -image $_normalIcon -anchor s \
    185185                -tags "$this $obj" -state hidden]
    186186        set _label [$c create text 0 $h \
     
    189189        $c bind $_tick <Enter> [itcl::code $this handle_event "enter"]
    190190        $c bind $_tick <Leave> [itcl::code $this handle_event "leave"]
     191        $c bind $_tick <ButtonPress-1> \
     192            [itcl::code $this handle_event "start" %x %y]
    191193        $c bind $_tick <B1-Motion> \
    192194            [itcl::code $this handle_event "update" %x %y]
     
    199201
    200202    public method get_relative_value {} {
    201         foreach {min max} [$_nvobj getLimits -current] break
    202         return [expr {($_value-$min)/($max - $min)}]
     203        array set limits [$_nvobj getLimits]
     204        return [expr {($_value-$limits(vmin))/($limits(vmax) - $limits(vmin))}]
     205    }
     206    public method activate { bool } {
     207        if  { $bool || $_active_press || $_active_motion } {
     208            $_canvas itemconfigure $_label -state normal
     209            $_canvas itemconfigure $_tick -image $_activeIcon
     210        } else {
     211            $_canvas itemconfigure $_label -state hidden
     212            $_canvas itemconfigure $_tick -image $_normalIcon
     213        }
    203214    }
    204215    public method show {} {
     
    232243    }
    233244    public method set_relative_value { x } {
    234         foreach {min max} [$_nvobj getLimits -current] break
    235         set r [expr $max - $min]
    236         set_absolute_value [expr {($x * $r) + $min}]
     245        array set limits [$_nvobj getLimits]
     246        set r [expr $limits(vmax) - $limits(vmin)]
     247        set_absolute_value [expr {($x * $r) + $limits(vmin)}]
    237248    }
    238249    public method handle_event { option args } {
     250        puts stderr "option=$option"
    239251        switch -- $option {
    240252            enter {
    241                 $_canvas itemconfigure $_label -state normal
    242                 $_canvas itemconfigure $_tick -image $_active_icon
     253                set _active_motion 1
     254                activate yes
    243255                $_canvas raise $_tick
    244256            }
    245257            leave {
    246                 $_canvas itemconfigure $_label -state hidden
    247                 $_canvas itemconfigure $_tick -image $_normal_icon
     258                set _active_motion 0
     259                activate no
    248260            }
    249261            start {
    250262                $_canvas raise $_tick
     263                set _active_press 1
     264                activate yes
    251265            }
    252266            update {
     
    254268                set x [lindex $args 0]
    255269                set_relative_value [expr {double($x-10)/($w-20)}]
     270                $_nvobj over_isomarker $this $x
    256271                $_nvobj update_transfer_function
    257272            }
     
    261276                    eval handle_event update $args
    262277                }
     278                set _active_press 0
     279                activate no
    263280            }
    264281            default {
     
    308325    set _obj2id(count) 0
    309326    set _id2obj(count) 0
     327    set _limits(vmin) 0.0
     328    set _limits(vmax) 1.0
    310329
    311330    itk_component add controls {
     
    543562    $inner.scales.transp set 50
    544563
    545     label $inner.scales.zerol -text "Transparent" -font $fg
     564    label $inner.scales.zerol -text "Clear" -font $fg
    546565    grid $inner.scales.zerol -row 2 -column 0 -sticky e
    547566    ::scale $inner.scales.opacity -from 0 -to 100 -orient horizontal \
     
    550569    label $inner.scales.onel -text "Opaque" -font $fg
    551570    grid $inner.scales.onel -row 2 -column 2 -sticky w
    552     $inner.scales.opacity set 50
     571    $inner.scales.opacity set 100
     572
     573    label $inner.scales.thinl -text "Thin" -font $fg
     574    grid $inner.scales.thinl -row 3 -column 0 -sticky e
     575    ::scale $inner.scales.thickness -from 0 -to 1000 -orient horizontal \
     576        -showvalue off -command [itcl::code $this _fixSettings thickness]
     577    grid $inner.scales.thickness -row 3 -column 1 -sticky ew
     578    label $inner.scales.thickl -text "Thick" -font $fg
     579    grid $inner.scales.thickl -row 3 -column 2 -sticky w
     580    $inner.scales.thickness set 500
    553581
    554582    set ::Rappture::NanovisViewer::_isosurface($this) 1
     
    557585        -variable ::Rappture::NanovisViewer::_isosurface($this) \
    558586        -command [itcl::code $this _fixSettings isosurface]
    559     grid $inner.scales.isosurface -row 3 -column 0 -columnspan 2 -sticky w
     587    grid $inner.scales.isosurface -row 4 -column 0 -columnspan 2 -sticky w
    560588
    561589
     
    10831111            # and make sure that it's defined on the server.
    10841112            #
    1085             _initIsoMarkers $dataobj $comp
     1113            if { ![info exists _isomarkers($dataobj)] } {
     1114                _initIsoMarkers $dataobj $comp
     1115            } else {
     1116                _hideIsoMarkers $dataObj
     1117            }
    10861118            foreach {sname cmap wmap} [_genTransfuncData $dataobj $comp] break
    10871119            set cmdstr [list transfunc define $sname $cmap $wmap]
     
    13221354    _fixSettings transp
    13231355    _fixSettings isosurface
     1356    _fixSettings opacity
     1357    _fixSettings thickness
    13241358
    13251359    if {"" == $itk_option(-plotoutline)} {
     
    16121646            }
    16131647        }
     1648        thickness {
     1649            if {[isconnected]} {
     1650                set dataobj [lindex [get] 0]
     1651                if {$dataobj != 0} {
     1652                    set val [$inner.scales.opacity get]
     1653                    # Scale values between 0.00001 and 0.01000
     1654                    set sval [expr {0.00001*double($val)}]
     1655                    set _thickness($dataobj) $sval
     1656                    update_transfer_function
     1657                }
     1658            }
     1659        }
    16141660        isosurface {
    16151661            if {[isconnected]} {
     
    17071753
    17081754    set delta 0.0005
     1755    if { [info exists _thickness($dataobj)]} {
     1756        set delta $_thickness($dataobj)
     1757    }
    17091758    set first [lindex $isovalues 0]
    17101759    set last [lindex $isovalues end]
     
    17141763    }
    17151764    foreach x $isovalues {
    1716         set x1 [expr {$x-$delta-0.001}]
     1765        set x1 [expr {$x-$delta}]
    17171766        set x2 [expr {$x-$delta}]
    17181767        set x3 [expr {$x+$delta}]
    1719         set x4 [expr {$x+$delta+0.001}]
     1768        set x4 [expr {$x+$delta}]
    17201769        if { $x1 < 0.0 } {
    17211770            set x1 0.0
     
    18241873
    18251874itcl::body Rappture::NanovisViewer::_initIsoMarkers {dataobj comp} {
    1826     if { [info exists _isomarkers($dataobj)] } {
    1827         _hideIsoMarkers $dataObj
    1828         return
    1829     }
    18301875    array set style {
    1831         -levels 6
     1876        -levels 6x
    18321877    }
    18331878    array set style [lindex [$dataobj components -style $comp] 0]
    18341879    set levels $style(-levels)
    18351880    set c $itk_component(legend)
    1836     if { [llength $levels] == 1 && [string is int $levels] } {
    1837         for {set i 1} {$i <= $levels} {incr i} {
    1838             set x [expr {double($i)/($levels+1)}]
     1881    regsub -all "," $levels " " levels
     1882    foreach level $levels {
     1883        set n [scan $level "%g%s" value suffix]
     1884        if { $n == 2 && $suffix == "%" } {
     1885            # ${n}% : Set relative value.
     1886            set value [expr {$value * 0.01}]
    18391887            set m [IsoMarker \#auto $c $this]
    1840             $m set_relative_value $x
    1841             lappend _isomarkers($dataobj) $m
     1888            $m set_relative_value $value
     1889            lappend _isomarkers($dataobj) $m
     1890        } elseif { $n == 2 && $suffix == "x" } {
     1891            # ${n}x : Set equal number of levels
     1892            if { $value != round($value) } {
     1893                error "\# of levels \"$value\" must be an interger"
     1894            }
     1895            set nLevels [expr round($value)]
     1896            for {set i 1} {$i <= $nLevels} {incr i} {
     1897                set x [expr {double($i)/($nLevels+1)}]
     1898                set m [IsoMarker \#auto $c $this]
     1899                $m set_relative_value $x
     1900                lappend _isomarkers($dataobj) $m
     1901            }
     1902        } else {
     1903            # ${n} : Set absolute value.
     1904            set m [IsoMarker \#auto $c $this]
     1905            $m set_absolute_value $value
     1906            lappend _isomarkers($dataobj) $m
    18421907        }
    1843     } else {
    1844         regsub -all "," $levels " " levels
    1845         foreach level $levels {
    1846             set n [scan $level "%g%s" x unit]
    1847             set m [IsoMarker \#auto $c $this]
    1848             lappend _isomarkers($dataobj) $m
    1849             if { $n == 2 && $unit == "%" } {
    1850                 set x [expr {$x * 0.01}]
    1851                 $m set_relative_value $x
    1852             } else {
    1853                 $m set_absolute_value $x
    1854             }
    1855         }
    18561908    }
    18571909}
     
    19041956        return 0
    19051957    }
    1906     set bool 1
     1958    set bool 0
    19071959    if { [info exists _isomarkers($dataobj)] } {
    19081960        set list {}
     
    19141966                    $marker set_relative_value [$m get_relative_value]
    19151967                    itcl::delete object $m
    1916                     set bool 0
     1968                    bell
     1969                    set bool 1
    19171970                    continue
    19181971                }
     
    19251978    return $bool
    19261979}
     1980
     1981itcl::body Rappture::NanovisViewer::over_isomarker { marker x } {
     1982    set dataobj [lindex [get] 0]
     1983    if {"" == $dataobj} {
     1984        return ""
     1985    }
     1986    if { [info exists _isomarkers($dataobj)] } {
     1987        set marker [namespace tail $marker]
     1988        foreach m $_isomarkers($dataobj) {
     1989            set sx [$m get_screen_position]
     1990            if { $m != $marker } {
     1991                set bool [expr { $x >= ($sx-3) && $x <= ($sx+3) }]
     1992                $m activate $bool
     1993            }
     1994        }
     1995    }
     1996    return ""
     1997}
Note: See TracChangeset for help on using the changeset viewer.