Beispiel #1
0
def _OpenDialog(nodeScope=None, fileLocation=None):
    from Katana import UI4
    import AssetAPI

    enabled = FarmAPI.IsSceneValid(nodeScope=nodeScope, unwantedSymbols=['_'])
    errorText = FarmAPI.GetErrorMessages()
    if len(errorText) > 0:
        UI4.Widgets.MessageBox.Warning('Error', ' '.join(errorText))
        return

    if fileLocation is None:
        fileLocation = ''

    xmlFile = UI4.Util.AssetId.BrowseForAsset(
        fileLocation, 'Specify a filename', True, {
            'fileTypes': 'xml',
            'acceptDir': False,
            'context': AssetAPI.kAssetContextFarm
        })

    if not xmlFile:
        return

    nodeList = FarmAPI.GetNodeList()
    if not nodeList:
        UI4.Widgets.MessageBox.Warning('Error', 'No nodes found!')

    _GenerateFarmFile(nodeList, xmlFile)
Beispiel #2
0
def initExport(option):
    dependencyList = FarmAPI.GetSortedDependencyList()[0]
    filepath = FarmAPI.GetKatanaFileName()

    # TODO - validity check
    saved = FarmAPI.IsSceneValid(FarmAPI.NODES_ALL)
    if not saved:
        # errormsg = FarmAPI.GetErrorMessages()
        result = UI4.Widgets.MessageBox.Warning('Unsaved Changes',
                                                'Save your file',
                                                acceptText='Save',
                                                cancelText='Cancel')
        if result == 0:  # Save
            KatanaFile.Save(filepath)
        else:  # cancel
            return

    # TODO - Get Katana version
    katanaVersion = "2.54"
    rendererVersion = "21.4"

    # get renderservice
    renderer = dependencyList['service']

    requ_lics = ''
    if renderer == 'arnold':
        rendererVersion = RenderingAPI.RendererInfo.GetPlugin(
            'ArnoldRendererInfo').getRegisteredRendererVersion()
        extension = '.ass'
        requ_lics += 'Arnold;'
    elif renderer == 'prman':
        rendererVersion = RenderingAPI.RendererInfo.GetPlugin(
            'PRManRendererInfo').getRegisteredRendererVersion()
        renderer = 'RenderMan'
        extension = '.rib'
        requ_lics += 'RenderMan;'
    else:
        UI4.Widgets.MessageBox.Warning('Unsupported Renderer',
                                       'Unknown Renderer')
        return

    use_yeti = dependencyList['useYetiLic']
    if use_yeti:
        requ_lics += "Yeti"

    software = 'Katana'
    software = 'Katana'
    if option == 'local':
        software = renderer

    #  print 'dependency list ', dependencyList
    fileDir = dependencyList['outputFolder']
    #  print 'FILEDDIR ', fileDir
    fileName = dependencyList['fileName']
    if fileName == '':
        UI4.Widgets.MessageBox.Warning('Warning', 'Add a name parameter')
        return

    # tmp name for xml and katana farm file
    xmlFileName = getNewTempFileName(fileDir, fileName)
    tmpFile = open(xmlFileName, 'w')
    dst = tmpFile.name[:-4] + '.katana'
    comment_file = tmpFile.name[:-4] + '_comment.txt'

    comment = ''
    use_comment = dependencyList['useComment']
    if use_comment:
        comment = dependencyList['comment']
        with open(comment_file, 'w') as f:
            f.write(comment)

    if (option == 'local'):
        # check file/dir
        if not os.path.isdir(fileDir):
            if UI4.Widgets.MessageBox.Warning('Warning',
                                              'Directory does not exist.\n' +
                                              fileDir + '\n\nCreate it?',
                                              acceptText='Yes',
                                              cancelText='No'):
                return
            else:
                os.mkdir(fileDir)
        sceneName = os.path.join(fileDir, fileName) + '_<FN4>' + extension
    else:
        sceneName = dst
        #  sceneName = FarmAPI.GetKatanaFileName()

    # check framerange
    framerange = dependencyList['range']
    if framerange is None:
        UI4.Widgets.MessageBox.Warning('Warning', 'Add a valid framerange')
        return
    startframe = int(framerange[0])
    endframe = int(framerange[1])
    if endframe <= startframe:
        UI4.Widgets.MessageBox.Warning('Warning', 'Add a valid framerange')
        return

    # distribution check
    threadCount = int(dependencyList['useThreads'])
    if threadCount <= 0:
        UI4.Widgets.MessageBox.Warning('Warning',
                                       'You must use at least one thread')
        return
    availableThreads = multiprocessing.cpu_count()
    if (threadCount > availableThreads) and (option == 'local'):
        UI4.Widgets.MessageBox.Warning(
            'Warning',
            'Your machine is restricted to max.' + str(availableThreads))
        return
    packageSize = int(dependencyList['packageSize'])
    if packageSize <= 0:
        UI4.Widgets.MessageBox.Warning('Warning', 'Add a valid packageSize')
        return

    # denoiser post script flags
    if int(dependencyList['useRendermanDenoiserPostScript']) == 1:
        filter = dependencyList['denoiseFilter']
        filter_cmd = 'denoise -v variance -f {}'.format(filter)
        if dependencyList['useFilterOverride']:
            filter_override = dependencyList['denoiseFilterOverride']
            for override in filter_override:
                filter_cmd += '+{}'.format(override)

    # create job
    newJob = rrJob()

    if (option == 'local'):
        newJob.version = rendererVersion
    else:
        newJob.version = katanaVersion
    newJob.rendererVersionName = renderer
    newJob.rendererVersion = rendererVersion
    newJob.software = software
    newJob.renderer = renderer
    newJob.RequiredLicenses = requ_lics  #"Yeti"  # TODO
    newJob.sceneName = sceneName
    newJob.sceneDatabaseDir = ""
    newJob.seqStart = startframe
    newJob.seqEnd = endframe
    newJob.seqStep = dependencyList['stepSize']  # TODO - get dynamic
    newJob.seqFileOffset = 0
    newJob.seqFrameSet = ""
    newJob.imageWidth = 99  # TODO - get dynamic
    newJob.imageHeight = 99
    newJob.imageDir = fileDir
    newJob.imageFileName = fileName + '_####_variance.exr'
    newJob.imageFramePadding = 4  # TODO - get dynamic
    newJob.imageExtension = ""  # ".exr"  # TODO get dynamic
    newJob.imagePreNumberLetter = ""
    newJob.imageSingleOutput = False
    newJob.imageStereoR = ""
    newJob.imageStereoL = ""
    newJob.sceneOS = getOSString()  # TODO - get dynamic
    newJob.camera = ""
    newJob.layer = dependencyList['name']
    newJob.channel = ""
    newJob.maxChannels = 0
    newJob.channelFileName = []
    newJob.channelExtension = []
    newJob.isActive = False
    newJob.sendAppBit = ""
    newJob.preID = ""
    newJob.waitForPreID = ""
    if dependencyList['useRendermanDenoiserPostScript']:
        newJob.CustomA = filter_cmd
    else:
        newJob.CustomA = ""
    newJob.CustomB = "comment: {}".format(comment)
    newJob.CustomC = ""
    newJob.LocalTexturesFile = ""
    newJob.rrSubmitVersion = "%rrVersion%"
    newJob.packageSize = packageSize
    newJob.threadCount = threadCount
    newJob.renderNode = dependencyList['name']

    # write xml file
    root = newJob.writeToXMLstart(None)
    job = newJob.writeToXMLJob(root)
    newJob.writeToXMLEnd(tmpFile, root)

    # copy katanna recipie
    shutil.copy(filepath, dst)

    # submit job
    if option == 'local':
        # start control session for local conversion
        scriptDir = os.path.dirname(os.path.realpath(__file__))
        sessionScript = os.path.join(scriptDir, 'session/ControlSessions.py')
        subp = subprocess.Popen(['python', sessionScript, tmpFile.name, dst],
                                close_fds=True,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)

    elif option == 'farm':
        os.system(getRRSubmitterPath() + "  \"" + xmlFileName + "\"")