-- Trooper Group Manager -- V 0.1 Release -- V 0.2 Groups are only listed if the list button is pressed to avoid long processing time in heavy scenes with more than a thousand groups. -- V 0.3 Objects can be grouped even if they are in different groups. Objects can be attached to groups: select objects and then the target group. ( local groupObjectsArray = #() local phPosition = [0,0,0] local phSize = 10 local groupTag = "_G" local groupTagHelper = "_Group" local groupTagHelperPattern = "*_Group*" local listGroups = false local selectedObjs try(cui.UnRegisterDialogBar groupManagerRollout)catch() if groupManagerRollout != undefined then ( destroyDialog groupManagerRollout) fn updateGroupObjectsArray = ( if listGroups == true then ( groupObjectsArray = for obj in objects where isGroupHead obj collect obj ) else ( free groupObjectsArray ) ) fn updateCustomGroupObjectsArray = ( groupObjectsArray = for obj in objects where matchPattern obj.name pattern:groupTagHelperPattern collect obj ) fn refreshListBox = ( if listGroups == true then ( groupManagerRollout.lb.items = for obj in groupObjectsArray collect obj.name ) else ( free groupManagerRollout.lb.items groupManagerRollout.lb.items = groupObjectsArray ) ) fn selectGroupObject index = ( if index > 0 do ( select groupObjectsArray[index] groupS = groupObjectsArray[index] select groupS.children ) ) fn focusGroupObject index = ( if index > 0 do ( max zoomext sel ) ) fn toggleGroup index = ( if index > 0 do ( if isGroupMember groupObjectsArray[index] then groupOpen groupObjectsArray[index] else groupClose groupObjectsArray[index] ) ) fn refreshGroupListBasedOnToggle = ( if groupManagerRollout.chk_toggle_group_type.checked then ( updateCustomGroupObjectsArray() ) else ( updateGroupObjectsArray() ) refreshListBox() ) fn onGroupCreated = ( if listGroups == true do ( updateGroupObjectsArray() refreshListBox() ) ) fn checkIfGrouped = ( selectedObjs = selection as array for obj in selectedObjs do ( if obj.parent != undefined do ( if (isGroupHead obj.parent) and (classOf obj != ObjectSet) do ( detachNodesFromGroup obj ) ) ) select selectedObjs ) fn createGroupLocal = ( undo on( checkIfGrouped() if selectedObjs.count > 0 then ( firstObj = selectedObjs[1] firstObjMatrix = firstObj.transform tempDummy = Dummy name:(firstObj.name + "_group_dummy") dummyGroup = group tempDummy name:(firstObj.name + groupTag) dummyGroup.transform = firstObjMatrix attachNodesToGroup selectedObjs dummyGroup delete tempDummy select dummyGroup ) else ( print "select at least one object" ) ) ) fn createPointHelperAtFirstObject = ( undo on( selectedObjs = selection as array if selectedObjs.count > 0 then ( firstObj = selectedObjs[1] firstObjMatrix = firstObj.transform pointHelper = Point name:(firstObj.name + groupTagHelper) pointHelper.transform = firstObjMatrix select pointHelper selectedObjs.parent = pointHelper ) else ( print "select at least one object" ) ) ) fn createPointHelperAtPosition position size = ( ph = Point() ph.position = position ph.size = size ph.name = (selection[1].name + groupTagHelper) return ph ) fn attachObjectsToGroup selectedObjs = ( local destinationGroup local sourceGroup if selectedObjs.count > 1 then ( destinationGroup = selectedObjs[selectedObjs.count] if isGroupHead destinationGroup do ( setGroupOpen destinationGroup true ) deleteItem selectedObjs selectedObjs.count for obj in selectedObjs do ( obj.parent = undefined obj.parent = destinationGroup ) ) ) callbacks.addScript #sceneNodeAdded onGroupCreated id:#groupCreationCallback callbacks.addScript #nodePostDelete onGroupCreated id:#groupCreationCallback -- callbacks.addScript #groupChanged onGroupCreated id:#groupCreationCallback rollout groupManagerRollout "Group Manager" width:144 height:600 ( button 'btnFloat' "F" pos:[104,8] width:16 height:14 toolTip:"Float Dialog" align:#left button 'btnDockLeft' "<" pos:[86,8] width:16 height:14 toolTip:"Dock Left" align:#left button 'btnDockRight' ">" pos:[121,8] width:16 height:14 toolTip:"Dock Right" align:#left checkbutton 'btnUpdateToggle' "List" pos:[50,8]width:32 height:14 align:#left toolTip:"List" listbox 'lb' "Groups" pos:[10,10] width:124 height:25 align:#left checkbutton 'chk_toggle_group_type' "Show '_Group' Objects" pos:[8,368] width:128 height:21 align:#left toolTip:"Toggle between showing groups and helper groups" button 'btnGroupLoc' "Group (Loc)" pos:[8,400] width:82 height:24 align:#left toolTip:"Create a group based on the selection,with first selected object's local transformation" button 'btnGroup' "Group (World)" pos:[8,424] width:82 height:24 align:#left toolTip:"Create a group from selection" button 'btnUngroup' "Ungroup" pos:[92,400] width:44 height:48 align:#left toolTip:"Ungroup selected group" button 'btnPointHelperLoc' "Helper Group (Loc)" pos:[8,456] width:128 height:24 align:#left toolTip:"Create a parent helper based on the first selected object's local transformation, tagged _group" button 'btnPointHelperWorld' "Helper Group (World)" pos:[8,480] width:128 height:24 align:#left toolTip:"Create a parent helper, tagged _group" button 'chkToggleGroup' "Toggle Group Open/Close" pos:[8,520] width:128 height:24 align:#left toolTip:"Toggle group open/closed" button 'btnAttach' "Attach" pos:[8,546] width:63 height:24 align:#left toolTip:"Object selection is attached to the last selected Group" button 'btnDetach' "Detach" pos:[73,546] width:63 height:24 align:#left toolTip:"Detach selection from Group" on btnFloat pressed do ( try(cui.UnRegisterDialogBar groupManagerRollout) catch() createDialog groupManagerRollout SetDialogSize groupManagerRollout [144,600] ) on btnDockLeft pressed do ( try(cui.UnRegisterDialogBar groupManagerRollout) catch() createDialog groupManagerRollout cui.RegisterDialogBar groupManagerRollout cui.DockDialogBar groupManagerRollout #cui_dock_left ) on btnDockRight pressed do ( try(cui.UnRegisterDialogBar groupManagerRollout) catch() createDialog groupManagerRollout cui.RegisterDialogBar groupManagerRollout cui.DockDialogBar groupManagerRollout #cui_dock_right ) on groupManagerRollout open do ( free groupObjectsArray ) on groupManagerRollout resized val do ( lb.height = val.y-266 chk_toggle_group_type.pos.y = val.y-232 btnGroupLoc.pos.y = val.y-200 btnGroup.pos.y = val.y-176 btnUngroup.pos.y = val.y-200 btnPointHelperLoc.pos.y = val.y-144 btnPointHelperWorld.pos.y = val.y-120 chkToggleGroup.pos.y = val.y-80 btnAttach.pos.y = val.y-50 btnDetach.pos.y = val.y-50 ) on lb selected item do ( selectGroupObject item ) on lb doubleClicked item do ( focusGroupObject item ) on lb rightClicked item do ( toggleGroup item ) on chk_toggle_group_type changed state do ( refreshGroupListBasedOnToggle() ) on btnGroupLoc pressed do ( createGroupLocal() ) on btnPointHelperWorld pressed do ( selectionArray = selection as array if selectionArray.count > 0 then ( undo on( phPosition = selectionArray[1].position newPointHelper = createPointHelperAtPosition phPosition phSize for obj in selectionArray do ( obj.parent = newPointHelper ) select newPointHelper ) ) else ( print "No objects selected" ) ) on btnPointHelperLoc pressed do ( createPointHelperAtFirstObject() ) on btnUpdateToggle changed stateA do ( if stateA == true do listGroups = true if stateA == false do listGroups = false updateGroupObjectsArray() refreshListBox() ) on chkToggleGroup pressed do ( if selection.count > 0 and (classOf selection[1].parent == Dummy) then ( if isOpenGroupHead selection[1].parent then ( setGroupOpen selection[1].parent false select selection[1] ) else if isGroupHead selection[1].parent then ( setGroupOpen selection[1].parent true select selection[1] ) ) else ( print "No group selected" ) if selection.count > 0 and (classOf selection[1] == Dummy) do ( if isGroupHead selection[1] do ( setGroupOpen selection[1] false select selection[1] ) ) ) on btnGroup pressed do ( undo on( if selection.count > 0 then ( checkIfGrouped() group selection name:(selection[1].name + groupTag) select selection[1].parent ) else ( print "No objects selected" ) ) ) on btnUngroup pressed do ( max group ungroup ) on btnAttach pressed do ( selectedObjs = selection as array if selectedObjs.count > 0 do ( attachObjectsToGroup selectedObjs ) ) on btnDetach pressed do ( selectedObjs = selection as array if selectedObjs.count > 0 do ( detachNodesFromGroup selectedObjs ) ) ) createDialog groupManagerRollout style:#(#style_resizing,#style_titleba,#style_toolwindow,#style_sysmenu)lockHeight:false lockWidth:true SetDialogPos groupManagerRollout [1740,190] )