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

3D图形编程

开发平台:

Visual C++

  1. ######################################################################
  2. #
  3. # Global registration UI
  4. #
  5. ######################################################################
  6. # in-progress notes:
  7. # does anything from globalreg_old still deserve to survive?
  8. # (delete dialog is main candidate)
  9. #TODO: fully replace and get rid of old stuff (oldglobalreg.tcl)
  10. source $env(SCANALYZE_DIR)/globalreg_old.tcl
  11. proc New_globalRegistrationDialog {} {
  12.     if {[window_Activate .globalReg]} { return }
  13.     plv_globalreg init_import
  14.     # create UI window
  15.     set gr [toplevel .globalReg]
  16.     wm title $gr "Global registration manager"
  17.     window_Register $gr
  18.     # the Selection pane
  19.     #TODO: tight, minerr
  20.     #and the others don't appear to work right (don't leave scan itself)
  21.     set pane [createTogglePane $gr selection "Show selection commands"]
  22.     set f [createOptionsPaneWithDoButton $pane select]
  23.     radiobutton $f.regDirect -text "Scans directly aligned" 
  24. -variable __gr_select -value direct
  25.     radiobutton $f.regTrans -text "Scans transitively aligned" 
  26. -variable __gr_select -value trans
  27.     radiobutton $f.regTight -text "Scans tightly aligned" 
  28. -variable __gr_select -value tight -state disabled
  29.     radiobutton $f.regNot -text "Scans not at all aligned" 
  30. -variable __gr_select -value not
  31.     set err [frame $f.regError]
  32.     radiobutton $err.reg -text "Scans with error above" 
  33. -variable __gr_select -value minerr -state disabled
  34.     entry $err.dist -width 3 -textvariable __gr_select_minerr
  35.     label $err.l -text "mm"
  36.     packchildren $err -side left
  37.     packchildren $f -side top -anchor w
  38.     # the Browse pane
  39.     set pane [createTogglePane $gr browse "Show browse commands"]
  40.     set f [createOptionsPaneWithDoButton $pane browse]
  41.     radiobutton $f.browseAgg -text "Browse summary" 
  42. -variable __gr_browse -value summary
  43.     radiobutton $f.browseAll -text "Browse all pairs" 
  44. -variable __gr_browse -value all
  45.     radiobutton $f.browseVis -text "Browse partners of visible meshes" 
  46. -variable __gr_browse -value visible
  47.     radiobutton $f.browseCur -text "Browse parterns of current mesh" 
  48. -variable __gr_browse -value current
  49.     radiobutton $f.showGroups -text "Text dump of connected subgroups" 
  50. -variable __gr_browse -value subgroups
  51.     packchildren $f -side top -anchor w
  52.     # the AutoAlign pane
  53.     set pane [createTogglePane $gr autoalign 
  54.   "Show auto-pair-creation commands"]
  55.     set f [createOptionsPaneWithDoButton $pane autoalign]
  56.     set p [frame $f.choices]
  57.     label $p.lf -text "Auto add pairs: from" -anchor w
  58.     tk_optionMenu $p.from __gr_auto_opts(autoFrom) visible current
  59.     label $p.lt -text "to" -anchor w
  60.     tk_optionMenu $p.to __gr_auto_opts(autoTo) visible all
  61.     packchildren $p -side left -fill x -expand 1
  62.     set p [frame $f.errorThresh]
  63.     label $p.l -text "Error threshold (mm):"
  64.     entry  $p.entry -relief sunken -width 6 
  65.     -textvariable __gr_auto_opts(thresh)
  66.     packchildren $p -side left -pady 2
  67.     set p [frame $f.nPairs]
  68.     label $p.l -text "Target number of pairs to calculate:"
  69.     entry $p.entry -relief sunken -width 6 
  70.     -textvariable __gr_auto_opts(numpairs)
  71.     packchildren $p -side left
  72.     set p [frame $f.cache]
  73.     checkbutton $p.cb1 -text "Size limit for scan cache:" 
  74. -variable __gr_auto_opts(useScanCache)
  75.     entry $p.entry -relief sunken -width 6 
  76.     -textvariable __gr_auto_opts(cachelimit)
  77.     label $p.l -text "KB"
  78.     checkbutton $p.cb2 -text "including loaded scans" 
  79. -variable __gr_auto_opts(includeLoadedScans)
  80.     packchildren $p -side left
  81.     checkbutton $f.preserve 
  82. -text "Preserve existing mesh pairs (don't recalculate)" 
  83. -variable __gr_auto_opts(preserveExisting) -anchor w
  84.     checkbutton $f.edit 
  85. -text "Edit pairing graph before registering" 
  86. -variable __gr_auto_opts(editGraph) -anchor w
  87.     packchildren $f -side top -anchor w
  88.     # the GlobalAlign pane
  89.     #TODO: lots -- make old things work again, write new things
  90.     #(or at least disable buttons that can't work)
  91.     set pane [createTogglePane $gr globalreg "Show global alignment commands"]
  92.     set f [createOptionsPaneWithDoButton $pane globalalign]
  93.     set l [frame $f.buttonColumns]
  94.     set c [frame $l.colFrom]
  95.     label $c.l -text "Move:"
  96.     radiobutton $c.all -text "All scans" -variable __gr_align1 -value all
  97.     radiobutton $c.vis -text "Vis scans" -variable __gr_align1 -value vis
  98.     radiobutton $c.cur -text "Cur scan"  -variable __gr_align1 -value cur
  99.     radiobutton $c.icp -text "ICP 1"     -variable __gr_align1 -value icp
  100.     packchildren $c -side top -anchor w
  101.     set c [frame $l.colTo]
  102.     label $c.l -text "Align to:"
  103.     radiobutton $c.all -text "All scans" -variable __gr_align1 -value all
  104.     radiobutton $c.vis -text "Vis scans" -variable __gr_align1 -value vis
  105.     radiobutton $c.cur -text "Cur scan"  -variable __gr_align1 -value cur
  106.     radiobutton $c.icp -text "ICP 2"     -variable __gr_align1 -value icp
  107.     packchildren $c -side top -anchor w
  108.     packchildren $l -side left
  109.     set l [frame $f.conv]
  110.     label $l.l -text "Convergence tolerance:"
  111.     entry $l.val -width 4 -textvariable __gr_align_tolerance
  112.     # label $l.l2 -text "mm"  # what ARE the units on this?
  113.     packchildren $l -side left
  114.     packchildren $f -side top -anchor w
  115.     # make panes visible
  116.     packchildren $gr -side top -anchor w -fill x
  117.     # and then the ones we want initially enabled
  118.     # (or their variables could be made autosave)
  119.     foreach b {selection browse autoalign globalreg} {
  120. $gr.tp_${b}.toggle invoke
  121.     }
  122.     globalset __gr_select direct
  123.     globalset __gr_select_minerr 1.5
  124.     globalset __gr_browse summary
  125. globalset __gr_auto_opts(thresh) 5
  126. globalset __gr_auto_opts(numpairs) 200
  127. globalset __gr_auto_opts(cachelimit) 0
  128. globalset __gr_auto_opts(editGraph) 1
  129. globalset __gr_auto_opts(preserveExisting) 1
  130.     globalset __gr_align1 all
  131.     globalset __gr_align2 all
  132.     globalset __gr_align_tolerance 0.01
  133. }
  134. # action button helpers for globalreg dialog
  135. proc globalRegAction_select {} {
  136.     global theMesh
  137.     set invert 0
  138.     switch -exact -- [globalset  __gr_select] {
  139. direct { set vis [plv_globalreg listpairsfor $theMesh] }
  140. trans  { set vis [plv_globalreg listpairsfor $theMesh trans] }
  141. tight  { set vis [plv_globalreg listpairsfor $theMesh tight] }
  142. not    { set vis [plv_globalreg listpairsfor $theMesh trans];
  143.          set invert 1 }
  144. minerr { set vis [plv_globalreg listpairsfor $theMesh 
  145.       errorabove $gr_select_minerr]}
  146.     }
  147.     if {$invert} {
  148. eval showOnlyMesh $vis $theMesh
  149.     } else {
  150. eval hideOnlyMesh $vis $theMesh
  151.     }
  152. }
  153. proc globalRegAction_browse {} {
  154.     switch [globalset __gr_browse] {
  155. current   { newAlignmentBrowser [globalset theMesh] }
  156. visible   { newAlignmentBrowser [getVisibleMeshes] }
  157. all       { newAlignmentBrowser [getMeshList] }
  158. summary   { AlignmentSummaryDialog }
  159. subgroups { globalreg_listGroupStatus }
  160.     }
  161. }
  162. proc globalRegAction_autoalign {} {
  163.     global __gr_auto_opts
  164.     
  165.     scz_auto_register 
  166.     $__gr_auto_opts(autoFrom) $__gr_auto_opts(autoTo) 
  167.     [globalset theMesh] 
  168.     $__gr_auto_opts(thresh) $__gr_auto_opts(numpairs) 
  169.     $__gr_auto_opts(preserveExisting) $__gr_auto_opts(useScanCache) 
  170.     $__gr_auto_opts(cachelimit) 
  171.     $__gr_auto_opts(includeLoadedScans) $__gr_auto_opts(editGraph)
  172. }
  173. proc globalRegAction_align {} {
  174.     foreach i {1 2} {
  175. set scan [globalset __gr_align$i]
  176. switch {$scan} {
  177.     cur { set scan [globalset theMesh] }
  178.     vis { set scan [getVisibleMeshes] }
  179.     all { set scan [getMeshList] }
  180.     icp {
  181. if {![winfo exists .regICP]} {
  182.     tk_messageBox -title "scanalyze" -icon error 
  183. -parent .globalReg 
  184. -message "ICP dialog must be visible."
  185.     return
  186. }
  187. if {$i == 1} {
  188.     set scan [globalset regICPFrom]
  189. } else {
  190.     set scan [globalset regICPTo]
  191. }
  192.     }
  193. }
  194. set s$i $scan
  195.     }
  196.     plv_globalreg register [globalset __gr_align_tolerance] $s1 $s2
  197.     #TODO: make plv_globalreg speak this language
  198.     redraw 1
  199. }
  200. # and action helper helpers
  201. proc globalreg_SelectPairsFor {mesh {trans ""}} {
  202.     if {$trans == ""} {
  203. set vis [plv_globalreg listpairsfor $mesh]
  204.     } else {
  205. set vis [plv_globalreg listpairsfor $mesh transitive]
  206.     }
  207.     eval showOnlyMesh $vis $mesh
  208. }
  209. proc globalreg_listGroupStatus {} {
  210.     plv_globalreg groupstatus
  211.     foreach mesh [lsort -dictionary [getVisibleMeshes]] {
  212. if {![plv_globalreg getpaircount $mesh]} {
  213.     lappend missing $mesh
  214. }
  215.     }
  216.     
  217.     if {[info exists missing]} {
  218. puts "nnot registered at all ([llength $missing]): $missing"
  219.     }
  220. }
  221. # window layout creation helpers for globalreg dialog
  222. proc createOptionsPaneWithDoButton {pane actionProc} {
  223.     set f [frame $pane.opt]
  224.     vertbutton $pane.go -text "DO IT" 
  225. -command globalRegAction_$actionProc
  226.     pack $pane.opt -side left -anchor w -padx 8
  227.     pack $pane.go -side right -fill y -expand 1 -anchor e
  228.     return $f
  229. }
  230. proc createTogglePane {parent name label} {
  231.     set pane [frame $parent.tp_$name -relief groove -border 2]
  232.     checkbutton $pane.toggle -text $label -anchor w 
  233. -variable togglePane_${parent}_${name} 
  234. -command "togglePaneSetVisible $pane"
  235.     set inner [frame $pane.inner]
  236.     pack $pane.toggle -side top -fill x -expand 1 -anchor w
  237.     return $inner
  238. }
  239. proc togglePaneSetVisible {pane} {
  240.     set var [$pane.toggle config -variable]
  241.     set var [lindex $var 4]
  242.     if {[globalset $var]} {
  243. pack $pane.inner -after $pane.toggle -side top -fill x -expand 1
  244.     } else {
  245. pack forget $pane.inner
  246.     }
  247. }