def temp_file(scene, suffix=""): """ Return a path to a config file stored in a temp dir according to OS. The filename is derived from the 'scene' parameter. We add the current system username as a prefix to keep the filename unique, to prevent permission errors arising if a different user attempts to submit the same file. """ if os.path.isfile(scene): scene_file = os.path.basename(scene) prefix = os_wrapper.sanitize(getpass.getuser(), replace='_') + '_' settings_file = prefix + os_wrapper.sanitize(scene_file, replace='_') + suffix return os.path.join(tempfile.gettempdir(), settings_file) else: return False
def loadReplaceStr(self, item=None, column=0): """ Copies the selected file name prefix to the 'Replace' text field. Non-alphanumeric characters will be replaced with underscores. """ if not item: item = self.ui.taskList_treeWidget.selectedItems()[0] text = item.text(self.header("Prefix")) text = os_wrapper.sanitize(text, pattern=r'[^\w\.-]', replace='_') if self.ui.replace_comboBox.findText(text) == -1: self.ui.replace_comboBox.insertItem(0, text) self.ui.replace_comboBox.setCurrentIndex(self.ui.replace_comboBox.findText(text))
def settings_file(scene, suffix=""): """ Determine the path to the settings file based on the full path of the scene file. N.B. This function is duplicated in render_submit.py """ if os.path.isfile(scene): scene_dir, scene_file = os.path.split(scene) # settings_dir = os.path.join(scene_dir, os.environ['IC_METADATA']) settings_file = os_wrapper.sanitize(scene_file, replace='_') + suffix # # Create settings directory if it doesn't exist # if not os.path.isdir(settings_dir): # os_wrapper.createDir(settings_dir) # return os.path.join(settings_dir, settings_file) return os.path.join('/var/tmp', settings_file) # temp - linux only else: return False
def publish(pblTo, slShot, nodeType, textures, pblNotes): # Get selection objLs = mc.ls(sl=True) # Check item count if not pblChk.itemCount(objLs): return # Define main variables assetType = '%s_node' % nodeType subsetName = mc.nodeType(objLs[0]) prefix = '' convention = objLs[0] suffix = '_node' fileType = 'mayaAscii' extension = 'ma' # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Check if asset to publish is a set if mc.nodeType(convention) == 'objectSet': verbose.noSetsPbl() return # Check if asset to publish is an icSet if mayaOps.chkIcDataSet(convention): verbose.noICSetsPbl() return # Check if asset to publish is referenced if mc.referenceQuery(convention, inr=True): verbose.noRefPbl() return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot # Determining publish env var for relative directory if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % ( assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) if textures: os_wrapper.createDir(os.path.join(pblDir, 'tx')) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = mayaOps.getScene() icPblData.writeData(pblDir, assetPblName, convention, assetType, extension, version, pblNotes, src) # Maya operations mayaOps.deleteICDataSet(objLs) if textures: # Copy textures to publish directory (use hardlink instead?) txFullPath = os.path.join(pblDir, 'tx') # txRelPath = txFullPath.replace(os.path.expandvars('$IC_JOBPATH'), '$IC_JOBPATH') # txPaths = (txFullPath, txRelPath) # Returns a dict for fileNodes and oldTxPaths if updateMaya = True oldTxPaths = mayaOps.updateTextures(txFullPath, txObjLs=objLs, updateMaya=True) # File operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) mayaOps.exportSelection(pathToPblAsset, fileType) # Write Nuke file if ic and file node type if nodeType == 'ic': if subsetName == 'file': fileTypeLs = ('.jpg', '.jpeg', '.hdr', '.exr', '.tif', '.tiff', '.tga', '.png') fileLs = os.listdir(os.path.join(pblDir, 'tx')) for file_ in fileLs: if file_.endswith(fileTypeLs, -4): fileName = file_ mayaOps.nkFileNodeExport(objLs, nodeType, fileName, pblDir, pblDir, assetPblName, version) # Reverts the texture paths if textures and oldTxPaths: mayaOps.relinkTextures(oldTxPaths) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % ( assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)
def publish(pblTo, slShot, subtype, textures, pblNotes): # Get selection objLs = mc.ls(sl=True) # Check item count if not pblChk.itemCount(objLs): return # Define main variables geoType = 'abc' subsetName = subtype assetType = 'ic_pointCloud' prefix = '' convention = objLs[0] suffix = '_pointCloud' ma_fileType = 'mayaBinary' extension = geoType # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Check if item is particle objSh = mc.listRelatives(objLs[0])[0] objType = mayaOps.nodetypeCheck(objSh) if objType not in ('particle', 'nParticle'): verbose.pointCloudParticle() return # Get all dependents allObjLs = mc.listRelatives(convention, ad=True, f=True, typ='transform') if allObjLs: allObjLs.append(convention) else: allObjLs = [convention] # Check if asset to publish is a set if mc.nodeType(convention) == 'objectSet': verbose.noSetsPbl() return # Check if asset to publish is an icSet if mayaOps.chkIcDataSet(convention): verbose.noICSetsPbl() return # Check if asset to publish is referenced for allObj in allObjLs: if mc.referenceQuery(allObj, inr=True): verbose.noRefPbl() return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot # Determining publish env var for relative directory if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot pblRelDir = '$IC_SHOTPUBLISHDIR' else: pblRelDir = '$IC_JOBPUBLISHDIR' # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % ( assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) if textures: os_wrapper.createDir(os.path.join(pblDir, 'tx')) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = mayaOps.getScene() icPblData.writeData(pblDir, assetPblName, convention, assetType, extension, version, pblNotes, src) # Maya operations if textures: # Copy textures to publish directory (use hardlink instead?) txFullPath = os.path.join(pblDir, 'tx') # txRelPath = txFullPath.replace(pblTo, pblRelDir) # txPaths = (txFullPath, txRelPath) # Returns a dict for fileNodes and oldTxPaths if updateMaya = True oldTxPaths = mayaOps.updateTextures(txFullPath, txObjLs=allObjLs, updateMaya=True) # Get transform data, write to file and zero obj out objTrs = mayaOps.getTransforms(convention) if objTrs: objT, objR, objS = objTrs else: raise RuntimeError(verbose.noGetTranforms()) trsDataFile = open('%s/trsData.py' % (pblDir), 'w') trsDataFile.write('t=%s\nr=%s\ns=%s' % (objT, objR, objS)) trsDataFile.close() mayaOps.applyTransforms(convention, [0, 0, 0], [0, 0, 0], [1, 1, 1]) # Take snapshot mayaOps.snapShot(pblDir, isolate=True, fit=True) # File operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) mayaOps.exportSelection(pathToPblAsset, ma_fileType) mayaOps.exportGeo(objLs, geoType, pathToPblAsset) # Re-apply original transforms to object mayaOps.applyTransforms(convention, objT, objR, objS) # Reverts the texture paths if textures and oldTxPaths: mayaOps.relinkTextures(oldTxPaths) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % ( assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)
def publish(pblTo, slShot, pblNotes): # Get selection objLs = mc.ls(sl=True) # Check item count if not pblChk.itemCount(objLs): return # Define main variables shot_ = os.environ['IC_SHOT'] assetType = 'ma_anim' subsetName = '' prefix = '' convention = objLs[0] suffix = '_anim' fileType = 'atomExport' extension = 'atom' # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Get all dependents allObjLs = mc.listRelatives(convention, ad=True, f=True) # Add original selection to allObj if no dependents are found if allObjLs: allObjLs.append(convention) else: allObjLs = [convention] # Check if asset to publish is a set if mc.nodeType(convention) == 'objectSet': verbose.noSetsPbl() return # Check if asset to publish is an icSet if mayaOps.chkIcDataSet(convention): verbose.noICSetsPbl() return # Check if asset to publish is referenced for allObj in allObjLs: if mc.referenceQuery(allObj, inr=True): verbose.noRefPbl() return # Check if selected asset is a published asset and matches the asset name try: ICSetConn = mc.listConnections('%s.icARefTag' % convention) if not ICSetConn[0].startswith('ICSet'): raise RuntimeError('ICSet') except: verbose.pblAssetReq() return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot # Determining publish env var for relative directory if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % ( assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = mayaOps.getScene() requires = mc.getAttr('%s.icRefTag' % ICSetConn[0]) compatible = '%s_%s' % (requires, mc.getAttr('ICSet_%s.icVersion' % requires)) icPblData.writeData(pblDir, assetPblName, convention, assetType, extension, version, pblNotes, src, requires, compatible) # Maya operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) mayaOps.exportAnimation(pathToPblAsset, pblDir, objLs) # os_wrapper.setPermissions(os.path.join(pblDir, '*')) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % ( assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)
def publish(pblTo, slShot, subtype, textures, pblNotes): # Get selection objLs = mc.ls(sl=True) # Check item count if not pblChk.itemCount(objLs): return # Define main variables assetType = 'ma_model' subsetName = subtype prefix = '' convention = objLs[0] suffix = '_%s_model' % subtype fileType = 'mayaBinary' extension = 'mb' autoLods = False # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Get all dependents. Creates a group for LODs with just dependents allObjLs = mc.listRelatives(convention, ad=True, f=True, typ='transform') objLodLs = allObjLs # Add original selection to allObj if no dependents are found if allObjLs: allObjLs.append(convention) else: allObjLs = [convention] objLodLs = [convention] # Check if asset to publish is a set if mc.nodeType(convention) == 'objectSet': verbose.noSetsPbl() return # Check if asset to publish is an icSet if mayaOps.chkIcDataSet(convention): verbose.noICSetsPbl() return # Check if asset to publish is referenced for allObj in allObjLs: if mc.referenceQuery(allObj, inr=True): verbose.noRefPbl() return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot # Determining publish env var for relative directory if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % (assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) if textures: os_wrapper.createDir(os.path.join(pblDir, 'tx')) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = mayaOps.getScene() #for i in ('pblDir', 'assetPblName', 'convention', 'assetType', 'extension', 'version', 'src', 'pblNotes') # publishVars[i] = locals()[i] #icPblData.writeData(publishVars) icPblData.writeData(pblDir, assetPblName, convention, assetType, extension, version, pblNotes, src) # Publish operations mayaOps.deleteICDataSet(allObjLs) if textures: # Copy textures to publish directory (use hardlink instead?) txFullPath = os.path.join(pblDir, 'tx') # txRelPath = txFullPath.replace(os.path.expandvars('$IC_JOBPATH'), '$IC_JOBPATH') # txPaths = (txFullPath, txRelPath) # Returns a dict for fileNodes and oldTxPaths if updateMaya = True oldTxPaths = mayaOps.updateTextures(txFullPath, txObjLs=allObjLs, updateMaya=True) # Take snapshot mayaOps.snapShot(pblDir, isolate=True, fit=True) # File operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) mayaOps.exportSelection(pathToPblAsset, fileType) # Reverts the texture paths if textures and oldTxPaths: mayaOps.relinkTextures(oldTxPaths) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) # was commented out? pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % (assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)
def publish(pblTo, slShot, subtype, pblNotes): # Get selection objLs = mc.ls(sl=True) # Check item count if not pblChk.itemCount(objLs): return # Define main variables assetType = 'ma_geoCache' subsetName = subtype prefix = '' convention = objLs[0] suffix = '_%s_geoCache' % subtype if subtype == 'vrmesh': fileType = 'vrmesh' extension = 'vrmesh' elif subtype == 'realflow': fileType = 'sd' extension = 'sd' else: fileType = 'abc' extension = 'abc' # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Get all dependents allObjLs = mc.listRelatives(convention, ad=True, f=True, typ='transform') if allObjLs: allObjLs.append(convention) else: allObjLs = [convention] # Check if asset to publish is a set if mc.nodeType(convention) == 'objectSet': verbose.noSetsPbl() return # Check if asset to publish is an icSet if mayaOps.chkIcDataSet(convention): verbose.noICSetsPbl() return # Check if asset to publish is referenced for allObj in allObjLs: if mc.referenceQuery(allObj, inr=True): verbose.noRefPbl() return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot # Determining publish env var for relative directory if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % (assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = mayaOps.getScene() icPblData.writeData(pblDir, assetPblName, convention, assetType, extension, version, pblNotes, src) # Maya operations mayaOps.deleteICDataSet(allObjLs) # Take snapshot mayaOps.snapShot(pblDir, isolate=True, fit=True) # File operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) mayaOps.exportGeo(objLs, fileType, pathToPblAsset) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % (assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)
def publish(pblTo, slShot, subtype, pblName, pblNotes): # Get selection nodeLs = nuke.selectedNodes() # Check item count if subtype == 'node': if not pblChk.itemCount(nodeLs): return else: if not pblChk.itemCount(nodeLs, mult=True): return # Define main variables shot_ = '' assetType = 'nk_%s' % subtype subsetName = '' prefix = '' convention = pblName suffix = '_%s' % subtype fileType = 'nk' extension = 'nk' # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % ( assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = nuke.root().name() #nukeOps.getScriptName() icPblData.writeData(pblDir, assetPblName, assetPblName, assetType, extension, version, pblNotes, src) # Nuke operations icSet = nukeOps.createBackdrop(assetPblName, nodeLs) icSet['selected'].setValue(True) # File operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) nukeOps.exportSelection(pathToPblAsset) nuke.delete(icSet) # Take snapshot nukeOps.viewerSnapshot(pblDir) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % ( assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)
def publish(pblTo, slShot, scnName, subtype, textures, pblNotes): # Define main variables assetType = 'ma_scene' subsetName = subtype prefix = '' convention = scnName suffix = '_scene' fileType = 'mayaAscii' extension = 'ma' # Check for illegal characters cleanObj = os_wrapper.sanitize(convention) if cleanObj != convention: verbose.illegalCharacters(convention) return # Get all dependents allObjLs = mc.ls(tr=True) # Remove Maya's default cameras from list defaultCamLs = ['front', 'persp', 'side', 'top'] for defaultCam in defaultCamLs: allObjLs.remove(defaultCam) # Check if asset to publish is referenced for allObj in allObjLs: if mc.referenceQuery(allObj, inr=True): verbose.noRefPbl() return # Process asset publish options assetPblName, assetDir, pblDir = pblOptsPrc.prc(pblTo, subsetName, assetType, prefix, convention, suffix) # Add shot name to assetPblName if asset is being publish to a shot # Determining publish env var for relative directory if pblTo != os.environ['IC_JOBPUBLISHDIR']: assetPblName += '_%s' % slShot # Version control version = '%s' % vCtrl.version(pblDir) # if approved: # version += '_apv' # Confirmation dialog dialogTitle = 'Publishing %s' % convention dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\nNotes:\t%s' % (assetPblName, version, subsetName, pblNotes) dialog = prompt.dialog() if not dialog.display(dialogMsg, dialogTitle): return # Publishing try: verbose.pblFeed(begin=True) # Create publish directories pblDir = os_wrapper.createDir(os.path.join(pblDir, version)) if textures: os_wrapper.createDir(os.path.join(pblDir, 'tx')) # Create in-progress tmp file inProgress.start(pblDir) # Store asset metadata in file src = mayaOps.getScene() icPblData.writeData(pblDir, assetPblName, convention, assetType, extension, version, pblNotes, src) # Publish operations try: mc.select('ICSet_*', ne=True, r=True) icSetLs = mc.ls(sl=True) for icSet in icSetLs: mc.delete(icSet) except: pass if textures: # Copy textures to publish directory (use hardlink instead?) txFullPath = os.path.join(pblDir, 'tx') # txRelPath = txFullPath.replace(os.path.expandvars('$IC_JOBPATH'), '$IC_JOBPATH') # txPaths = (txFullPath, txRelPath) # Returns a dict for fileNodes and oldTxPaths if updateMaya = True oldTxPaths = mayaOps.updateTextures(txFullPath, updateMaya=True) # Take snapshot mayaOps.snapShot(pblDir, isolate=False, fit=False) # File operations pathToPblAsset = os.path.join(pblDir, '%s.%s' % (assetPblName, extension)) verbose.pblFeed(msg=assetPblName) activeScene = mayaOps.getScene() mayaOps.redirectScene(pathToPblAsset) mayaOps.saveFile(fileType, updateRecentFiles=False) # Reverts the texture paths if textures and oldTxPaths: mayaOps.relinkTextures(oldTxPaths) mayaOps.redirectScene(activeScene) # Delete in-progress tmp file inProgress.end(pblDir) # Published asset check pblResult = pblChk.success(pathToPblAsset) verbose.pblFeed(end=True) except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) pathToPblAsset = '' os_wrapper.remove(pblDir) pblResult = pblChk.success(pathToPblAsset) pblResult += verbose.pblRollback() # Show publish result dialog dialogTitle = 'Publish Report' dialogMsg = 'Asset:\t%s\n\nVersion:\t%s\n\nSubset:\t%s\n\n\n%s' % (assetPblName, version, subsetName, pblResult) dialog = prompt.dialog() dialog.display(dialogMsg, dialogTitle, conf=True)