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

3D图形编程

开发平台:

Visual C++

  1. # To add new things to the stored context:
  2. # make up a new global var like vgRestoreRenderColor
  3. # make up a new global var like vgRenderColor
  4. # Add a global line to buildVisGroupsUI
  5. # Add to the menu in buildVisGroupsUI for defauts pop up menu
  6. # Add to vg_globalVars so defaults are set
  7. # Add to vg_CreateView so defaults are copied to new context
  8. # Add to menu in vg_addContextUI for context pop up menu 
  9. # Add to vg_SaveCurrentState
  10. # Add to vg_RestoreState
  11. #Build UI
  12. proc buildVisGroupsUI {} {
  13.     if [window_Activate .visgroups] return
  14.     
  15.     # Global vars # Set up default values if necessary
  16.     vg_globalVars
  17.     global vgRestoreCamera
  18.     global vgRestoreMeshList
  19.     global vgMeshMod
  20.     global vg_viewName
  21.     global vgAutoUpdate
  22.     # Build window
  23.     global vg
  24.     set vg [toplevel .visgroups]
  25.     wm title $vg "Context Manager"
  26.     window_Register $vg
  27.     # Entry Box
  28.     frame $vg.eb
  29.     button $vg.eb.addView -text "Create Context:" 
  30. -command vg_CreateView
  31.     entry $vg.eb.viewName -relief sunken -textvariable vg_viewName
  32.     pack $vg.eb.addView -fill x
  33.     pack $vg.eb.viewName  -fill x
  34.     bind $vg <Return> vg_CreateView
  35.     # Defaults button
  36.     menubutton $vg.menuB -relief raised 
  37. -text "Context Defaults ..." -menu $vg.menuB.defaultMenu
  38.     bind $vg.menuB <Button-3> {
  39. tk_popup $vg.menuB.defaultMenu %X %Y
  40.     }
  41.     set defaultMenu [menu $vg.menuB.defaultMenu 
  42.  -tearoffcommand {setMenuTitle "Context Defaults"}]
  43.     # Defaults menu
  44.     $defaultMenu add checkbutton -label "Auto update context" 
  45. -variable vgAutoUpdate(default)
  46.     $defaultMenu add separator
  47.     $defaultMenu add checkbutton -label "Restore Camera" 
  48. -variable vgRestoreCamera(default)
  49.     $defaultMenu add checkbutton -label "Restore Scan Set" 
  50. -variable vgRestoreMeshList(default)
  51.     $defaultMenu add checkbutton -label "Restore Mesh Resolutions" 
  52. -variable vgRestoreMeshResolutions(default)
  53.     $defaultMenu add separator
  54.     $defaultMenu add radiobutton -label "Show ONLY scan set" 
  55. -variable vgMeshMod(default) -value exact
  56.     $defaultMenu add radiobutton -label "Show scan set" 
  57. -variable vgMeshMod(default) -value show
  58.     $defaultMenu add radiobutton -label "Hide scan set" 
  59. -variable vgMeshMod(default) -value hide
  60.     $defaultMenu add radiobutton -label "Hide/Show toggle scan set" 
  61. -variable vgMeshMod(default) -value toggle
  62.   
  63.     $defaultMenu add separator
  64.     $defaultMenu add command -label "Clear All Contexts" 
  65.       -command {vg_clearAllContext}
  66.     $defaultMenu add command -label "Save Context Set As..." 
  67.       -command {vg_saveAsUI}
  68.     $defaultMenu add command -label "Load Context Set..." 
  69.       -command {vg_loadFileUI}
  70.     $defaultMenu add command -label "Create Pseudo Group..." 
  71.       -command {vg_savePseudoGroupUI}
  72.     
  73.   
  74.     # List frame
  75.     frame $vg.lb
  76.     frame $vg.vMenus
  77.    
  78.     listbox $vg.lb.viewnames -yscrollcommand "$vg.lb.scroll set"
  79.     bind $vg.lb.viewnames <ButtonRelease-1> {  }
  80.   
  81.     scrollbar $vg.lb.scroll -command "$vg.lb.viewnames yview"
  82.     pack $vg.lb.scroll -side right -fill y 
  83.     pack $vg.lb.viewnames -fill x
  84.     # Bindings for buttons in listbox
  85.     bind $vg.lb.viewnames <Button-3>  {
  86. # Pop up menu
  87. set item [$vg.lb.viewnames get @%x,%y]
  88. if {$item != ""} {
  89.     tk_popup $vg.vMenus.x$item %X %Y
  90. }
  91.     }
  92.     bind $vg.lb.viewnames <Motion> {
  93. # Selection tracks mouse
  94. $vg.lb.viewnames selection clear 0 end
  95. $vg.lb.viewnames selection set @%x,%y
  96.     }
  97.     bind $vg.lb.viewnames <Leave> {
  98. # Leave clears slectioin
  99. $vg.lb.viewnames selection clear 0 end
  100. if {$vgCurrentContext != "" && 
  101. $vgAutoUpdate($vgCurrentContext)} {
  102.     vgSetListBox $vgCurrentContext
  103. }
  104.     }
  105.     bind $vg.lb.viewnames <Button-1> {
  106. # Restore state
  107. vg_RestoreState [$vg.lb.viewnames get @%x,%y]
  108.     }
  109.     # Reset the list of whats in the listbox
  110.     vg_updateListbox
  111.     $vg.lb.viewnames configure -height 25
  112.     # Pack
  113.     pack $vg.eb -fill x
  114.     pack $vg.menuB -anchor w
  115.     pack $vg.lb -fill x
  116. }
  117. proc vgSetListBox {name} {
  118.     global vg
  119.     for {set i 0} {$i < [$vg.lb.viewnames index end]} {incr i} {
  120. if {[$vg.lb.viewnames get $i] == "$name"} {
  121.     $vg.lb.viewnames selection set $i
  122. }
  123.     }
  124. }
  125. proc vg_updateListbox {} {
  126.     global vgRestoreCamera
  127.     #Build new UI
  128.     foreach view [array names vgRestoreCamera] {
  129. if {$view != "default"} {vg_addContextUI $view}
  130.     }
  131. }
  132. proc vg_clearAllContext {} {
  133.     global vgRestoreCamera
  134.     foreach view [array names vgRestoreCamera] {
  135. if {$view != "default"} {vg_deleteContext $view}
  136.     }
  137. }
  138. # Global Vars
  139. proc vg_globalVars {} {
  140.     global vgRestoreCamera
  141.     global vgRestoreMeshList
  142.     global vgCamera
  143.     global vgMeshList
  144.     global vgMeshMod
  145.     global vgAutoUpdate
  146.     global vgCurrentContext
  147.     global vgRestoreMeshResolutions
  148.     global vgMeshResolutions
  149.     if {![info exists vgCurrentContext]} {
  150. set vgCurrentContext ""
  151.     }
  152.     if {![info exists vgAutoUpdate]} {
  153. set vgAutoUpdate(default) 0
  154.     }
  155.     if {![info exists vgRestoreCamera]} {
  156. set vgRestoreCamera(default) 1
  157.     }
  158.     if {![info exists vgRestoreMeshList]} {
  159. set vgRestoreMeshList(default) 1
  160.     }
  161.  
  162.    if {![info exists vgRestoreMeshResolutions]} {
  163. set vgRestoreMeshResolutions(default) 1
  164.     }
  165.     if {![info exists vgMeshMod]} {
  166. set vgMeshMod(default) exact
  167.     }
  168.     uplevel {
  169. global vgRestoreCamera
  170. global vgRestoreMeshList
  171. global vgCamera
  172. global vgMeshList
  173. global vgMeshMod
  174. global vgAutoUpdate
  175. global vgCurrentContext
  176. global vgRestoreMeshResolutions
  177. global vgMeshResolutions
  178.     }
  179. }
  180. # saves the current context set to a file
  181. proc vg_saveContextSetToFile {filename} {
  182.     vg_globalVars
  183.     pref_saveVarsToFile $filename vgRestoreCamera vgRestoreMeshList vgCamera vgMeshList vgMeshMod vgAutoUpdate vgRestoreMeshResolutions vgMeshResolutions
  184. }
  185. proc vg_loadContextSetFromFile {filename} {
  186.     vg_globalVars
  187.     pref_loadVarsFromFile $filename 
  188.     vg_updateListbox
  189. }
  190. proc vg_saveAsUI {} {
  191.     set types {
  192. {{Context file}       {.context}}
  193.     }
  194.     set name [tk_getSaveFile -defaultextension .context -filetypes $types
  195.   -title "Save context set as"]
  196.     if {"$name" != ""} {
  197. vg_saveContextSetToFile $name
  198.     }
  199. }
  200. proc vg_loadFileUI {} {
  201.     set types {
  202. {{Context file}       {.context}}
  203.     }
  204.     set name [tk_getOpenFile -defaultextension .context -filetypes $types
  205.   -title "Load context set "]
  206.     if {"$name" != ""} {
  207. vg_loadContextSetFromFile $name
  208.     }
  209. }
  210. proc vg_savePseudoGroupUI {} {
  211.     set name [tk_getSaveFile -title "Create a pseudo group"]
  212.     if {"$name" != ""} {
  213. scz_pseudogroup $name [getVisibleMeshes]
  214.     }
  215. }
  216. # CreateView
  217. proc vg_CreateView {{viewArg ""}} {
  218.     global vg_viewName
  219.     global vgRestoreCamera
  220.     global vgRestoreMeshList
  221.     global vgMeshMod
  222.     global vgCurrentContext
  223.     global vgAutoUpdate
  224.  
  225.     # Make sure global vars exist
  226.     vg_globalVars
  227.     # If the user specifies use this, otherwise use the entrybox variable
  228.     if {"$viewArg" != ""} {
  229. set vg_viewName $viewArg
  230.     }
  231.     # Check for empty view name
  232.     if {"$vg_viewName" == "" } { return}
  233.     # Check for name default
  234.     if {"$vg_viewName" == "default" } { return}
  235.     
  236.     # Check for repeated view name
  237.     foreach view [array names vgRestoreCamera] {
  238. if {$view == "$vg_viewName"} {
  239.     vg_SaveCurrentState $vg_viewName
  240.     puts "Saving current view to $vg_viewName."
  241.     vg_clearEntry
  242.     return
  243. }
  244.     }
  245.     # Set option values for new View
  246.     set vgRestoreCamera($vg_viewName) $vgRestoreCamera(default)
  247.     set vgRestoreMeshList($vg_viewName) $vgRestoreMeshList(default)
  248.     set vgMeshMod($vg_viewName) $vgMeshMod(default)
  249.     set vgAutoUpdate($vg_viewName) $vgAutoUpdate(default)
  250.     set vgRestoreMeshResolutions($vg_viewName) $vgRestoreMeshResolutions(default)
  251.     # Save Current State
  252.     vg_SaveCurrentState $vg_viewName
  253.     #Build new UI elements
  254.     vg_addContextUI $vg_viewName
  255.     # Auto update old context?
  256.     if {$vgCurrentContext != ""} {
  257. if {$vgAutoUpdate($vgCurrentContext) == 1} {
  258.     vg_SaveCurrentState $vgCurrentContext
  259. }
  260.     }
  261.     # Set Current Context
  262.     set vgCurrentContext $vg_viewName
  263.     # Clear the entry box - last since we are using the value
  264.     vg_clearEntry
  265. }
  266. proc vg_clearEntry {} {
  267.     if [winfo exists .visgroups] {
  268. .visgroups.eb.viewName delete 0 end
  269.     }
  270.     globalset vg_viewName ""
  271. }
  272. proc vg_addContextUI {vg_viewName} {
  273.     vg_globalVars 
  274.     # If the window isn't present return
  275.     if {![winfo exists .visgroups]} return;
  276.     # If the view is alrady in the list return
  277.     if {[winfo exists .visgroups.vMenus.x$vg_viewName]} return;
  278.     # Add View to list
  279.     .visgroups.lb.viewnames insert end $vg_viewName
  280.  
  281.     # Create menu
  282.     set m [menu .visgroups.vMenus.x$vg_viewName 
  283.        -tearoffcommand "setMenuTitle Context_$vg_viewName" ]
  284.     $m add checkbutton -label "Auto update context" 
  285. -variable vgAutoUpdate($vg_viewName)
  286.     $m add separator
  287.     $m add checkbutton -label "Restore Camera" 
  288. -variable vgRestoreCamera($vg_viewName)
  289.     
  290.     $m add checkbutton -label "Restore Scan Set" 
  291. -variable vgRestoreMeshList($vg_viewName)
  292.     $m add checkbutton -label "Restore Mesh Resolutions" 
  293. -variable vgRestoreMeshResolutions($vg_viewName)
  294.   
  295.     $m add separator
  296.     $m add radiobutton -label "Show ONLY scan set" 
  297. -variable vgMeshMod($vg_viewName) -value exact
  298.     $m add radiobutton -label "Show scan set" 
  299. -variable vgMeshMod($vg_viewName) -value show
  300.     $m add radiobutton -label "Hide scan set" 
  301. -variable vgMeshMod($vg_viewName) -value hide
  302.     $m add radiobutton -label "Hide/Show toggle scan set" 
  303. -variable vgMeshMod($vg_viewName) -value toggle
  304.     $m add separator
  305.     set meshMenu [createNamedCascade $m meshMenu 
  306.       "MeshList"  ]
  307.     $meshMenu configure -tearoffcommand "setMenuTitle $vg_viewName"
  308.     foreach mesh $vgMeshList($vg_viewName) {
  309. $meshMenu add command -label $mesh
  310.     }
  311.     $m add separator
  312.     
  313.     $m add command -label "Delete Context" 
  314. -command "vg_deleteContext $vg_viewName"
  315.     $m add command -label "Update Context" 
  316. -command "vg_SaveCurrentState $vg_viewName"
  317. }
  318. proc vg_deleteContext {name} {
  319.     global vgRestoreCamera
  320.     global vgCurrentContext 
  321.     # Remove context from vgRestoreCamera (so we think its gone)
  322.     unset vgRestoreCamera($name)
  323.     if [winfo exists .visgroups] {
  324. # Delete menu
  325. destroy .visgroups.vMenus.x$name
  326. # Rebuild UI list - since I dont know how to delete this one
  327. .visgroups.lb.viewnames delete 0 end
  328. foreach view [array names vgRestoreCamera] {
  329.     if {$view != "default"} {
  330. .visgroups.lb.viewnames insert end $view
  331.     }
  332. }
  333.     }
  334.     # If this was the current context, set no current
  335.     if {"$name" == "$vgCurrentContext" } {
  336. set vgCurrentContext ""
  337.     }
  338. }
  339. proc vg_updateMeshListMenu {context} {
  340.     vg_globalVars
  341.     set m .visgroups.vMenus.x$context.meshMenu
  342.    # puts "Checking existant"
  343.     if {![winfo exists $m]} return;
  344.    # puts "Finxing menu"
  345.     # Clear old menu
  346.     $m delete 0 end
  347.     # Build new menu
  348.     foreach mesh $vgMeshList($context) {
  349. $m add command -label $mesh
  350.     }
  351. }
  352. proc vg_SaveCurrentState {name} {
  353.     global vgRestoreCamera
  354.     global vgRestoreMeshList
  355.     global vgCamera
  356.     global vgMeshList
  357.     global vg_viewName
  358.     vg_globalVars
  359.     set vgCamera($name) [plv_positioncamera]
  360.     set vgMeshList($name) [getVisibleMeshes]
  361.     set vgMeshResolutions($name) [vg_buildMeshResList [getVisibleMeshes]]
  362.    # puts $vgMeshResolutions($name)
  363.     vg_updateMeshListMenu $name
  364. }
  365. proc vg_buildMeshResList {meshes} {
  366.     set retstr ""
  367.     puts $meshes
  368.     foreach mesh $meshes {
  369. lappend retstr "$mesh [plv_getcurrentres $mesh]"
  370.     }
  371.     
  372.     return $retstr
  373. }
  374. proc vg_setRestoreScanOnly {name} {
  375.     globalset vgRestoreCamera($name) 0
  376.     globalset vgRestoreMeshResolutions($name) 0
  377. }
  378. proc vg_RestoreState {name} {
  379.     global vgRestoreCamera
  380.     global vgRestoreMeshList
  381.     global vgCamera
  382.     global vgMeshList
  383.     global vgMeshMod
  384.     global vgrs_toggle
  385.     global vgCurrentContext
  386.     global vgAutoUpdate
  387.     vg_globalVars
  388.     # Check for empty
  389.     if {$name == ""} return
  390.     # Auto update old context?
  391.     if {$vgCurrentContext != ""} {
  392. if {$vgAutoUpdate($vgCurrentContext) == 1} {
  393.     vg_SaveCurrentState $vgCurrentContext
  394. }
  395.     }
  396.     # Set new context
  397.     set vgCurrentContext $name
  398.     redraw block
  399.     # Restore new context
  400.     if {![info exist vgrs_toggle]} {set vgrs_toggle 0}
  401.     # read camera pos into temp variable
  402.     set camerapos $vgCamera($name)
  403.     # because if we're switching to PREVIOUS, it will change when we
  404.     # mess with the mesh list
  405.     if {$vgRestoreMeshList($name) == 1} {
  406. if {$vgMeshMod($name) == "exact"} {
  407.     eval showOnlyMesh $vgMeshList($name)
  408. } elseif {$vgMeshMod($name) == "hide"} {
  409.     eval hideMesh $vgMeshList($name)
  410. } elseif {$vgMeshMod($name) == "show"} {
  411.     eval showMesh $vgMeshList($name)
  412. } elseif {$vgMeshMod($name) == "toggle"} {
  413.     if {$vgrs_toggle == 1} {
  414. eval showMesh $vgMeshList($name)
  415.     } else {
  416. eval hideMesh $vgMeshList($name)
  417.     }
  418.     set vgrs_toggle [expr 1 - $vgrs_toggle]
  419. }
  420.     }
  421.     if {$vgRestoreMeshResolutions($name) == 1} {
  422. foreach pair $vgMeshResolutions($name) {
  423.     eval "setMeshResolution $pair"
  424. }
  425.     }
  426.     if {$vgRestoreCamera($name) == 1} {
  427. eval plv_positioncamera $camerapos
  428.     }
  429.     # Redraw
  430.     redraw flush
  431. }
  432. proc vg_pickScanContextHelper {mesh state} {
  433.     global vgRestoreCamera
  434.     global vgMeshList
  435.     # If shift key isn't down just set the context to 
  436.     # be the selected scan
  437.     # if shift key down append to the list
  438.     # Mesh is the picked mesh
  439.     # state is the modifier state from the event.
  440.     # 1= shift key down
  441.     # Make sure we have the desired context
  442.     if {![info exists vgRestoreCamera(PICK_SCAN)]} {
  443. vg_CreateView PICK_SCAN
  444. puts "creating PICKSCAN"
  445.     }
  446.     # Add to context
  447.     if {$state == 1} {
  448. # shift key down, append
  449. if {[lsearch -exact $vgMeshList(PICK_SCAN) $mesh]== -1} {
  450. lappend vgMeshList(PICK_SCAN) $mesh
  451. }
  452.     } elseif {$state == 0} {
  453. # set scan
  454. globalset vgMeshList(PICK_SCAN) $mesh
  455.     } else {
  456. puts "bad staet"
  457. return
  458.     }
  459.     # Update the meshList menu option
  460.     vg_updateMeshListMenu PICK_SCAN
  461.     # Make sure its set to only restore scan
  462.     vg_setRestoreScanOnly PICK_SCAN
  463. }