Source code for qbfutures.maya

from __future__ import absolute_import

import os
import datetime

from . import core

# Test for maya.
try:
    from maya import cmds as maya_cmds, mel as maya_mel
    IN_MAYA = True
except ImportError:
    IN_MAYA = False


def preflight(package):
    
    from .worker import log
    
    import maya.standalone as maya_standalone
    maya_standalone.initialize()
    
    from maya import cmds
    
    filename = package.get('filename')
    if filename:
        log('opening file %r' % filename)
        cmds.file(filename, open=True, force=True)
    
    workspace = package.get('workspace')
    if workspace:
        log('setting workspace %r' % workspace)
        cmds.workspace(dir=workspace)


[docs]class Executor(core.Executor):
"""An executor that is tailored to the Maya environment. :param bool clone_environ: Convenience for :func:`~qbfutures.maya.Executor.clone_environ`. :param bool create_tempfile: Convenience for :func:`~qbfutures.maya.Executor.create_tempfile`. :param str filename: File to open once bootstrapped. :param str workspace: Workspace to set once bootstrapped. :param int version: Version of maya to use. """ def __init__(self, clone_environ=None, create_tempfile=False, filename=None, workspace=None, version=None, **kwargs ): super(Executor, self).__init__(**kwargs) # Pull overrides from given kwargs. self.filename = filename self.workspace = workspace self.version = version if clone_environ: self.clone_environ() if create_tempfile: if isinstance(create_tempfile, basestring): self.filename = create_tempfile else: self.filename = filename # Override the cloned environment. self.create_tempfile() # Set a default. self.version = self.version or (int(maya_cmds.about(version=True)) if IN_MAYA else 2014) def create_tempfile(self): """Save the current file in a temporary location for Qube processes to use.""" if not IN_MAYA: raise RuntimeError('cannot create tempfile when not in Maya') existing = maya_cmds.file(q=True, expandName=True) # Determine what we are going to call it. if self.filename is None: base_name, base_ext = os.path.splitext(os.path.basename(existing)) base_ext = base_ext or '.mb' dir_path = os.path.dirname(existing).replace('/.qbfutures', '') self.filename = os.path.join(dir_path, '.qbfutures', '%s.%s%s' % ( base_name, datetime.datetime.utcnow().strftime('%y%m%d.%H%M%S.%f'), base_ext, )) # print '# qbfutures tempfile:', self.filename # Create the directory. dir_path = os.path.dirname(self.filename) if not os.path.exists(dir_path): os.makedirs(dir_path) # Save the file. try: maya_cmds.file(rename=self.filename) _, ext = os.path.splitext(self.filename) maya_cmds.file(save=True, force=True, type='mayaAscii' if ext == '.ma' else 'mayaBinary') finally: maya_cmds.file(rename=existing) def clone_environ(self): """Set the jobs to use the same environment that we are currently in. Sets the current filename, workspace, and version. """ if not IN_MAYA: raise RuntimeError('cannot clone environment when not in Maya') if self.filename is None: self.filename = maya_cmds.file(q=True, expandName=True) if self.workspace is None: self.workspace = maya_cmds.workspace(q=True, rootDirectory=True) if self.version is None: self.version = int(maya_mel.eval('about -version').split()[0]) def _base_work_package(self, func, args=None, kwargs=None, extra={}): package = super(Executor, self)._base_work_package(func, args, kwargs, extra) # Executor information. package['preflight'] = '%s:preflight' % __name__ package['interpreter'] = extra.get('interpreter', 'maya%d_python' % self.version) # The Maya environment. package['filename'] = extra.get('filename', self.filename) package['workspace'] = extra.get('workspace', self.workspace) package['version'] = extra.get('version', self.version) # print '# qbfutures filename:', package['filename'] # print '# qbfutures workspace:', package['workspace'] # print '# qbfutures version:', package['version'] return package