alignmentbrowser.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:9k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. proc newAlignmentBrowser {meshes} {
  2.     # create a new window on each invocation
  3.     set br [toplevel .alignBrowser_[getUniqueInt]]
  4.     wm title $br "Registration pair browser -- $meshes"
  5.     window_Register $br
  6.     # set up scrollable pane (main) with header and footer
  7.     ab_create3PaneWindow $br header main footer
  8.     # now we can put whatever we want in main, header and footer
  9.     # header: sortable column headers
  10.     label $header.instr -text "Sort by"
  11.     label $header.errormetrics -text "Error metrics"
  12.     grid $header.instr - x x x $header.errormetrics - - - - -row 0
  13.     abm_buildframe $header 1 Mesh Partner M/A Qual "#Points" 
  14. max avg rms pw_point pw_plane Date
  15.     # for each pair:
  16.     # srcName destName m/a qual errmetrics(all) ptcount date
  17.     # TODO: overlap, other 2nd-order quality metrics?
  18.     set i 0
  19.     foreach mesh $meshes {
  20. foreach partner [plv_globalreg listpairsfor $mesh] {
  21.     eval abm_buildframe $main $i $mesh $partner 
  22. [plv_globalreg getstats $mesh $partner]
  23.     incr i
  24. }
  25.     }
  26.     # footer: buttons for:
  27.     # (re)View: view those two meshes, w/respective registration
  28.     # Edit: view, and send those two meshes to ICP
  29.     # Delete: nuke pair
  30.     # Grade: set quality
  31.     # TODO: activate these
  32.     button $footer.view -text "reView" -state disabled
  33.     button $footer.edit -text "Edit" -state disabled
  34.     button $footer.delete -text "Delete" -state disabled
  35.     label $footer.ql -text "Quality:"
  36.     set qualMenu [tk_optionMenu $footer.qual RegQuality_$br 
  37.       "0 - Unspecified" "1 - Bad" "2 - Fair" "3 - Good"]
  38.     packchildren $footer -side left -fill x
  39.     # TODO: way to select individual row
  40.     # TODO: also need way to select range of rows based on one column value
  41.     # and make column headers sort by that column
  42.     set columntype {name name name num num num num num num num name}
  43.     set nCol [lindex [grid size $header] 0]
  44.     for {set i 0} {$i < $nCol} {incr i} {
  45. set widget [grid slaves $header -row 1 -column $i]
  46. set type [lindex $columntype $i]
  47. if {$type == "name"} {
  48.     set order "-dictionary -increasing"
  49. } else {
  50.     set order "-real -decreasing"
  51. }
  52. bind $widget <Button-1> "grid_sortRows $main $i $order"
  53.     }
  54. }
  55. proc AlignmentSummaryDialog {} {
  56.     if {[window_Activate .alignSummary]} return
  57.     set sum [toplevel .alignSummary]
  58.     wm title $sum "Registration pair browser -- summary"
  59.     window_Register $sum
  60.     # set up scrollable pane (main) with header and footer
  61.     ab_create3PaneWindow $sum header main footer
  62.     # now we can put whatever we want in main, header and footer
  63.     # header:
  64.     label $header.instr -text "Sort by"
  65.     label $header.partners -text "# partners"
  66.     label $header.err -text "error"
  67.     label $header.qual -text "quality"
  68.     grid $header.instr $header.partners - - $header.err - - 
  69. $header.qual - - - -row 0
  70.     abs_buildframe $header 1 Mesh tot man auto min avg max 0 1 2 3
  71.     eval abs_buildframe $header 2 All [plv_globalreg getstatsummary * pnt]
  72.     
  73.     # footer:
  74.     label $footer.instr -text "Click header to sort by that column; click mesh name to send to browser; click other entry to send matching pairs to browser"
  75.     #button $footer.browse -text "Send to browser"
  76.     packchildren $footer -side left -fill x -expand 1
  77.     
  78.     # main:
  79.     set i 0
  80.     foreach mesh [getMeshList] {
  81. eval abs_buildframe $main $i $mesh 
  82.     [plv_globalreg getstatsummary $mesh pnt]
  83. incr i
  84.     }
  85.     # and set expansion properties
  86.     grid rowconfig $header 2 -weight 1
  87.     #grid columnconfig $header 0 -weight 7
  88.     #foreach index {4 5 6} {grid columnconfig $header $index -weight 2}
  89.     #foreach index {1 2 3 7 8 9 10} {grid columnconfig $header $index -weight 1}
  90.     
  91.     # and make column headers sort by that column
  92.     set nCol [lindex [grid size $header] 0]
  93.     set order "-dictionary -increasing"
  94.     for {set i 0} {$i < $nCol} {incr i} {
  95. set widget [grid slaves $header -row 1 -column $i]
  96. bind $widget <Button-1> "grid_sortRows $main $i $order"
  97. # and for all columns after first:
  98. set order "-real -decreasing"
  99.     }
  100.     # and make individual entry-clicks do the right thing
  101.     set nRow [lindex [grid size $main] 1]
  102.     for {set ii 0} {$ii < $nCol} {incr ii} {
  103. for {set i 0} {$i < $nRow} {incr i} {
  104.     set widget [grid slaves $main -row $i -col $ii]
  105.     bind $widget <Button-1> "abs_clickEntry $main $i $ii"
  106. }
  107. # BUGBUG, TODO:
  108. # need redirection table, so that abs_clickEntry row col
  109. # still works after resorting the rows.
  110. set widget [grid slaves $header -row 2 -col $ii]
  111. bind $widget <Button-1> "abs_clickEntry $header -1 $ii"
  112.     }
  113. }
  114. proc abs_clickEntry {grid row col} {
  115.     if {$row == -1} {
  116. set mesh *
  117. set row 2
  118.     } else {
  119. set mesh [grid slaves $grid -row $row -col 0]
  120. set mesh [lindex [$mesh config -text] 4]
  121.     }
  122.     if {$col <= 1} {
  123. set criteria "all pairings"
  124.     } else {
  125. set w [grid slaves $grid -row $row -col $col]
  126. set crit [string range $w [expr 1 + [string last _ $w]] end]
  127. if {[string range $crit 0 2] == "err"} {
  128.     set criteria "$crit above [lindex [$w conf -text] 4]"
  129. } else {
  130.     set criteria "$crit"
  131. }
  132.     }
  133.     # TODO
  134.     puts "This would invoke browser for:"
  135.     puts "Mesh = $mesh, $criteria"
  136. }
  137. proc abm_buildframe {parent iRow mesh partner
  138.      method quality pointcount
  139.      errMax errAvg errRms errRms_pwpoint errRms_pwplane
  140.      date} {
  141.     set f $parent.pairframe_${mesh}_${partner}
  142.     set iCol 0
  143.     foreach widget { mesh partner
  144. method quality pointcount
  145. errMax errAvg errRms errRms_pwpoint errRms_pwplane
  146. date} {
  147. if {$iCol < 2} {set dir w} else {set dir e}
  148. set w [label ${f}_${widget} -text [set $widget] -anchor $dir]
  149. grid $w -sticky $dir -row $iRow -col $iCol
  150. incr iCol
  151.     }
  152.     foreach index {0 1} {grid columnconfig $parent $index -weight 7}
  153.     foreach index {4} {grid columnconfig $parent $index -weight 1}
  154.     foreach index {5 6 7 8 9} {grid columnconfig $parent $index -weight 2}
  155.     foreach index {10} {grid columnconfig $parent $index -weight 4}
  156. }
  157. proc abs_buildframe {parent iRow mesh
  158.      total man auto errmin erravg errmax q0 q1 q2 q3} {
  159.     
  160.     set f $parent.meshframe_${mesh}
  161.     label ${f}_mesh -text $mesh -anchor w
  162.     grid ${f}_mesh -sticky w -row $iRow -col 0
  163.     
  164.     set iCol 1
  165.     foreach widget {total man auto errmin erravg errmax q0 q1 q2 q3} {
  166. set w [label ${f}_${widget} 
  167.    -text [set $widget] -anchor e]
  168. grid $w -sticky e -row $iRow -col $iCol
  169. incr iCol
  170.     }
  171.     
  172.     grid columnconfig $parent 0 -weight 7
  173.     foreach index {4 5 6} {grid columnconfig $parent $index -weight 2}
  174.     foreach index {1 2 3 7 8 9 10} {grid columnconfig $parent $index -weight 1}
  175. }
  176. # will create widgets under parent named header, footer, and main
  177. # will also send these variables down
  178. # you can do with these as you'd like
  179. proc ab_create3PaneWindow {parent vHeader vMain vFooter} {
  180.     upvar 1 $vHeader header $vMain main $vFooter footer
  181.     set bar  [scrollbar $parent.bar -command "$parent.mover yview"]
  182.     set mover [canvas $parent.mover -width 0 -height 0 
  183.    -yscrollcommand "$parent.bar set" -border 1 -relief sunken]
  184.     set main [frame $parent.main]
  185.     set idMain [$mover create window 0 0 -window $main -anchor nw]
  186.     pack $bar -side right -fill y -anchor e
  187.     pack $mover -side left -fill both -expand 1
  188.     bind $mover <Configure> "ab_3pw_resizeMoverChild %W $mover $idMain"
  189.     set header [frame $parent.header]
  190.     set footer [frame $parent.footer]
  191.     grid $header -row 0 -sticky news
  192.     grid $mover -row 1 -col 0 -sticky news
  193.     grid $bar -row 1 -col 1 -sticky nse
  194.     grid $footer - -row 2 -sticky news
  195.     grid rowconfigure $parent 1 -weight 1
  196.     grid columnconfigure $parent 0 -weight 1
  197.     # and update scrollbar size.  Cool hack of the day:
  198.     # nested "after idle" causes it to go to the end of the idle queue at
  199.     # that point, which is necessary because if we schedule it now, it
  200.     # the first idle callback happens before all the geometry stuff
  201.     # happens and the window requests its height.  This way, we schedule
  202.     # an event now that when idle (then, the geometry manager events will
  203.     # be in queue but not processed) puts our updatesize in queue to be
  204.     # processed after the geometry manager events.
  205.     after idle "after idle {ab_3pw_setMoverScroll $mover $main}"
  206. }
  207. proc ab_3pw_setMoverScroll {mover main} {
  208.     $mover config -scrollregion "0 0 [winfo reqw $main] [winfo reqh $main]"
  209. }
  210. proc ab_3pw_resizeMoverChild {from mover idMain} {
  211.     if {$from == $mover} {
  212. $mover itemconfigure $idMain -width [expr [winfo width $mover] - 6]
  213.     }
  214. }
  215. proc grid_sortRows {grid iColumn args} {
  216.     set nRows [lindex [grid size $grid] 1]
  217.     set nCols [lindex [grid size $grid] 0]
  218.     
  219.     # get info about rows, and un-grid them
  220.     for {set i 0} {$i < $nRows} {incr i} {
  221. #set slaves($i) [grid slaves $grid -row $i]
  222. for {set i2 0} {$i2 < $nCols} {incr i2} {
  223.     lappend slaves($i) [grid slaves $grid -row $i -col $i2]
  224. }
  225. set widget [lindex $slaves($i) $iColumn]
  226. set value [lindex [$widget config -text] 4]
  227. lappend table [list $i $value]
  228. eval grid remove $slaves($i)
  229.     }
  230.     
  231.     # sort according to given column's value
  232.     set table [eval lsort $args -index 1 [list $table]]
  233.     
  234.     # add rows back to grid in correct order
  235.     for {set i 0} {$i < $nRows} {incr i} {
  236. set iRow [lindex [lindex $table $i] 0]
  237. eval grid $slaves($iRow) -row $i
  238.     }
  239. }