diff options
Diffstat (limited to 'ds9/library/examine.tcl')
-rw-r--r-- | ds9/library/examine.tcl | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/ds9/library/examine.tcl b/ds9/library/examine.tcl new file mode 100644 index 0000000..5cc82dc --- /dev/null +++ b/ds9/library/examine.tcl @@ -0,0 +1,319 @@ +# Copyright (C) 1999-2016 +# Smithsonian Astrophysical Observatory, Cambridge, MA, USA +# For conditions of distribution and use, see copyright notice in "copyright" + +package provide DS9 1.0 + +proc ExamineDef {} { + global pexamine + + # prefs only + set pexamine(mode) new + set pexamine(zoom) 4 +} + +proc ExamineButton {which x y} { + if {![$which has fits]} { + return + } + + switch -- [$which get type] { + base {ExamineButtonBase $which $x $y} + rgb {ExamineButtonRGB $which $x $y} + 3d {ExamineButton3D $which $x $y} + } +} + +proc ExamineButtonBase {which x y} { + global current + global ds9 + global pexamine + + # this code will not handle mosaics. + + # current coord + set coord [$which get coordinates $x $y physical] + + # find filename/slice + set fn [$which get fits file name full canvas $x $y] + for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { + set slice($ii) [$which get fits slice $ii] + } + + # so the new frame will have all of the parent frame when created + set ds9(next) $which + GotoFrame + + # create frame if needed + switch -- $pexamine(mode) { + new {CreateFrame} + one { + if {[info exists pexamine(one)]} { + if {$which == $pexamine(one)} { + # do nothing, we clicked in the examine frame + return + } + DeleteSingleFrame $pexamine(one) + CreateFrame + set pexamine(one) $current(frame) + } else { + CreateFrame + set pexamine(one) $current(frame) + } + } + } + + # go to tile mode in case + set current(display) tile + DisplayMode + + # load data + LoadFitsFile $fn {} {} + + RealizeDS9 + + # set slice + for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { + $current(frame) update fits slice $ii $slice($ii) + } + + # zoom to about + if {[$current(frame) has fits bin]} { + set bf "[$current(frame) get bin factor]" + set bx [expr [lindex $bf 0]/$pexamine(zoom)] + set by [expr [lindex $bf 1]/$pexamine(zoom)] + $current(frame) bin factor to $bx $by about \ + [lindex $coord 0] [lindex $coord 1] + } else { + $current(frame) zoom $pexamine(zoom) $pexamine(zoom) \ + about physical [lindex $coord 0] [lindex $coord 1] + } + + # back to original frame + set ds9(next) $which + GotoFrame + + # update any dialogs + UpdateDS9 +} + +proc ExamineButtonRGB {which x y} { + global current + global ds9 + global pexamine + + # this code is far from perfect. It assumes data is loaded into the red + # and it is the keychannel. Furthermore, it assumes either images or bin + # tables are loaded into each channel, but not both. + # this code will not handle mosaics. + + # save current channel + set channel [$which get rgb channel] + + # current coord + $which rgb channel red + set coord [$which get coordinates $x $y physical] + + # find filename/slice + foreach cc {red green blue} { + $which rgb channel $cc + set fn($cc) [$which get fits file name full canvas $x $y] + + for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { + set slice($cc,$ii) [$which get fits slice $ii] + } + } + + # so the new frame will have all of the parent frame when created + set ds9(next) $which + GotoFrame + + # create frame if needed + switch -- $pexamine(mode) { + new {CreateRGBFrame} + one { + if {[info exists pexamine(one)]} { + if {$which == $pexamine(one)} { + # do nothing, we clicked in the examine frame + return + } + DeleteSingleFrame $pexamine(one) + CreateRGBFrame + set pexamine(one) $current(frame) + } else { + CreateRGBFrame + set pexamine(one) $current(frame) + } + } + } + + # go to tile mode in case + set current(display) tile + DisplayMode + + # load data + foreach cc {red green blue} { + $current(frame) rgb channel $cc + + if {$fn($cc) != {}} { + LoadFitsFile $fn($cc) {} {} + } + } + + RealizeDS9 + + # set slice + foreach cc {red green blue} { + $current(frame) rgb channel $cc + for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { + $current(frame) update fits slice $ii $slice($cc,$ii) + } + } + + # zoom to about + $current(frame) rgb channel red + if {[$current(frame) has fits bin]} { + foreach cc {red green blue} { + $which rgb channel $cc + $current(frame) rgb channel $cc + + set bf "[$current(frame) get bin factor]" + set bx [expr [lindex $bf 0]/$pexamine(zoom)] + set by [expr [lindex $bf 1]/$pexamine(zoom)] + $current(frame) bin factor to $bx $by about \ + [lindex $coord 0] [lindex $coord 1] + } + } else { + $current(frame) zoom $pexamine(zoom) $pexamine(zoom) \ + about image [lindex $coord 0] [lindex $coord 1] + } + + # set channel + $current(frame) rgb channel $channel + + # back to original frame + set ds9(next) $which + GotoFrame + $current(frame) rgb channel $channel + + # update any dialogs + UpdateDS9 +} + +proc ExamineButton3D {which x y} { + global current + global ds9 + global pexamine + + # this code will not handle mosaics. + + # current coord + set coord [$which get coordinates $x $y physical] + + # find filename/slice + set fn [$which get fits file name full canvas $x $y] + for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { + set slice($ii) [$which get fits slice $ii] + } + + # and 3d info + set rr [$current(frame) get 3d view] + set az [lindex $rr 0] + set el [lindex $rr 1] + set method [$current(frame) get 3d method] + + # so the new frame will have all of the parent frame when created + set ds9(next) $which + GotoFrame + + # create frame if needed + switch -- $pexamine(mode) { + new {Create3DFrame} + one { + if {[info exists pexamine(one)]} { + if {$which == $pexamine(one)} { + # do nothing, we clicked in the examine frame + return + } + DeleteSingleFrame $pexamine(one) + Create3DFrame + set pexamine(one) $current(frame) + } else { + Create3DFrame + set pexamine(one) $current(frame) + } + } + } + + # go to tile mode in case + set current(display) tile + DisplayMode + + # load data + LoadFitsFile $fn {} {} + + RealizeDS9 + + # set slice + for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { + $current(frame) update fits slice $ii $slice($ii) + } + + # zoom to about + if {[$current(frame) has fits bin]} { + set bf "[$current(frame) get bin factor]" + set bx [expr [lindex $bf 0]/$pexamine(zoom)] + set by [expr [lindex $bf 1]/$pexamine(zoom)] + $current(frame) bin factor to $bx $by about \ + [lindex $coord 0] [lindex $coord 1] + } else { + $current(frame) zoom $pexamine(zoom) $pexamine(zoom) \ + about physical [lindex $coord 0] [lindex $coord 1] + } + + # set 3d + $current(frame) 3d view $az $el + $current(frame) 3d method $method + + # back to original frame + set ds9(next) $which + GotoFrame + + # update any dialogs + UpdateDS9 +} + +# Prefs + +proc PrefsDialogExamine {} { + global dprefs + + set w $dprefs(tab) + + $dprefs(list) insert end [msgcat::mc {Examine}] + lappend dprefs(tabs) [ttk::frame $w.examine] + + # Examine + set f [ttk::labelframe $w.examine.mode -text [msgcat::mc {Mode}]] + + ttk::radiobutton $f.new -text [msgcat::mc {New Frame each Time}] \ + -variable pexamine(mode) -value new + ttk::radiobutton $f.one -text [msgcat::mc {Examine Frame}] \ + -variable pexamine(mode) -value one + + grid $f.new -padx 2 -pady 2 -sticky w + grid $f.one -padx 2 -pady 2 -sticky w + + set f [ttk::labelframe $w.examine.mag -text [msgcat::mc {Magnification}]] + + ttk::radiobutton $f.x1 -text {1x} -variable pexamine(zoom) -value 1 + ttk::radiobutton $f.x2 -text {2x} -variable pexamine(zoom) -value 2 + ttk::radiobutton $f.x4 -text {4x} -variable pexamine(zoom) -value 4 + ttk::radiobutton $f.x8 -text {8x} -variable pexamine(zoom) -value 8 + ttk::radiobutton $f.x16 -text {16x} -variable pexamine(zoom) -value 16 + + grid $f.x1 $f.x2 $f.x4 $f.x8 $f.x16 -padx 2 -pady 2 -sticky w + + pack $w.examine.mode $w.examine.mag -side top -fill both -expand true +} + |