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

3D图形编程

开发平台:

Visual C++

  1. ######################################################################
  2. #
  3. # build_ui.tcl
  4. # created 10/29/98  magi
  5. #
  6. # create visible user interface -- main window interactors and menubar
  7. #
  8. ######################################################################
  9. #
  10. # exports:
  11. #   buildScanalyzeUI
  12. #   addMeshToWindow
  13. #   removeMeshFromWindow
  14. #   buildUI_shutdown
  15. #   hiliteScanEntry
  16. #
  17. ######################################################################
  18. ############################################################################
  19. #
  20. # Create the complete visible UI
  21. #
  22. ############################################################################
  23. proc buildScanalyzeUI {} {
  24. global errorInfo
  25.     if {![globalset noui]} {
  26. detectCursorCapabilities
  27. buildUI_ScanalyzeMenus
  28. buildUI_ToglContextMenu
  29. buildUI_MainWindow
  30. buildUI_MeshControls
  31. buildUI_BindShortcuts
  32. buildUI_PositionWindows
  33. buildUI_BuildNudgeWindow
  34. buildUI_BuildVersionWindow
  35. bind all <Control-q> { confirmQuit}
  36.     }
  37.     globalset tcl_prompt1 {puts -nonewline "scanalyze> "}
  38.     globalset tcl_prompt2 {puts -nonewline "> "}
  39. }
  40. proc buildUI_shutdown {} {
  41.     # save any persistent settings before exit
  42.     buildUI_SaveWindowPositions save
  43. }
  44. ############################################################################
  45. #
  46. # add a mesh to the mesh controls window so it can be manipulated
  47. #
  48. ############################################################################
  49. proc addMeshToWindow {name {loaded 1}} {
  50.     global meshCount
  51.     global meshLoaded
  52.     if {![globalset noui]} {
  53. global leftFrame
  54. global meshFrame
  55. set i [getUniqueInt]
  56. set fr $leftFrame.meshFrame$i
  57. if {[catch {set newFrame [buildUI_privAddMeshAsFrame 
  58.       $name $fr]} err]} {
  59.     puts "$err"
  60.     destroy $fr
  61.     return
  62. }
  63. set meshFrame($name) $newFrame
  64. pack $newFrame -side top -anchor e
  65.     }
  66.     incr meshCount
  67.     set meshLoaded($name) $loaded
  68.     updatePolyCount
  69.     # always select the first scan loaded into scanalyze...
  70.     if {$meshCount == 1} {
  71. selectScan $name
  72.     }
  73.     resizeMCscrollbar
  74. }
  75. ############################################################################
  76. # Changes the size of resolution bars in mesh controls window
  77. ############################################################################
  78. proc buildUI_ResizeResBars {name inframe} {
  79.     set curres [plv_getcurrentres $name]
  80.     set maxres [getPolyCount_maxres $name]
  81.     if {$maxres > 0} {
  82. if {$curres > 0} {
  83.     set curres [expr round(10 * (log10($curres) - 3))]
  84. }
  85. set maxres [expr round(10 * (log10($maxres) - 3))]
  86.     }
  87.     
  88.     # anything less than 1000 gets set to 1 pix..
  89.     if { $curres < 0 } {
  90. set curres 1
  91.     }
  92.     if { $maxres < 0 } {
  93. set maxres 1
  94.     }
  95.     
  96.     # make them always visibly wide, for false color convenience
  97.     incr curres 5
  98.     incr maxres 5
  99.     
  100.     if {$curres == $maxres} {
  101. # hacks to make maxres bar invisible, since we can't make
  102. # it narrower than 1 pixel
  103. $inframe.title.maxBar config -width 1 
  104.     -bg [lindex [$inframe.title.curBar config -bg] 4]
  105.     } else {
  106. $inframe.title.maxBar config -width [expr $maxres - $curres] 
  107.     -bg "#000000"
  108.     }
  109.     $inframe.title.curBar config -width $curres
  110.     
  111.     return $maxres
  112. }
  113. proc buildUI_ResizeAllResBars {} {
  114.     global meshFrame
  115.     set meshes [getMeshList]
  116.     foreach mesh $meshes {
  117. buildUI_ResizeResBars $mesh $meshFrame($mesh)
  118.     }
  119. }
  120. proc toggleRangeFromActiveMeshTo {mesh} {
  121.     global meshVisible
  122.     set meshes [getSortedMeshControlsList]
  123.     set start [lsearch -exact $meshes $mesh]
  124.     set stop [lsearch -exact $meshes [globalset theMesh]]
  125.     if {$stop < $start} {
  126. set start [expr $start - 1]
  127. swap start stop
  128.     } else { incr start }
  129.     set range [lrange $meshes $start $stop]
  130.     without_redraw {
  131. foreach m $range {
  132.     changeVis $m [expr ! $meshVisible($m)]
  133. }
  134.     } maskerrors
  135. }
  136. proc buildUI_privAddMeshAsFrame {name inframe} {
  137.     global meshVisible
  138.     global meshLoaded
  139.     global menuView
  140.     set titleFrame [frame $inframe]
  141.     set meshFrame [frame $titleFrame.title]
  142.     set meshLabel [label $meshFrame.label -text $name]
  143.     set meshColor [frame $meshFrame.color -width 10 -height 10 
  144.        -background [GetMeshFalseColor $name]]
  145.     set radioMove [radiobutton $meshFrame.active -variable theMesh 
  146.        -value $name -command [list selectScan $name]]
  147.     set checkVis [checkbutton $meshFrame.visible 
  148.       -variable meshVisible($name) 
  149.       -command [list changeVis $name]]
  150.     set loaded [checkbutton $meshFrame.loaded 
  151.     -variable meshLoaded($name) 
  152.     -command [list changeLoaded $name]]
  153.     
  154.     set meshVisible($name) 1
  155.     
  156.     # resolution indicator bars
  157.     set max [frame $meshFrame.maxBar
  158.  -width 0 -height 10 -background black]
  159.     set cur [frame $meshFrame.curBar
  160.  -width 0 -height 10 -background [GetMeshFalseColor $name]]
  161.     #cheap hack for spacing
  162.     #assumes a max of 10^7 triangles (based on formula in resizeResBars)
  163.     #the number 45 comes from 10 * (log10(10^7) - 3) + 5
  164.     set maxpix [buildUI_ResizeResBars $name $inframe]
  165.     set pad [frame $meshFrame.pad -width [expr 45 - $maxpix] 
  166.  -height 10 -background "#d9d9d9"]
  167.     pack $loaded $pad $max $cur $radioMove $checkVis $meshLabel
  168. -side right -anchor e
  169.     if {[plv_groupscans isgroup $name]} {
  170.   set exp [label $meshFrame.expand -text "+" -anchor w]
  171. bind $exp <ButtonPress-1> "group_expandGroup $name"
  172. pack $exp -side left -anchor w
  173.     }
  174.     
  175.     # don't need this now that res-indicator shows the false color
  176.     #pack $meshColor -side right
  177.     
  178.     set meshMenu [menu $meshLabel.menu -tearoffcommand 
  179.       "setMenuTitle $name"]
  180.     $meshMenu add cascade -label "Resolution" -menu $meshMenu.resMenu
  181.     $meshMenu add separator
  182.     $meshMenu add command -label "Flip normals" 
  183. -command "invertMeshNormals $name"
  184.     $meshMenu add command -label "Reset transform" 
  185. -command "plv_resetxform $name"
  186.     $meshMenu add command -label "Get info" 
  187. -command "showMeshInfo $name"
  188.     $meshMenu add command -label "Change false color" 
  189. -command "chooseMeshFalseColor $name"
  190.     $meshMenu add separator
  191.     $meshMenu add command -label "Reload" -command "reloadMesh $name"
  192.     $meshMenu add command -label "Delete" -command "confirmDeleteMesh $name"
  193.     ss_addConvertSweepScanToMeshControlMenu $meshMenu $name
  194.     menu $meshMenu.resMenu 
  195. -postcommand "buildMeshResList $name $meshMenu.resMenu"
  196.     foreach control 
  197. "$meshLabel $meshColor $checkVis $radioMove $cur $max $loaded" {
  198. bind $control <ButtonPress-3> "tk_popup $meshMenu %X %Y"
  199.     }
  200.     bind $checkVis <Control-ButtonPress-1> "toggleRangeFromActiveMeshTo $name"
  201.     bind $meshFrame <Enter> "plv_hilitescan $name"
  202.     bind $meshFrame <Leave> "plv_hilitescan"
  203.     pack $meshFrame -side top -fill both -expand 1
  204.     return $titleFrame
  205. }
  206. ############################################################################
  207. #
  208. # remove a mesh from the mesh controls window (presumably, after deletion)
  209. #
  210. ############################################################################
  211. proc removeMeshFromWindow {meshes} {
  212.     global meshFrame
  213.     global meshVisible
  214.     global meshCount
  215.     set needReactivate 0
  216.     foreach mesh $meshes {
  217. destroy $meshFrame($mesh)
  218. unset meshFrame($mesh)
  219. unset meshVisible($mesh)
  220. set meshCount [expr $meshCount - 1]
  221. if {[globalset theMesh] == $mesh} {
  222.     set needReactivate 1
  223. }
  224.     }
  225.     if {$needReactivate} {
  226. globalset theMesh [lindex [array names meshVisible] 0]
  227.     }
  228.     updatePolyCount
  229.     resizeMCscrollbar
  230. }
  231. proc progress {args} {
  232.     # this got moved to C code
  233.     eval plv_progress $args
  234. }
  235. # private functions follow
  236. ############################################################################
  237. #
  238. # build the render menu, used by the menubar and the togl context menu
  239. #
  240. ############################################################################
  241. proc buildUI_RenderMenu {name tearname} {
  242.     set menuRender [menu $name 
  243. -tearoffcommand "setMenuTitle "$tearname""]
  244.     $menuRender add radiobutton -label Polygons 
  245. -variable thePolygonMode -value fill
  246.     $menuRender add radiobutton -label Wireframe 
  247. -variable thePolygonMode -value line
  248.     $menuRender add radiobutton -label "Hidden line" 
  249. -variable thePolygonMode -value hiddenline
  250.     $menuRender add radiobutton -label Points 
  251. -variable thePolygonMode -value point
  252.     $menuRender add radiobutton -label "Hidden Points" 
  253. -variable thePolygonMode -value hiddenpoint
  254.     $menuRender add separator
  255.     $menuRender add radiobutton -label "Smooth per-vertex" 
  256. -variable theShadeModel -value smooth 
  257. -command {plv_drawstyle -shademodel $theShadeModel; redraw}
  258.     $menuRender add radiobutton -label "Flat per-vertex" 
  259. -variable theShadeModel -value fakeflat 
  260. -command {plv_drawstyle -shademodel $theShadeModel; redraw}
  261.     $menuRender add radiobutton -label "Flat per-face (slow)" 
  262. -variable theShadeModel -value realflat 
  263. -command {plv_drawstyle -shademodel $theShadeModel; redraw}
  264.     $menuRender add separator
  265.     set menuColor [createNamedCascade $menuRender menuColors 
  266.        "Change colors"]
  267.     $menuColor add command -label Background -command "chooseColor background"
  268.     $menuColor add separator
  269.     $menuColor add command -label Materials: -state disabled
  270.     $menuColor add command -label Specular -command "chooseColor specular"
  271.     $menuColor add command -label Diffuse -command "chooseColor diffuse"
  272.     $menuColor add separator
  273.     $menuColor add command -label Back Materials: -state disabled
  274.     $menuColor add command -label Specular -command "chooseColor backSpecular"
  275.     $menuColor add command -label Diffuse -command "chooseColor backDiffuse"
  276.     $menuColor add separator
  277.     $menuColor add command -label Lighting: -state disabled
  278.     $menuColor add command -label Ambient -command "chooseColor lightambient"
  279.     $menuColor add command -label Diffuse -command "chooseColor lightdiffuse"
  280.     $menuColor add command -label Specular -command "chooseColor lightspecular"
  281.     $menuRender add separator
  282.     $menuRender add checkbutton -label Lit 
  283. -variable theLightingMode 
  284. -command {plv_drawstyle -lighting $theLightingMode; redraw}
  285.     $menuRender add checkbutton -label Shiny 
  286. -variable theShinyMode 
  287. -command {setShininess $theShinyMode; redraw}
  288.     $menuRender add checkbutton -label Emissive 
  289. -variable theEmissiveMode 
  290. -command {plv_drawstyle -emissive $theEmissiveMode; redraw}
  291.     $menuRender add checkbutton -label "Backface culling" 
  292. -variable theCullMode 
  293. -command {plv_drawstyle -cull $theCullMode; redraw}
  294. # two sided lighting now implements this feature
  295. #    $menuRender add checkbutton -label "Emissive backface like background" 
  296. # -variable theEmissiveBackfaceMode 
  297. # -command {plv_drawstyle -backfaceemissive $theEmissiveBackfaceMode;
  298. #     if {$theEmissiveBackfaceMode && $theCullMode} {
  299. # set theCullMode 0; plv_drawstyle -cull 0;
  300. #     }
  301. #     redraw}
  302.     $menuRender add checkbutton -label "Two sided lighting" 
  303. -variable theTwoSidedLighting 
  304. -command {plv_drawstyle -twosidedlighting $theTwoSidedLighting; redraw}
  305.     $menuRender add checkbutton -label "Flip normals" 
  306. -variable theFlipNormalMode 
  307. -command {plv_drawstyle -flipnorm $theFlipNormalMode; redraw}
  308.     $menuRender add checkbutton -label "Selected mesh transparent" 
  309. -variable transparentSelection
  310.     $menuRender add separator
  311.     $menuRender add radiobutton -label "Lit backface" 
  312.         -variable theBackfaceMode -value lit
  313.     $menuRender add radiobutton -label "Emissive backface" 
  314. -variable theBackfaceMode -value emissive
  315.     $menuRender add separator
  316.     $menuRender add radiobutton -label "Gray color" 
  317. -variable theColorMode -value gray
  318.     $menuRender add radiobutton -label "False color" 
  319. -variable theColorMode -value false
  320.     $menuRender add radiobutton -label "Intensity" 
  321. -variable theColorMode -value intensity
  322.     $menuRender add radiobutton -label "True color" 
  323. -variable theColorMode -value true
  324.     $menuRender add radiobutton -label "Boundary" 
  325. -variable theColorMode -value boundary
  326.     $menuRender add radiobutton -label "Confidence" 
  327. -variable theColorMode -value confidence
  328.     $menuRender add radiobutton -label "Registration status" 
  329. -variable theColorMode -value registration
  330.     $menuRender add radiobutton -label "Texture mapped" 
  331. -variable theColorMode -value texture
  332.     return $menuRender
  333. }
  334. ######################################################################
  335. #
  336. # clip menu treated slightly differently, but same effect -- you
  337. # create it where you want it, then call this to fill it in, again
  338. # decomposed so we can put one on the togl context menu
  339. #
  340. ######################################################################
  341. proc buildUI_populateClipMenu {clipMenu} {
  342.     $clipMenu add command -label "Clip current mesh:" -state disabled
  343.     $clipMenu add command -label "TO (discard all but selection)" 
  344. -command {doClipMesh $theMesh [list sel inplace inside]}
  345.     $clipMenu add command -label "AWAY (discard selection)" 
  346. -command {doClipMesh $theMesh [list sel inplace outside]}
  347.     $clipMenu add command -label "COPY (selection to new mesh)" 
  348. -command {doClipMesh $theMesh [list sel newmesh inside]}
  349.     $clipMenu add separator
  350.     $clipMenu add command -label "Split (remove selection to new mesh)" 
  351. -command { doClipSplitMesh $theMesh }
  352.     $clipMenu add separator
  353.     $clipMenu add command -label "Clip..." -command clipDialog
  354.     $clipMenu add separator
  355.     $clipMenu add command -label "Clear selection" -command clearSelection
  356. }
  357. ######################################################################
  358. #
  359. # create main menubar
  360. #
  361. ######################################################################
  362. proc buildUI_ScanalyzeMenus {} {
  363.     menu .menubar
  364.     . config -menu .menubar
  365.     
  366.     set menuFile [createNamedCascade .menubar menuFile File "-underline 0"]
  367.     $menuFile add command -label "Open scan..." 
  368.     -command { openScanFile }
  369.     $menuFile add command -label "Open SD scan directory..." 
  370.     -command { openScanDir }
  371.     $menuFile add command -label "Open session..." 
  372.     -command { fileSession open }
  373.     $menuFile add command -label "Open group..." 
  374. -command { openGroupFile }  
  375.     $menuFile add separator
  376.     $menuFile add command -label "Save current scan" 
  377.     -command { saveScanFile $theMesh }
  378.     $menuFile add command -label "Save current scan as..." 
  379.     -command { saveScanFileAs $theMesh }
  380.     $menuFile add command -label "Save all..." 
  381.     -command { confirmSaveMeshes }
  382.     $menuFile add command -label "Save all visible to directory..." 
  383.     -command { saveVisibleScans }
  384.     $menuFile add command -label "Save session..." 
  385.     -command { fileSession save }
  386.     $menuFile add command -label "Save current group" 
  387.     -command { group_saveCurrentGroup  }
  388.     $menuFile add command -label "Save current group to directory..." 
  389.     -command { group_saveCurrentGroupToDir  }
  390.     $menuFile add separator
  391.     $menuFile add command -label "Flatten all scans..." 
  392. -command {confirmFlattenMeshes }
  393.     $menuFile add separator
  394.     $menuFile add command -label "Export current scan as..." 
  395. -command {saveScanAsPlySet $theMesh }
  396.     $menuFile add command -label "Export current mesh as..." 
  397. -command { saveScanResolutionMeshAs $theMesh }
  398.     $menuFile add command -label "Export transformed mesh as..." 
  399. -command { saveScanResolutionMeshAs $theMesh extended }
  400.     $menuFile add command -label "Export all scans as plysets" 
  401. -command saveAllScansAsPlySets
  402.     $menuFile add command -label "Export rendered image as..." 
  403. -command saveScreenDump
  404.     set menuRemoteDisplay [createNamedCascade .menubar.menuFile remoteDisplay 
  405.        "Export to remote display" ]
  406.     $menuRemoteDisplay add command -label "Other..." 
  407. -command remoteDisplayUI
  408.     $menuRemoteDisplay add separator
  409.     $menuRemoteDisplay add command -label "nurb" 
  410. -command {sendImageTo nurb}
  411.     $menuRemoteDisplay add command -label "cesello" 
  412. -command {sendImageTo cesello}
  413.     $menuRemoteDisplay add command -label "brdf" 
  414. -command {sendImageTo brdf}
  415.     $menuRemoteDisplay add command -label "enoriver" 
  416. -command {sendImageTo enoriver}
  417.     $menuFile add separator
  418.     $menuFile add command -label "Write scan xform" 
  419. -command { saveScanMetaData $theMesh xform }
  420.     $menuFile add command -label "Write all xforms" 
  421. -command fileWriteAllScanXforms -accelerator ^X
  422.     $menuFile add command -label "Write visible xforms" 
  423. -command fileWriteVisibleScanXforms
  424.     $menuFile add separator
  425.     $menuFile add command -label "Exit" -command confirmQuit -accelerator ^Q
  426.     set menuView [createNamedCascade .menubar menuView View "-underline 0"]
  427.     set menuViewRes [createNamedCascade $menuView res Resolution]
  428.     $menuViewRes add radiobutton -label "View selected resolution" 
  429. -value default -variable drawResolution
  430.     $menuViewRes add radiobutton -label "View highest resolution" 
  431. -value temphigh -variable drawResolution
  432.     $menuViewRes add radiobutton -label "View lowest" 
  433. -value templow -variable drawResolution
  434.     $menuViewRes add separator
  435.     $menuViewRes add command -label "Select highest for all" 
  436. -command "set drawResolution high" -accelerator "Ctrl->"
  437.     $menuViewRes add command -label "Next higher for all" 
  438. -command "set drawResolution nexthigh" -accelerator >
  439.     $menuViewRes add command -label "Next lower for all" 
  440. -command "set drawResolution nextlow" -accelerator <
  441.     $menuViewRes add command -label "Select lowest for all" 
  442. -command "set drawResolution low" -accelerator "Ctrl-<"
  443.     $menuViewRes add separator
  444.     $menuViewRes add command -label "Select Nth for all..." 
  445. -command "buildUI_selectNthResolution"
  446.     $menuViewRes add command -label "Select above N for all..." 
  447. -command selectResAboveUI
  448.     $menuViewRes add separator
  449.     $menuViewRes add checkbutton -label "'All' includes invisible meshes" 
  450. -variable selectResIncludesInvisible
  451.     set menuViewSpeed [createNamedCascade $menuView speed 
  452.    "Render speed while moving"]
  453.     $menuViewSpeed add checkbutton -label "Draw points instead of tris" 
  454. -variable manipRender(Points)
  455.     $menuViewSpeed add checkbutton -label "Use tiny points" 
  456. -variable manipRender(TinyPoints)
  457.     $menuViewSpeed add checkbutton -label "Disable lighting" 
  458. -variable manipRender(Unlit)
  459.     $menuViewSpeed add checkbutton -label "Use lowest resolution" 
  460. -variable manipRender(Lores)
  461.     $menuViewSpeed add separator
  462.     $menuViewSpeed add checkbutton -label "Prefer speedups to display list"
  463. -variable manipRender(SkipDisplayList)
  464.     $menuViewSpeed add separator
  465.     $menuViewSpeed add command -state disabled 
  466. -label "Threshold for fast draw:"
  467.     $menuViewSpeed add radiobutton -label "None (always draw fast)" 
  468. -variable manipRender(Thresh) -value 0
  469.     $menuViewSpeed add radiobutton -label "50k polys" 
  470. -variable manipRender(Thresh) -value 50000
  471.     $menuViewSpeed add radiobutton -label "100k polys" 
  472. -variable manipRender(Thresh) -value 100000
  473.     $menuViewSpeed add radiobutton -label "200k polys" 
  474. -variable manipRender(Thresh) -value 200000
  475.     $menuViewSpeed add radiobutton -label "500k polys" 
  476. -variable manipRender(Thresh) -value 500000
  477.     $menuViewSpeed add radiobutton -label "1M polys" 
  478. -variable manipRender(Thresh) -value 1000000
  479.     $menuViewSpeed add radiobutton -label "5M polys" 
  480. -variable manipRender(Thresh) -value 5000000
  481.     $menuViewSpeed add radiobutton -label "10M polys" 
  482. -variable manipRender(Thresh) -value 10000000
  483.     $menuViewSpeed add radiobutton -label "50M polys" 
  484. -variable manipRender(Thresh) -value 50000000
  485.     $menuViewSpeed add radiobutton -label "100M polys" 
  486. -variable manipRender(Thresh) -value 100000000
  487.     $menuViewSpeed add radiobutton -label "Never (disable fastdraw)" 
  488. -variable manipRender(Thresh) -value -1
  489.     $menuView add separator
  490.     $menuView add checkbutton -label "Use triangle strips" 
  491. -variable styleTStrip
  492.     $menuView add checkbutton -label "Use display lists" 
  493. -variable styleDispList
  494.     $menuView add checkbutton -label "Don't re-render static images" 
  495. -variable styleCacheRender
  496.     $menuView add separator
  497.     set menuViewHQ [createNamedCascade $menuView highquality 
  498. "Add realism to current rendering"]
  499.     $menuViewHQ add command -label "Anti-aliasing" 
  500. -command { highQualityDraw 1 -1 }
  501.     $menuViewHQ add command -label "Shadows" 
  502. -command { highQualityDraw -1 1 }
  503.     $menuViewHQ add command -label "Soft shadows and anti-aliasing" 
  504. -command { highQualityDraw 1 1 }
  505.     $menuViewHQ add separator
  506.     $menuViewHQ add command -label "Soft shadow length..." 
  507. -command setSoftShadowLength
  508.     $menuViewHQ add separator
  509.     $menuViewHQ add checkbutton -label "Hide bounding box for HQ" 
  510. -variable highQualHideBbox
  511.     $menuView add checkbutton -label "Always anti-alias (slow!)" 
  512. -command { plv_drawstyle -antialias $styleAntiAlias; 
  513.        $toglPane render } 
  514. -variable styleAntiAlias
  515.     $menuView add checkbutton -label "Always draw shadows (slow!)" 
  516. -command { plv_drawstyle -shadows $styleShadows; 
  517.        $toglPane render } 
  518. -variable styleShadows
  519.     createNamedCascade $menuView menuAAsamps "Anti-alias sample number"
  520.     foreach x { 2 3 4 8 15 24 66 } {
  521. $menuView.menuAAsamps add radiobutton -label $x 
  522.     -variable styleAAsamps -value $x 
  523.     -command { plv_drawstyle -aasamps $styleAAsamps }
  524.     }
  525.     $menuView add separator
  526.     $menuView add checkbutton -label "Double-buffer" -variable isDoubleBuffer 
  527. -command { $toglPane configure -double $isDoubleBuffer }
  528.     $menuView add checkbutton -label "Orthographic" -variable isOrthographic 
  529. -command { if {$isOrthographic} {plv_ortho} else {plv_persp}; 
  530.        $toglPane render}
  531.     $menuView add checkbutton -label "Hide render window" 
  532. -variable theHideRenderMode 
  533. -command {
  534.     if {$theHideRenderMode} {
  535. place forget $toglPane
  536.     } else {
  537. place $toglPane -x 0 -y 0 -relwidth 1.0 -relheight 1.0
  538.     }}
  539.     $menuView add command -label "Kiosk mode" -command "kioskMode start"
  540.     $menuView add separator
  541.  
  542.     $menuView add command -label "Context Manager..." 
  543. -command buildVisGroupsUI
  544. #     set menuCamera [createNamedCascade $menuView menuCamera 
  545. #      "Camera positions"]
  546. #     $menuCamera add command -label "Remember..." 
  547. #      -command "saveCameraPosition $menuCamera"
  548. #     $menuCamera add separator
  549. #     $menuCamera add command -label "(Reset)" -command plv_resetxform
  550.     $menuView add command -label "Get camera info" -command showCameraInfo
  551.     $menuView add command -label "Reset ALL transformations" 
  552. -command { plv_resetxform all }
  553.     $menuView add command -label "Reset View transformations" 
  554. -command { plv_resetxform  }
  555.     
  556.     $menuView add command -label "Apply camera to mesh xform" 
  557. -command { plv_camera_xform_to_mesh; $toglPane render }
  558.     $menuView add command -label "Load (tsai) camera viewpoint..." 
  559. -command {
  560.     set types { { {Tsai Files} {.tsai} } { {Camera Files} {.camera} } }
  561.     set tsaifile [tk_getOpenFile -defaultextension .tsai 
  562.       -filetypes $types]
  563.     if {$tsaifile != ""} {
  564. plv_resetxform
  565. plv_positioncamera $tsaifile ; redraw 1
  566.     }
  567. }
  568.     $menuView add command -label "Resize render frame..." 
  569. -command windowResizeUI
  570.     $menuView add separator
  571.     $menuView add command -label "Preferences..." -command prefsDialog
  572.     .menubar add cascade -label Render -underline 0 -menu .menubar.menuRender
  573.     set menuRender [buildUI_RenderMenu .menubar.menuRender "Render options"]
  574.     set menuMesh [createNamedCascade .menubar menuMesh Mesh "-underline 0"]
  575.     $menuMesh add cascade -label Resolution -menu $menuMesh.resMenu
  576.     menu $menuMesh.resMenu 
  577. -postcommand "buildCurrentMeshResList $menuMesh.resMenu"
  578.     $menuMesh add separator
  579.     $menuMesh add command -label "Flip normals" 
  580. -command { invertMeshNormals $theMesh }
  581.     $menuMesh add separator
  582.     $menuMesh add command -label "Get mesh info" 
  583. -command {showMeshInfo $theMesh}
  584.     $menuMesh add command -label "Reset transformation" 
  585. -command { plv_resetxform $theMesh }
  586.     set menuCommands [createNamedCascade .menubar menuCommands Commands 
  587.   "-underline 0"]
  588.     $menuCommands add command -label "Correspondence registration" 
  589. -command correspRegistrationDialog
  590.     $menuCommands add command -label "Drag registration walkthrough" 
  591. -command dragRegistrationDialog
  592.     $menuCommands add command -label "Drag register current mesh" 
  593. -command {DragRegister $theMesh $dragRegMethod}
  594.     $menuCommands add command -label "ICP registration" -accelerator "i" 
  595. -command ICPdialog 
  596.     $menuCommands add command -label "Global registration" -accelerator "^r" 
  597. -command globalRegistrationDialog
  598.     $menuCommands add command -label "CyberScan self-alignment" 
  599. -command {plv_cyberscan_selfalign $theMesh; redraw 1}
  600.     $menuCommands add separator
  601.     set clipMenu [createNamedCascade $menuCommands clipMenu 
  602.       "Clip to selection"]
  603.     buildUI_populateClipMenu $clipMenu
  604.     $menuCommands add command -label "Fit plane to cliprect..." 
  605. -command planeFitClipRectUI
  606.     $menuCommands add command -label "Analyze line for depth" 
  607. -command analyze_line_depth
  608.     $menuCommands add command -label "Auto-Analyze lines..." 
  609. -command autoAnalyzeLineUI
  610.     $menuCommands add command -label "Render thickness view" 
  611.         -command "update; plv_render_thickness"
  612.     $menuCommands add separator
  613.     $menuCommands add command -label "Align image to mesh..." 
  614. -command imageAlignmentUI
  615.     $menuCommands add command -label "Color image visualizer..." 
  616. -command colorVisUI
  617.     $menuCommands add command -label "CyberScan Preview..." 
  618.         -command cyberscanPreviewUI
  619.     $menuCommands add separator
  620.     set groupMenu [createNamedCascade $menuCommands groupMenu 
  621.        "Group/ungroup"]
  622.     $groupMenu add command -label "Group visible meshes" 
  623. -command {group_createFromVis} -accelerator "^g"
  624.     $groupMenu add command -label "Group visible meshes as..." 
  625. -command {group_createNamedFromVis} -accelerator "^G"
  626.     $groupMenu add command -label "Ungroup active mesh" 
  627. -command {group_breakGroup $theMesh} -accelerator "^u"
  628.     set xformMenu [createNamedCascade $menuCommands xformMenu 
  629.        "Transform mesh"]
  630.     $xformMenu add command -label "Reload xform for current scan" 
  631. -command {scz_xform_scan $theMesh reload}
  632.     $xformMenu add separator
  633.     $xformMenu add command -label "Specify rotation/translation" 
  634. -command manualXFormUI
  635.     $xformMenu add command -label "Specify matrix transform" 
  636. -command matrixXformUI
  637.     set dumpXfMenu [createNamedCascade $menuCommands dumpXf 
  638. "Dump mesh transform"]
  639.     $dumpXfMenu add command -label "As matrix" 
  640. -command "showCurrentScanXform matrix"
  641.     $dumpXfMenu add command -label "As quaternion" 
  642. -command "showCurrentScanXform quat"
  643.     $dumpXfMenu add command -label "As axial rotation" 
  644. -command "showCurrentScanXform axis"
  645.     $menuCommands add separator
  646.     $menuCommands add command -label "MM-VRIP Preparation" 
  647. -command {file_exportMMSForVripDialog}
  648.     $menuCommands add command -label "CyberScan-VRIP Preparation..." 
  649. -command {file_exportSDForVripDialog}
  650.     $menuCommands add command -label "Plyfile-VRIP Preparation..." 
  651. -command {file_exportPlyForVripDialog}
  652.     $menuCommands add separator
  653.     $menuCommands add command -label "Release all resolutions" 
  654. -command releaseAllMeshes
  655.     $menuCommands add separator
  656.     $menuCommands add command -label "Create cube" 
  657. -command { addMeshToWindow [plv_synthesize 1.0] }
  658.     $menuCommands add command -label "Polygonize visible meshes" 
  659. -command { polygonizeDialog }
  660.     $menuCommands add separator
  661.     $menuCommands add command -label "Run external program" 
  662. -command { ExtProg }
  663.     global menuWindow
  664.     set menuWindow [createNamedCascade .menubar menuWindow Window 
  665. "-underline 0"]
  666.     $menuWindow add checkbutton -label "Show toolbar" 
  667. -variable ui_showToolbar
  668.     $menuWindow add checkbutton -label "Show status bar" 
  669. -variable ui_showStatusbar
  670.     $menuWindow add separator
  671.     bind $menuWindow <ButtonPress-3> "window_ActivateFromY %y"
  672.     global menuHelp
  673.     set menuHelp [createNamedCascade .menubar menuHelp Help 
  674.       "-underline 0"]
  675.     $menuHelp add command -label "Show Help Window" 
  676. -command {help_showWindow}
  677.     global help_onoff
  678.     set help_onoff 1
  679.     $menuHelp add checkbutton -label "Toggle Help On/Off" 
  680. -variable help_onoff -accelerator "^h"
  681.     help_bindHelpToMenus
  682.     help_bindHelpToButtons
  683.     global env
  684.     help_setHelpDirectory "$env(SCANALYZE_DIR)/help"
  685. }
  686. ######################################################################
  687. #
  688. # create right-click menu for togl pane
  689. #
  690. ######################################################################
  691. proc buildUI_ToglContextMenu {} {
  692.     global toglMenu
  693.     global toglSubmenu
  694.     set toglMenu [menu .toglMenu 
  695.       -tearoffcommand "setMenuTitle "Quick options""]
  696.     # this will be populated later as tools are selected
  697.     # but create submenus once, now, for later use
  698.     set toglSubmenu(render) [buildUI_RenderMenu $toglMenu.renderMenu 
  699.  "Render options"]
  700.     set toglSubmenu(reset) [menu $toglMenu.resetMenu 
  701. -tearoffcommand "setMenuTitle reset"]
  702.     $toglSubmenu(reset) add command -label Viewer -command "plv_resetxform"
  703.     $toglSubmenu(reset) add command -label "Current scan" -command 
  704. {if {$theMesh != ""} {plv_resetxform $theMesh}}
  705.     $toglSubmenu(reset) add command -label "All scans" 
  706. -command "plv_resetxform allmesh"
  707.     $toglSubmenu(reset) add command -label "All (scans and viewer)" 
  708. -command "plv_resetxform all"
  709.     set toglSubmenu(gohome) [menu $toglMenu.goHomeMenu 
  710.     -tearoffcommand "setMenuTitle "Go Home""]
  711.     $toglSubmenu(gohome) add command -label Viewer -command {goHome ""}
  712.     $toglSubmenu(gohome) add command -label Mesh -command 
  713. {if {$theMesh != ""} {goHome $theMesh}}
  714.     $toglSubmenu(gohome) add command -label All -command goHomeAll
  715.     set toglSubmenu(CoR) [menu $toglMenu.corMenu 
  716.  -tearoffcommand "setMenuTitle "Rotation center""]
  717.     $toglSubmenu(CoR) add checkbutton -label "Show" 
  718. -variable rotCenterVisible -command { $toglPane render }
  719.     $toglSubmenu(CoR) add checkbutton -label "Always on top" 
  720. -variable rotCenterOnTop -command { $toglPane render }
  721.     $toglSubmenu(CoR) add command -label "Flash" 
  722. -command flashCenterOfRotation
  723.     set toglSubmenu(clip) [menu $toglMenu.clipMenu 
  724.        -tearoffcommand "setMenuTitle "Clip""]
  725.     buildUI_populateClipMenu $toglSubmenu(clip)
  726. }
  727. ############################################################################
  728. #
  729. # create/maintain mesh controls window
  730. #
  731. ############################################################################
  732. proc resizeMCscrollbar {} {
  733.     if {[globalset noui]} return
  734.     # batch multiple requests together
  735.     idlecallback resizeMCscrollbar
  736. }
  737. proc _resizeMCscrollbar_idlecallback {} {
  738.     global leftFrame
  739.     global scrollFrame
  740.     global meshFrame
  741.     # want to re-sort everything
  742.     #set slaves [lsort -dictionary [getMeshList]]
  743.     set slaves [getSortedMeshList]
  744.     set lastframe ""
  745.     foreach slave $slaves {
  746. if {[array names meshFrame $slave]!=""} {
  747.     catch {
  748. set frame $meshFrame($slave)
  749. if {$lastframe == ""} {
  750.     pack $frame -side top
  751. } else {
  752.     pack $frame -side top -after $lastframe
  753. }
  754. set lastframe $frame
  755.     }
  756. }
  757.     }
  758.     # so that winfo works
  759.     update idletasks
  760.     set w [winfo reqwidth $leftFrame]
  761.     set h [winfo reqheight $leftFrame]
  762.     $scrollFrame config -scrollregion "0 0 $w $h" -width $w -height $h
  763. }
  764. proc buildUI_MeshControls {} {
  765.     global meshControls
  766.     global leftFrame
  767.     global scrollFrame
  768.     global meshSelScroll
  769.     global meshVisible
  770.     set meshControls [toplevel .meshControls]
  771.     set allFrame [frame $meshControls.allFrame]
  772.     
  773.     button $allFrame.show      -text "ShowAll" -padx 0 -pady 0 
  774. -command "showAllMeshes 1"
  775.     button $allFrame.hideOther -text "HideOther" -padx 0 -pady 0 
  776. -command { showOnlyMesh $theMesh }
  777.     lappend enabledWhenMeshSelected $allFrame.hideOther
  778.     button $allFrame.hide      -text "HideAll" -padx 0 -pady 0 
  779. -command "showAllMeshes 0"
  780.     button $allFrame.invert    -text "Inv" -padx 0 -pady 0 
  781. -command "showAllMeshes invert" 
  782.     globalset invokeExtendedMeshControls 
  783. [menubutton $allFrame.menuB -text "..." 
  784.      -padx 3 -pady 1 -relief raised
  785.      -menu $allFrame.menuB.hideShowMenu]
  786.     set hideShowMenu [menu $allFrame.menuB.hideShowMenu 
  787. -tearoffcommand {setMenuTitle "Extended Mesh Controls"}]
  788.     $hideShowMenu add command -label "Sort order..." 
  789. -command meshControlsSortDialog
  790.     $hideShowMenu add separator
  791.     $hideShowMenu add command -label "ShowAll" 
  792. -command {showAllMeshes 1} 
  793. -accelerator "^a"
  794.     $hideShowMenu add command -label "HideOther" 
  795. -command {showOnlyMesh $theMesh}
  796.     $hideShowMenu add command -label "HideAll" 
  797. -command {showAllMeshes 0}
  798.     $hideShowMenu add command -label "Inv" 
  799. -command {showAllMeshes invert} 
  800. -accelerator "^i"
  801.     $hideShowMenu add separator
  802.     $hideShowMenu add command -label "Show only ICP meshes" 
  803. -command showOnlyIcpMeshes
  804.     $hideShowMenu add separator
  805.     $hideShowMenu add checkbutton -label "Render only active mesh" 
  806. -variable renderOnlyActiveMesh -accelerator "^1"
  807.     $hideShowMenu add separator
  808.     $hideShowMenu add command -label "Show only screen visible meshes" 
  809. -command {eval showOnlyMesh [plv_getVisiblyRenderedScans]} 
  810. -accelerator "^v"
  811.     $hideShowMenu add command -label "Hide meshes outside" 
  812. -command {eval showOnlyMesh [plv_get_selected_meshes]}
  813.     $hideShowMenu add command -label "Hide meshes inside" 
  814. -command {eval showOnlyMesh [plv_get_selected_meshes invert]}
  815.     $hideShowMenu add command -label "Show only meshes inside" 
  816. -command {eval showOnlyMesh [plv_get_selected_meshes hidden]}
  817.     $hideShowMenu add command -label "Show all meshes outside" 
  818. -command {eval showOnlyMesh [plv_get_selected_meshes hidden invert]}
  819.     $hideShowMenu add separator
  820.     $hideShowMenu add command -label "Group visible meshes" 
  821. -command {group_createFromVis} -accelerator "^g"
  822.     $hideShowMenu add command -label "Group visible meshes as..." 
  823. -command {group_createNamedFromVis} -accelerator "^G"
  824.     $hideShowMenu add command -label "Ungroup active mesh" 
  825. -command {group_breakGroup $theMesh} -accelerator "^u"
  826.     $hideShowMenu add separator
  827.     $hideShowMenu add command -label "Load visible meshes" 
  828. -command {eval loadMeshes 1 [getVisibleMeshes]}
  829.     $hideShowMenu add command -label "Load meshes inside" 
  830. -command {eval loadMeshes 1 [plv_get_selected_meshes]}
  831.     $hideShowMenu add command -label "Unload meshes inside" 
  832. -command {eval loadMeshes 0 [plv_get_selected_meshes]}
  833.     $hideShowMenu add command -label "Unload meshes outside" 
  834. -command {eval loadMeshes 0 [plv_get_selected_meshes invert]}
  835.     $hideShowMenu add separator 
  836.  
  837.     $hideShowMenu add command -label "Delete Invisible Meshes" 
  838. -command deleteInvisibleMeshes
  839.     $hideShowMenu add separator 
  840.     $hideShowMenu add command -label "Context Manager..." 
  841. -command "buildVisGroupsUI"
  842.     bind $allFrame.menuB <Double-Button-1> {
  843. # double-click invokes the context manager:
  844. buildVisGroupsUI
  845. # need to unpost menu now; here are two possible ways:
  846. # 1) by hand.
  847. #$invokeExtendedMeshControls.hideShowMenu unpost
  848. #grab release [grab current]
  849. # 2) tkMenuUnpost is cleaner, since it releases the grab (with
  850. # error-checking) and cleans up various internal tk state.
  851. # but it cleans it up so well that the menu will see the 2nd
  852. # click of the double-click as a call to display again, so we
  853. # need to hack around that.
  854. tkMenuUnpost {}
  855. $invokeExtendedMeshControls config -state disabled
  856. after 100 "$invokeExtendedMeshControls config -state normal"
  857.     }
  858.  
  859.     packchildren $allFrame -side left -fill x -expand true
  860. #     set labelFrame [frame $meshControls.labelFrame]
  861. #     label $labelFrame.meshLabel -text "Mesh"
  862. #     label $labelFrame.visLabel -text "Vis."
  863. #     label $labelFrame.activeLabel -text "Act."
  864. #     pack $labelFrame.activeLabel $labelFrame.visLabel 
  865. #  -side right -anchor e
  866. #     pack $labelFrame.meshLabel -side right -anchor e -fill x -expand 1
  867.     set scrollerFrame [frame $meshControls.scrollFrame]
  868.     set meshSelScroll [scrollbar $scrollerFrame.s 
  869.    -command "$scrollerFrame.leftFrame yview"]
  870.     set scrollFrame [canvas $scrollerFrame.leftFrame -width 0 -height 0 
  871.  -yscrollcommand "$meshSelScroll set"]
  872.     set leftFrame [frame $scrollFrame.scrollee]
  873.     $scrollFrame create window 0 0 -window $leftFrame -anchor nw
  874.     pack $meshSelScroll -side right -fill y
  875.     pack $scrollFrame -side left -fill both -expand 1
  876.     packchildren $meshControls -side top -fill x -expand 1
  877.     wm title $meshControls "Mesh controls"
  878.     wm resizable $meshControls 0 1
  879.     window_Register $meshControls undeletable
  880. }
  881. ############################################################################
  882. #
  883. # add widgets to main window
  884. #
  885. ############################################################################
  886. proc buildUI_ShowToolbar {show} {
  887.     if {![winfo exists .tools] || ![winfo exists .status]} { return }
  888.     if {$show} {
  889. pack .tools -side left -fill y -anchor n -before .toglFrame
  890. pack forget .status.tools
  891.     } else {
  892. pack forget .tools
  893. pack .status.tools -side left -before .status.info
  894.     }
  895.     # force redraw because togl was resized
  896.     redraw 1
  897. }
  898. proc buildUI_ShowStatusbar {show} {
  899.     if {![winfo exists .tools] || ![winfo exists .status]} { return }
  900.     if {$show} {
  901. pack .status .statussep -side bottom -fill both
  902.     } else {
  903. pack forget .status
  904.     }
  905.     # force redraw because togl was resized
  906.     redraw 1
  907. }
  908. proc buildUI_MainWindow {} {
  909.     global toglPane
  910.     # main togl widget for rendering
  911.     frame .toglFrame
  912.     set toglPane .toglFrame.toglPane
  913.     togl $toglPane 
  914. -width 10 -height 10 
  915. -rgba true -double true -depth true -accum true -overlay true 
  916. -stencil true -ident $toglPane
  917.     place $toglPane -x 0 -y 0 -relwidth 1.0 -relheight 1.0
  918.     # tool palette
  919.     frame .tools
  920.     # move viewer, move selected mesh
  921.     radiobutton .tools.moveMesh -text "moveMesh (m)" 
  922. -variable theMover -value mesh 
  923. -indicatoron false
  924.     global enabledWhenMeshSelected
  925.     lappend enabledWhenMeshSelected .tools.moveMesh
  926.      radiobutton .tools.moveCamera -text "moveView (v)" 
  927. -variable theMover -value viewer 
  928. -indicatoron false
  929.     radiobutton .tools.moveLight -text "moveLight (l)" 
  930. -variable theMover -value light 
  931. -indicatoron false
  932.     # interactively select scans by selection rect
  933.     radiobutton .tools.selectScan -text selectScan 
  934. -variable theMover -value selectScan 
  935. -indicatoron false
  936.     # interactively select scans by selection rect
  937.     radiobutton .tools.selectScreenScan -text selectVisScan 
  938. -variable theMover -value selectScreenScan 
  939. -indicatoron false
  940.     # interactively choose one scan by pt click
  941.     radiobutton .tools.pickScan -text "pickScan (p)"
  942. -variable theMover -value pickScan 
  943. -indicatoron false
  944.     # pick color
  945.     radiobutton .tools.pickColor -text pickColor 
  946. -variable theMover -value pickColor 
  947. -indicatoron false
  948.     # display coordinates under mouse
  949.     radiobutton .tools.ptChooser -text "Xyz coord (x)" 
  950. -variable theMover -value ptChooser -indicatoron false
  951.     # zoom tool
  952.     radiobutton .tools.zoomer -text "Zoom (z)" 
  953. -variable theMover -value zoomer -indicatoron false
  954.     # clipping tools
  955.     frame .tools.clip
  956.     global env
  957.     radiobutton .tools.clip.line -bitmap @$env(SCANALYZE_DIR)/tool_line.xbm 
  958. -variable theMover -value clipLine 
  959. -indicatoron false
  960.     radiobutton .tools.clip.rect -bitmap @$env(SCANALYZE_DIR)/tool_rect.xbm 
  961. -variable theMover -value clipRect 
  962. -indicatoron false
  963.     radiobutton .tools.clip.shape -bitmap @$env(SCANALYZE_DIR)/tool_shape.xbm 
  964. -variable theMover -value clipShape 
  965. -indicatoron false
  966.     pack .tools.clip.line .tools.clip.rect .tools.clip.shape 
  967.   -side left
  968.     frame .tools.divide1 -height 3 -relief sunken -borderwidth 2
  969.     # center of screen, center of obj, arbitrary
  970.     radiobutton .tools.chooseCenter -text ChsCtr 
  971. -variable theMover -value rotCenter -indicatoron false
  972.     button .tools.autoCenter -text AutoCtr 
  973. -command "set theCoR auto" -padx 0 -pady 0
  974.     button .tools.screenCenter -text ScrnCtr 
  975. -command "set theCoR screen" -padx 0 -pady 0
  976.     frame .tools.divide2 -height 3 -relief sunken -borderwidth 2
  977.     # set and go home
  978.     button .tools.setHome -text "SetHome (s)" -command setHome -padx 0 -pady 0
  979.     button .tools.goHome -text "GoHome (g)" -command goHome -padx 0 -pady 0
  980.     frame .tools.divide3 -height 3 -relief sunken -borderwidth 2
  981.     # undo button
  982.     button .tools.undo -text Undo -command plv_undo_xform -padx 0 -pady 0
  983.     # redo button
  984.     button .tools.redo -text Redo -command plv_redo_xform -padx 0 -pady 0
  985.     # rotation constraints
  986.     frame .tools.rc
  987.     radiobutton .tools.rc.n -text F -variable rotationConstraint -value none 
  988. -indicator off
  989.     radiobutton .tools.rc.x -text X -variable rotationConstraint -value x 
  990. -indicator off
  991.     radiobutton .tools.rc.y -text Y -variable rotationConstraint -value y 
  992. -indicator off
  993.     radiobutton .tools.rc.z -text Z -variable rotationConstraint -value z 
  994. -indicator off
  995.     packchildren .tools.rc -side left -padx 0 -pady 0 -expand 1 -fill x
  996.     # quick render options
  997.     frame .tools.divide4 -height 3 -relief sunken -borderwidth 2
  998.     frame .tools.ro
  999.     verboseOptionMenu .tools.ro.fill "Fill" thePolygonMode 
  1000. {fill Polygons} {line Wireframe} {hiddenline "Hidden line"} 
  1001. {point Points} {hiddenpoint "Hidden Points"}
  1002.     verboseOptionMenu .tools.ro.color "Color" theColorMode 
  1003. {gray "Gray color"} {false "False color"} {intensity Intensity}
  1004. {true "True color"} {boundary Boundary} {confidence Confidence}
  1005. {registration Registration} {texture Texture}
  1006.     button .tools.ro.redraw -text "Redraw (r)" -padx 0 -pady 0
  1007. -command "redraw safeflush"
  1008.     packchildren .tools.ro -side top -expand 1 -fill x -padx 0
  1009.     pack .tools.moveCamera .tools.moveMesh .tools.moveLight
  1010. .tools.selectScan .tools.selectScreenScan 
  1011. .tools.pickScan .tools.pickColor .tools.ptChooser
  1012. .tools.zoomer 
  1013. -side top -fill x
  1014.     pack .tools.clip 
  1015. -side top -fill x
  1016.     pack .tools.divide1 -side top -fill x -pady 4
  1017.     pack .tools.chooseCenter .tools.autoCenter .tools.screenCenter 
  1018. -side top -fill x
  1019.     pack .tools.divide2 -side top -fill x -pady 4
  1020.     pack .tools.setHome .tools.goHome 
  1021. -side top -fill x
  1022.     pack .tools.divide3 -side top -fill x -pady 4
  1023.     pack .tools.undo .tools.redo .tools.rc -side top -fill x
  1024.     pack .tools.divide4 -side top -fill x -pady 4
  1025.     pack .tools.undo .tools.redo .tools.ro -side top -fill x
  1026.     fixButtonColors .tools.moveCamera .tools.moveMesh .tools.moveLight 
  1027. .tools.ptChooser .tools.chooseCenter 
  1028. .tools.pickScan .tools.pickColor .tools.selectScan
  1029.     fixButtonColors .tools.clip.line .tools.clip.rect .tools.clip.shape
  1030.     fixButtonColors .tools.rc.n .tools.rc.x .tools.rc.y .tools.rc.z
  1031.     button .tools.hide -text ">" -command "set ui_showToolbar 0"
  1032.     pack .tools.hide -side bottom -fill x
  1033.     # status bar
  1034.     frame .statussep -bg lightgray -height 2
  1035.     frame .status -relief sunken -borderwidth 2 -height 28
  1036.     frame .status.info
  1037.     label .status.info.mesh -textvariable meshCount
  1038.     label .status.info.l1 -text "scans  "
  1039.     label .status.info.tri -textvariable polyCount
  1040.     label .status.info.l2 -text "triangles (" -padx 0
  1041.     label .status.info.vis -textvariable visPolyCount -padx 0
  1042.     label .status.info.l3 -text " visible)"
  1043.     foreach widget {mesh l1 tri l2 vis l3} 
  1044. { pack .status.info.$widget -side left }
  1045.     label .status.info.mem -relief sunken
  1046.     autoSetText .status.info.mem getMemUsage
  1047.     label .status.info.tstrips -relief sunken -text tstrip -fg darkred
  1048.     label .status.info.displist -relief sunken -text dlist -fg darkred
  1049.     pack .status.info.displist .status.info.tstrips 
  1050. .status.info.mem -side right
  1051.     bind .status.info.tstrips <Double-Button-1> {
  1052. set styleTStrip [expr ! $styleTStrip]
  1053.     }
  1054.     bind .status.info.displist <Double-Button-1> {
  1055. set styleDispList [expr ! $styleDispList]
  1056.     }
  1057.     pack .status.info -side left -fill x -expand true
  1058.     button .status.tools -text "<" -command "set ui_showToolbar 1"
  1059.     # arrange tool palette, display area and status bar in main window
  1060.     pack propagate .status 0
  1061.     pack .toglFrame -side top -fill both -expand 1 -anchor n
  1062.     globalset ui_showToolbar 1
  1063.     globalset ui_showStatusbar 1
  1064.     wm title   . scanalyze
  1065.     wm protocol . WM_DELETE_WINDOW confirmQuit
  1066.     # handle uncovering of window with cached redraw
  1067.     bind $toglPane <Visibility> "checkRedrawToglPane %s"
  1068.     # and now that toglPane exists, bind context menu
  1069.     bindToglPaneRclickToContextMenu
  1070. }
  1071. proc bindToglPaneRclickToContextMenu {} {
  1072.     global toglPane
  1073.     bind $toglPane <ButtonPress-3> {
  1074. set toglContextClick "%x %y %s"
  1075. tk_popup $toglMenu %X %Y
  1076.     }
  1077.     bind $toglPane <B3-Motion> ""
  1078.     bind $toglPane <ButtonRelease-3> ""
  1079. }
  1080. proc checkRedrawToglPane {state} {
  1081.     if {$state == "VisibilityUnobscured"} {
  1082. #puts "forcing redraw due to vis change"
  1083. # also inappropriate to redraw here because it happens after every 
  1084. # menu pull-down -- exactly what we're trying to avoid
  1085. # What would be necessary here is to know what areas of the cache
  1086. # are valid, and if an invalid area is exposed, then redraw.
  1087. # It's not (currently) worth the trouble IMHO. -- magi
  1088. #redraw 1
  1089.     }
  1090.     # not safe to redraw because we're obscured, and we'll pick up bad
  1091.     # stuff in the cache... is this the best we can do?
  1092. }
  1093. proc buildUI_PositionWindows {} {
  1094.     set scrX [winfo screenwidth .]
  1095.     set scrY [winfo screenheight .]
  1096.     set left   [expr int($scrX * .2)]
  1097.     set width  [expr int($scrX * .6)]
  1098.     set top    [expr int($scrY * .1)]
  1099.     set height [expr int($scrY * .7)]
  1100.     buildUI_SaveWindowPositions prepare
  1101.     set mainGeom [get_preference mainWindowGeometry 
  1102.       ${width}x${height}+${left}+${top}]
  1103.     wm geometry . $mainGeom
  1104.     wm minsize . 450 400
  1105.     # allow window to grow bigger than screen, so you can
  1106.     # arrange a no-borders view
  1107.     wm maxsize . [expr int(1.6 * [winfo screenwidth .])] 
  1108. [expr int(1.3 * [winfo screenheight .])]
  1109.     set meshGeom [get_preference meshWindowGeometry 
  1110.       +[expr $left+$width+16]+${top}]
  1111.     wm geometry [globalset meshControls] $meshGeom
  1112. }
  1113. proc buildUI_SaveWindowPositions {mode} {
  1114.     if {$mode == "prepare"} {
  1115. watchWindowPosition .
  1116. watchWindowPosition [globalset meshControls]
  1117.     } elseif {$mode == "save"} {
  1118. . config -menu ""
  1119. update idletasks
  1120. set_preference mainWindowGeometry [getWindowPosition .]
  1121. . config -menu .menubar
  1122. # for mesh controls, just part after the + sign
  1123. set meshGeom [getWindowPosition [globalset meshControls]]
  1124. set meshGeom [string range $meshGeom [string first + $meshGeom] end]
  1125. set_preference meshWindowGeometry $meshGeom
  1126.     } else {
  1127. puts "Bad parameter $mode to buildUI_SaveWindowPositions"
  1128.     }
  1129. }
  1130. proc watchWindowPosition {win} {
  1131.     bind $win <Configure> "+setWindowPosition $win %W %wx%h+%x+%y"
  1132. }
  1133. proc setWindowPosition {winTarget winMove pos} {
  1134.     if {$winTarget != $winMove} { return }
  1135.     global watch_win_pos
  1136.     set watch_win_pos($winMove) $pos
  1137.     #puts "Window $winMove moved to $pos"
  1138. }
  1139. proc getWindowPosition {win} {
  1140.     global watch_win_pos
  1141.     if {[info exists watch_win_pos($win)]} {
  1142. return $watch_win_pos($win)
  1143.     } else {
  1144. puts "Warning: getWindowPosition used on un-watched window"
  1145. return [wm geometry $win]
  1146.     }
  1147. }
  1148. proc buildUI_BuildNudgeWindow {} {
  1149.     toplevel .nudge
  1150.     wm title .nudge "Nudge Controls"
  1151.     window_Register .nudge undeletable
  1152.     setWindowVisible .nudge 0
  1153.     label .nudge.help -text "Arrow keys move 1mm; shift=.1; control=10"
  1154.     pack .nudge.help -side top
  1155.     frame .nudge.up
  1156.     button .nudge.up.up1 -text .1 -command "translateinplane 0 .1"
  1157.     button .nudge.up.up10 -text 1 -command "translateinplane 0 1"
  1158.     button .nudge.up.up100 -text 10 -command "translateinplane 0 10"
  1159.     pack .nudge.up.up1 .nudge.up.up10 .nudge.up.up100 -side top
  1160.     frame .nudge.down
  1161.     button .nudge.down.down1 -text .1 -command "translateinplane 0 -.1"
  1162.     button .nudge.down.down10 -text 1 -command "translateinplane 0 -1"
  1163.     button .nudge.down.down100 -text 10 -command "translateinplane 0 -10"
  1164.     pack .nudge.down.down1 .nudge.down.down10 .nudge.down.down100 -side bottom
  1165.     frame .nudge.lr
  1166.     frame .nudge.lr.left
  1167.     button .nudge.lr.left.left1 -text .1 -command "translateinplane -.1 0"
  1168.     button .nudge.lr.left.left10 -text 1 -command "translateinplane -1 0"
  1169.     button .nudge.lr.left.left100 -text 10 -command "translateinplane -10 0"
  1170.     pack .nudge.lr.left.left1 .nudge.lr.left.left10 
  1171. .nudge.lr.left.left100 -side left
  1172.     frame .nudge.lr.right
  1173.     button .nudge.lr.right.right1 -text .1 -command "translateinplane .1 0"
  1174.     button .nudge.lr.right.right10 -text 1 -command "translateinplane 1 0"
  1175.     button .nudge.lr.right.right100 -text 10 -command "translateinplane 10 0"
  1176.     pack .nudge.lr.right.right1 .nudge.lr.right.right10 
  1177. .nudge.lr.right.right100 -side right
  1178.     pack .nudge.lr.left .nudge.lr.right -side left -fill x -expand 1
  1179.     pack .nudge.up .nudge.lr .nudge.down -side top -fill x -expand 1
  1180.     frame .nudge.units -borderwidth 2 -relief groove
  1181.     label .nudge.units.u -text "Mesh units:"
  1182.     radiobutton .nudge.units.m -text meters 
  1183. -variable theUnitScale -value 1000
  1184.     radiobutton .nudge.units.mm -text millimeters 
  1185. -variable theUnitScale -value 1
  1186.     pack .nudge.units.u .nudge.units.m .nudge.units.mm -side left
  1187.     pack .nudge.units -side top -fill x -expand 1 -pady 4 -padx 4
  1188.     frame .nudge.num -borderwidth 2 -relief groove
  1189.     frame .nudge.num.r1
  1190.     label .nudge.num.r1.l -text "Numeric translation (in mm):"
  1191.     frame .nudge.num.r2
  1192.     label .nudge.num.r2.lx -text X:
  1193.     entry .nudge.num.r2.x -textvariable nudgeX -width 5
  1194.     globalset nudgeX 0
  1195.     label .nudge.num.r2.ly -text Y:
  1196.     entry .nudge.num.r2.y -textvariable nudgeY -width 5
  1197.     globalset nudgeY 0
  1198.     pack .nudge.num.r1.l -side left
  1199.     set r2 .nudge.num.r2
  1200.     pack $r2.lx $r2.x $r2.ly $r2.y -side left
  1201.     button .nudge.num.go -text Nudge -command numericNudgeNow
  1202.     bind $r2.x <Return> numericNudgeNow
  1203.     bind $r2.y <Return> numericNudgeNow
  1204.     pack .nudge.num.go -side right -fill y -expand 1 -anchor e -pady 4 -padx 4
  1205.     pack .nudge.num.r1 .nudge.num.r2 -side top -fill x -anchor w -pady 2
  1206.     pack .nudge.num -side top -fill x -expand 1 -padx 4 -pady 4
  1207.     wm resizable .nudge 0 0
  1208. }
  1209. proc numericNudgeNow {} {
  1210.     translateinplane [globalset nudgeX] [globalset nudgeY]
  1211. }
  1212. proc buildUI_BuildVersionWindow {} {
  1213.     global env
  1214.     if [catch {set file [open "$env(SCANALYZE_DIR)/source-history" r]}] return
  1215.     set history [read $file]
  1216.     close $file
  1217.     set vi [toplevel .versioninfo]
  1218.     wm title $vi "Version information"
  1219.     window_Register $vi undeletable
  1220.     setWindowVisible $vi 0
  1221.     text $vi.t -wrap none -yscrollcommand "$vi.sy set"
  1222.     $vi.t insert end $history
  1223.     scrollbar $vi.sy -orient vert -command "$vi.t yview"
  1224.     pack $vi.sy -side right -fill y
  1225.     pack $vi.t -side top -fill both -expand true
  1226. }
  1227. proc buildUI_selectNthResolution {} {
  1228.     if {[window_Activate .resNselect]} return
  1229.     set rs [toplevel .resNselect]
  1230.     wm title $rs "Global resolution selector"
  1231.     window_Register $rs
  1232.     frame $rs.a -relief groove -border 2
  1233.     label $rs.a.l1 -text "Choose relative resolution for all scans"
  1234.     label $rs.a.l2 -text "(0 is highest res)"
  1235.     set f [frame $rs.a.f]
  1236.     entry $f.val -width 2
  1237.     scale $f.slide -orient horiz -from 0 -to 6 -showvalue 0 
  1238. -command {.resNselect.a.f.val delete 0 end;
  1239.     .resNselect.a.f.val insert end}
  1240.     packchildren $f -side left
  1241.     packchildren $rs.a -side top -anchor w
  1242.     set p [frame $rs.preset]
  1243.     for {set i 0} {$i < 7} {incr i} {
  1244. button $p.p$i -text $i -command "selectNthResolution $i"
  1245.     }
  1246.     packchildren $p -side left -padx 3
  1247.     frame $rs.b
  1248.     button $rs.b.ok -text "Select" 
  1249. -command {selectNthResolution [.resNselect.a.val get]}
  1250.     button $rs.b.cl -text "Close" -command "destroy $rs"
  1251.     packchildren $rs.b -side left -fill x -expand 1
  1252.     packchildren $rs -side top -fill x -expand 1
  1253. }
  1254. ######################################################################
  1255. #
  1256. # bind keyboard shortcuts to toolbar/menu commands
  1257. #
  1258. ######################################################################
  1259. proc buildUI_BindShortcuts {} {
  1260.     # TODO: these switch theMover permanently; it's also useful to have keys
  1261.     # that switch the mode only while the key is down.  Maybe have lowercase
  1262.     # (unshifted) switch mode while key is down, or uppercase (shifted) keys
  1263.     # switch mode permanently?
  1264.     # bind Space to temporary theMover=viewer?
  1265.     bind . <KeyPress-v> "set theMover viewer"
  1266.     bind . <KeyPress-m> "set theMover mesh"
  1267.     bind . <KeyPress-l> "set theMover light"
  1268.     bind . <KeyPress-p> "set theMover pickScan"
  1269.     bind . <KeyPress-r> "set theMover clipRect"
  1270.     bind . <KeyPress-x> "set theMover ptChooser"
  1271.     bind . <KeyPress-z> "set theMover zoomer"
  1272.     bind . <KeyPress-s> "setHome"
  1273.     bind . <KeyPress-S> "setHomeAll"
  1274.     bind . <KeyPress-g> "goHome"
  1275.     bind . <KeyPress-G> "goHomeAll"
  1276.     bind . <KeyPress-r> "redraw 1"
  1277.     bind . <KeyPress-i> "ICPdialog"
  1278.     # X, Y, Z (must be uppercase) set rotation constraints
  1279.     foreach char {F X Y Z} {
  1280. bind . <KeyPress-$char> "toggleRotationConstraint $char"
  1281.     }
  1282.     # left shift keeps us in fast-draw mode
  1283.     bind . <KeyPress-f> "plv_setManipRenderMode lock"
  1284.     bind . <KeyRelease-f> "plv_setManipRenderMode unlock; redraw"
  1285.     # some menu key shortcut
  1286.     bind .meshControls  <KeyPress-i> "ICPdialog"
  1287.     bind . <Control-KeyPress-r> "globalRegistrationDialog"
  1288.     bind .meshControls <Control-KeyPress-r> "globalRegistrationDialog"
  1289.     bind all <Control-KeyPress-h> "help_toggleOnOff"
  1290.     # resolution increase/decrease
  1291.     # basic idea is comma (<) down, period (>) up
  1292.     # shift applies to all meshes
  1293.     # control means go all the way
  1294.     # so you get the idea for ctrl+shift
  1295.     bind . <KeyPress-less>    {set drawResolution nextlow}
  1296.     bind . <KeyPress-greater> {set drawResolution nexthigh}
  1297.     bind . <KeyPress-comma>   {setMeshResolution $theMesh lower}
  1298.     bind . <KeyPress-period>  {setMeshResolution $theMesh higher}
  1299.     bind . <Control-KeyPress-comma>     {setMeshResolution $theMesh lowest}
  1300.     bind . <Control-KeyPress-period>    {setMeshResolution $theMesh highest}
  1301.     bind . <Control-KeyPress-less>      {set drawResolution low}
  1302.     bind . <Control-KeyPress-greater>   {set drawResolution high}
  1303.     # Mesh Visibility
  1304.     bind . <Control-KeyPress-a> {showAllMeshes 1} 
  1305.     bind . <Control-KeyPress-o> {showOnlyMesh $theMesh} 
  1306.     bind . <Control-KeyPress-v> {eval showOnlyMesh 
  1307.      [plv_getVisiblyRenderedScans]}
  1308.     bind . <Control-KeyPress-i> {showAllMeshes invert}
  1309.     bind .meshControls <Control-KeyPress-a> {showAllMeshes 1} 
  1310.     bind .meshControls <Control-Shift-KeyPress-a> {showAllMeshes 1} 
  1311.     bind .meshControls <Control-KeyPress-v> {eval showOnlyMesh 
  1312.  [plv_getVisiblyRenderedScans]}
  1313.     bind .meshControls <Control-KeyPress-i> {showAllMeshes invert}
  1314.     bind . <Control-KeyPress-k> {set renderOnlyActiveMesh 
  1315.      [expr !$renderOnlyActiveMesh]}
  1316.     bind . <KeyPress-t> {changeVis $theMesh [expr ! $meshVisible($theMesh)]}
  1317.     bind .meshControls <KeyPress-t> 
  1318. {set meshVisible($theMesh) [expr ! $meshVisible($theMesh)]}
  1319.     
  1320.     # Grouping
  1321.     bind . <Control-KeyPress-g> {group_createFromVis}
  1322.     bind .meshControls <Control-KeyPress-g> {group_createFromVis}    
  1323.     bind . <Control-KeyPress-G> {group_createNamedFromVis}
  1324.     bind .meshControls <Control-KeyPress-G> {group_createNamedFromVis}    
  1325.     bind . <Control-KeyPress-u> {group_breakGroup $theMesh}
  1326.     bind .meshControls <Control-KeyPress-u> {group_breakGroup $theMesh}
  1327.     # and number keys, to switch directly to given res
  1328.     foreach pair {{1 exclam} {2 at} {3 numbersign} {4 dollar} {5 percent}
  1329. {6 asciicircum} {7 ampersand} {8 asterisk} {9 parenleft}
  1330. {0 parenright}} {
  1331. set num [lindex $pair 0]
  1332. set sym [lindex $pair 1]
  1333. bind . <KeyPress-$num> "selectNthResolutionForCurrentMesh $num"
  1334. bind . <KeyPress-$sym> "selectNthResolution $num"
  1335.     }
  1336.     # nudge controls
  1337.     bind . <KeyPress-Left>  {translateinplane -1  0}
  1338.     bind . <KeyPress-Right> {translateinplane  1  0}
  1339.     bind . <KeyPress-Up>    {translateinplane  0  1}
  1340.     bind . <KeyPress-Down>  {translateinplane  0 -1}
  1341.     bind . <Shift-KeyPress-Left>  {translateinplane -.1  0}
  1342.     bind . <Shift-KeyPress-Right> {translateinplane  .1  0}
  1343.     bind . <Shift-KeyPress-Up>    {translateinplane  0  .1}
  1344.     bind . <Shift-KeyPress-Down>  {translateinplane  0 -.1}
  1345.     bind . <Control-KeyPress-Left>  {translateinplane -10  0}
  1346.     bind . <Control-KeyPress-Right> {translateinplane  10  0}
  1347.     bind . <Control-KeyPress-Up>    {translateinplane  0  10}
  1348.     bind . <Control-KeyPress-Down>  {translateinplane  0 -10}
  1349.     # rotational nudges
  1350.     # home/end = y, delete/pagedn = x, insert/pageup = z
  1351.     bind . <KeyPress-Delete> {plv_manrotate  0 -1  0; redraw 1}
  1352.     bind . <KeyPress-Next>   {plv_manrotate  0  1  0; redraw 1}
  1353.     bind . <KeyPress-Home>   {plv_manrotate -1  0  0; redraw 1}
  1354.     bind . <KeyPress-End>    {plv_manrotate  1  0  0; redraw 1}
  1355.     bind . <KeyPress-Insert> {plv_manrotate  0  0  1; redraw 1}
  1356.     bind . <KeyPress-Prior>  {plv_manrotate  0  0 -1; redraw 1}
  1357.     bind . <Control-KeyPress-Delete> {plv_manrotate   0 -10  0; redraw 1}
  1358.     bind . <Control-KeyPress-Next>   {plv_manrotate   0  10  0; redraw 1}
  1359.     bind . <Control-KeyPress-Home>   {plv_manrotate -10   0  0; redraw 1}
  1360.     bind . <Control-KeyPress-End>    {plv_manrotate  10   0  0; redraw 1}
  1361.     bind . <Control-KeyPress-Insert> {plv_manrotate   0  0  10; redraw 1}
  1362.     bind . <Control-KeyPress-Prior>  {plv_manrotate   0  0 -10; redraw 1}
  1363.     # select mesh
  1364.     bind . <KeyPress-bracketleft>    {selectMesh prev}
  1365.     bind . <KeyPress-bracketright>   {selectMesh next}
  1366.     bind .meshControls <KeyPress-bracketleft>    {selectMesh prev}
  1367.     bind .meshControls <KeyPress-bracketright>   {selectMesh next}
  1368.     bind . <KeyPress-braceleft>    {selectMeshFromAll prev}
  1369.     bind . <KeyPress-braceright>   {selectMeshFromAll next}
  1370.     bind .meshControls <KeyPress-braceleft>    {selectMeshFromAll prev}
  1371.     bind .meshControls <KeyPress-braceright>   {selectMeshFromAll next}
  1372.     # ICP dialog
  1373.     bind . <F1> {
  1374. set regICPFrom $theMesh
  1375. ICPdialog
  1376.     }
  1377.     bind . <F2> {
  1378. set regICPTo $theMesh
  1379. ICPdialog
  1380.     }
  1381.     # save registrations
  1382.     bind . <Control-KeyPress-x> {fileWriteAllScanXforms}
  1383.     # and some X event bindings that we need to process
  1384.     # minimize/maximize
  1385.     bind . <Unmap> {if {"%W"=="."} { window_Minimize save }}
  1386.     bind . <Map>   {if {"%W"=="."} { window_Minimize restore }}
  1387.     # resize
  1388.     bind . <Configure> {+if {"%W"=="."} { onMainResize }}
  1389. }
  1390. proc onMainResize {} {
  1391.     after idle {
  1392. update
  1393. if {[info exists onMainResizeProc]} {
  1394.     eval $onMainResizeProc
  1395. }
  1396. redraw
  1397.     }
  1398. }
  1399. proc buildUI_privChangeMeshActive {mesh active {frame ""}} {
  1400.     global meshFrame
  1401.     global meshVisible
  1402.     if {$active} {
  1403. set meshFrame($mesh) $frame
  1404. set meshVisible($mesh) 1
  1405.     } else {
  1406. unset meshFrame($mesh)
  1407. unset meshVisible($mesh)
  1408.     }
  1409. }
  1410. proc buildUI_dummyPrivChangeMeshActive {mesh active {frame ""}} {
  1411.     global meshFrame
  1412.     global meshVisible
  1413.     if {$active} {
  1414. set meshFrame($mesh) $frame
  1415. set meshVisible($mesh) 1
  1416.     } else {
  1417. destroy $meshFrame($mesh)
  1418. unset meshFrame($mesh)
  1419. unset meshVisible($mesh)
  1420.     }
  1421. }
  1422. proc hiliteScanEntry {mesh hilite} {
  1423.     global meshFrame
  1424.     set lab $meshFrame($mesh).title.label
  1425.     if {$hilite} {
  1426. $lab config -bg "#00ffff"
  1427.     } else {
  1428. resetBGcolor $lab
  1429.     }
  1430. }
  1431. proc redrawStatus {mode} {
  1432.     # early out for speed freaks
  1433.     if {![globalset wantRedrawStatus]} return
  1434.     set ud 0
  1435.     if {$mode == "start"} {
  1436. set color Red
  1437.     } elseif {$mode == "cache"} {
  1438. set color Purple
  1439.     } elseif {$mode == "end"} {
  1440. set color Black
  1441.     } else {
  1442. # medium out for medium speed freaks
  1443. if {[globalset wantRedrawStatus] < 2} return
  1444. set color $mode
  1445.     }
  1446.     .tools.ro.redraw config -fg $color
  1447.     #update idletasks
  1448. }
  1449. proc windowResizeUI {} {
  1450.     toplevel .resizeD
  1451.     wm title .resizeD "Resize render window..."
  1452.     wm resizable .resizeD 0 0 
  1453.     label .resizeD.width -text "Width:"
  1454.     entry .resizeD.widthval -relief sunken -textvariable widthval
  1455.     label .resizeD.height -text "Height:"
  1456.     entry .resizeD.heightval -relief sunken -textvariable heightval
  1457.     button .resizeD.okb -text "OK" -command {
  1458. if {    ( [scan $widthval "%d" foo] == 1 )
  1459.      && ( [scan $heightval "%d" foo] == 1) } {
  1460.     setMainWindowSize $widthval $heightval
  1461.     destroy .resizeD
  1462. }
  1463.     }
  1464.  
  1465.     button .resizeD.apply -text "Apply" -command {
  1466. if {    ( [scan $widthval "%d" foo] == 1 )
  1467.      && ( [scan $heightval "%d" foo] == 1) } {
  1468.     setMainWindowSize $widthval $heightval
  1469. }
  1470.     }
  1471.     button .resizeD.cancel -text "Cancel" -command "destroy .resizeD"
  1472.     pack .resizeD.width .resizeD.widthval 
  1473. .resizeD.height .resizeD.heightval 
  1474. .resizeD.okb .resizeD.apply .resizeD.cancel -side left
  1475. }
  1476. proc meshControlsSortDialog {} {
  1477.     set sd .meshControlsSortDialog
  1478.     if {[window_Activate $sd]} {return}
  1479.     toplevel $sd
  1480.     wm title $sd "Sort mesh list by:"
  1481.     window_Register $sd
  1482.     for {set n 1} {$n <= 5} {incr n} {
  1483. set f [frame $sd.line$n]
  1484. label $f.l -text "Criteria $n:" -anchor w
  1485. set m [tk_optionMenu $f.sort meshControlsSort($n) 
  1486.    "Name" "File date" "Loadedness" "Visibility" 
  1487.    "PolygonCount"]
  1488. packchildren $f -side left -fill x -expand 1
  1489.     }
  1490.     checkbutton $sd.dictionary -text "Use dictionary sort" 
  1491. -variable meshControlsSort(mode) -onvalue dictionary -offvalue ascii
  1492.     button $sd.resort -text "Resort now" -command resizeMCscrollbar
  1493.     button $sd.close -text "Close" -command "destroy $sd"
  1494.     packchildren $sd -side top -fill x -expand 1
  1495. }
  1496. proc bindToglPaneRclickToMoveLight {} {
  1497.     global cursor
  1498.     global toglPane
  1499.     bind $toglPane <ButtonPress-3> 
  1500. "plv_rotlight $toglPane %x %y;
  1501.          $toglPane config -cursor "circle$cursor(Fore)""
  1502.     bind $toglPane <B3-Motion> 
  1503. "plv_rotlight $toglPane %x %y"
  1504.     bind $toglPane <ButtonRelease-3> 
  1505. "setTBCursor $toglPane 0 none"
  1506. }
  1507. proc kioskInstructions {} {
  1508.     set k [toplevel .kiosk]
  1509.     wm title $k "Instruzioni / Instructions"
  1510.     set width [expr [winfo screenwidth $k] / 5]
  1511.     set instr [frame $k.instructions]
  1512.     set i [frame $instr.italian]
  1513.     frame $instr.line -width 2 -borderwidth 2 -relief solid
  1514.     set e [frame $instr.english]
  1515.     frame $k.line -height 2 -borderwidth 2 -relief solid
  1516.     button $k.ok -text "Cominciare        OK               Begin" 
  1517. -command "destroy $k"
  1518.     label $i.prova -text "Provatelo vi stessi!"
  1519.     label $i.rotare -text "Premere il pulsante sinistra (e trascinare il
  1520.         mouse) per rotare la statua"
  1521.     label $i.muovere -text "Premere il pulsante a meta' (e trascinare il
  1522.         mouse) per muovere la statua"
  1523.     label $i.zoomare -text "Premere simultaneamente i pulsanti sinistra e
  1524.         a meta' (e trascinare il mouse) per zoomare"
  1525.     label $i.luce -text "Premere il pulsante destra (e trascinare il
  1526.         mouse verticalmente) per muovere la luce"
  1527.     label $i.comincia -text "Cliccare su "OK" per cominciare"
  1528.     label $e.try -text "Try this yourself!"
  1529.     label $e.rotate -text "Push the left button (and drag the mouse) to
  1530.         rotate the statue"
  1531.     label $e.move -text "Push the middle button (and drag the mouse) to
  1532.         move the statue"
  1533.     label $e.zoom -text "Push the left and middle buttons at once (and
  1534.         move the mouse vertically) to zoom"
  1535.     label $e.light -text "Push the right button (and move the mouse) to
  1536.         move the light"
  1537.     label $e.begin -text "Click "OK" to begin"
  1538.     foreach child [concat [winfo children $i] [winfo children $e]] {
  1539. $child config -wraplength $width -justify left -anchor w 
  1540.     -font -*-times-medium-r-normal--20-*-*-*-p-96-iso8859-1
  1541.     }
  1542.     foreach child "$i.prova $e.try" {
  1543. $child config -font -*-times-bold-r-normal--34-*-*-*-p-177-iso8859-1
  1544.     }
  1545.     packchildren $i -side top -fill x -pady 3
  1546.     packchildren $e -side top -fill x -pady 3
  1547.     packchildren $instr -side left -fill both -expand 1 -padx 10
  1548.     pack $k.instructions $k.line -side top -pady 5 -fill x
  1549.     pack $k.ok -side top -pady 5
  1550.     centerWindow $k
  1551.     grab set $k
  1552.     tkwait window $k
  1553. }
  1554. proc kioskMode {mode} {
  1555.     redraw block
  1556.     global preKioskGeometry
  1557.     if {$mode == "start"} {
  1558. # go kiosk mode!
  1559. # make sure model is onscreen; if this fails, die early
  1560. if {[catch {plv_force_keep_onscreen 1 20 
  1561. "kioskInstructions"} msg]} {
  1562.     bgerror $msg
  1563.     redraw flush
  1564.     return
  1565. }
  1566. # strip window of everything but rendering pane
  1567. . config -menu ""
  1568. buildUI_ShowToolbar 0
  1569. buildUI_ShowStatusbar 0
  1570. # set right button to move light
  1571. bindToglPaneRclickToMoveLight
  1572. globalset theMover viewer
  1573. # fill the screen
  1574. set preKioskGeometry [getWindowPosition .]
  1575. set w [expr [winfo screenwidth .] + 80]
  1576. set h [expr [winfo screenheight .] + 80]
  1577. wm geometry . ${w}x${h}+-40+-40
  1578. # and our exit key
  1579. bind . <Escape> "kioskMode end"
  1580.     } else {
  1581. # restore previous state
  1582. # redo main window layout
  1583. . config -menu .menubar
  1584. buildUI_ShowToolbar [globalset ui_showToolbar]
  1585. buildUI_ShowStatusbar [globalset ui_showStatusbar]
  1586. # restore window position
  1587. wm geometry . $preKioskGeometry
  1588. unset preKioskGeometry
  1589. # right button goes back to context menu
  1590. bindToglPaneRclickToContextMenu
  1591. plv_force_keep_onscreen 0
  1592. # cleanup
  1593. bind . <Escape> ""
  1594.     }
  1595.     redraw flush
  1596. }
  1597. proc toggleRotationConstraint {char} {
  1598.     global rotationConstraint
  1599.     set constraint [string tolower $char]
  1600.     if {$rotationConstraint == $constraint} {
  1601. set rotationConstraint none
  1602.     } elseif {$constraint == "f"} {
  1603. set rotationConstraint none
  1604.     } else {
  1605. set rotationConstraint $constraint
  1606.     }
  1607. }