示例#1
0
class snapMarkingMenu(BaseMelWindow):
    _DEFAULT_MENU_PARENT = 'viewPanes'

    def __init__(self):
        """
		Initializes the pop up menu class call
		"""
        self.optionVars = []
        self.toolName = 'cgm.snapMM'
        IsClickedOptionVar = OptionVarFactory('cgmVar_IsClicked', 'int')
        mmActionOptionVar = OptionVarFactory('cgmVar_mmAction', 'int')
        surfaceSnapAimModeVar = OptionVarFactory('cgmVar_SurfaceSnapAimMode',
                                                 'int')
        UpdateRotateOrderOnTagVar = OptionVarFactory('cgmVar_TaggingUpdateRO',
                                                     'int')
        self.LocinatorUpdateObjectsBufferOptionVar = OptionVarFactory(
            'cgmVar_LocinatorUpdateObjectsBuffer', defaultValue=[''])

        self.LocinatorUpdateObjectsOptionVar = OptionVarFactory(
            'cgmVar_SnapMMUpdateMode', defaultValue=0)
        guiFactory.appendOptionVarList(
            self, self.LocinatorUpdateObjectsOptionVar.name)

        self.SnapModeOptionVar = OptionVarFactory('cgmVar_SnapMatchMode',
                                                  defaultValue=0)
        guiFactory.appendOptionVarList(self, self.SnapModeOptionVar.name)

        panel = mc.getPanel(up=True)
        sel = search.selectCheck()

        IsClickedOptionVar.set(0)
        mmActionOptionVar.set(0)

        if mc.popupMenu('cgmMM', ex=True):
            mc.deleteUI('cgmMM')

        if panel:
            if mc.control(panel, ex=True):
                mc.popupMenu('cgmMM',
                             ctl=0,
                             alt=0,
                             sh=0,
                             mm=1,
                             b=1,
                             aob=1,
                             p='viewPanes',
                             pmc=lambda *a: self.createUI('cgmMM'))

    def createUI(self, parent):
        """
		Create the UI
		"""
        def buttonAction(command):
            """
			execute a command and let the menu know not do do the default button action but just kill the ui
			"""
            killUI()
            command
            mmActionOptionVar.set(1)

        self.LocinatorUpdateObjectsBufferOptionVar = OptionVarFactory(
            'cgmVar_LocinatorUpdateObjectsBuffer', defaultValue=[''])
        IsClickedOptionVar = OptionVarFactory('cgmVar_IsClicked', 'int')
        mmActionOptionVar = OptionVarFactory('cgmVar_mmAction', 'int')

        self.SnapModeOptionVar.update(
        )  #Check if another tool has changed this setting

        sel = search.selectCheck()
        selPair = search.checkSelectionLength(2)

        IsClickedOptionVar.set(1)

        mc.menu(parent, e=True, deleteAllItems=True)
        MelMenuItem(parent,
                    en=selPair,
                    l='Point Snap',
                    c=lambda *a: buttonAction(tdToolsLib.doPointSnap()),
                    rp='NW')
        MelMenuItem(parent,
                    en=selPair,
                    l='Parent Snap',
                    c=lambda *a: buttonAction(tdToolsLib.doParentSnap()),
                    rp='N')
        MelMenuItem(parent,
                    en=selPair,
                    l='Orient Snap',
                    c=lambda *a: buttonAction(tdToolsLib.doOrientSnap()),
                    rp='NE')

        MelMenuItem(parent,
                    en=selPair,
                    l='Surface Snap',
                    c=lambda *a: buttonAction(
                        tdToolsLib.doSnapClosestPointToSurface(False)),
                    rp='W')

        if self.LocinatorUpdateObjectsOptionVar.value:
            ShowMatch = False
            if self.LocinatorUpdateObjectsBufferOptionVar.value:
                ShowMatch = True
            MelMenuItem(parent,
                        en=ShowMatch,
                        l='Buffer Snap',
                        c=lambda *a: buttonAction(
                            locinatorLib.doUpdateLoc(self, True)),
                        rp='S')
        else:
            ShowMatch = search.matchObjectCheck()
            MelMenuItem(parent,
                        en=ShowMatch,
                        l='Match Snap',
                        c=lambda *a: buttonAction(
                            locinatorLib.doUpdateSelectedObjects(self)),
                        rp='S')

        MelMenuItem(
            parent,
            en=0,
            l='Mirror',
            c=lambda *a: buttonAction(locinatorLib.doUpdateObj(self, True)),
            rp='SW')

        MelMenuItemDiv(parent)
        MelMenuItem(parent,
                    l='Loc Me',
                    c=lambda *a: buttonAction(locinatorLib.doLocMe(self)))
        MelMenuItem(parent,
                    l='Tag Loc to Object',
                    en=selPair,
                    c=lambda *a: buttonAction(locinatorLib.doTagObjects(self)))
        # Update Mode
        UpdateMenu = MelMenuItem(parent, l='Update Mode', subMenu=True)
        UpdateMenuCollection = MelRadioMenuCollection()

        if self.LocinatorUpdateObjectsOptionVar.value == 0:
            slMode = True
            bufferMode = False
        else:
            slMode = False
            bufferMode = True

        UpdateMenuCollection.createButton(
            UpdateMenu,
            l='Selected',
            c=lambda *a: self.LocinatorUpdateObjectsOptionVar.set(0),
            rb=slMode)
        UpdateMenuCollection.createButton(
            UpdateMenu,
            l='Buffer',
            c=lambda *a: self.LocinatorUpdateObjectsOptionVar.set(1),
            rb=bufferMode)
        #>>>Match Mode
        self.MatchModeOptions = ['parent', 'point', 'orient']

        self.MatchModeCollection = MelRadioMenuCollection()
        self.MatchModeCollectionChoices = []

        MatchModeMenu = MelMenuItem(parent, l='Match Mode', subMenu=True)
        self.matchMode = self.SnapModeOptionVar.value
        for c, item in enumerate(self.MatchModeOptions):
            if self.matchMode == c:
                rbValue = True
            else:
                rbValue = False
            self.MatchModeCollectionChoices.append(
                self.MatchModeCollection.createButton(
                    MatchModeMenu,
                    label=item,
                    rb=rbValue,
                    command=Callback(self.SnapModeOptionVar.set, c)))
        #>>> Define
        DefineMenu = MelMenuItem(parent, l='Buffer', subMenu=True)
        MelMenuItem(DefineMenu,
                    l="Define",
                    c=lambda *a: locinatorLib.defineObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItem(DefineMenu,
                    l="Add Selected",
                    c=lambda *a: locinatorLib.addSelectedToObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItem(DefineMenu,
                    l="Remove Selected",
                    c=lambda *a: locinatorLib.removeSelectedFromObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItemDiv(DefineMenu)
        MelMenuItem(DefineMenu,
                    l="Select Members",
                    c=lambda *a: locinatorLib.selectObjBufferMembers(
                        self.LocinatorUpdateObjectsBufferOptionVar))
        MelMenuItem(DefineMenu,
                    l="Clear",
                    c=lambda *a: locinatorLib.clearObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItemDiv(parent)
        MelMenuItem(parent,
                    l='Locinator',
                    c=lambda *a: buttonAction(cgmToolbox.loadLocinator()))
        MelMenuItem(parent,
                    l='cgm.animTools',
                    c=lambda *a: buttonAction(cgmToolbox.loadAnimTools()))
        MelMenuItem(parent,
                    l='cgm.tdTools',
                    c=lambda *a: buttonAction(cgmToolbox.loadTDTools()))
        MelMenuItem(parent,
                    l='cgm.attrTools',
                    c=lambda *a: buttonAction(cgmToolbox.loadAttrTools()))

        MelMenuItemDiv(parent)
        MelMenuItem(parent,
                    l="Reset",
                    c=lambda *a: guiFactory.resetGuiInstanceOptionVars(
                        self.optionVars))
示例#2
0
class locinatorClass(BaseMelWindow):
	from  cgm.lib import guiFactory
	guiFactory.initializeTemplates()
	USE_Template = 'cgmUITemplate'
	
	WINDOW_NAME = 'cgmLocinatorWindow'
	WINDOW_TITLE = 'cgm.locinator - %s'%__version__
	DEFAULT_SIZE = 180, 275
	DEFAULT_MENU = None
	RETAIN = True
	MIN_BUTTON = True
	MAX_BUTTON = False
	FORCE_DEFAULT_SIZE = True  #always resets the size of the window when its re-created


	def __init__(self):

		self.toolName = 'cgm.locinator'
		self.description = 'This tool makes locators based on selection types and provides ways to update those locators over time'
		self.author = 'Josh Burton'
		self.owner = 'CG Monks'
		self.website = 'www.cgmonks.com'
		self.version =  __version__ 
		self.optionVars = []

		self.currentFrameOnly = True
		self.startFrame = ''
		self.endFrame = ''
		self.startFrameField = ''
		self.endFrameField = ''
		self.forceBoundingBoxState = False
		self.forceEveryFrame = False
		self.showHelp = False
		self.helpBlurbs = []
		self.oldGenBlurbs = []

		self.showTimeSubMenu = False
		self.timeSubMenu = []
		

		#Menu
		self.setupVariables()
		self.UI_OptionsMenu = MelMenu( l='Options', pmc=self.buildOptionsMenu)
		self.UI_BufferMenu = MelMenu( l = 'Buffer', pmc=self.buildBufferMenu)
		self.UI_HelpMenu = MelMenu( l='Help', pmc=self.buildHelpMenu)
		
		self.ShowHelpOption = mc.optionVar( q='cgmVar_LocinatorShowHelp' )
		
		#Tabs
		tabs = MelTabLayout( self )
		TabBasic = MelColumnLayout(tabs)
		TabSpecial = MelColumnLayout( tabs )
		TabMatch = MelColumnLayout( tabs )
		n = 0
		for tab in 'Basic','Special','Match':
			tabs.setLabel(n,tab)
			n+=1

		self.buildBasicLayout(TabBasic)
		self.buildSpecialLayout(TabSpecial)
		self.buildMatchLayout(TabMatch)
		

		self.show()

	def setupVariables(self):
		self.LocinatorUpdateObjectsOptionVar = OptionVarFactory('cgmVar_LocinatorUpdateMode',defaultValue = 0)
		guiFactory.appendOptionVarList(self,'cgmVar_LocinatorUpdateMode')
		
		self.LocinatorUpdateObjectsBufferOptionVar = OptionVarFactory('cgmVar_LocinatorUpdateObjectsBuffer',defaultValue = [''])
		guiFactory.appendOptionVarList(self,'cgmVar_LocinatorUpdateObjectsBuffer')	
		
		self.DebugModeOptionVar = OptionVarFactory('cgmVar_LocinatorDebug',defaultValue=0)
		guiFactory.appendOptionVarList(self,self.DebugModeOptionVar.name)	
		
		self.SnapModeOptionVar = OptionVarFactory('cgmVar_SnapMatchMode',defaultValue = 0)
		guiFactory.appendOptionVarList(self,self.SnapModeOptionVar.name)		
		
		#Old method...clean up at some point
		if not mc.optionVar( ex='cgmVar_ForceBoundingBoxState' ):
			mc.optionVar( iv=('cgmVar_ForceBoundingBoxState', 0) )
		if not mc.optionVar( ex='cgmVar_LocinatorShowHelp' ):
			mc.optionVar( iv=('cgmVar_LocinatorShowHelp', 0) )
		if not mc.optionVar( ex='cgmVar_LocinatorCurrentFrameOnly' ):
			mc.optionVar( iv=('cgmVar_LocinatorCurrentFrameOnly', 0) )
			
		if not mc.optionVar( ex='cgmVar_LocinatorBakingMode' ):
			mc.optionVar( iv=('cgmVar_LocinatorBakingMode', 0) )
			
		guiFactory.appendOptionVarList(self,'cgmVar_LocinatorShowHelp')	


	#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	# Menus
	#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	def buildOptionsMenu( self, *a ):
		self.UI_OptionsMenu.clear()
		
		#>>>Match Mode
		MatchModeMenu = MelMenuItem( self.UI_OptionsMenu, l='Match Mode', subMenu=True)		
		self.MatchModeOptions = ['parent','point','orient']
		
		self.MatchModeCollection = MelRadioMenuCollection()
		self.MatchModeCollectionChoices = []
		
		self.SnapModeOptionVar.update()#Incase another tool changed			
		
		self.matchMode = self.SnapModeOptionVar.value
		for c,item in enumerate(self.MatchModeOptions):
			if self.matchMode == c:
				rbValue = True
			else:
				rbValue = False
			self.MatchModeCollectionChoices.append(self.MatchModeCollection.createButton(MatchModeMenu,label=item,
			                                                                             rb = rbValue,
			                                                                             command = Callback(self.SnapModeOptionVar.set,c)))		

		# Placement Menu
		PlacementMenu = MelMenuItem( self.UI_OptionsMenu, l='Placement', subMenu=True)
		PlacementMenuCollection = MelRadioMenuCollection()

		if mc.optionVar( q='cgmVar_ForceBoundingBoxState' ) == 0:
			cgmOption = False
			pivotOption = True
		else:
			cgmOption = True
			pivotOption = False

		PlacementMenuCollection.createButton(PlacementMenu,l='Bounding Box Center',
				                             c=lambda *a: mc.optionVar( iv=('cgmVar_ForceBoundingBoxState', 1)),
				                             rb=cgmOption )
		PlacementMenuCollection.createButton(PlacementMenu,l='Pivot',
				                             c=lambda *a: mc.optionVar( iv=('cgmVar_ForceBoundingBoxState', 0)),
				                             rb=pivotOption )
		# Tagging options
		AutoloadMenu = MelMenuItem( self.UI_OptionsMenu, l='Tagging', subMenu=True)
		if not mc.optionVar( ex='cgmVar_TaggingUpdateRO' ):
			mc.optionVar( iv=('cgmVar_TaggingUpdateRO', 1) )
		guiFactory.appendOptionVarList(self,'cgmVar_TaggingUpdateRO')	
	  
		RenameOnUpdateState = mc.optionVar( q='cgmVar_TaggingUpdateRO' )
		MelMenuItem( AutoloadMenu, l="Update Rotation Order",
	                 cb= mc.optionVar( q='cgmVar_TaggingUpdateRO' ),
	                 c= lambda *a: guiFactory.doToggleIntOptionVariable('cgmVar_TaggingUpdateRO'))
		
		# Update Mode
		UpdateMenu = MelMenuItem( self.UI_OptionsMenu, l='Update Mode', subMenu=True)
		UpdateMenuCollection = MelRadioMenuCollection()

		if self.LocinatorUpdateObjectsOptionVar.value == 0:
			slMode = True
			bufferMode = False
		else:
			slMode = False
			bufferMode = True

		UpdateMenuCollection.createButton(UpdateMenu,l='Selected',
				                             c=lambda *a: self.LocinatorUpdateObjectsOptionVar.set(0),
				                             rb=slMode )
		UpdateMenuCollection.createButton(UpdateMenu,l='Buffer',
				                             c=lambda *a:self.LocinatorUpdateObjectsOptionVar.set(1),
				                             rb=bufferMode )
		

			                    
		MelMenuItemDiv( self.UI_OptionsMenu )
		MelMenuItem( self.UI_OptionsMenu, l="Reset",
			         c=lambda *a: self.reset())	
		
	def reset(self):	
		Callback(guiFactory.resetGuiInstanceOptionVars(self.optionVars,run))
		
	def reload(self):	
		run()
		
	def buildBufferMenu( self, *a ):
		self.UI_BufferMenu.clear()
		
		MelMenuItem( self.UI_BufferMenu, l="Define",
		             c= lambda *a: locinatorLib.defineObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
		MelMenuItem( self.UI_BufferMenu, l="Add Selected",
		             c= lambda *a: locinatorLib.addSelectedToObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
		MelMenuItem( self.UI_BufferMenu, l="Remove Selected",
		             c= lambda *a: locinatorLib.removeSelectedFromObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
		MelMenuItemDiv( self.UI_BufferMenu )
		MelMenuItem( self.UI_BufferMenu, l="Select Members",
				     c= lambda *a: locinatorLib.selectObjBufferMembers(self.LocinatorUpdateObjectsBufferOptionVar))
		MelMenuItem( self.UI_BufferMenu, l="Clear",
		             c= lambda *a: locinatorLib.clearObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
	def buildHelpMenu( self, *a ):
		self.UI_HelpMenu.clear()
		MelMenuItem( self.UI_HelpMenu, l="Show Help",
				     cb=self.ShowHelpOption,
				     c= lambda *a: self.do_showHelpToggle())
		MelMenuItem( self.UI_HelpMenu, l="Print Tools Help",
				     c=lambda *a: self.printHelp() )

		MelMenuItemDiv( self.UI_HelpMenu )
		MelMenuItem( self.UI_HelpMenu, l="About",
				     c=lambda *a: self.showAbout() )
		MelMenuItem( self.UI_HelpMenu, l="Debug",
				     cb=self.DebugModeOptionVar.value,
				     c= lambda *a: self.DebugModeOptionVar.toggle())	
		
	def do_showHelpToggle( self):
		guiFactory.toggleMenuShowState(self.ShowHelpOption,self.helpBlurbs)
		mc.optionVar( iv=('cgmVar_LocinatorShowHelp', not self.ShowHelpOption))
		self.ShowHelpOption = mc.optionVar( q='cgmVar_LocinatorShowHelp' )

	def do_showTimeSubMenuToggleOn( self):
		guiFactory.toggleMenuShowState(1,self.timeSubMenu)
		mc.optionVar( iv=('cgmVar_LocinatorCurrentFrameOnly', 1))

	def do_showTimeSubMenuToggleOff( self):
		guiFactory.toggleMenuShowState(0,self.timeSubMenu)
		mc.optionVar( iv=('cgmVar_LocinatorCurrentFrameOnly', 0))


	def showAbout(self):
		window = mc.window( title="About", iconName='About', ut = 'cgmUITemplate',resizeToFitChildren=True )
		mc.columnLayout( adjustableColumn=True )
		guiFactory.header(self.toolName,overrideUpper = True)
		mc.text(label='>>>A Part of the cgmTools Collection<<<', ut = 'cgmUIInstructionsTemplate')
		guiFactory.headerBreak()
		guiFactory.lineBreak()
		descriptionBlock = guiFactory.textBlock(self.description)

		guiFactory.lineBreak()
		mc.text(label=('%s%s' %('Written by: ',self.author)))
		mc.text(label=('%s%s%s' %('Copyright ',self.owner,', 2011')))
		guiFactory.lineBreak()
		mc.text(label='Version: %s' % self.version)
		mc.text(label='')
		guiFactory.doButton('Visit Tool Webpage', 'import webbrowser;webbrowser.open(" http://www.cgmonks.com/tools/maya-tools/locinator/")')
		guiFactory.doButton('Close', 'import maya.cmds as mc;mc.deleteUI(\"' + window + '\", window=True)')
		mc.setParent( '..' )
		mc.showWindow( window )

	def printHelp(self):
		import locinatorLib
		help(locinatorLib)

	#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	# Layouts
	#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	def buildPlaceHolder(self,parent):
		self.containerName = MelColumnLayout(parent,ut='cgmUISubTemplate')
		return self.containerName
	
	def buildTimeSubMenu(self,parent):
		self.containerName = MelColumnLayout(parent,ut='cgmUISubTemplate')
		# Time Submenu
		mc.setParent(self.containerName)
		self.helpBlurbs.extend(guiFactory.instructions(" Set your time range",vis = self.ShowHelpOption))

		timelineInfo = search.returnTimelineInfo()


		# TimeInput Row
		TimeInputRow = MelHSingleStretchLayout(self.containerName,ut='cgmUISubTemplate')
		self.timeSubMenu.append( TimeInputRow )
		MelSpacer(TimeInputRow)
		MelLabel(TimeInputRow,l='start')

		self.startFrameField = MelIntField(TimeInputRow,'cgmLocWinStartFrameField',
	                                       width = 40,
	                                       value= timelineInfo['rangeStart'])
		TimeInputRow.setStretchWidget( MelSpacer(TimeInputRow) )
		MelLabel(TimeInputRow,l='end')

		self.endFrameField = MelIntField(TimeInputRow,'cgmLocWinEndFrameField',
	                                     width = 40,
	                                     value= timelineInfo['rangeEnd'])

		MelSpacer(TimeInputRow)
		TimeInputRow.layout()

		MelSeparator(self.containerName,ut = 'cgmUISubTemplate',style='none',height = 5)
		

		# Button Row
		TimeButtonRow = MelHSingleStretchLayout(self.containerName,padding = 1, ut='cgmUISubTemplate')
		MelSpacer(TimeButtonRow,w=2)
		currentRangeButton = guiFactory.doButton2(TimeButtonRow,'Current Range',
	                                              lambda *a: locinatorLib.setGUITimeRangeToCurrent(self),
	                                              'Sets the time range to the current slider range')
		TimeButtonRow.setStretchWidget( MelSpacer(TimeButtonRow,w=2) )
		sceneRangeButton = guiFactory.doButton2(TimeButtonRow,'Scene Range',
	                                            lambda *a: locinatorLib.setGUITimeRangeToScene(self),
	                                            'Sets the time range to the current slider range')
		MelSpacer(TimeButtonRow,w=2)
		
		TimeButtonRow.layout()

		
		#>>> Base Settings Flags
		self.KeyingModeCollection = MelRadioCollection()
		self.KeyingModeCollectionChoices = []		
		if not mc.optionVar( ex='cgmVar_LocinatorKeyingMode' ):
			mc.optionVar( iv=('cgmVar_LocinatorKeyingMode', 0) )
		guiFactory.appendOptionVarList(self,'cgmVar_LocinatorKeyingMode')	
			
		
		KeysSettingsFlagsRow = MelHSingleStretchLayout(self.containerName,ut='cgmUISubTemplate',padding = 2)
		MelSpacer(KeysSettingsFlagsRow,w=2)	
		KeysSettingsFlagsRow.setStretchWidget( MelLabel(KeysSettingsFlagsRow,l='Anim Option: ',align='right') )
		self.keyingOptions = ['Keys','All']
		for item in self.keyingOptions:
			cnt = self.keyingOptions.index(item)
			self.KeyingModeCollectionChoices.append(self.KeyingModeCollection.createButton(KeysSettingsFlagsRow,label=self.keyingOptions[cnt],
			                                                                               onCommand = Callback(guiFactory.toggleOptionVarState,self.keyingOptions[cnt],self.keyingOptions,'cgmVar_LocinatorKeyingMode',True)))
			MelSpacer(KeysSettingsFlagsRow,w=5)
		mc.radioCollection(self.KeyingModeCollection ,edit=True,sl= (self.KeyingModeCollectionChoices[ (mc.optionVar(q='cgmVar_LocinatorKeyingMode')) ]))
		
		KeysSettingsFlagsRow.layout()

		#>>> Base Settings Flags
		self.KeyingTargetCollection = MelRadioCollection()
		self.KeyingTargetCollectionChoices = []		
		if not mc.optionVar( ex='cgmVar_LocinatorKeyingTarget' ):
			mc.optionVar( iv=('cgmVar_LocinatorKeyingTarget', 0) )
		guiFactory.appendOptionVarList(self,'cgmVar_LocinatorKeyingTarget')	
			
		
		BakeSettingsFlagsRow = MelHSingleStretchLayout(self.containerName,ut='cgmUISubTemplate',padding = 2)
		MelSpacer(BakeSettingsFlagsRow,w=2)	
		BakeSettingsFlagsRow.setStretchWidget( MelLabel(BakeSettingsFlagsRow,l='From: ',align='right') )
		MelSpacer(BakeSettingsFlagsRow)
		self.keyTargetOptions = ['source','self']
		for item in self.keyTargetOptions:
			cnt = self.keyTargetOptions.index(item)
			self.KeyingTargetCollectionChoices.append(self.KeyingTargetCollection.createButton(BakeSettingsFlagsRow,label=self.keyTargetOptions[cnt],
		                                                                                       onCommand = Callback(guiFactory.toggleOptionVarState,self.keyTargetOptions[cnt],self.keyTargetOptions,'cgmVar_LocinatorKeyingTarget',True)))
			MelSpacer(BakeSettingsFlagsRow,w=5)
		mc.radioCollection(self.KeyingTargetCollection ,edit=True,sl= (self.KeyingTargetCollectionChoices[ (mc.optionVar(q='cgmVar_LocinatorKeyingTarget')) ]))
		
		BakeSettingsFlagsRow.layout()
		
		return self.containerName
	
	def buildBasicLayout(self,parent):
		mc.setParent(parent)
		guiFactory.header('Update')

		#>>>Time Section
		UpdateOptionRadioCollection = MelRadioCollection()
		EveryFrameOption = mc.optionVar( q='cgmVar_LocinatorBakeState' )
		mc.setParent(parent)
		guiFactory.lineSubBreak()
		
		#>>> Time Menu Container
		self.BakeModeOptionList = ['Current Frame','Bake']
		cgmVar_Name = 'cgmVar_LocinatorBakeState'
		guiFactory.appendOptionVarList(self,'cgmVar_LocinatorBakeState')	
		
		if not mc.optionVar( ex=cgmVar_Name ):
			mc.optionVar( iv=(cgmVar_Name, 0) )
		
		#build our sub section options
		self.ContainerList = []
		
		#Mode Change row 
		ModeSetRow = MelHSingleStretchLayout(parent,ut='cgmUISubTemplate')
		self.BakeModeRadioCollection = MelRadioCollection()
		self.BakeModeChoiceList = []	
		MelSpacer(ModeSetRow,w=2)

		self.BakeModeChoiceList.append(self.BakeModeRadioCollection.createButton(ModeSetRow,label=self.BakeModeOptionList[0],
	                                                                      onCommand = Callback(guiFactory.toggleModeState,self.BakeModeOptionList[0],self.BakeModeOptionList,cgmVar_Name,self.ContainerList,True)))
		
		ModeSetRow.setStretchWidget( MelSpacer(ModeSetRow) )
		
		self.BakeModeChoiceList.append(self.BakeModeRadioCollection.createButton(ModeSetRow,label=self.BakeModeOptionList[1],
	                                                                      onCommand = Callback(guiFactory.toggleModeState,self.BakeModeOptionList[1],self.BakeModeOptionList,cgmVar_Name,self.ContainerList,True)))
		
		ModeSetRow.layout()
		
		
		#>>>
		self.ContainerList.append( self.buildPlaceHolder(parent) )
		self.ContainerList.append( self.buildTimeSubMenu( parent) )
		
		mc.radioCollection(self.BakeModeRadioCollection,edit=True, sl=self.BakeModeChoiceList[mc.optionVar(q=cgmVar_Name)])
		#>>>
		
		mc.setParent(parent)

		guiFactory.doButton2(parent,'Do it!',
	                         lambda *a: locinatorLib.doUpdateLoc(self),
	                         'Update a locator at a particular frame or through a timeline')

		guiFactory.lineSubBreak()



		#>>>  Loc Me Section
		guiFactory.lineBreak()
		guiFactory.lineSubBreak()
		guiFactory.doButton2(parent,'Just Loc Selected',
			                 lambda *a: locinatorLib.doLocMe(self),
			                 'Create an updateable locator based off the selection and options')



	def buildSpecialLayout(self,parent):
		SpecialColumn = MelColumnLayout(parent)

		#>>>  Center Section
		guiFactory.lineSubBreak()
		guiFactory.doButton2(SpecialColumn,'Locate Center',
		                     lambda *a: locinatorLib.doLocCenter(self),
				             'Find the center point from a selection set')


		#>>>  Closest Point Section
		guiFactory.lineSubBreak()
		guiFactory.doButton2(SpecialColumn,'Locate Closest Point',
		                     lambda *a: locinatorLib.doLocClosest(self),
				             'Select the proximity object(s), then the object to find point on. Accepted target object types are - nurbsCurves and surfaces and poly objects')

		#>>>  Curves Section
		guiFactory.lineSubBreak()
		guiFactory.doButton2(SpecialColumn,'Loc CVs of curve',
		                     lambda *a: locinatorLib.doLocCVsOfObject(),
				             "Locs the cv's at the cv coordinates")

		guiFactory.lineSubBreak()
		guiFactory.doButton2(SpecialColumn,'Loc CVs on the curve',
		                     lambda *a: locinatorLib.doLocCVsOnObject(),
				             "Locs cv's at closest point on the curve")

		guiFactory.lineBreak()

		#>>> Update Section
		guiFactory.lineSubBreak()
		guiFactory.doButton2(SpecialColumn,'Update Selected',
		                     lambda *a: locinatorLib.doUpdateLoc(self),
				             "Only works with locators created with this tool")


	def buildMatchLayout(self,parent):

		MatchColumn = MelColumnLayout(parent)

		#>>>  Tag Section
		guiFactory.lineSubBreak()
		guiFactory.doButton2(MatchColumn,'Tag it',
		                     lambda *a: locinatorLib.doTagObjects(self),
				             "Tag the selected objects to the first locator in the selection set. After this relationship is set up, you can match objects to that locator.")


		#>>>  Purge Section
		guiFactory.lineSubBreak()
		self.helpBlurbs.extend(guiFactory.instructions("  Purge all traces of cgmThinga tools from the object",vis = self.ShowHelpOption))
		guiFactory.doButton2(MatchColumn,'Purge it',
		                     lambda *a: locinatorLib.doPurgeCGMAttrs(self),
				             "Clean it")

		guiFactory.lineBreak()

		#>>> Update Section
		guiFactory.lineSubBreak()
		guiFactory.doButton2(MatchColumn,'Update Selected',
		                     lambda *a: locinatorLib.doUpdateLoc(self),
				             "Only works with locators created with this tool")
示例#3
0
class locinatorClass(BaseMelWindow):
    from cgm.lib import guiFactory
    guiFactory.initializeTemplates()
    USE_Template = 'cgmUITemplate'

    WINDOW_NAME = 'cgmLocinatorWindow'
    WINDOW_TITLE = 'cgm.locinator - %s' % __version__
    DEFAULT_SIZE = 180, 275
    DEFAULT_MENU = None
    RETAIN = True
    MIN_BUTTON = True
    MAX_BUTTON = False
    FORCE_DEFAULT_SIZE = True  #always resets the size of the window when its re-created

    def __init__(self):

        self.toolName = 'cgm.locinator'
        self.description = 'This tool makes locators based on selection types and provides ways to update those locators over time'
        self.author = 'Josh Burton'
        self.owner = 'CG Monks'
        self.website = 'www.cgmonks.com'
        self.version = __version__
        self.optionVars = []

        self.currentFrameOnly = True
        self.startFrame = ''
        self.endFrame = ''
        self.startFrameField = ''
        self.endFrameField = ''
        self.forceBoundingBoxState = False
        self.forceEveryFrame = False
        self.showHelp = False
        self.helpBlurbs = []
        self.oldGenBlurbs = []

        self.showTimeSubMenu = False
        self.timeSubMenu = []

        #Menu
        self.setupVariables()
        self.UI_OptionsMenu = MelMenu(l='Options', pmc=self.buildOptionsMenu)
        self.UI_BufferMenu = MelMenu(l='Buffer', pmc=self.buildBufferMenu)
        self.UI_HelpMenu = MelMenu(l='Help', pmc=self.buildHelpMenu)

        self.ShowHelpOption = mc.optionVar(q='cgmVar_LocinatorShowHelp')

        #Tabs
        tabs = MelTabLayout(self)
        TabBasic = MelColumnLayout(tabs)
        TabSpecial = MelColumnLayout(tabs)
        TabMatch = MelColumnLayout(tabs)
        n = 0
        for tab in 'Basic', 'Special', 'Match':
            tabs.setLabel(n, tab)
            n += 1

        self.buildBasicLayout(TabBasic)
        self.buildSpecialLayout(TabSpecial)
        self.buildMatchLayout(TabMatch)

        self.show()

    def setupVariables(self):
        self.LocinatorUpdateObjectsOptionVar = OptionVarFactory(
            'cgmVar_LocinatorUpdateMode', defaultValue=0)
        guiFactory.appendOptionVarList(self, 'cgmVar_LocinatorUpdateMode')

        self.LocinatorUpdateObjectsBufferOptionVar = OptionVarFactory(
            'cgmVar_LocinatorUpdateObjectsBuffer', defaultValue=[''])
        guiFactory.appendOptionVarList(self,
                                       'cgmVar_LocinatorUpdateObjectsBuffer')

        self.DebugModeOptionVar = OptionVarFactory('cgmVar_LocinatorDebug',
                                                   defaultValue=0)
        guiFactory.appendOptionVarList(self, self.DebugModeOptionVar.name)

        self.SnapModeOptionVar = OptionVarFactory('cgmVar_SnapMatchMode',
                                                  defaultValue=0)
        guiFactory.appendOptionVarList(self, self.SnapModeOptionVar.name)

        #Old method...clean up at some point
        if not mc.optionVar(ex='cgmVar_ForceBoundingBoxState'):
            mc.optionVar(iv=('cgmVar_ForceBoundingBoxState', 0))
        if not mc.optionVar(ex='cgmVar_LocinatorShowHelp'):
            mc.optionVar(iv=('cgmVar_LocinatorShowHelp', 0))
        if not mc.optionVar(ex='cgmVar_LocinatorCurrentFrameOnly'):
            mc.optionVar(iv=('cgmVar_LocinatorCurrentFrameOnly', 0))

        if not mc.optionVar(ex='cgmVar_LocinatorBakingMode'):
            mc.optionVar(iv=('cgmVar_LocinatorBakingMode', 0))

        guiFactory.appendOptionVarList(self, 'cgmVar_LocinatorShowHelp')

    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    # Menus
    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    def buildOptionsMenu(self, *a):
        self.UI_OptionsMenu.clear()

        #>>>Match Mode
        MatchModeMenu = MelMenuItem(self.UI_OptionsMenu,
                                    l='Match Mode',
                                    subMenu=True)
        self.MatchModeOptions = ['parent', 'point', 'orient']

        self.MatchModeCollection = MelRadioMenuCollection()
        self.MatchModeCollectionChoices = []

        self.SnapModeOptionVar.update()  #Incase another tool changed

        self.matchMode = self.SnapModeOptionVar.value
        for c, item in enumerate(self.MatchModeOptions):
            if self.matchMode == c:
                rbValue = True
            else:
                rbValue = False
            self.MatchModeCollectionChoices.append(
                self.MatchModeCollection.createButton(
                    MatchModeMenu,
                    label=item,
                    rb=rbValue,
                    command=Callback(self.SnapModeOptionVar.set, c)))

        # Placement Menu
        PlacementMenu = MelMenuItem(self.UI_OptionsMenu,
                                    l='Placement',
                                    subMenu=True)
        PlacementMenuCollection = MelRadioMenuCollection()

        if mc.optionVar(q='cgmVar_ForceBoundingBoxState') == 0:
            cgmOption = False
            pivotOption = True
        else:
            cgmOption = True
            pivotOption = False

        PlacementMenuCollection.createButton(
            PlacementMenu,
            l='Bounding Box Center',
            c=lambda *a: mc.optionVar(iv=('cgmVar_ForceBoundingBoxState', 1)),
            rb=cgmOption)
        PlacementMenuCollection.createButton(
            PlacementMenu,
            l='Pivot',
            c=lambda *a: mc.optionVar(iv=('cgmVar_ForceBoundingBoxState', 0)),
            rb=pivotOption)
        # Tagging options
        AutoloadMenu = MelMenuItem(self.UI_OptionsMenu,
                                   l='Tagging',
                                   subMenu=True)
        if not mc.optionVar(ex='cgmVar_TaggingUpdateRO'):
            mc.optionVar(iv=('cgmVar_TaggingUpdateRO', 1))
        guiFactory.appendOptionVarList(self, 'cgmVar_TaggingUpdateRO')

        RenameOnUpdateState = mc.optionVar(q='cgmVar_TaggingUpdateRO')
        MelMenuItem(AutoloadMenu,
                    l="Update Rotation Order",
                    cb=mc.optionVar(q='cgmVar_TaggingUpdateRO'),
                    c=lambda *a: guiFactory.doToggleIntOptionVariable(
                        'cgmVar_TaggingUpdateRO'))

        # Update Mode
        UpdateMenu = MelMenuItem(self.UI_OptionsMenu,
                                 l='Update Mode',
                                 subMenu=True)
        UpdateMenuCollection = MelRadioMenuCollection()

        if self.LocinatorUpdateObjectsOptionVar.value == 0:
            slMode = True
            bufferMode = False
        else:
            slMode = False
            bufferMode = True

        UpdateMenuCollection.createButton(
            UpdateMenu,
            l='Selected',
            c=lambda *a: self.LocinatorUpdateObjectsOptionVar.set(0),
            rb=slMode)
        UpdateMenuCollection.createButton(
            UpdateMenu,
            l='Buffer',
            c=lambda *a: self.LocinatorUpdateObjectsOptionVar.set(1),
            rb=bufferMode)

        MelMenuItemDiv(self.UI_OptionsMenu)
        MelMenuItem(self.UI_OptionsMenu, l="Reset", c=lambda *a: self.reset())

    def reset(self):
        Callback(guiFactory.resetGuiInstanceOptionVars(self.optionVars, run))

    def reload(self):
        run()

    def buildBufferMenu(self, *a):
        self.UI_BufferMenu.clear()

        MelMenuItem(self.UI_BufferMenu,
                    l="Define",
                    c=lambda *a: locinatorLib.defineObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItem(self.UI_BufferMenu,
                    l="Add Selected",
                    c=lambda *a: locinatorLib.addSelectedToObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItem(self.UI_BufferMenu,
                    l="Remove Selected",
                    c=lambda *a: locinatorLib.removeSelectedFromObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

        MelMenuItemDiv(self.UI_BufferMenu)
        MelMenuItem(self.UI_BufferMenu,
                    l="Select Members",
                    c=lambda *a: locinatorLib.selectObjBufferMembers(
                        self.LocinatorUpdateObjectsBufferOptionVar))
        MelMenuItem(self.UI_BufferMenu,
                    l="Clear",
                    c=lambda *a: locinatorLib.clearObjBuffer(
                        self.LocinatorUpdateObjectsBufferOptionVar))

    def buildHelpMenu(self, *a):
        self.UI_HelpMenu.clear()
        MelMenuItem(self.UI_HelpMenu,
                    l="Show Help",
                    cb=self.ShowHelpOption,
                    c=lambda *a: self.do_showHelpToggle())
        MelMenuItem(self.UI_HelpMenu,
                    l="Print Tools Help",
                    c=lambda *a: self.printHelp())

        MelMenuItemDiv(self.UI_HelpMenu)
        MelMenuItem(self.UI_HelpMenu, l="About", c=lambda *a: self.showAbout())
        MelMenuItem(self.UI_HelpMenu,
                    l="Debug",
                    cb=self.DebugModeOptionVar.value,
                    c=lambda *a: self.DebugModeOptionVar.toggle())

    def do_showHelpToggle(self):
        guiFactory.toggleMenuShowState(self.ShowHelpOption, self.helpBlurbs)
        mc.optionVar(iv=('cgmVar_LocinatorShowHelp', not self.ShowHelpOption))
        self.ShowHelpOption = mc.optionVar(q='cgmVar_LocinatorShowHelp')

    def do_showTimeSubMenuToggleOn(self):
        guiFactory.toggleMenuShowState(1, self.timeSubMenu)
        mc.optionVar(iv=('cgmVar_LocinatorCurrentFrameOnly', 1))

    def do_showTimeSubMenuToggleOff(self):
        guiFactory.toggleMenuShowState(0, self.timeSubMenu)
        mc.optionVar(iv=('cgmVar_LocinatorCurrentFrameOnly', 0))

    def showAbout(self):
        window = mc.window(title="About",
                           iconName='About',
                           ut='cgmUITemplate',
                           resizeToFitChildren=True)
        mc.columnLayout(adjustableColumn=True)
        guiFactory.header(self.toolName, overrideUpper=True)
        mc.text(label='>>>A Part of the cgmTools Collection<<<',
                ut='cgmUIInstructionsTemplate')
        guiFactory.headerBreak()
        guiFactory.lineBreak()
        descriptionBlock = guiFactory.textBlock(self.description)

        guiFactory.lineBreak()
        mc.text(label=('%s%s' % ('Written by: ', self.author)))
        mc.text(label=('%s%s%s' % ('Copyright ', self.owner, ', 2011')))
        guiFactory.lineBreak()
        mc.text(label='Version: %s' % self.version)
        mc.text(label='')
        guiFactory.doButton(
            'Visit Tool Webpage',
            'import webbrowser;webbrowser.open(" http://www.cgmonks.com/tools/maya-tools/locinator/")'
        )
        guiFactory.doButton(
            'Close', 'import maya.cmds as mc;mc.deleteUI(\"' + window +
            '\", window=True)')
        mc.setParent('..')
        mc.showWindow(window)

    def printHelp(self):
        import locinatorLib
        help(locinatorLib)

    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    # Layouts
    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    def buildPlaceHolder(self, parent):
        self.containerName = MelColumnLayout(parent, ut='cgmUISubTemplate')
        return self.containerName

    def buildTimeSubMenu(self, parent):
        self.containerName = MelColumnLayout(parent, ut='cgmUISubTemplate')
        # Time Submenu
        mc.setParent(self.containerName)
        self.helpBlurbs.extend(
            guiFactory.instructions(" Set your time range",
                                    vis=self.ShowHelpOption))

        timelineInfo = search.returnTimelineInfo()

        # TimeInput Row
        TimeInputRow = MelHSingleStretchLayout(self.containerName,
                                               ut='cgmUISubTemplate')
        self.timeSubMenu.append(TimeInputRow)
        MelSpacer(TimeInputRow)
        MelLabel(TimeInputRow, l='start')

        self.startFrameField = MelIntField(TimeInputRow,
                                           'cgmLocWinStartFrameField',
                                           width=40,
                                           value=timelineInfo['rangeStart'])
        TimeInputRow.setStretchWidget(MelSpacer(TimeInputRow))
        MelLabel(TimeInputRow, l='end')

        self.endFrameField = MelIntField(TimeInputRow,
                                         'cgmLocWinEndFrameField',
                                         width=40,
                                         value=timelineInfo['rangeEnd'])

        MelSpacer(TimeInputRow)
        TimeInputRow.layout()

        MelSeparator(self.containerName,
                     ut='cgmUISubTemplate',
                     style='none',
                     height=5)

        # Button Row
        TimeButtonRow = MelHSingleStretchLayout(self.containerName,
                                                padding=1,
                                                ut='cgmUISubTemplate')
        MelSpacer(TimeButtonRow, w=2)
        currentRangeButton = guiFactory.doButton2(
            TimeButtonRow, 'Current Range',
            lambda *a: locinatorLib.setGUITimeRangeToCurrent(self),
            'Sets the time range to the current slider range')
        TimeButtonRow.setStretchWidget(MelSpacer(TimeButtonRow, w=2))
        sceneRangeButton = guiFactory.doButton2(
            TimeButtonRow, 'Scene Range',
            lambda *a: locinatorLib.setGUITimeRangeToScene(self),
            'Sets the time range to the current slider range')
        MelSpacer(TimeButtonRow, w=2)

        TimeButtonRow.layout()

        #>>> Base Settings Flags
        self.KeyingModeCollection = MelRadioCollection()
        self.KeyingModeCollectionChoices = []
        if not mc.optionVar(ex='cgmVar_LocinatorKeyingMode'):
            mc.optionVar(iv=('cgmVar_LocinatorKeyingMode', 0))
        guiFactory.appendOptionVarList(self, 'cgmVar_LocinatorKeyingMode')

        KeysSettingsFlagsRow = MelHSingleStretchLayout(self.containerName,
                                                       ut='cgmUISubTemplate',
                                                       padding=2)
        MelSpacer(KeysSettingsFlagsRow, w=2)
        KeysSettingsFlagsRow.setStretchWidget(
            MelLabel(KeysSettingsFlagsRow, l='Anim Option: ', align='right'))
        self.keyingOptions = ['Keys', 'All']
        for item in self.keyingOptions:
            cnt = self.keyingOptions.index(item)
            self.KeyingModeCollectionChoices.append(
                self.KeyingModeCollection.createButton(
                    KeysSettingsFlagsRow,
                    label=self.keyingOptions[cnt],
                    onCommand=Callback(guiFactory.toggleOptionVarState,
                                       self.keyingOptions[cnt],
                                       self.keyingOptions,
                                       'cgmVar_LocinatorKeyingMode', True)))
            MelSpacer(KeysSettingsFlagsRow, w=5)
        mc.radioCollection(self.KeyingModeCollection,
                           edit=True,
                           sl=(self.KeyingModeCollectionChoices[(mc.optionVar(
                               q='cgmVar_LocinatorKeyingMode'))]))

        KeysSettingsFlagsRow.layout()

        #>>> Base Settings Flags
        self.KeyingTargetCollection = MelRadioCollection()
        self.KeyingTargetCollectionChoices = []
        if not mc.optionVar(ex='cgmVar_LocinatorKeyingTarget'):
            mc.optionVar(iv=('cgmVar_LocinatorKeyingTarget', 0))
        guiFactory.appendOptionVarList(self, 'cgmVar_LocinatorKeyingTarget')

        BakeSettingsFlagsRow = MelHSingleStretchLayout(self.containerName,
                                                       ut='cgmUISubTemplate',
                                                       padding=2)
        MelSpacer(BakeSettingsFlagsRow, w=2)
        BakeSettingsFlagsRow.setStretchWidget(
            MelLabel(BakeSettingsFlagsRow, l='From: ', align='right'))
        MelSpacer(BakeSettingsFlagsRow)
        self.keyTargetOptions = ['source', 'self']
        for item in self.keyTargetOptions:
            cnt = self.keyTargetOptions.index(item)
            self.KeyingTargetCollectionChoices.append(
                self.KeyingTargetCollection.createButton(
                    BakeSettingsFlagsRow,
                    label=self.keyTargetOptions[cnt],
                    onCommand=Callback(guiFactory.toggleOptionVarState,
                                       self.keyTargetOptions[cnt],
                                       self.keyTargetOptions,
                                       'cgmVar_LocinatorKeyingTarget', True)))
            MelSpacer(BakeSettingsFlagsRow, w=5)
        mc.radioCollection(
            self.KeyingTargetCollection,
            edit=True,
            sl=(self.KeyingTargetCollectionChoices[(mc.optionVar(
                q='cgmVar_LocinatorKeyingTarget'))]))

        BakeSettingsFlagsRow.layout()

        return self.containerName

    def buildBasicLayout(self, parent):
        mc.setParent(parent)
        guiFactory.header('Update')

        #>>>Time Section
        UpdateOptionRadioCollection = MelRadioCollection()
        EveryFrameOption = mc.optionVar(q='cgmVar_LocinatorBakeState')
        mc.setParent(parent)
        guiFactory.lineSubBreak()

        #>>> Time Menu Container
        self.BakeModeOptionList = ['Current Frame', 'Bake']
        cgmVar_Name = 'cgmVar_LocinatorBakeState'
        guiFactory.appendOptionVarList(self, 'cgmVar_LocinatorBakeState')

        if not mc.optionVar(ex=cgmVar_Name):
            mc.optionVar(iv=(cgmVar_Name, 0))

        #build our sub section options
        self.ContainerList = []

        #Mode Change row
        ModeSetRow = MelHSingleStretchLayout(parent, ut='cgmUISubTemplate')
        self.BakeModeRadioCollection = MelRadioCollection()
        self.BakeModeChoiceList = []
        MelSpacer(ModeSetRow, w=2)

        self.BakeModeChoiceList.append(
            self.BakeModeRadioCollection.createButton(
                ModeSetRow,
                label=self.BakeModeOptionList[0],
                onCommand=Callback(guiFactory.toggleModeState,
                                   self.BakeModeOptionList[0],
                                   self.BakeModeOptionList, cgmVar_Name,
                                   self.ContainerList, True)))

        ModeSetRow.setStretchWidget(MelSpacer(ModeSetRow))

        self.BakeModeChoiceList.append(
            self.BakeModeRadioCollection.createButton(
                ModeSetRow,
                label=self.BakeModeOptionList[1],
                onCommand=Callback(guiFactory.toggleModeState,
                                   self.BakeModeOptionList[1],
                                   self.BakeModeOptionList, cgmVar_Name,
                                   self.ContainerList, True)))

        ModeSetRow.layout()

        #>>>
        self.ContainerList.append(self.buildPlaceHolder(parent))
        self.ContainerList.append(self.buildTimeSubMenu(parent))

        mc.radioCollection(
            self.BakeModeRadioCollection,
            edit=True,
            sl=self.BakeModeChoiceList[mc.optionVar(q=cgmVar_Name)])
        #>>>

        mc.setParent(parent)

        guiFactory.doButton2(
            parent, 'Do it!', lambda *a: locinatorLib.doUpdateLoc(self),
            'Update a locator at a particular frame or through a timeline')

        guiFactory.lineSubBreak()

        #>>>  Loc Me Section
        guiFactory.lineBreak()
        guiFactory.lineSubBreak()
        guiFactory.doButton2(
            parent, 'Just Loc Selected', lambda *a: locinatorLib.doLocMe(self),
            'Create an updateable locator based off the selection and options')

    def buildSpecialLayout(self, parent):
        SpecialColumn = MelColumnLayout(parent)

        #>>>  Center Section
        guiFactory.lineSubBreak()
        guiFactory.doButton2(SpecialColumn, 'Locate Center',
                             lambda *a: locinatorLib.doLocCenter(self),
                             'Find the center point from a selection set')

        #>>>  Closest Point Section
        guiFactory.lineSubBreak()
        guiFactory.doButton2(
            SpecialColumn, 'Locate Closest Point',
            lambda *a: locinatorLib.doLocClosest(self),
            'Select the proximity object(s), then the object to find point on. Accepted target object types are - nurbsCurves and surfaces and poly objects'
        )

        #>>>  Curves Section
        guiFactory.lineSubBreak()
        guiFactory.doButton2(SpecialColumn, 'Loc CVs of curve',
                             lambda *a: locinatorLib.doLocCVsOfObject(),
                             "Locs the cv's at the cv coordinates")

        guiFactory.lineSubBreak()
        guiFactory.doButton2(SpecialColumn, 'Loc CVs on the curve',
                             lambda *a: locinatorLib.doLocCVsOnObject(),
                             "Locs cv's at closest point on the curve")

        guiFactory.lineBreak()

        #>>> Update Section
        guiFactory.lineSubBreak()
        guiFactory.doButton2(
            SpecialColumn, 'Update Selected',
            lambda *a: locinatorLib.doUpdateLoc(self),
            "Only works with locators created with this tool")

    def buildMatchLayout(self, parent):

        MatchColumn = MelColumnLayout(parent)

        #>>>  Tag Section
        guiFactory.lineSubBreak()
        guiFactory.doButton2(
            MatchColumn, 'Tag it', lambda *a: locinatorLib.doTagObjects(self),
            "Tag the selected objects to the first locator in the selection set. After this relationship is set up, you can match objects to that locator."
        )

        #>>>  Purge Section
        guiFactory.lineSubBreak()
        self.helpBlurbs.extend(
            guiFactory.instructions(
                "  Purge all traces of cgmThinga tools from the object",
                vis=self.ShowHelpOption))
        guiFactory.doButton2(MatchColumn, 'Purge it',
                             lambda *a: locinatorLib.doPurgeCGMAttrs(self),
                             "Clean it")

        guiFactory.lineBreak()

        #>>> Update Section
        guiFactory.lineSubBreak()
        guiFactory.doButton2(
            MatchColumn, 'Update Selected',
            lambda *a: locinatorLib.doUpdateLoc(self),
            "Only works with locators created with this tool")
示例#4
0
class snapMarkingMenu(BaseMelWindow):
	_DEFAULT_MENU_PARENT = 'viewPanes'
	
	def __init__(self):	
		"""
		Initializes the pop up menu class call
		"""
		self.optionVars = []
		self.toolName = 'cgm.snapMM'
		IsClickedOptionVar = OptionVarFactory('cgmVar_IsClicked', 'int')
		mmActionOptionVar = OptionVarFactory('cgmVar_mmAction', 'int')	
		surfaceSnapAimModeVar = OptionVarFactory('cgmVar_SurfaceSnapAimMode', 'int')	
		UpdateRotateOrderOnTagVar = OptionVarFactory('cgmVar_TaggingUpdateRO', 'int')	
		self.LocinatorUpdateObjectsBufferOptionVar = OptionVarFactory('cgmVar_LocinatorUpdateObjectsBuffer',defaultValue = [''])
		
		self.LocinatorUpdateObjectsOptionVar = OptionVarFactory('cgmVar_SnapMMUpdateMode',defaultValue = 0)
		guiFactory.appendOptionVarList(self,self.LocinatorUpdateObjectsOptionVar.name)
		
		self.SnapModeOptionVar = OptionVarFactory('cgmVar_SnapMatchMode',defaultValue = 0)
		guiFactory.appendOptionVarList(self,self.SnapModeOptionVar.name)
				
		
		panel = mc.getPanel(up = True)
		sel = search.selectCheck()
		
		IsClickedOptionVar.set(0)
		mmActionOptionVar.set(0)
		
		if mc.popupMenu('cgmMM',ex = True):
			mc.deleteUI('cgmMM')
			
		if panel:
			if mc.control(panel, ex = True):
				mc.popupMenu('cgmMM', ctl = 0, alt = 0, sh = 0, mm = 1, b =1, aob = 1, p = 'viewPanes',
					         pmc = lambda *a: self.createUI('cgmMM'))
	
	def createUI(self,parent):
		"""
		Create the UI
		"""		
		def buttonAction(command):
			"""
			execute a command and let the menu know not do do the default button action but just kill the ui
			"""			
			killUI()
			command
			mmActionOptionVar.set(1)
		
		self.LocinatorUpdateObjectsBufferOptionVar = OptionVarFactory('cgmVar_LocinatorUpdateObjectsBuffer',defaultValue = [''])
		IsClickedOptionVar = OptionVarFactory('cgmVar_IsClicked', 'int')
		mmActionOptionVar = OptionVarFactory('cgmVar_mmAction', 'int')
		
		self.SnapModeOptionVar.update()#Check if another tool has changed this setting
		
		sel = search.selectCheck()
		selPair = search.checkSelectionLength(2)
		
		IsClickedOptionVar.set(1)
		
		mc.menu(parent,e = True, deleteAllItems = True)
		MelMenuItem(parent,
		            en = selPair,
		            l = 'Point Snap',
		            c = lambda *a:buttonAction(tdToolsLib.doPointSnap()),
		            rp = 'NW')		            
		MelMenuItem(parent,
		            en = selPair,
		            l = 'Parent Snap',
		            c = lambda *a:buttonAction(tdToolsLib.doParentSnap()),
		            rp = 'N')	
		MelMenuItem(parent,
		            en = selPair,
		            l = 'Orient Snap',
		            c = lambda *a:buttonAction(tdToolsLib.doOrientSnap()),
		            rp = 'NE')	
		
		MelMenuItem(parent,
		            en = selPair,
		            l = 'Surface Snap',
		            c = lambda *a:buttonAction(tdToolsLib.doSnapClosestPointToSurface(False)),
		            rp = 'W')
		
		if self.LocinatorUpdateObjectsOptionVar.value:
			ShowMatch = False
			if self.LocinatorUpdateObjectsBufferOptionVar.value:
				ShowMatch = True
			MelMenuItem(parent,
				        en = ShowMatch,
				        l = 'Buffer Snap',
				        c = lambda *a:buttonAction(locinatorLib.doUpdateLoc(self,True)),
				        rp = 'S')					
		else:
			ShowMatch = search.matchObjectCheck()			
			MelMenuItem(parent,
				        en = ShowMatch,
				        l = 'Match Snap',
				        c = lambda *a:buttonAction(locinatorLib.doUpdateSelectedObjects(self)),
				        rp = 'S')	
			
		
		MelMenuItem(parent,
		            en = 0,
		            l = 'Mirror',
		            c = lambda *a:buttonAction(locinatorLib.doUpdateObj(self,True)),
		            rp = 'SW')			
		
		MelMenuItemDiv(parent)
		MelMenuItem(parent,l = 'Loc Me',
	                c = lambda *a: buttonAction(locinatorLib.doLocMe(self)))
		MelMenuItem(parent, l = 'Tag Loc to Object',en = selPair,
	                c = lambda *a: buttonAction(locinatorLib.doTagObjects(self)))
		# Update Mode
		UpdateMenu = MelMenuItem(parent, l='Update Mode', subMenu=True)
		UpdateMenuCollection = MelRadioMenuCollection()

		if self.LocinatorUpdateObjectsOptionVar.value == 0:
			slMode = True
			bufferMode = False
		else:
			slMode = False
			bufferMode = True

		UpdateMenuCollection.createButton(UpdateMenu,l='Selected',
				                             c=lambda *a: self.LocinatorUpdateObjectsOptionVar.set(0),
				                             rb=slMode )
		UpdateMenuCollection.createButton(UpdateMenu,l='Buffer',
				                             c=lambda *a:self.LocinatorUpdateObjectsOptionVar.set(1),
				                             rb=bufferMode )
		#>>>Match Mode
		self.MatchModeOptions = ['parent','point','orient']
		
		self.MatchModeCollection = MelRadioMenuCollection()
		self.MatchModeCollectionChoices = []
					
		MatchModeMenu = MelMenuItem( parent, l='Match Mode', subMenu=True)
		self.matchMode = self.SnapModeOptionVar.value
		for c,item in enumerate(self.MatchModeOptions):
			if self.matchMode == c:
				rbValue = True
			else:
				rbValue = False
			self.MatchModeCollectionChoices.append(self.MatchModeCollection.createButton(MatchModeMenu,label=item,
			                                                                             rb = rbValue,
			                                                                             command = Callback(self.SnapModeOptionVar.set,c)))
		#>>> Define
		DefineMenu = MelMenuItem( parent, l='Buffer', subMenu=True)
		MelMenuItem( DefineMenu, l="Define",
		             c= lambda *a: locinatorLib.defineObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
		MelMenuItem( DefineMenu, l="Add Selected",
		             c= lambda *a: locinatorLib.addSelectedToObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
		MelMenuItem( DefineMenu, l="Remove Selected",
		             c= lambda *a: locinatorLib.removeSelectedFromObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
		
		MelMenuItemDiv( DefineMenu )
		MelMenuItem( DefineMenu, l="Select Members",
				     c= lambda *a: locinatorLib.selectObjBufferMembers(self.LocinatorUpdateObjectsBufferOptionVar))
		MelMenuItem( DefineMenu, l="Clear",
		             c= lambda *a: locinatorLib.clearObjBuffer(self.LocinatorUpdateObjectsBufferOptionVar))
				
		
		
		
		
		MelMenuItemDiv(parent)		
		MelMenuItem(parent, l = 'Locinator',
	                c = lambda *a: buttonAction(cgmToolbox.loadLocinator()))
		MelMenuItem(parent, l = 'cgm.animTools',
	                c = lambda *a: buttonAction(cgmToolbox.loadAnimTools()))
		MelMenuItem(parent, l = 'cgm.tdTools',
	                c = lambda *a: buttonAction(cgmToolbox.loadTDTools()))
		MelMenuItem(parent, l = 'cgm.attrTools',
	                c = lambda *a: buttonAction(cgmToolbox.loadAttrTools()))
		

		MelMenuItemDiv(parent)	
		MelMenuItem(parent, l="Reset",
	                 c=lambda *a: guiFactory.resetGuiInstanceOptionVars(self.optionVars))