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

3D图形编程

开发平台:

Visual C++

  1. # To load up a saved group, for example, you need to be able to 
  2. # create by name. 
  3. proc group_createNamedGroup {name members {dirty 1}} {
  4.     global theMesh
  5.     
  6.     set oldtheMesh $theMesh
  7.     #subsequent commands change theMesh which messes up the foreach loop
  8.     
  9.     # check for any meshes that have already been loaded in
  10.     # as part of another group - thus if any of the meshes
  11.     # in $members are roots then they are legit i.e. there is
  12.     # no problem - otherwise return without creating the group.
  13.     set legitscans [plv_listscans root]
  14.     set offenders ""
  15.     set newmembers ""
  16.     set i 0
  17.      while { $i < [llength $members] } {
  18.   set member [lindex $members $i]
  19. set loaded [lsearch -exact $legitscans $member]
  20. if { $loaded == -1 } {
  21.     lappend offenders $member
  22. } else {
  23.     lappend newmembers $member
  24. }
  25. incr i
  26.     }
  27.     set members $newmembers
  28.    
  29.     if { $offenders != "" } {
  30. tk_messageBox -title Scanalyze -icon 
  31.     error -message "At least of the meshes you tried to group as 
  32.                      [file tail $name] 
  33.                      is already part of another group. The offenders were 
  34.                      $offenders. [file tail $name] was not created." 
  35.     -type ok 
  36. puts "Offenders are $offenders"
  37. return
  38.     }
  39.     removeMeshFromWindow $members
  40.     set group [eval plv_groupscans create [append name ".gp"] $members $dirty]
  41.     addMeshToWindow $group $members
  42.     # fix selection
  43.     foreach member $members {
  44. if {$member == $oldtheMesh} {
  45.     globalset theMesh $group
  46. }
  47.     }
  48. }
  49. proc group_createFromVis {} {
  50.     global theMesh
  51.     
  52.     set members [getVisibleMeshes]
  53.     if {$members == ""} {
  54. tk_messageBox -title Scanalyze -icon 
  55.     error -message "Please make the meshes you wish to group visible." 
  56.     -type ok 
  57. puts $members
  58. return
  59.     }
  60.     set oldtheMesh $theMesh
  61.     #subsequent commands change theMesh which messes up the foreach loop
  62.     removeMeshFromWindow $members
  63.     set name [plv_getNextAvailGroupName]
  64.     set group [eval plv_groupscans create [append name ".gp"]  $members 1]
  65.     addMeshToWindow $group
  66.     
  67.     # fix selection
  68.     
  69.     foreach member $members {
  70. if {$member == $oldtheMesh} {
  71.     globalset theMesh $group
  72. }
  73.     }
  74.     redraw safeflush
  75. }
  76. proc group_createNamedFromVis {} {
  77.     global theMesh
  78.     
  79.     set members [getVisibleMeshes]
  80.     if {$members == ""} {
  81. tk_messageBox -title Scanalyze -icon 
  82.     error -message "Please make the meshes you wish to group visible." 
  83.     -type ok 
  84. puts $members
  85. return
  86.     }
  87.     
  88.     # setting up the dialog box that allows you to choose the group name
  89.     set name [plv_getNextAvailGroupName]
  90.     toplevel .g
  91.     frame .g.group
  92.     frame .g.but
  93.     label .g.group.label -text "Enter group name: " 
  94.     entry .g.group.ent -width 36 -textvariable name
  95.     .g.group.ent delete 0 end
  96.     .g.group.ent insert 0 $name
  97.     .g.group.ent selection range 0 end
  98.     button .g.but.ok -text Ok 
  99. -command { trytomakegroup [.g.group.ent get] .g [getVisibleMeshes] }
  100.     button .g.but.cancel -text Cancel -command "destroy .g"
  101.     
  102.     
  103.     wm title .g "Create group..."
  104.     wm transient .g .
  105.     # the transient call registers the dialog box with the top level
  106.     # window of the application 
  107.     pack .g.group.label .g.group.ent -side left 
  108.     pack .g.but.ok .g.but.cancel -side left
  109.     pack .g.group .g.but -side top -padx 5 -pady 5
  110.     
  111.     bind .g.group.ent <Key-Return> {
  112. trytomakegroup $name .g [getVisibleMeshes]
  113.     }
  114.     grab set .g
  115.     focus .g.group.ent
  116.     tkwait window .g
  117. }
  118. # This procedure destroys dialog, and creates a group called name with
  119. # members meshlist. 
  120. proc trytomakegroup { name dialog meshlist } {
  121.     if {$name == ""} {
  122. tk_messageBox -title Scanalyze -icon error -type ok 
  123. -message "No name specified - try again."
  124.     } else {
  125. destroy $dialog
  126. group_createNamedGroup $name $meshlist 1
  127. redraw flush
  128.     }
  129. }
  130.   
  131. proc group_breakGroup {group} {
  132.     global theMesh
  133.     global meshVisible
  134.     
  135.     set oldtheMesh $theMesh
  136.     #subsequent commands change theMesh which messes up the foreach loop
  137.     redraw block
  138.     set vis $meshVisible($group)
  139.     set members [plv_groupscans break $group]
  140.     
  141.     removeMeshFromWindow $group
  142.     foreach member $members {
  143. addMeshToWindow $member
  144. changeVis $member $vis
  145.     }
  146.     
  147.     # fix selection
  148.     if {$oldtheMesh == $group} {
  149. globalset theMesh [lindex $members 0]
  150.     }
  151.     plv_pickscan init
  152.     updateFromAndToMeshNames
  153.     redraw flush
  154. }
  155. # assumes that theMesh is currently set to a group - otherwise pops up a dialog
  156. proc group_saveCurrentGroup {} {
  157.     global theMesh
  158.     set members [plv_groupscans list $theMesh]
  159.     if {$members == ""} {
  160. tk_messageBox -message "The group "$theMesh" does not 
  161.         have any members - perhaps it's not a group after all?" -type ok 
  162. return
  163.     }
  164.     group_recursiveSave $theMesh $members [pwd]
  165. }
  166. proc group_saveCurrentGroupToDir {} {
  167.     global theMesh
  168.     set members [plv_groupscans list $theMesh]
  169.     if {$members == ""} {
  170. tk_messageBox -message "The group "$theMesh" does not 
  171.         have any members - perhaps it's not a group after all?" -type ok 
  172. return
  173.     }
  174.     set dir [tk_chooseDir -title "Choose directory to save group to"]
  175.     
  176.     if { $dir != "" } {
  177. if {![file exists $dir]} {
  178.     file mkdir $dir
  179. }
  180.     }
  181.     group_recursiveSave $theMesh $members $dir
  182. }
  183. proc group_recursiveSave {group meshes dir} {
  184.     set name ""
  185.         
  186.     foreach mesh $meshes {
  187. set children [plv_groupscans list $mesh]
  188. if { $children != "" } {
  189.     group_recursiveSave $mesh $children $dir
  190. }
  191.     }
  192.     set head [file join $dir $group]
  193.     plv_saveCurrentGroup $group [append head ".gp"]
  194. }
  195.     
  196. proc group_expandGroup {group} {
  197.     # BUGBUG -- expansion doesn't currently work with the canvas
  198.     tk_messageBox -message "Group expansion will be working soon."
  199.     # Print out contents of group  to see what is in the group, 
  200.     # though normal expansion doesn't work. -seander
  201.     
  202.     #set members [plv_groupscans list $group]
  203.     #puts stderr "nMesh $group: " nonewline
  204.     #foreach member $members {
  205. #puts stderr "$member " nonewline
  206.     #}
  207.     #puts stderr ""
  208.     return
  209.     
  210.     global meshFrame
  211.     set groupFrame $meshFrame($group)
  212.     set title [frame $groupFrame.title2]
  213.     set widget [label $title.expand -text -]
  214.     bind $widget <ButtonPress-1> "group_contractGroup $group $groupFrame"
  215.     label $title.l -text $group
  216.     pack $widget $title.l -side left
  217.     pack $title -side top -fill x -anchor w
  218.     pack forget $groupFrame.title
  219.     
  220.     set members [plv_groupscans expand $group]
  221.     set i 0
  222.     foreach member $members {
  223. set fr $groupFrame.g$i
  224. buildUI_privAddMeshAsFrame $member $fr
  225. buildUI_privChangeMeshActive $member 1 $fr
  226. pack $fr -side top -fill x -expand 1 -anchor e
  227. incr i
  228.     }
  229.     if {[globalset theMesh] == $group} {
  230. globalset theMesh [lindex $members 0]
  231.     }
  232.     buildUI_privChangeMeshActive $group 0
  233.     resizeMCscrollbar
  234. }
  235. proc group_contractGroup {group groupFrame} {
  236.     global meshFrame
  237.     destroy $groupFrame.title2
  238.     pack $groupFrame.title -fill both -expand 1
  239.     
  240.      set i 0
  241.      set activateGroup 0
  242.      while {[winfo exists $groupFrame.g$i]} {
  243.      set member [lindex [$groupFrame.g$i.title.label config -text] 4]
  244. incr i
  245.       lappend members $member
  246.   if {[globalset theMesh] == $member} {
  247.       set activateGroup 1
  248.   }
  249.     }
  250.     
  251.     
  252.     #eval plv_groupscans contract $group $members
  253.     if {$activateGroup} {
  254. globalset theMesh $group
  255.     }
  256.     foreach member $members {
  257. buildUI_dummyPrivChangeMeshActive $member 0
  258.     }
  259.     buildUI_privChangeMeshActive $group 1 $groupFrame
  260.     puts "Members array is $members"
  261.     
  262.     resizeMCscrollbar
  263. }