示例#1
0
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 )
示例#2
0
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 )
示例#3
0
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' )
示例#4
0
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
示例#5
0
    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) )
示例#6
0
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
示例#7
0
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
示例#8
0
    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) )
示例#9
0
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 )
示例#10
0
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
示例#11
0
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 )