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

3D图形编程

开发平台:

Visual C++

  1. proc colorVisUI {} {
  2.     if [window_Activate .colorvis] return
  3.     
  4.     global cv
  5.     set cv [toplevel .colorvis]
  6.     wm title $cv "Color Visualization"
  7.     window_Register $cv
  8.     global currentSelectedMesh
  9.     global cv_showimage
  10.     if {![info exists cv_showimage]} {
  11. set cv_showimage 0
  12.     }
  13.     global cv_curmesh
  14.     if {![info exists cv_curmesh]} {
  15. set cv_curmesh 1
  16.     }
  17.     global litOnly
  18.     set litOnly 1
  19.     # Current selected mesh
  20.     frame $cv.csm -relief groove -borderwidth 4 
  21.     label $cv.csm.curmeshlab -text "Current Selected Mesh:"
  22.     label $cv.csm.curmesh -relief sunken -textvariable currentSelectedMesh -anchor e
  23.     bind $cv.csm.curmesh <Button-1> { csm_pick }
  24.     pack $cv.csm.curmeshlab $cv.csm.curmesh -fill x
  25.     # Options
  26.     frame $cv.o -relief groove -borderwidth 4
  27.     checkbutton $cv.o.showimage -text "Project Image" -variable cv_showimage 
  28. -command {showProjection [getListboxSelection .colorvis.il.filenames]}
  29.     checkbutton $cv.o.curmesh -text "Track Current Mesh" -variable cv_curmesh
  30.     checkbutton $cv.o.litonly -text "Lit Images Only" -variable litOnly -command makeImageList
  31.     button $cv.o.allimages -text "Show all images" -command makeImageList
  32.     button $cv.o.findimages -text "Show images on rect" 
  33. -command findImagesOnRect
  34.     button $cv.o.displayimage -text "Display raw image" 
  35. -command displayRawImage
  36.  
  37.    
  38.     pack $cv.o.showimage $cv.o.curmesh $cv.o.litonly -anchor w
  39.     pack $cv.o.allimages $cv.o.findimages $cv.o.displayimage -fill x
  40.     # $cv.o.allimages -anchor w -fill x
  41.     # Image List
  42.     frame $cv.il
  43.     listbox $cv.il.filenames -yscrollcommand "$cv.il.scroll set"
  44.     bind $cv.il.filenames <ButtonRelease-1> { 
  45. showProjection [getListboxSelection .colorvis.il.filenames] }
  46.   
  47.     scrollbar $cv.il.scroll -command "$cv.il.filenames yview"
  48.     pack $cv.il.filenames $cv.il.scroll -side left  -fill y -expand false
  49.     $cv.il.filenames configure -height 15
  50.     # Pack All
  51.     pack $cv.csm $cv.o -fill x 
  52.     pack $cv.il 
  53.     
  54.     # Start Idle Routine
  55.     #  $cv.il.filenames configure -height 100
  56.     # set currentSelectedMesh ""
  57.     colorvis_idlerefresh
  58.     after 100 scrollboxhack
  59.     updateCVBox
  60.  
  61. }
  62. proc csm_pick {} {
  63.     global cv_curmesh
  64.     global currentSelectedMesh
  65.     if { ! $cv_curmesh } {
  66. # Print a usage info thing
  67. puts ""
  68. puts "You cant pick a directory, so to pick a scan: Pick any sweep in "
  69. puts "  the scan directory."
  70. # Pick a new scan
  71. set types {
  72.     {{sd Files}       {.sd}}}
  73. set filename [tk_getOpenFile -defaultextension .sd -filetypes $types]
  74. if {$filename != ""} {
  75.     set currentSelectedMesh [ file dirname $filename ]
  76.     makeImageList
  77. }
  78.     }
  79. }
  80. # make the list window expandable
  81. # check geometry before scroll size chagne and reset afterwards
  82. proc scrollboxhack {} {
  83.     global cv
  84.     set geom [wm geometry $cv]
  85.     $cv.il.filenames configure -height 300
  86.     wm geometry $cv $geom
  87. }
  88. # Show projection of image on meshes
  89. proc showProjection {imageName} {
  90.     global currentSelectedMesh
  91.     global cv_showimage
  92.     if  $cv_showimage  {
  93. plv_load_projective_texture $currentSelectedMesh/color/$imageName nomipmap
  94.     } else {
  95. plv_load_projective_texture $currentSelectedMesh/color/$imageName green nomipmap
  96.     }
  97.     globalset theColorMode texture
  98.     redraw 1
  99. }
  100. # Refresh the notion of current active mesh occasionally
  101. proc colorvis_idlerefresh {} {
  102.     global currentSelectedMesh
  103.     global theMesh
  104.     global imageList
  105.     global cv 
  106.     global cv_curmesh
  107.     if { $cv_curmesh && [winfo exists .colorvis] && $theMesh != "" } {
  108. # Check if we need to update the list
  109. set presentmesh [plv_get_scan_filename $theMesh]
  110. set dirname [file dirname $presentmesh]
  111. set ext [file extension $dirname]
  112. if {$ext == ".sd"} {set presentmesh $dirname}
  113. if [expr  [string compare $currentSelectedMesh $presentmesh] != 0 ]  {
  114.     # Change the current mesh name
  115.     set currentSelectedMesh $presentmesh
  116.     puts changing
  117.     # Make a new list
  118.     makeImageList
  119.    
  120. }
  121. #$cv.il.filenames configure -height 30
  122.     }
  123. # Call again after an interval
  124. after 300 colorvis_idlerefresh
  125. }
  126. proc makeImageList {} {
  127.     global cv
  128.     global currentSelectedMesh
  129.     global litOnly
  130.     global cv_ImageList
  131.     # Make a new list
  132.     set cv_ImageList ""
  133.     if { $litOnly == 1 } {
  134. if { [file exists $currentSelectedMesh/images.paste] } {
  135.     set imageList [exec grep process $currentSelectedMesh/images.paste | sed s/^.*color.\(.*\)\..*/\1/]
  136. } else {
  137.     puts "Failed to open file: " 
  138.     puts  $currentSelectedMesh/images.paste
  139.     set imageList ""
  140. }
  141. set ext ""
  142. foreach filename $imageList {
  143.     if {$ext == ""} {
  144. if [file exists $currentSelectedMesh/color/$filename.png] {
  145.     set ext "png"
  146. } else {
  147.     set ext "rgb"
  148. }
  149.     }
  150.     lappend cv_ImageList  $filename.$ext
  151. }
  152.   
  153.     } else  {
  154. set imageList [glob $currentSelectedMesh/color/*.png $currentSelectedMesh/color/*.rgb]
  155. foreach filename $imageList {
  156.     lappend cv_ImageList $filename
  157. }
  158.     }
  159.     # Actually set it in the box
  160.     updateCVBox
  161. }
  162. proc updateCVBox {} {
  163.     global cv_ImageList
  164.     global cv
  165.     if [winfo exists .colorvis] {
  166. $cv.il.filenames delete 0 [$cv.il.filenames size]
  167. foreach filename $cv_ImageList {
  168.     $cv.il.filenames insert end [file tail $filename]
  169. }
  170.     }
  171. }
  172. # Optional param of the rect to look in. Defaults to current selection
  173. proc findImagesOnRect {{bbox ""} } {
  174.     global cv
  175.     global cv_ImageList
  176.     globalset cv_showimage 0
  177.    # set LB $cv.il.filenames
  178.     set len [llength $cv_ImageList]
  179.     set count 0
  180.     while {$count < [llength $cv_ImageList]} {
  181. set curfile [lindex $cv_ImageList $count]
  182. showProjection $curfile
  183. set pixcount [eval plv_countPixels 0 0 1 255 255 255 $bbox ]
  184. if {$pixcount > 0} {
  185.     set cv_ImageList [lreplace $cv_ImageList $count $count]
  186. } else {
  187.     set count [expr $count + 1]
  188. }
  189.     }
  190.     updateCVBox
  191. }
  192. proc displayRawImage {} {
  193.     global currentSelectedMesh
  194.     set imageName [getListboxSelection .colorvis.il.filenames]
  195.    
  196.     puts $currentSelectedMesh/color/$imageName
  197.     exec display $currentSelectedMesh/color/$imageName
  198. }
  199. # This can be called externally to set the notion of current color
  200. # Mesh in this tool For instance the pickColor button uses it.
  201. proc color_vis_set_mesh {selected} {
  202.     global currentSelectedMesh
  203.     global cv_cur_scan
  204.     set cv_cur_scan $selected
  205.     # Get the filename of this scan
  206.     set fname [plv_get_scan_filename "$selected"]
  207.     set dirname [file dirname $fname]
  208.     set ext [file extension $dirname]
  209.     if {$ext == ".sd"} {set fname $dirname}
  210.     # Change the current mesh name
  211.     set currentSelectedMesh  $fname
  212.     # Set vars
  213.     globalset litOnly 1
  214.     globalset cv_curmesh 0
  215.     # Make a new list
  216.     makeImageList
  217.    
  218. }
  219. proc color_vis_proj_color {x y } {
  220.     global toglPane
  221.     global cv_ImageList
  222.     global cv
  223.     global cv_showimage
  224.     global currentSelectedMesh
  225.     global cv_cur_scan
  226.     # Turn on green mode
  227.     set cv_showimage 0
  228.     # Show only the relevant scan
  229.     set mlist [getVisibleMeshes]
  230.     puts $mlist
  231.     showOnlyMesh $cv_cur_scan
  232.     # Search for correct set of images
  233.     set height [lindex [$toglPane config -height] 4]
  234.     set y [expr $height - $y - 1]
  235.     set xpp [expr $x + 1]
  236.     set ypp [expr $y + 1]
  237.     findImagesOnRect "$x $y $xpp $ypp"
  238.     # Turn back on all previous meshes
  239.     eval showOnlyMesh "$mlist"
  240.     # Pick the first one and show it
  241.     set image [lindex $cv_ImageList 0]
  242.     if  [winfo exists .colorvis] {
  243. $cv.il.filenames selection set 0
  244.     }
  245.     set cv_showimage 1
  246.     showProjection $image
  247. }