def resetIk( translation=True, rotation=True ): """Reset translation and rotation of selected IK control(s)""" objects = pm.ls( selection=True, type='transform' ) if not objects: mel.warning( 'no transform objects selected.' ) else: resetIkCmd( objects, translation, rotation )
def unfreezeTranslation( options=False ): if options: pass else: objects = pm.ls(selection=True, type='transform') if not objects: mel.warning('Unfreeze Translation requires at least 1 selected object.') else: unfreezeTranslationCmd( objects )
def toggleInfinityCycle(): """Toggle infinite cycle with offset for curves on selected object(s)""" try: if 'constant' not in pm.setInfinity( query=True, poi=True ): pm.setInfinity( poi='constant', pri='constant' ) else: pm.setInfinity( poi='cycleRelative', pri='cycleRelative' ) except: mel.warning( 'Select object(s) with animation curves.' ) pm.animCurveEditor( 'graphEditor1GraphEd', edit=True, displayInfinities='on' )
def cleanGroupCombineCmd( group_list ): combined_list = [] for grp in group_list: grp_parent = grp.getParent() print "grp_parent:", grp_parent pm.delete( ch=1 ) grp_str = grp.nodeName() mesh_children = pm.ls( grp, dag=1, type="mesh" ) if len( mesh_children ) > 1: if grp_parent is not None: pm.parent( grp, world=1 ) obj = pm.polyUnite( grp, ch=1 )[0] pm.delete( obj, ch=1 ) try: pm.delete( grp ) except TypeError: pass if grp_parent is not None: pm.parent( obj, grp_parent ) obj_str = obj.rename( grp_str ) print '// Result: Combined group as', obj_str elif len( mesh_children ) == 1: obj = mesh_children[0].getParent() if grp_parent is not None: pm.parent( obj, grp_parent ) pm.delete( grp ) obj_str = obj.rename( grp_str ) print '// Result: Promoted mesh as', obj_str else: obj = None mel.warning( "No meshes found under group." ) if not obj is None: combined_list.append( obj ) return combined_list
def apply( self, alterNamespace=False, namespace='' ): "apply the stored pose to the current scene" for t in self._stored: attr, v = t if alterNamespace: split = attr.split(':') if len( split ) > 1: attr = split[1] attr = '%s:%s' % (namespace, attr) try: pm.Attribute(attr).set(v) except pm.MayaAttributeError, msg: mel.warning( str(msg) )
def checkSave( fileName=None ): if fileName is None: fileName = pm.sceneName() else: fileName = Path( fileName ) mc.file( rename=fileName ) if not setWritable( fileName ): mel.warning( 'File "%s" is read-only. Could not save.' % fileName.basename() ) return False mc.file( save=True ) print '// Result: %s //' % fileName return True
def reverseOppositeGeometry(): """ Finds and reverses meshes under selection with opposite flag set. """ sel_list = pm.ls( sl=1, dag=1, type="mesh" ) if not sel_list: mel.warning( "No meshes found in selection." ) count = 0 for obj in sel_list: if obj.opposite.get(): obj.opposite.set( 0 ) pm.polyNormal( obj, normalMode=0, userNormalMode=0, ch=0 ) count += 1 print '// Results: %d opposite meshes reversed.' % count
def applyToSelected( self ): "apply the stored pose to the current scene" sel_list = pm.ls(sl=1, type="transform") stored_list = [ StoredAttr(*s) for s in self._stored] stored_nodes = [] for stored in stored_list: if stored.node not in stored_nodes: stored_nodes.append(stored.node) mapped_nodes = dict( zip( stored_nodes, sel_list ) ) for stored in stored_list: if stored.node in mapped_nodes.keys(): attr = '.'.join( [ mapped_nodes[stored.node].nodeName(), stored.attr.split('.')[1] ] ) try: pm.Attribute(attr).set(stored.value) except pm.MayaAttributeError, msg: mel.warning( str(msg) )
def resetIkCmd( controls, translation=False, rotation=False ): for control in controls: try: reset_target = pm.PyNode( control + '_resetik' ) except pm.MayaNodeError: mel.warning ( 'Reset IK target not found for %s' % control ) return False unit_scale = reset_target.getRotatePivot( worldSpace=True )[-1] tgtPos = reset_target.getRotatePivot( worldSpace=True ) * unit_scale objPos = control.getRotatePivot( worldSpace=True ) * unit_scale newPos = tgtPos - objPos tgtRot = reset_target.getRotation( worldSpace=True ) if translation: pm.xform( control, translation=newPos, relative=True, worldSpace=True ) if rotation: pm.xform( control, rotation=tgtRot, worldSpace=True )
def superRename( object, newName, force=False ): print 'object:', object result = pm.rename( object, newName ) result = str( result ) if result == newName: print '// Result:', result else: nsList = pm.namespaceInfo( listOnlyNamespaces=True ) nodeList = pm.ls( '*' + newName ) if force: if newName in nsList: nsName = newName + 'NS' try: pm.namespace( add=nsName ) except RuntimeError: pass pm.namespace( force=True, moveNamespace=( newName, nsName ) ) pm.namespace( removeNamespace=newName ) mel.warning( 'Renamed namespace "%s" to "%s".' % ( newName, nsName ) ) if newName in nodeList: for n in nodeList: if n.type() == 'displayLayer': pm.rename( n, n + 'L' ) mel.warning( 'SuperRename: Forced DisplayLayer "%s" to "%s".' % ( newName, n + 'L' ) ) else: try: print n.nextName().split( '|' )[-1] r = pm.rename( n, n.nextName().split( '|' )[-1] ) except RuntimeError: # pass r = pm.rename( n, n + '100' ) except: pass mel.warning( 'SuperRename: Forced renamed "%s" to "%s".' % ( newName, r ) ) # renamed conflicting nodes, try again superRename( result, newName, force=False ) else: print '// Conflicts:' if newName in nsList: print '// (namespace)'.ljust( 10 ), newName if nodeList: for n in nodeList: print '// (%s)'.ljust( 10 ) % n.type(), n
def mirrorAnimation( defaultAxis='XZ' ): tempGroups = [] st2 = pm.timerX() pm.waitCursor( state=True ) autoKeyState = pm.autoKeyframe( query=True, state=True ) pm.autoKeyframe( state=False ) pm.select( pm.ls( selection=True ), replace=True ) objects = pm.ls( selection=True, type='transform' ) if len( objects ) == 0: mel.warning( 'No Transform objects selected for mirroring.' ) else: for obj in objects: if obj.mirrorAxis.exists(): axis = ( 'XY', 'YZ', 'XZ' )[ obj.mirrorAxis.get() ] else: axis = defaultAxis split = obj.split( ':' ) if len( split ) > 1: a = split[1] else: a = obj if a.startswith( prefix[0] ) or a.startswith( prefix[1] ): if a.startswith( prefix[1] ): prefix.reverse() opposite = pm.PyNode( obj.replace( prefix[0], prefix[1] ) ) else: opposite = None if opposite is not None and opposite.exists(): # -- make holder group -- g = pm.group( name='%s_holder' % obj, empty=True ) tempGroups.append( g ) ud_attrs = map( pm.Attribute, obj.listAttr( keyable=True ) ) for attr in ud_attrs: newAttr = pm.Attribute( '%s.%s' % ( g, attr.longName() ) ) if not newAttr.exists(): newAttr.add( attributeType=attr.type(), keyable=True ) if attr.longName() in mirrAttrs[axis] or attr.longName() in extrasList: newAttr.set( -attr.get() ) else: newAttr.set( attr.get() ) copy_result = pm.copyKey( obj, hierarchy='none', controlPoints=0, shape=1 ) if copy_result > 0: pm.pasteKey( g, option='replaceCompletely', copies=1, connect=1, timeOffset=0, floatOffset=0, valueOffset=0 ) # -- get opposite's values/keys -- og = '%s_holder' % opposite print 'tempGroups:', tempGroups print 'og:', og print len( tempGroups ) if og in tempGroups: obj2 = og else: obj2 = opposite copy_result = pm.copyKey( obj2, hierarchy=None, controlPoints=0, shape=1 ) if copy_result > 0: pm.pasteKey( obj, option='replaceCompletely', copies=1, connect=1, timeOffset=0, floatOffset=0, valueOffset=0 ) for attr in ud_attrs: srcAttr = pm.Attribute( '%s.%s' % ( obj2, attr.longName() ) ) if srcAttr.exists(): if attr.longName() in mirrAttrs[axis] or attr.longName() in extrasList: attr.set( -srcAttr.get() ) mirrorCurve( curves=attr.listConnections() ) else: attr.set( srcAttr.get() ) else: for attr in map( pm.Attribute, obj.listAttr( keyable=True ) ): if attr.longName() in mirrAttrs[axis] or attr.longName() in extrasList: attr.set( -attr.get() ) mirrorCurve( curves=attr.listConnections() ) # -- Finalize -- try: pm.delete( tempGroups ) except: pass pm.select( objects, replace=True ) pm.autoKeyframe( state=autoKeyState ) print '// Results: Mirrored animation for %i objects in %f seconds' % ( len( objects ), pm.timerX( st=st2 ) ) pm.waitCursor( state=False )