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

3D图形编程

开发平台:

Visual C++

  1. proc readfile {args} {
  2.     cursor watch
  3.     without_redraw {
  4. set names ""
  5. set files [lsort [eval glob $args]]
  6. progress start [llength $files] "Read [llength $files] files"
  7. foreach filename $files {
  8.     if {[catch {
  9. if {[file extension $filename] == ".session"} {
  10.     scz_session load $filename
  11. } else {
  12.     puts "Reading scan $filename..."
  13.     set name [plv_readfile $filename]
  14.     addMeshToWindow $name
  15.     lappend names $name
  16. }
  17.     } err]} {
  18. puts "Scan read failed: $err"
  19.     }
  20.     
  21.     progress updateinc 1
  22. }
  23. progress done
  24.     } maskerrors
  25.     cursor restore
  26.     return $names
  27. }
  28. # Expected formats for proc loadgroup:
  29. # $args = "group1.gp group2.gp..."
  30. # $group = "group1.gp"
  31. # $groupfiles = "/n/luma/mich8/practice/test/back1.sd 
  32. #                /n/luma/mich8/practice/test/front2.sd..."
  33. # $filesloaded = "left1 right2..."
  34. # $meshname = "back1"
  35. proc loadgroup {args} {
  36.     set failed ""
  37.     # list of all groups that could not be loaded
  38.     foreach group $args {
  39. set members ""
  40. puts -nonewline "Loading group from file $group..." 
  41. if {[catch {
  42.     set groupfiles [plv_readgroupmembers $group]
  43. } err]} { 
  44.     puts "failed"
  45.     return 0
  46. } else {
  47.     puts "nGroup members are $groupfiles"
  48.     set filesloaded [plv_listscans leaves]
  49.     foreach groupfile $groupfiles {
  50. set meshname [file rootname [file tail $groupfile]]
  51. set ext [file extension $groupfile]
  52. if { $ext == ".gp" } {
  53.     # i.e. the "mesh" is actually a group
  54.     # so we check if this group has already been loaded - 
  55.     # if not, then we load it. This is to prevent 
  56.     # recursively reloading a group several times
  57.     # as could happen with a *.gp on the command line.
  58.     set meshControlsList [plv_listscans groups]
  59.     set loaded [lsearch -exact $meshControlsList $meshname]
  60.     if {$loaded == -1} {
  61. set try [loadgroup $groupfile]
  62. if {!$try} {
  63.     set failed [concat $failed $groupfile]
  64.     set meshname ""
  65. }
  66.     }
  67. } else {
  68.     set loaded [lsearch -exact $filesloaded $meshname]
  69.     if {$loaded != -1} {
  70. puts "Mesh $meshname is already loaded."
  71.     } else {
  72. readfile $groupfile
  73.     }
  74. }
  75. set members [concat $members $meshname]
  76. #puts "added $meshname to members"
  77.     }
  78.     if { $members != ""} {
  79. group_createNamedGroup [file rootname $group] $members 0
  80.     } else {
  81. set failed [concat $failed $groupfile]
  82.     }
  83. }
  84.     }
  85.     if {$failed != ""} puts "Couldn't create the following groups:nt $failed"
  86.     return 1
  87.         
  88.     # Do not redraw - instead use the without_redraw 
  89.     # script in scanalyze_util.tcl when calling this in order
  90.     # to ensure that there are no unnec redraws when loading many groups
  91. }
  92. proc read_sweeps_from_dir {args} {
  93.     cursor watch
  94.     redraw block
  95.     foreach arg $args {
  96. foreach dir [lsort [glob $arg]] {
  97.     puts "Heading for directory $dir..."
  98.     set stem [fileroot $dir]
  99.     if {[file exists $stem.xf]} {
  100. set matrix [xform_readFromFile $stem.xf]
  101.     } else {
  102. set matrix "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"
  103.     }
  104.     foreach file [lsort [glob $dir/*.sd]] {
  105. set sweep [plv_readfile $file]
  106. addMeshToWindow $sweep
  107. # if sweep doesn't have .xf, get rid of default vertical xform
  108. set sweepxf [fileroot $file].xf
  109. if {![file exists $sweepxf]} {
  110.     scz_xform_scan $sweep matrix 
  111. "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"
  112. }
  113. # and concat on directory xform
  114. scz_xform_scan $sweep matrix $matrix relative
  115.     }
  116. }
  117.     }
  118.     redraw flush
  119.     cursor restore
  120. }
  121. proc openScanFile {} {
  122.     set types {
  123. {{Generic ply file}       {.ply}}
  124. {{Multires ply set}       {.set}}
  125. {{ModelMaker scan}        {.cta}}
  126. {{New ModelMaker Format}  {.mms}}
  127. {{Cyberware ScanData}     {.sd}}
  128. {{Cyra scan}              {.pts}}
  129. {{Qsplat model}           {.qs}}
  130. {{Statue session}         {.session}}
  131.     }
  132.     set name [tk_getOpenFile -defaultextension .ply -filetypes $types]
  133.     if {$name != ""} {
  134. readfile $name
  135.     }
  136. }
  137. proc openScanDir {} {
  138.     set dir [tk_chooseDirectory -title "Browse for .sd directory"]
  139.     if {$dir == ""} return
  140.     if {[file extension $dir] != ".sd"} {
  141. guiError "$dir is not an .sd scan directory."
  142. return
  143.     }
  144.     readfile $dir
  145. }
  146. proc openGroupFile {} {
  147.     set types {
  148. {{Group file}       {.gp}}
  149.     }
  150.     set name [tk_getOpenFile -defaultextension .gp -filetypes $types]
  151.     if {$name != ""} {
  152. without_redraw {
  153.     loadgroup $name
  154. } maskerrors
  155.     }
  156. }
  157. proc saveScanFile {mesh} {
  158.     if {[catch {plv_write_scan $mesh} result]} {
  159. if {$result == "unnamed"} {
  160.     return [saveScanFileAs $mesh]
  161. } else {
  162.     error $result
  163.     return 0
  164. }
  165.     } else {
  166. return 1
  167.     }
  168. }
  169. proc saveScanFileAs {mesh} {
  170.     set defname [plv_get_scan_filename $mesh]
  171.     set name [tk_getSaveFile -title "Save scan $mesh as" 
  172.   -initialfile $defname]
  173.     if {$name != ""} {
  174. plv_write_scan $mesh $name
  175.     }
  176. }
  177. proc saveVisibleScansToDir {dir} {
  178.     if {![file exists $dir]} {
  179. file mkdir $dir
  180.     }
  181.     set DB [open "$dir/filenames" a]
  182.     puts $DB "Saving scans loaded from [pwd]"
  183.     foreach mesh [getVisibleMeshes] {
  184. set oldname [plv_get_scan_filename $mesh]
  185. set ext [file extension $oldname]
  186. set newname "$dir/${mesh}.$ext"
  187. if {[catch {plv_write_scan $mesh $newname} err]} {
  188.     puts "Can't write $newname: $err"
  189.     puts $DB "FAILED to write $oldname as $newname"
  190. } else {
  191.     puts $DB "$oldname saved as $newname"
  192. }
  193.     }
  194.     close $DB
  195. }
  196. proc saveVisibleScans {} {
  197.     set dir [askQuestion "What directory to save to?"]
  198.     if {$dir != ""} {
  199. saveVisibleScansToDir $dir
  200.     }
  201. }
  202. proc saveScanResolutionMeshAs {mesh {extended 0}} {
  203.     set options ""
  204.     if {$extended != 0} {
  205. set options [file_getXformOptions]
  206.     }
  207.     if {$options != "cancel"} {
  208. set res [plv_getcurrentres $mesh]
  209. set name [tk_getSaveFile -title "Save $res-poly mesh of $mesh as"]
  210. if {$name != ""} {
  211.     plv_write_resolutionmesh $mesh $res $name $options
  212. }
  213.     }
  214. }
  215. proc saveScanAsPlySet {mesh} {
  216.     set dir [tk_getSaveFile -title "Save plyset of $mesh as"]
  217.     if {$dir != ""} {
  218. saveScanAsPlySetToDir $mesh $dir
  219.     }
  220. }
  221. proc exportAnalysisAsText { togl winName } {
  222. #    set dir [tk_getSaveFile -title "Export analysis data to text" -initialfile $winName]
  223.     set dir [tk_getSaveFile -title "Export analysis data to text"]
  224.     set ext ".ctl"
  225.     if { $dir != "" } {
  226. plv_export_graph_as_text $togl $dir$ext
  227.     }
  228. }
  229. proc saveAllScansAsPlySets {} {
  230.     # Added by lucas, to write out all cyra scans as plysets
  231.     puts "Saving all scans as ply sets..."
  232.     set errors ""
  233.     foreach mesh [plv_listscans leaves] {
  234. if {[catch {saveScanAsPlySetToDir $mesh $mesh} err]} {
  235.     set errors "$mesh: $errn$errors"
  236. }
  237. # link xform inside directory so set file can see it if
  238. # the .xf exists...
  239. set xfname "$mesh.xf"
  240. if {[file readable $xfname]} {
  241.     if {[file readable $mesh/$xfname]} {
  242. exec rm $mesh/$xfname
  243.     }
  244.     exec ln -s "../$xfname" $mesh/$xfname
  245.         }
  246.     }
  247.     if {$errors != ""} {
  248. tk_messageBox -title "Scanalyze: saveAllScansAsPlySets failed." 
  249.     -message "Errors occurred while writing plysets:nn$errors"
  250. return 0
  251.     }
  252.     return 1
  253. }
  254. proc saveScanAsPlySetToDir {mesh dir} {
  255.     # broken off from saveScanAsPlySet so that saveAllScansAsPlySets
  256.     # can jump into it directly
  257.     if {$dir != ""} {
  258. file mkdir $dir
  259. set slash [string last "/" $dir]
  260. set name [string range $dir [expr 1 + $slash] end]
  261. set SET [open "${dir}/${name}.set" "w"]
  262. set reslist [plv_getreslist $mesh]
  263. puts $SET "NumMeshes = [llength $reslist]"
  264. puts $SET "DefaultRes = [extractRes [lindex $reslist end]]"
  265. foreach res $reslist {
  266.     set res [extractRes $res]
  267.     set ply "${name}_${res}.ply"
  268.     if {[catch {plv_write_resolutionmesh 
  269.     $mesh $res ${dir}/${ply}} err]} {
  270. puts "Can't write res $res: $err";
  271.     } else {
  272. puts $SET "noload $res $ply"
  273.     }
  274. }
  275. close $SET
  276.     }
  277. }
  278. proc saveScanMetaData {mesh data} {
  279.     plv_write_metadata $mesh $data
  280. }
  281. proc file_getXformOptions {} {
  282.     global __xfo
  283.     set xfo [_file_getXformOptions __xfo]
  284.     grab set $xfo
  285.     tkwait window $xfo
  286.     set temp $__xfo
  287.     unset __xfo
  288.     return $temp
  289. }
  290. proc _file_getXformOptions {result} {
  291.     toplevel .xfo
  292.     wm title .xfo "Save xform'd mesh"
  293.     wm resizable .xfo 0 0
  294.     label .xfo.l -text "Transformation to apply to mesh vertices:" 
  295. -anchor w
  296.     frame .xfo.xf -relief groove -border 2
  297.     globalset $result ""
  298.     radiobutton .xfo.xf.none -text "None" -variable $result -val ""
  299.     radiobutton .xfo.xf.flat -text "Mesh's transform (flatten)" 
  300. -variable $result -val "flatten"
  301.     radiobutton .xfo.xf.mat  -text "Matrix:" 
  302. -variable $result -val "matrix"
  303.     frame .xfo.xf.omatf
  304.     frame .xfo.xf.omatf.space -width 15
  305.     set mat [frame .xfo.xf.omatf.mat -relief groove -border 3]
  306.     for {set i 0} {$i < 4} {incr i} {
  307. set f [frame $mat.row$i]
  308. for {set j 0} {$j < 4} {incr j} {
  309.     set e [entry $f.c$j -width 4]
  310.     if {$i == $j} {
  311. $e insert 0 1.0
  312.     } else {
  313. $e insert 0 0.0
  314.     }
  315. }
  316. packchildren $f -side left
  317.     }
  318.     packchildren .xfo.xf.omatf.mat -side top
  319.     packchildren .xfo.xf.omatf -side left -pady 2
  320.     packchildren .xfo.xf -side top -anchor w
  321.     frame .xfo.go
  322.     button .xfo.go.go -text OK 
  323. -command "_file_GFXO_update $result $mat; destroy .xfo"
  324.     button .xfo.go.no -text Cancel 
  325. -command "set $result cancel; destroy .xfo"
  326.     packchildren .xfo.go -side left -fill x -expand 1
  327.     packchildren .xfo -side top -anchor w -fill x -expand 1 -pady 3
  328.     return .xfo
  329. }
  330. proc _file_GFXO_update {result mat} {
  331.     global $result
  332.     if {[set $result] == "matrix"} {
  333. for {set j 0} {$j < 4} {incr j} {
  334.     for {set i 0} {$i < 4} {incr i} {
  335. set entry $mat.row$i.c$j
  336. set val [$entry get]
  337. lappend $result " $val"
  338.     }
  339. }
  340.     }
  341. }
  342. proc fileWriteAllScanXforms {} {
  343.     set errors ""
  344.     foreach mesh [plv_listscans] {
  345. if {[catch {saveScanMetaData $mesh xform} err]} {
  346.     set errors "$mesh: $errn$errors"
  347. }
  348.     }
  349.     if {$errors != ""} {
  350. tk_messageBox -title "Scanalyze: xform write failed." 
  351.     -message "Errors occurred while writing xforms:nn$errors"
  352. return 0
  353.     }
  354.     return 1
  355. }
  356. proc fileWriteVisibleScanXforms {} {
  357.     set errors ""
  358.     foreach mesh [getVisibleMeshes] {
  359. if {[catch {saveScanMetaData $mesh xform} err]} {
  360.     set errors "$mesh: $errn$errors"
  361. }
  362.     }
  363.     if {$errors != ""} {
  364. tk_messageBox -title "Scanalyze: xform write failed." 
  365.     -message "Errors occurred while writing xforms:nn$errors"
  366. return 0
  367.     }
  368.     return 1
  369. }
  370. proc fileSession {access} {
  371.     set types {
  372. {{Statue session}       {.session}}
  373.     }
  374.     if {$access == "open"} {
  375. set mode Open
  376. set impex load
  377.     } else {
  378. set mode Save
  379. set impex save
  380.     }
  381.     set name [tk_get${mode}File -defaultextension .session -filetypes $types
  382.   -title "$impex statue session"]
  383.     if {$name != ""} {
  384. scz_session $impex $name
  385.     }
  386. }
  387. proc saveScreenDump {{sourceTogl ""}} {
  388.     set types {
  389. {{Iris image file}       {.rgb}}
  390.     }
  391.     if {$sourceTogl == ""} {
  392. set sourceTogl [globalset toglPane]
  393.     }
  394.     set name [tk_getSaveFile -defaultextension .rgb -filetypes $types
  395.   -title "Save current rendering as" -parent $sourceTogl]
  396.     if {"$name" != ""} {
  397. redraw
  398. if {[catch {plv_writeiris $sourceTogl $name} err]} {
  399.     tk_messageBox -type ok -icon error 
  400. -message "Could not save image to $name:n$err"
  401. } else {
  402.     puts "Image written to $name"
  403. }
  404.     }
  405. }
  406. proc writeply args {
  407.     global meshFrame
  408.     set len [llength $args]
  409.     if {$len < 1 || $len > 3} {
  410. puts "writeply: wrong number of args"
  411. return
  412.     }
  413.     set meshName [lindex $args 0]
  414.     set names [array names meshFrame]
  415.     set meshExists [lsearch $names $meshName]
  416.     if {$meshExists < 0} {
  417. puts "writeply: mesh not found"
  418. return
  419.     }
  420.     
  421.     if {[llength $args] > 1} {
  422.        set filename [lindex $args 1]
  423.        set theRest [lreplace $args 0 1]
  424.     } else {
  425.        set filename $meshName
  426.     }
  427.     set filelist $filename
  428.     set root [fileroot $filename]
  429.     set ext [file extension $filename]
  430.     set i 2
  431.     for {set i 2} {$i <= 4} {incr i} {
  432.         set nextName ${root}_res${i}${ext}
  433.         lappend filelist $nextName
  434.     }
  435.     set filesExist 0
  436.     foreach x $filelist {
  437. if {[file readable $x]} {
  438.     set filesExist 1
  439. }
  440.     }
  441.     
  442.     if {$filesExist} {
  443. puts ""
  444. puts -nonewline "File(s) already exist.  OK to overwrite? (y/n) "
  445. flush stdout
  446. gets stdin doit
  447. if {!($doit == "y")} {
  448.     puts "No files written."
  449.     return
  450. }
  451.     }
  452.     set command [concat plv_writeply $meshName 4 $filelist $theRest]
  453.     eval $command    
  454. }
  455. proc readcyb args {
  456.     global toglPane
  457.     set name [lindex $args 0]
  458.     set dontUseTexture 0
  459.     if {[lindex $args 1] == "-notex"} {
  460.        set dontUseTexture 1
  461.     }
  462.     if {[lindex $args 1] == "-head"} {
  463. plv_param -maxlen 100
  464.     }
  465.     if {![file readable $name]} {
  466.         puts "Could not read file $name."
  467.         return
  468.     }
  469.     if {!$dontUseTexture} {
  470.        set cybTextureName ${name}.color
  471.        set finalTextureName ${name}.rgb
  472.        
  473.        if {![file readable $cybTextureName] && 
  474.      ![file readable $finalTextureName]} {
  475.   set noTexture 1
  476.        } else {
  477.   set noTexture 0
  478.        }
  479.        
  480.        if {[file readable $finalTextureName]} {
  481.   set time1 [file mtime $name]
  482.   set time2 [file mtime $finalTextureName]
  483.   if {$time1 > $time2} {
  484.      set makeNewTexture 1
  485.   } else {
  486.      set makeNewTexture 0
  487.   }
  488.        } else {
  489.   set makeNewTexture 1
  490.        }
  491.     } else {
  492.        set noTexture 1
  493.     }
  494.     
  495.     if {$noTexture} {
  496. set name [plv_readcyb $name]
  497.     } elseif {!$makeNewTexture} {
  498. set name[plv_readcyb $name -tex $finalTextureName]
  499.     } else {
  500. puts "Creating new texture map $finalTextureName..."
  501. if {1} {
  502.     # All of this attempts to make up for crummy color 
  503.     # from standard ee from the MS platform
  504.     exec iflip $cybTextureName /usr/tmp/__temp.rgb 90
  505.     exec chmod 666 /usr/tmp/__temp.rgb
  506.     exec /usr/graphics/bin/fixcybcolor 
  507.     /usr/tmp/__temp.rgb /usr/tmp/__temp2.rgb 
  508.     exec chmod 666 /usr/tmp/__temp2.rgb
  509.     exec greyscale /usr/tmp/__lin7.bw 1 7 10
  510.     exec chmod 666 /usr/tmp/__lin7.bw
  511.     exec convolve /usr/tmp/__temp2.rgb /usr/tmp/__temp.rgb /usr/tmp/__lin7.bw
  512.     exec hipass3 /usr/tmp/__temp.rgb /usr/tmp/__temp2.rgb 0.35
  513.     exec iflip /usr/tmp/__temp2.rgb $finalTextureName 180
  514.     exec rm /usr/tmp/__temp.rgb
  515.     exec rm /usr/tmp/__temp2.rgb
  516. } else {
  517.     # All of this attempts to make up for crummy color 
  518.     # from standard ee from the PS platform
  519.     exec iflip $cybTextureName /usr/tmp/__temp.rgb 270
  520.     exec chmod 666 /usr/tmp/__temp.rgb
  521.     exec /usr/graphics/bin/fixcybcolor 
  522.     /usr/tmp/__temp.rgb $finalTextureName
  523.     exec rm /usr/tmp/__temp.rgb
  524. }
  525. set name [plv_readcyb $name -tex $finalTextureName]
  526.     }
  527.     addMeshToWindow $name
  528.     plv_viewall $toglPane
  529.     plv_draw $toglPane
  530. }
  531. proc writeimage {filename} {
  532.     plv_writeiris [globalset toglPane] $filename
  533. }
  534. proc writeimage2 {filename} {
  535.     global toglPane
  536.     set photo [image create photo tempPhoto]
  537.     plv_fillphoto $toglPane $photo
  538.     $photo write $filename -format ppm
  539.     image delete $photo
  540. }
  541. proc writeppmframe {name count} {
  542.     
  543.     # Set up frame count suffix
  544.     if {$count < 10} {
  545. set suffix 000${count}
  546.     } elseif {$count < 100} {
  547. set suffix 00${count}
  548.     } elseif {$count < 1000} {
  549. set suffix 0${count}
  550.     } else {
  551. set suffix ${count}
  552.     }
  553.     # Write out IRIS rgb image
  554.     writeimage ${name}${suffix}.rgb
  555.     # Convert to ppm for mpeg usage
  556.     exec /usr/common/bin/toppm ${name}${suffix}.rgb ${name}${suffix}.ppm
  557.     # Remove the IRIS rgb file
  558.     exec /bin/rm ${name}${suffix}.rgb
  559. }
  560. proc writeirisframe {name count} {
  561.     
  562.     # Set up frame count suffix
  563.     if {$count < 10} {
  564. set suffix 000${count}
  565.     } elseif {$count < 100} {
  566. set suffix 00${count}
  567.     } elseif {$count < 1000} {
  568. set suffix 0${count}
  569.     } else {
  570. set suffix ${count}
  571.     }
  572.     # Write out IRIS rgb image
  573.     writeimage ${name}${suffix}.rgb
  574. }
  575. proc writebwframe {name count} {
  576.     
  577.     # Set up frame count suffix
  578.     if {$count < 10} {
  579. set suffix 000${count}
  580.     } elseif {$count < 100} {
  581. set suffix 00${count}
  582.     } elseif {$count < 1000} {
  583. set suffix 0${count}
  584.     } else {
  585. set suffix ${count}
  586.     }
  587.     # Write out IRIS rgb image
  588.     writeimage /usr/tmp/__temp.rgb 
  589.     exec tobw /usr/tmp/__temp.rgb ${name}${suffix}.rgb
  590. }
  591. proc writejpgframe {name count} {
  592.     # Set up frame count suffix
  593.     if {$count < 10} {
  594. set suffix 000${count}
  595.     } elseif {$count < 100} {
  596. set suffix 00${count}
  597.     } elseif {$count < 1000} {
  598. set suffix 0${count}
  599.     } else {
  600. set suffix ${count}
  601.     }
  602.     # Write out IRIS rgb image
  603.     writeimage /usr/tmp/__temp.rgb
  604.     # Write out IRIS rgb image
  605.     exec tojpg -q 90 /usr/tmp/__temp.rgb ${name}${suffix}.jpg
  606. }
  607. proc file_locateScan {basename} {
  608.     # search current directory, and all 1-level subdirectories
  609.     # for scan with recognized extension and given basename.
  610.     # current dir first
  611.     foreach dir {. *} {
  612. set possibilities [glob -nocomplain $dir/$basename.*]
  613. foreach scan $possibilities {
  614.     switch -exact -- [file extension $scan] {
  615. .sd -
  616. .ply -
  617. .set -
  618. .pts -
  619. .mms -
  620. .cta {return $scan}
  621.     }
  622. }
  623.     }
  624.     # failed.
  625.     return ""
  626. }
  627. proc fileroot {name} {
  628.     # this is like file root, but file root doesn't like double periods
  629.     # ie, [file root bogus..sd] returns bogus, and while it's not pretty,
  630.     # we need bogus. so we can append .xf and get bogus..xf, not bogus.xf.
  631.     set l [string last . $name]
  632.     if {$l == -1} {
  633. return $name
  634.     } else {
  635. return [string range $name 0 [expr $l - 1]]
  636.     }
  637. }