summaryrefslogtreecommitdiffstats
path: root/ds9/library/catreg.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'ds9/library/catreg.tcl')
-rw-r--r--ds9/library/catreg.tcl395
1 files changed, 395 insertions, 0 deletions
diff --git a/ds9/library/catreg.tcl b/ds9/library/catreg.tcl
new file mode 100644
index 0000000..505e919
--- /dev/null
+++ b/ds9/library/catreg.tcl
@@ -0,0 +1,395 @@
+# 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
+
+# catreg -- convert catalog table into region string
+proc CATReg {varname row interactive resultname} {
+ upvar $resultname result
+
+ upvar #0 $varname var
+ global $varname
+ global $var(tbldb)
+ global $var(symdb)
+
+ # init result
+ set result {}
+
+ # How to process each field of a filter
+ # -------------------------------------
+ # condition: subst/expr
+ # shape: constant
+ # color: constant
+ # width: constant
+ # dash: constant
+ # font: constant
+ # fontsize: constant
+ # fontweight: constant
+ # fontslant: constant
+ # text: subst
+ # size1: expr
+ # size2: expr
+ # angle: expr
+
+ # valid cols?
+ if {$var(colx) == {} || $var(coly) == {}} {
+ return
+ }
+ set colx [starbase_colnum $var(tbldb) $var(colx)]
+ set coly [starbase_colnum $var(tbldb) $var(coly)]
+
+ # do we have formats for colx and coly?
+ if {[catch {starbase_hdrget $var(tbldb) UFMT} ff]} {
+ set ff {}
+ global errorInfo
+ set errorInfo {}
+ }
+ set xformat [lindex $ff 0]
+ set yformat [lindex $ff 1]
+
+ # else, do we have T(Units), i.e. votable
+ set db $var(tbldb)
+ upvar #0 $db T
+ if {[info exists T(Unit)]} {
+ set xformat [string trim [lindex $T(Unit) [expr $colx-1]] {"}]
+ set yformat [string trim [lindex $T(Unit) [expr $coly-1]] {"}]
+ }
+
+ # process prologue
+ append result "# Region file format: DS9 version 4.0\n"
+
+ # for speed...
+ # tbldb
+ set nrows [starbase_nrows $var(tbldb)]
+ set cols [starbase_columns $var(tbldb)]
+
+ # system
+ switch $var(psystem) {
+ image -
+ physical -
+ detector -
+ amplifier {set sys $var(psystem)}
+ default {set sys "$var(psystem); $var(psky)"}
+ }
+
+ # symdb
+ set snrows [starbase_nrows $var(symdb)]
+ set sncond [starbase_colnum $var(symdb) condition]
+ set snshape [starbase_colnum $var(symdb) shape]
+ set sncolor [starbase_colnum $var(symdb) color]
+ set snwidth [starbase_colnum $var(symdb) width]
+ set sndash [starbase_colnum $var(symdb) dash]
+ set snfont [starbase_colnum $var(symdb) font]
+ set snfontsize [starbase_colnum $var(symdb) fontsize]
+ set snfontweight [starbase_colnum $var(symdb) fontweight]
+ set snfontslant [starbase_colnum $var(symdb) fontslant]
+ set sntext [starbase_colnum $var(symdb) text]
+ set snsize [starbase_colnum $var(symdb) size]
+ set snsize2 [starbase_colnum $var(symdb) size2]
+ set snunits [starbase_colnum $var(symdb) units]
+ set snangle [starbase_colnum $var(symdb) angle]
+
+ # for each row in the catalog table ...
+ if {[string is integer -strict $row]} {
+ set start $row
+ set end $row
+ } else {
+ set start 1
+ set end $nrows
+ }
+
+ # look for need to eval colnames (only used for conditionals and text
+ set doEval 0
+ for {set jj 1} {$jj <= $snrows} {incr jj} {
+ set cond [starbase_get $var(symdb) $jj $sncond]
+ set text [starbase_get $var(symdb) $jj $sntext]
+ set sz [starbase_get $var(symdb) $jj $snsize]
+ set sz2 [starbase_get $var(symdb) $jj $snsize2]
+ set angle [starbase_get $var(symdb) $jj $snangle]
+ if {$cond!={} || $text!={} || $sz!={} || $sz2!={} || $angle!={}} {
+ set doEval 1
+ }
+ }
+
+ for {set ii $start} {$ii <= $end} {incr ii} {
+ if {$doEval} {
+ # define each colunm variable
+ foreach col $cols {
+ set val [starbase_get $var(tbldb) $ii \
+ [starbase_colnum $var(tbldb) $col]]
+ # here's a tough one-- what to do if the col is blank
+ # for now, just set it to '0'
+ if {[string trim "$val"] == {}} {
+ set val 0
+ }
+ eval "set \{$col\} \{$val\}"
+ }
+ }
+
+ # look through each filter
+ for {set jj 1} {$jj <= $snrows} {incr jj} {
+ # eval condition
+ set cond [starbase_get $var(symdb) $jj $sncond]
+
+ if {$cond != {}} {
+ set found 0
+
+ # subst any column vars
+ if {[catch {subst $cond} cc]} {
+ Error "Unable to evaluate condition $cc"
+ return
+ }
+ # evaluate filter
+ if {[catch {expr $cc} found]} {
+ Error "Unable to evaluate condition $cc"
+ return
+ }
+ } else {
+ set found 1
+ }
+
+ # if not true, goto the next filter
+ if {!$found} {
+ continue
+ }
+
+ # shape
+ set shape [starbase_get $var(symdb) $jj $snshape]
+ if {$shape == {}} {
+ set shape circle
+ }
+
+ # xx
+ set xx [starbase_get $var(tbldb) $ii $colx]
+ switch $xformat {
+ {h:m:s} -
+ {d:m:s} {set xx [uformat $xformat d $xx]}
+ }
+
+ # yy
+ set yy [starbase_get $var(tbldb) $ii $coly]
+ if {$yformat == {d:m:s}} {
+ set yy [uformat $yformat d $yy]
+ }
+
+ # size/angle
+ set szcol {}
+ set sz2col {}
+ set angcol {}
+
+ set units [starbase_get $var(symdb) $jj $snunits]
+ switch -- $units {
+ image {set unitval i}
+ physical {set unitval p}
+ degrees {set unitval d}
+ arcmin {set unitval {'}}
+ arcsec {set unitval {"}}
+ default {set unitval p}
+ }
+
+ switch -- $shape {
+ text -
+ point -
+ {circle point} -
+ {box point} -
+ {diamond point} -
+ {cross point} -
+ {x point} -
+ {arrow point} -
+ {boxcircle point} {set size {}}
+
+ circle {
+ set sz [starbase_get $var(symdb) $jj $snsize]
+
+ set szcolnm [string range $sz 1 end]
+ if {[lsearch -exact $cols $szcolnm] != -1} {
+ set szcol [starbase_colnum $var(tbldb) $szcolnm]
+ }
+
+ if {$sz != {}} {
+ if {[catch {expr $sz} ss]} {
+ Error "Unable to evaluate size $sz"
+ return
+ } else {
+ set sz $ss
+ }
+ } else {
+ set sz 5
+ }
+ set size "${sz}${unitval}"
+ }
+
+ vector {
+ set sz [starbase_get $var(symdb) $jj $snsize]
+
+ set szcolnm [string range $sz 1 end]
+ if {[lsearch -exact $cols $szcolnm] != -1} {
+ set szcol [starbase_colnum $var(tbldb) $szcolnm]
+ }
+
+ if {$sz != {}} {
+ if {[catch {expr $sz} ss]} {
+ Error "Unable to evaluate size $sz"
+ return
+ } else {
+ set sz $ss
+ }
+ } else {
+ set sz 5
+ }
+
+ set angle [starbase_get $var(symdb) $jj $snangle]
+
+ set angcolnm [string range $angle 1 end]
+ if {[lsearch -exact $cols $angcolnm] != -1} {
+ set angcol [starbase_colnum $var(tbldb) $angcolnm]
+ }
+
+ if {$angle != {}} {
+ if {[catch {expr $angle} aa]} {
+ Error "Unable to evaluate angle $angle"
+ return
+ } else {
+ set angle $aa
+ }
+ } else {
+ set angle 0
+ }
+
+ set size "${sz}${unitval} ${angle}"
+ }
+
+ ellipse -
+ box {
+ # size
+ set sz [starbase_get $var(symdb) $jj $snsize]
+
+ set szcolnm [string range $sz 1 end]
+ if {[lsearch -exact $cols $szcolnm] != -1} {
+ set szcol [starbase_colnum $var(tbldb) $szcolnm]
+ }
+
+ if {$sz != {}} {
+ if {[catch {expr $sz} ss]} {
+ Error "Unable to evaluate size $sz"
+ return
+ } else {
+ set sz $ss
+ }
+ } else {
+ set sz 5
+ }
+
+ # size2
+ set sz2 [starbase_get $var(symdb) $jj $snsize2]
+
+ set sz2colnm [string range $sz2 1 end]
+ if {[lsearch -exact $cols $sz2colnm] != -1} {
+ set sz2col [starbase_colnum $var(tbldb) $sz2colnm]
+ }
+
+ if {$sz2 != {}} {
+ if {[catch {expr $sz2} ss]} {
+ Error "Unable to evaluate size $sz2"
+ return
+ } else {
+ set sz2 $ss
+ }
+ } else {
+ set sz2 5
+ }
+
+ # angle
+ set angle [starbase_get $var(symdb) $jj $snangle]
+
+ set angcolnm [string range $angle 1 end]
+ if {[lsearch -exact $cols $angcolnm] != -1} {
+ set angcol [starbase_colnum $var(tbldb) $angcolnm]
+ }
+
+ if {$angle != {}} {
+ if {[catch {expr $angle} aa]} {
+ Error "Unable to evaluate angle $angle"
+ return
+ } else {
+ set angle $aa
+ }
+ } else {
+ set angle 0
+ }
+
+ # put it all together
+ set size "${sz}${unitval} ${sz2}${unitval} ${angle}"
+ }
+ }
+
+ # color
+ set color [starbase_get $var(symdb) $jj $sncolor]
+ if {$color == {}} {
+ set color green
+ }
+
+ # width
+ set width [starbase_get $var(symdb) $jj $snwidth]
+ if {$width == {}} {
+ set width 1
+ }
+
+ # dash
+ set dash [starbase_get $var(symdb) $jj $sndash]
+ if {$dash == {}} {
+ set dash 0
+ }
+
+
+ #font
+ set font [starbase_get $var(symdb) $jj $snfont]
+ if {$font == {}} {
+ set font helvetica
+ }
+ set fontsize [starbase_get $var(symdb) $jj $snfontsize]
+ if {$fontsize == {}} {
+ set fontsize 10
+ }
+ set fontweight [starbase_get $var(symdb) $jj $snfontweight]
+ if {$fontweight == {}} {
+ set fontweight normal
+ }
+ set fontslant [starbase_get $var(symdb) $jj $snfontslant]
+ if {$fontslant == {}} {
+ set fontslant roman
+ }
+
+ # text
+ set text [starbase_get $var(symdb) $jj $sntext]
+ if {$text != {}} {
+ if {[catch {subst $text} tt]} {
+ Error "Unable to evaluate text $text"
+ return
+ } else {
+ set text $tt
+ }
+ }
+ if {$shape == {text} && $text == {}} {
+ set text "$ii"
+ }
+
+ # final substitution and append result
+ # init result for substitutions
+ if {$interactive} {
+ if {$var(edit)} {
+ set template "\${sys};\${shape}(\${xx} \${yy} \${size}) # color=\${color} width=\${width} dash=\${dash} font=\{${font} ${fontsize} ${fontweight} ${fontslant}\} text=\{\${text}\} tag={${varname}} tag={${varname}.\${ii}} select=1 edit=1 move=1 rotate=1 delete=1 highlite=0 callback=select CATHighliteCB {${varname}.\${ii}} callback=unselect CATUnhighliteCB {${varname}.\${ii}} callback=edit CATEditCB {${varname}.\${ii}.\${szcol}.\${sz2col}.\${units}.\${angcol}} callback=move CATMoveCB {${varname}.\${ii}} callback=rotate CATRotateCB {${varname}.\${ii}.\${angcol}} callback=delete CATDeleteCB {${varname}.\${ii}}\n"
+ } else {
+ set template "\${sys};\${shape}(\${xx} \${yy} \${size}) # color=\${color} width=\${width} dash=\${dash} font=\{${font} ${fontsize} ${fontweight} ${fontslant}\} text=\{\${text}\} tag={${varname}} tag={${varname}.\${ii}} select=0 edit=0 move=0 rotate=0 delete=1 highlite=1 callback=delete CATDeleteCB {${varname}.\${ii}} callback=highlite CATHighliteCB {${varname}.\${ii}} callback=unhighlite CATUnhighliteCB {${varname}.\${ii}}\n"
+ }
+ } else {
+ set template "\${sys};\${shape}(\${xx} \${yy} \${size}) # color=\${color} width=\${width} dash=\${dash} text=\{\${text}\} tag=$varname\n"
+ }
+ append result [subst $template]
+
+ # ok, we are done
+ break
+ }
+ }
+}