Good point Justin, thanks.

  In an attempt to explain here is my reasoning:

[ operating system path module ] os.path.join() 
-Easy to use and has a lot of catches
-One extra module import, meaning more need for traceability and logging and 
such.

[ built-in function ] ‘/’.join 
-Is built-in so traceability and extended knowledge requirements on my behalf 
are None, this is just using python.

  Example of how easy it is to have fun with joining things, paths or not:
" ".join(mylist)
 {note the space}

" ".join(['Bob', 'Bobo', 'Bubba'])
(Note the addition if the square brackets inside the normal brackets.

  Easy identification:
" <--> ".join(mylist())

Alphabetical
" ".join(sorted(mydict.keys()))

  For every n in the list, do things to each one
print [ n for n in " ".join(sorted(mydict.keys())) ]

  Filter
print [ n for n in " ".join(sorted(mydict.keys())) if "Bobo" in n]

  But having said that I feel comfortable using the built-in join function in 
this case as I know what I’m querying will always return a path in Windows form 
or Unix style and all I’m doing is slicing the two elements together.  For more 
elaborate path joining depending on variable resolution and such I tend to 
stick to os.path.join() as it has things in there that catch and construct 
bespoke paths quite well.  Can you throw me an example of how you would 
approach the same scenario using the os.path module?  If there are additional 
catches and a compelling reason to use it I certainly will, just haven’t read 
many cases where the path module is more useful than just simply joining things.

  As for not using shutil, no real reason actually, got burnt on using it a few 
times in the past so I tend to steer away from it, but it’s more of a personal 
grief than anything technical, what it was being used for was odd so the module 
itself is not really to blame I’d think.  Do you have an example of how to use 
shutil to ensure my backed up file is the same file as is in my scene 
directory, anything other than a physical duplicate of the backed up file will 
suffice I’d think as file size becomes an issue quite fast when working with 
large files or working with a project off a small media.

  I updated the code a little bit to add automatic versioning as well with a 
prefix choice and cleaned up the path naming.  My current issue is still that 
once my file has been saved into the new directory and retains the original 
name the file in the root of my scenes directory doesn’t update, as I mentioned 
above and Justin suggests shutil should be able to sort this but as a side 
gimmick does anyone know if Maya has any notion of multiple files being the 
same file?  As in save once , then build a representation of that file in 
another location without it delaying the actual save process?

from os import listdir
from maya.cmds import file
from maya.cmds import workspace

class Backup( object ):
    
    def __init__( self , foldername='' ):
        """Saves out an incremented backup file of your scene
        
                -folder argument is the name of the folder the backed up file 
gets saved into.  
                If no foldername is given a versioned file gets saved into the 
root of the scenes directory.
        
        """

        self.__version__ = '0.0.3'
        self.foldername = foldername

    def create_path( self , filerule='scene' , name=False ):
        """Creates a path within the current projects scene directory
        
            -Use filerule to get the path of various workspace settings.
            -Use the name argument as the name of the directory to create

        """
        
        if not name:
                name = self.foldername
                
        scene = ''.join( [ workspace( q=1,rd=1 ) , workspace( filerule , q=1 , 
fre=1 ) ] )
        self.path = '/'.join( [ scene , name ] )
        workspace( create=self.path )
        
        return self.path

    def save( self , version=None , type='mayaBinary' , name='_noname_' ):
        """Places a saved out scene on disk
        
            -Version argument adds that version name at the back of the scene 
name.
            -Type argument can be mayaBinary or mayaAscii
            -Use name to set our scene name.

        """
        
        path = self.create_path()
        
        if not version:
                version = self.get_version( path )
        
        file( rename='%s %s' % ( '/'.join( [ path , name ] ) , version ) )
        file( save=True , type=type )
        file( rename=name )
        
        return True

    def get_version( self ,path , prefix='v' , initialversion='001' ):
        """Returns a valid version number for a given path
        
                -Use the prefix argument to set a prepended name on your 
version ID.
                -initialversion can be used to state a version number to start 
from if the backup directory is empty.
        
        """
        
        backups = sorted( [ n for n in listdir( path ) ] )
        
        if backups==[]:
                return ''.join( [ prefix , initialversion ] )
        else:
                last_backup = backups[-1]
                ver = [ n[ 1: ].split( '.' )[ 0 ] for n in last_backup.split() 
if n.startswith( 'v' ) ][0]
        new = ''.join( [ prefix , str( int( ver ) + 1 ).zfill( 3 ) ] )
        
        return new

if __name__ == '__main__':
    __oo__ = Backup( foldername='Backups' )
    __oo__.save( name='Porks Werfect' )

Comments and discussion of course welcome

   p.s. will learn how pastebin works before this gets any longer :)

-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to