Revision: 54444
          http://brlcad.svn.sourceforge.net/brlcad/?rev=54444&view=rev
Author:   r_weiss
Date:     2013-02-20 19:51:08 +0000 (Wed, 20 Feb 2013)
Log Message:
-----------
Update to mged grouper command (i.e. gr). Added a "-p" option to collect the 
parent of the selected primitives, instead of the primitives.

Modified Paths:
--------------
    brlcad/trunk/src/tclscripts/mged/grouper.tcl

Modified: brlcad/trunk/src/tclscripts/mged/grouper.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/mged/grouper.tcl        2013-02-20 16:10:43 UTC 
(rev 54443)
+++ brlcad/trunk/src/tclscripts/mged/grouper.tcl        2013-02-20 19:51:08 UTC 
(rev 54444)
@@ -30,9 +30,19 @@
 # section box. To start grouper use the command 'grouper' or 'gr' and
 # to finish use 'done_grouper' or 'dg'. The center mouse button is used
 # to create the selection box. Primitives in the group will be
-# displayed in yellow.
+# displayed in yellow. The '-p' places the primitive parent in the group
+# instead of the primitive. With the '-p' option, if the primitive does
+# not have a parent (i.e. is in the root) it will be ignored.
 #
 
+
+namespace eval grouper_v2 {
+
+namespace export gr
+namespace export grouper
+namespace export dg
+namespace export done_grouper
+
 set GroupNameGlobal ""
 set GrouperRunning 0
 set draw_orig ""
@@ -43,10 +53,11 @@
 set listen_orig ""
 set objs {}
 set erase_status ""
+set parent_only 0
 
 proc gr_remdup { GroupName } {
 
-    set ItemList [search $GroupName]
+    set ItemList [search $GroupName -maxdepth 1]
     set ItemList [lrange $ItemList 1 end]
 
     set ItemList [lsort -unique $ItemList]
@@ -69,6 +80,10 @@
 
 
 proc gr_getObjInRectangle {} {
+
+    variable parent_only
+    set objs2 {}
+
     set size [dm size]
     set sizeX [lindex $size 0].0
     set sizeY [lindex $size 1].0
@@ -104,29 +119,93 @@
        return "no_result"
     }
 
-    foreach obj $objs {
-       set obj2 [file tail $obj]
-       lappend objs2 $obj2
-       unset obj2
+    if { $parent_only != 1 } {
+       foreach obj $objs {
+           set obj2 [file tail $obj]
+           lappend objs2 $obj2
+       }
+    } else {
+       foreach obj $objs {
+           set obj2 [file tail [file dirname $obj]]
+           # skip objects with no parent
+           if { $obj2 != "" } {
+               lappend objs2 $obj2
+           } 
+       }
     }
 
+    if { $objs2 == {} } {
+       return "no_result"
+    }
+
     return $objs2
 }
 
 
-proc gr { GroupName Boolean { ListLimit 0 } } {
-    grouper $GroupName $Boolean $ListLimit
+proc gr { args } {
+    grouper $args
 }
 
 
-proc grouper { GroupName Boolean { ListLimit 0 } } {
+proc grouper { args } {
+
     global mged_gui mged_default mged_players
-    global GrouperRunning
 
+    variable GrouperRunning
+    variable parent_only
+    variable draw_orig
+    variable pos_orig
+    variable dim_orig
+    variable fb_orig
+    variable fb_all_orig
+    variable listen_orig
+
+    set GroupName ""
+    set Boolean ""
+    set ListLimit 0
+    set parent_only 0
+    set usage_msg "Usage: {GroupName} {+|-} \[ListLimit\] \[-p\]"
+
     if {$GrouperRunning == 1} {
        return "Grouper already running, use the 'dg' command to exit grouper 
before restarting."
     }
 
+    set args [join $args]
+    set args_cnt [llength $args]
+
+    if { $args_cnt < 2 || $args_cnt > 4 } {
+       puts stdout "$usage_msg"
+       return
+    }
+
+    set listlimit_flag_cnt 0
+    set boolean_flag_cnt 0
+    set groupname_flag_cnt 0
+    set invalid_flag_cnt 0
+
+    foreach arg $args {
+       if { $arg == "-p" } {
+           set parent_only 1
+       } elseif { [string is integer $arg] && $arg > 0 } {
+           incr listlimit_flag_cnt
+           set ListLimit $arg
+       } elseif { ($arg == "+" || $arg == "-") && ($arg != $Boolean) } {
+           incr boolean_flag_cnt
+           set Boolean $arg
+       } elseif { ([string index $arg 0] != "-") && ![string is integer $arg] 
} {
+           incr groupname_flag_cnt
+           set GroupName $arg
+       } else {
+           puts stdout "Invalid parameter: \"$arg\""
+           incr invalid_flag_cnt
+       }
+    }
+
+    if { $groupname_flag_cnt != 1 || $boolean_flag_cnt != 1 || 
$listlimit_flag_cnt > 1 || $invalid_flag_cnt != 0} {
+       puts stdout "$usage_msg"
+       return
+    }
+
     set GrouperRunning 1
 
     for {set i 0} {1} {incr i} {
@@ -136,16 +215,12 @@
        }
     }
 
-    if {$Boolean != "+" && $Boolean != "-" } {
-       set GrouperRunning 0
-       return "Please provide a Boolean of either + or -"
-    }
-    uplevel #0 {set draw_orig [rset r draw]}
-    uplevel #0 {set pos_orig [rset r pos]}
-    uplevel #0 {set dim_orig [rset r dim]}
-    uplevel #0 {set fb_orig [rset var fb]}
-    uplevel #0 {set fb_all_orig [rset var fb_all]}
-    uplevel #0 {set listen_orig [rset var listen]}
+    set draw_orig [rset r draw]
+    set pos_orig [rset r pos]
+    set dim_orig [rset r dim]
+    set fb_orig [rset var fb]
+    set fb_all_orig [rset var fb_all]
+    set listen_orig [rset var listen]
 
     set mged_gui($id,mouse_behavior) p
     set_mouse_behavior $id
@@ -153,7 +228,7 @@
     rset vars fb 0
     rset r draw 1
 
-    bind $mged_gui($id,active_dm) <ButtonRelease-2> " winset 
$mged_gui($id,active_dm); dm idle; do_grouper $GroupName $Boolean $ListLimit"
+    bind $mged_gui($id,active_dm) <ButtonRelease-2> " winset 
$mged_gui($id,active_dm); dm idle; ::grouper_v2::do_grouper $GroupName $Boolean 
$ListLimit"
     bind $mged_gui($id,active_dm) <Control-ButtonRelease-2> " winset 
$mged_gui($id,active_dm); dm idle; done_grouper"
 
     # highlight in yellow current group
@@ -165,20 +240,27 @@
 
 proc do_grouper { GroupName Boolean ListLimit } {
 
-    uplevel #0 set GroupNameGlobal $GroupName
-    global objs
-    global erase_status
+    variable objs
+    variable GroupNameGlobal
 
+    set GroupNameGlobal $GroupName
+
     # Temporarily erase group from display while getting objects in rectangle"
-    after 1 {if { [search -name $GroupNameGlobal] != "" } { set erase_status 
[erase $GroupNameGlobal] } else { set erase_status 1 }}
+    after 1 {
+       if { [search -name $::grouper_v2::GroupNameGlobal] != "" } {
+           set ::grouper_v2::erase_status [erase 
$::grouper_v2::GroupNameGlobal]
+       } else {
+           set ::grouper_v2::erase_status 1
+       } 
+    }
 
     # Wait for the group to be erased from the display before we continue
-    vwait erase_status
+    vwait ::grouper_v2::erase_status
 
-    after 1 {set objs [gr_getObjInRectangle]}
+    after 1 {set ::grouper_v2::objs [::grouper_v2::gr_getObjInRectangle]}
 
     puts stdout "Selection running ..."
-    vwait objs
+    vwait ::grouper_v2::objs
 
     if { $objs == "invalid_selection" } {
        puts stdout "Invalid selection (zero area selection box)."
@@ -205,7 +287,7 @@
        set grp_obj_list_before ""
        set grp_obj_list_len_before 0
     } else {
-       set grp_obj_list_before [search $GroupName]
+       set grp_obj_list_before [search $GroupName -maxdepth 1]
        set grp_obj_list_len_before [expr [llength $grp_obj_list_before] - 1]
     }
 
@@ -227,10 +309,11 @@
        set grp_obj_list_after ""
        set grp_obj_list_len_after 0
     } else {
-       set grp_obj_list_after [search $GroupName]
+       set grp_obj_list_after [search $GroupName -maxdepth 1]
        set grp_obj_list_len_after [expr [llength $grp_obj_list_after] - 1]
     }
 
+
     if { $grp_obj_list_len_after > $grp_obj_list_len_before } {
        set objcnt_chng [expr $grp_obj_list_len_after - 
$grp_obj_list_len_before]
        puts stdout "$objcnt_chng of $tot_obj_in_rect selected objects added to 
group '$GroupName'."
@@ -284,21 +367,22 @@
 
 
 proc done_grouper {} {
+
     global mged_gui mged_default mged_players
-    global GroupNameGlobal
-    global GrouperRunning
-    global draw_orig
-    global pos_orig
-    global dim_orig
-    global fb_orig
-    global fb_all_orig
-    global listen_orig
 
+    variable GroupNameGlobal
+    variable GrouperRunning
+    variable draw_orig
+    variable pos_orig
+    variable dim_orig
+    variable fb_orig
+    variable fb_all_orig
+    variable listen_orig
+
     if {$GrouperRunning != 1} {
        return "Grouper not running."
     }
 
-
     for {set i 0} {1} {incr i} {
        set id [subst $mged_default(id)]_$i
        if { [lsearch -exact $mged_players $id] != -1 } {
@@ -313,7 +397,9 @@
     bind $mged_gui($id,active_dm) <ButtonRelease-2> ""
 
     # remove yellow highlights from the display
-    erase $GroupNameGlobal
+    if { [search -name $GroupNameGlobal] != "" } {
+       erase $GroupNameGlobal
+    }
     set GrouperRunning 0
 
     # return display to state before grouper changed it
@@ -327,7 +413,11 @@
     puts stdout "Grouper done."
 }
 
+}
 
+namespace import ::grouper_v2::*
+
+
 # Local Variables:
 # mode: Tcl
 # tab-width: 8

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to