diff --git a/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_Functions.py b/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_Functions.py index 9a0e3d7..4e37b7f 100644 --- a/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_Functions.py +++ b/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_Functions.py @@ -140,8 +140,10 @@ def getExternalFiles(self, origin, isSubmitting=False): @err_decorator def preSubmit(self, origin, rSettings): if origin.chb_resOverride.isChecked(): + rSettings["resolutionpercent"] = bpy.context.scene.render.resolution_percentage rSettings["width"] = bpy.context.scene.render.resolution_x rSettings["height"] = bpy.context.scene.render.resolution_y + bpy.context.scene.render.resolution_percentage = 100 bpy.context.scene.render.resolution_x = origin.sp_resWidth.value() bpy.context.scene.render.resolution_y = origin.sp_resHeight.value() @@ -149,112 +151,128 @@ def preSubmit(self, origin, rSettings): rSettings["start"] = bpy.context.scene.frame_start rSettings["end"] = bpy.context.scene.frame_end - rSettings["fileformat"] = bpy.context.scene.render.image_settings.file_format rSettings["overwrite"] = bpy.context.scene.render.use_overwrite + rSettings["placeholder"] = bpy.context.scene.render.use_placeholder rSettings["fileextension"] = bpy.context.scene.render.use_file_extension - rSettings["resolutionpercent"] = bpy.context.scene.render.resolution_percentage - rSettings["origOutputName"] = rSettings["outputName"] + rSettings["camera"] = bpy.context.scene.camera.name + rSettings["origOutputName"] = bpy.context.scene.render.filepath + + #rSettings["fileformat"] = bpy.context.scene.render.image_settings.file_format + #rSettings["resolutionpercent"] = bpy.context.scene.render.resolution_percentage + #rSettings["origOutputName"] = rSettings["outputName"] + # bpy.context.scene.render.image_settings.file_format = "OPEN_EXR" + # bpy.context.scene.render.image_settings.color_depth = "16" + # bpy.context.scene.render.resolution_percentage = 100 + bpy.context.scene["PrismIsRendering"] = True - bpy.context.scene.render.filepath = rSettings["outputName"] - bpy.context.scene.render.image_settings.file_format = "OPEN_EXR" - bpy.context.scene.render.image_settings.color_depth = "16" + bpy.context.scene.render.use_file_extension = True + bpy.context.scene.render.use_overwrite = False + bpy.context.scene.render.use_placeholder = False bpy.context.scene.frame_start = jobFrames[0] bpy.context.scene.frame_end = jobFrames[1] - bpy.context.scene.render.use_overwrite = True - bpy.context.scene.render.use_file_extension = False - bpy.context.scene.render.resolution_percentage = 100 if origin.cb_cam.currentText() in bpy.context.scene.objects: - bpy.context.scene.camera = bpy.context.scene.objects[ - origin.cb_cam.currentText() - ] - - usePasses = False - if bpy.context.scene.node_tree is not None and bpy.context.scene.use_nodes: - outNodes = [ - x for x in bpy.context.scene.node_tree.nodes if x.type == "OUTPUT_FILE" - ] - rlayerNodes = [ - x for x in bpy.context.scene.node_tree.nodes if x.type == "R_LAYERS" - ] - - bName = os.path.splitext(os.path.basename(rSettings["outputName"])) - if bName[0].endswith(self.plugin.frameString): - bName = "%s.beauty%s%s" % (bName[0][:-5], bName[0][-5:], bName[1]) - else: - bName = "%s.beauty%s" % (bName[0], bName[1]) - rSettings["outputName"] = os.path.join( - os.path.dirname(rSettings["outputName"]), "beauty", bName - ) - - for m in outNodes: - connections = [] - for idx, i in enumerate(m.inputs): - if len(list(i.links)) > 0: - connections.append([i.links[0], idx]) - - m.base_path = os.path.dirname(rSettings["outputName"]) - - for i, idx in connections: - passName = i.from_socket.name - - if passName == "Image": - passName = "beauty" - - if i.from_node.type == "R_LAYERS": - if len(rlayerNodes) > 1: - passName = "%s_%s" % (i.from_node.layer, passName) - - else: - if hasattr(i.from_node, "label") and i.from_node.label != "": - passName = i.from_node.label - - extensions = { - "PNG": ".png", - "JPEG": ".jpg", - "JPEG2000": "jpg", - "TARGA": ".tga", - "TARGA_RAW": ".tga", - "OPEN_EXR_MULTILAYER": ".exr", - "OPEN_EXR": ".exr", - "TIFF": ".tif", - } - nodeExt = extensions[m.format.file_format] - curSlot = m.file_slots[idx] - if curSlot.use_node_format: - ext = nodeExt - else: - ext = extensions[curSlot.format.file_format] - - curSlot.path = "../%s/%s" % ( - passName, - os.path.splitext(os.path.basename(rSettings["outputName"]))[ - 0 - ].replace("beauty", passName) - + ext, - ) - newOutputPath = os.path.abspath( - os.path.join( - rSettings["outputName"], - "../..", - passName, - os.path.splitext(os.path.basename(rSettings["outputName"]))[ - 0 - ].replace("beauty", passName) - + ext, - ) - ) - if passName == "beauty": - rSettings["outputName"] = newOutputPath - usePasses = True - - if usePasses: - import platform - - if platform.system() == "Windows": - tmpOutput = os.path.join(os.environ["temp"], "PrismRender", "tmp.####.exr") - bpy.context.scene.render.filepath = tmpOutput - if not os.path.exists(os.path.dirname(tmpOutput)): - os.makedirs(os.path.dirname(tmpOutput)) + bpy.context.scene.camera = bpy.context.scene.objects[origin.cb_cam.currentText()] + + # Output Path + bName = os.path.splitext(rSettings["outputName"])[0] + + if not bName.endswith(self.plugin.frameString): + bName += self.plugin.frameString + + bName += bpy.context.scene.render.file_extension + rSettings["outputName"] = bName + bpy.context.scene.render.filepath = rSettings["outputName"] + + if not os.path.exists(os.path.dirname(rSettings["outputName"])): + os.makedirs(os.path.dirname(rSettings["outputName"])) + + # usePasses = False + # if bpy.context.scene.node_tree is not None and bpy.context.scene.use_nodes: + # outNodes = [ + # x for x in bpy.context.scene.node_tree.nodes if x.type == "OUTPUT_FILE" + # ] + # rlayerNodes = [ + # x for x in bpy.context.scene.node_tree.nodes if x.type == "R_LAYERS" + # ] + + # bName = os.path.splitext(os.path.basename(rSettings["outputName"])) + # if bName[0].endswith(self.plugin.frameString): + # bName = "%s.beauty%s%s" % (bName[0][:-5], bName[0][-5:], bName[1]) + # else: + # bName = "%s.beauty%s" % (bName[0], bName[1]) + # rSettings["outputName"] = os.path.join( + # os.path.dirname(rSettings["outputName"]), "beauty", bName + # ) + + # for m in outNodes: + # connections = [] + # for idx, i in enumerate(m.inputs): + # if len(list(i.links)) > 0: + # connections.append([i.links[0], idx]) + + # m.base_path = os.path.dirname(rSettings["outputName"]) + + # for i, idx in connections: + # passName = i.from_socket.name + + # if passName == "Image": + # passName = "beauty" + + # if i.from_node.type == "R_LAYERS": + # if len(rlayerNodes) > 1: + # passName = "%s_%s" % (i.from_node.layer, passName) + + # else: + # if hasattr(i.from_node, "label") and i.from_node.label != "": + # passName = i.from_node.label + + # extensions = { + # "PNG": ".png", + # "JPEG": ".jpg", + # "JPEG2000": "jpg", + # "TARGA": ".tga", + # "TARGA_RAW": ".tga", + # "OPEN_EXR_MULTILAYER": ".exr", + # "OPEN_EXR": ".exr", + # "TIFF": ".tif", + # } + # nodeExt = extensions[m.format.file_format] + # curSlot = m.file_slots[idx] + # if curSlot.use_node_format: + # ext = nodeExt + # else: + # ext = extensions[curSlot.format.file_format] + + # curSlot.path = "../%s/%s" % ( + # passName, + # os.path.splitext(os.path.basename(rSettings["outputName"]))[ + # 0 + # ].replace("beauty", passName) + # + ext, + # ) + # newOutputPath = os.path.abspath( + # os.path.join( + # rSettings["outputName"], + # "../..", + # passName, + # os.path.splitext(os.path.basename(rSettings["outputName"]))[ + # 0 + # ].replace("beauty", passName) + # + ext, + # ) + # ) + # if passName == "beauty": + # rSettings["outputName"] = newOutputPath + # usePasses = True + + # if usePasses: + # import platform + + # if platform.system() == "Windows": + # tmpOutput = os.path.join(os.environ["temp"], "PrismRender", "tmp.####.png") + # bpy.context.scene.render.filepath = tmpOutput + # if not os.path.exists(os.path.dirname(tmpOutput)): + # os.makedirs(os.path.dirname(tmpOutput)) @err_decorator def undoRenderSettings(self, origin, rSettings): @@ -266,14 +284,18 @@ def undoRenderSettings(self, origin, rSettings): bpy.context.scene.frame_start = rSettings["start"] if "end" in rSettings: bpy.context.scene.frame_end = rSettings["end"] - if "fileformat" in rSettings: - bpy.context.scene.render.image_settings.file_format = rSettings["fileformat"] - if "overwrite" in rSettings: - bpy.context.scene.render.use_overwrite = rSettings["overwrite"] if "fileextension" in rSettings: bpy.context.scene.render.use_file_extension = rSettings["fileextension"] if "resolutionpercent" in rSettings: bpy.context.scene.render.resolution_percentage = rSettings["resolutionpercent"] + if "overwrite" in rSettings: + bpy.context.scene.render.use_overwrite = rSettings["overwrite"] + if "placeholder" in rSettings: + bpy.context.scene.render.use_placeholder = rSettings["placeholder"] + if "camera" in rSettings: + bpy.context.scene.camera = bpy.context.scene.objects[rSettings["camera"]] + if "origOutputName" in rSettings: + bpy.context.scene.render.filepath = rSettings["origOutputName"] @err_decorator def preSubmitChecks(self, origin, jobData): diff --git a/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_externalAccess_Functions.py b/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_externalAccess_Functions.py index 0b2a33a..6e832ee 100644 --- a/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_externalAccess_Functions.py +++ b/Pandora/Plugins/Apps/Blender/Scripts/Pandora_Blender_externalAccess_Functions.py @@ -152,49 +152,49 @@ def startJob(self, origin, jobData={}): bpy.ops.file.unpack_all(method='USE_LOCAL') bpy.ops.file.find_missing_files(\'EXEC_DEFAULT\', directory=\'%s\') -usePasses = False -if bpy.context.scene.node_tree is not None and bpy.context.scene.use_nodes: - outNodes = [x for x in bpy.context.scene.node_tree.nodes if x.type == 'OUTPUT_FILE'] - rlayerNodes = [x for x in bpy.context.scene.node_tree.nodes if x.type == 'R_LAYERS'] +# usePasses = False +# if bpy.context.scene.node_tree is not None and bpy.context.scene.use_nodes: +# outNodes = [x for x in bpy.context.scene.node_tree.nodes if x.type == 'OUTPUT_FILE'] +# rlayerNodes = [x for x in bpy.context.scene.node_tree.nodes if x.type == 'R_LAYERS'] - for m in outNodes: - connections = [] - for idx, i in enumerate(m.inputs): - if len(list(i.links)) > 0: - connections.append([i.links[0], idx]) +# for m in outNodes: +# connections = [] +# for idx, i in enumerate(m.inputs): +# if len(list(i.links)) > 0: +# connections.append([i.links[0], idx]) - m.base_path = os.path.dirname("%s") +# m.base_path = os.path.dirname("%s") - for i, idx in connections: - passName = i.from_socket.name +# for i, idx in connections: +# passName = i.from_socket.name - if passName == "Image": - passName = "beauty" +# if passName == "Image": +# passName = "beauty" - if i.from_node.type == "R_LAYERS": - if len(rlayerNodes) > 1: - passName = "%%s_%%s" %% (i.from_node.layer, passName) - - else: - if hasattr(i.from_node, "label") and i.from_node.label != "": - passName = i.from_node.label - - extensions = {"PNG": ".png", "JPEG": ".jpg", "JPEG2000": "jpg", "TARGA": ".tga", "TARGA_RAW": ".tga", "OPEN_EXR_MULTILAYER": ".exr", "OPEN_EXR": ".exr", "TIFF": ".tif" } - nodeExt = extensions[m.format.file_format] - curSlot = m.file_slots[idx] - if curSlot.use_node_format: - ext = nodeExt - else: - ext = extensions[curSlot.format.file_format] +# if i.from_node.type == "R_LAYERS": +# if len(rlayerNodes) > 1: +# passName = "%%s_%%s" %% (i.from_node.layer, passName) + +# else: +# if hasattr(i.from_node, "label") and i.from_node.label != "": +# passName = i.from_node.label + +# extensions = {"PNG": ".png", "JPEG": ".jpg", "JPEG2000": "jpg", "TARGA": ".tga", "TARGA_RAW": ".tga", "OPEN_EXR_MULTILAYER": ".exr", "OPEN_EXR": ".exr", "TIFF": ".tif" } +# nodeExt = extensions[m.format.file_format] +# curSlot = m.file_slots[idx] +# if curSlot.use_node_format: +# ext = nodeExt +# else: +# ext = extensions[curSlot.format.file_format] -# curSlot.path = "../%%s/%%s" %% (passName, os.path.splitext(os.path.basename("%s"))[0].replace("beauty", passName) + ext) - usePasses = True - -if usePasses: - tmpOutput = os.path.join(os.environ["temp"], "PrismRender", "tmp.####.exr") - bpy.context.scene.render.filepath = tmpOutput - if not os.path.exists(os.path.dirname(tmpOutput)): - os.makedirs(os.path.dirname(tmpOutput)) +# # # curSlot.path = "../%%s/%%s" %% (passName, os.path.splitext(os.path.basename("%s"))[0].replace("beauty", passName) + ext) +# usePasses = True + +# if usePasses: +# tmpOutput = os.path.join(os.environ["temp"], "PrismRender", "tmp.####.exr") +# bpy.context.scene.render.filepath = tmpOutput +# if not os.path.exists(os.path.dirname(tmpOutput)): +# os.makedirs(os.path.dirname(tmpOutput)) bpy.ops.wm.save_mainfile() diff --git a/Pandora/Scripts/PandoraCore.py b/Pandora/Scripts/PandoraCore.py index bc3c457..63542bb 100644 --- a/Pandora/Scripts/PandoraCore.py +++ b/Pandora/Scripts/PandoraCore.py @@ -855,33 +855,34 @@ def getConfig( self.createUserPrefs() with open(configPath, "r") as f: userConfig = json.load(f) - else: - warnStr = ( - "Cannot read the following file:\n\n%s\n\nDo you want to delete the corrupt file?" - % configPath - ) - msg = QMessageBox( - QMessageBox.Warning, - "Warning", - warnStr, - QMessageBox.Cancel, - parent=self.messageParent, - ) - msg.addButton("Delete", QMessageBox.YesRole) - msg.addButton("Open file", QMessageBox.YesRole) - action = msg.exec_() - - if action == 0: - try: - os.remove(configPath) - except Exception as e: - QMessageBox.warning( - self.messageParent, - "Pandora", - "Could not delete file:\n\n%s\n\n%s" % (configPath, str(e)), - ) - elif action == 1: - self.openFile(configPath) + # else: + # warnStr = ( + # "Cannot read the following file:\n\n%s\n\nDo you want to delete the corrupt file?" + # % configPath + # ) + # self.PandoraTray.trayIcon.showMessage(warnStr) + # msg = QMessageBox( + # QMessageBox.Warning, + # "Warning", + # warnStr, + # QMessageBox.Cancel, + # parent=self.messageParent, + # ) + # msg.addButton("Delete", QMessageBox.YesRole) + # msg.addButton("Open file", QMessageBox.YesRole) + # action = msg.exec_() + + # if action == 0: + # try: + # os.remove(configPath) + # except Exception as e: + # QMessageBox.warning( + # self.messageParent, + # "Pandora", + # "Could not delete file:\n\n%s\n\n%s" % (configPath, str(e)), + # ) + # elif action == 1: + # self.openFile(configPath) if getConf: return userConfig diff --git a/Pandora/Scripts/PandoraSlave.py b/Pandora/Scripts/PandoraSlave.py index b0b5253..8018c72 100644 --- a/Pandora/Scripts/PandoraSlave.py +++ b/Pandora/Scripts/PandoraSlave.py @@ -367,7 +367,7 @@ def createTrayIcon(self): self.trayIcon = QSystemTrayIcon() self.trayIcon.setContextMenu(self.trayIconMenu) - self.trayIcon.setToolTip(" Pandora RenderSlave") + self.trayIcon.setToolTip("RenderSlave - " + self.slaveState) self.trayIcon.activated.connect(self.trayActivated) @@ -376,7 +376,7 @@ def createTrayIcon(self): os.path.join( os.path.dirname(os.path.abspath(__file__)), "UserInterfacesPandora", - "pandora_slave.ico", + "pandora_slave_" + self.slaveState + ".ico", ) ) @@ -387,7 +387,7 @@ def createTrayIcon(self): @err_decorator def trayActivated(self, reason): if reason == QSystemTrayIcon.Context: - statusText = "Status:\n%s" % self.slaveState + statusText = "Status: %s" % self.slaveState if self.slaveState == "paused": pauseMin = QDateTime.currentDateTime().secsTo(self.pauseEnd) // 60 hourPause = pauseMin // 60 @@ -396,10 +396,12 @@ def trayActivated(self, reason): statusText += " (%sh %smin.)" % (hourPause, pauseMin) else: statusText += " (%s min.)" % pauseMin + elif self.slaveState == "rendering": + for task in self.curTasks: + statusText += "\n" + task["program"] + ": " + task["projectName"] + "-" + task["jobname"] +" (Frames " + str(task["taskStartframe"]) + "-" + str(task["taskEndframe"]) + ")" self.enableAction.setChecked(self.slaveState != "disabled") - statusText += "\n" self.statusLabel.setText(statusText) # called from the tray icon. Forces the slave to emmediatly check for renderjobs/commands @@ -781,6 +783,25 @@ def setState(self, state): "status", section="slaveinfo", setval=True, value=self.slaveState ) + self.slaveIcon = QIcon( + os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "UserInterfacesPandora", + "pandora_slave_" + self.slaveState + ".ico", + ) + ) + + self.trayIcon.setIcon(self.slaveIcon) + self.setWindowIcon(self.slaveIcon) + tooltip = "" + if self.slaveState == "rendering": + for task in self.curTasks: + tooltip += "Rendering " + task["program"] + ": " + task["projectName"] + "-" + task["jobname"] +" (Frames " + str(task["taskStartframe"]) + "-" + str(task["taskEndframe"]) + ")\n" + else: + tooltip = "RenderSlave - " + self.slaveState + + self.trayIcon.setToolTip(tooltip) + # checks if the slave can start rendering @err_decorator def checkAssignments(self): @@ -1147,7 +1168,7 @@ def preRenderCheck(self): if not self.maxTasks: self.getConfSetting("maxConcurrentTasks", setval=True, value=self.maxTasks) self.maxTasks = self.getConfSetting("maxConcurrentTasks") - self.writeLog(self.maxTasks, 2) + # self.writeLog(self.maxTasks, 2) if len(concurrent) >= min(concurrent) or len(concurrent) >= self.maxTasks: self.writeLog("maximum concurrent tasks reached") @@ -1543,7 +1564,7 @@ def stopRender(self, tasks=None, msgPressed=False): if self.slaveState == "rendering": self.setState("idle") - self.writeLog("stopRender - msgPressed = %s" % msgPressed, 1) + self.writeLog("stopRender - msgPressed = %s" % msgPressed, 0) if msgPressed: self.pauseSlave(60, stop=False) @@ -1631,7 +1652,7 @@ def checkForUpdates(self): def startRenderThread(self, pOpenArgs, jData, prog, decode=False): def runInThread(popenArgs, jobData, prog, decode): try: - self.writeLog("call " + prog, 1) + self.writeLog("call " + prog, 0) self.writeLog(popenArgs, 0) jobData["renderProc"] = subprocess.Popen( popenArgs, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True @@ -1651,15 +1672,17 @@ def readStdout(jobData, prog, decode): else: logLevel = 1 - # reduce blender logdata - if ( - prog == "blender" - and line.startswith("Fra:") - and " | Time:" in line in line - ): - continue + # make blender logdata debug only + if (prog == "blender"): + if (line.startswith("Fra:") or line.startswith("| Time:") or line.startswith("Compositing") or line.startswith("Read blend:") or line.startswith("Read prefs:") or line.startswith("Info:") or line.startswith("No addon key") or line.startswith("Blender quit")): + if (", Sample " in line): + continue + else: + logLevel = 0 + else: + logLevel = 1 - self.writeLog(line.strip(), logLevel) + self.writeLog(prog.upper() + ": " + line.strip(), logLevel) except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() @@ -1687,20 +1710,20 @@ def readStderr(jobData, prog, decode): line = "stderr - " + line if prog == "max": - self.writeLog(line, 2) + self.writeLog(prog.upper() + ": " + line, 2) elif prog == "maya": if ( " (kInvalidParameter): No element at given index" in line ): - self.writeLog(line, 1) + self.writeLog(prog.upper() + ": " + line, 1) else: - self.writeLog(line, 2) + self.writeLog(prog.upper() + ": " + line, 2) elif prog == "houdini": if "Unable to load HFS OpenCL platform." in line: - self.writeLog(line, 1) + self.writeLog(prog.upper() + ": " + line, 1) else: - self.writeLog(line, 2) + self.writeLog(prog.upper() + ": " + line, 2) elif prog == "blender": if ( ( @@ -1714,13 +1737,13 @@ def readStderr(jobData, prog, decode): and "appears twice, correcting" in line ) ): - self.writeLog(line, 1) + self.writeLog(prog.upper() + ": " + line, 1) else: - self.writeLog(line, 2) + self.writeLog(prog.upper() + ": " + line, 2) else: - self.writeLog(line, 3) + self.writeLog(prog.upper() + ": " + line, 3) self.taskFailed = True - + except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() self.writeLog( @@ -1779,21 +1802,19 @@ def finishedJob(self, task): if self.interrupted: self.writeLog( - "rendering interrupted - %s - %s" % (task["taskname"], task["jobname"]), 2 + "rendering interrupted: %s - %s" % (task["taskname"], task["jobname"]), 2 ) elif self.taskFailed: self.writeLog( - "rendering failed - %s - %s" % (task["taskname"], task["jobname"]), 3 + "rendering failed: %s - %s" % (task["taskname"], task["jobname"]), 3 ) elif not hasNewOutput: self.writeLog( - "rendering didn't produce any output - %s - %s" - % (task["taskname"], task["jobname"]), - 3, + "rendering didn't produce any output: %s - %s" % (task["taskname"], task["jobname"]), 2 ) else: self.writeLog( - "rendering finished - %s - %s" % (task["taskname"], task["jobname"]), 1 + "rendering finished: %s - %s" % (task["taskname"], task["jobname"]), 0 ) if ( @@ -1859,7 +1880,7 @@ def finishedJob(self, task): ) outputNum = -1 - if self.taskFailed or not hasNewOutput: + if self.taskFailed: status = "error" taskResult = "failed" else: @@ -1897,7 +1918,7 @@ def finishedJob(self, task): self.setState("idle") - self.writeLog("task " + taskResult, 1) + self.writeLog("task " + taskResult + ": %s - %s" % (task["taskname"], task["jobname"]), 1) if self.interrupted: self.interrupted = False diff --git a/Pandora/Scripts/PandoraSubmitter.py b/Pandora/Scripts/PandoraSubmitter.py index 64e7df9..0e8ddc4 100644 --- a/Pandora/Scripts/PandoraSubmitter.py +++ b/Pandora/Scripts/PandoraSubmitter.py @@ -348,14 +348,15 @@ def startSubmission(self): ) return - outputName = os.path.join( - os.path.dirname(self.e_outputpath.text()), - "%s%s.exr" - % ( - os.path.splitext(os.path.basename(self.e_outputpath.text()))[0], - self.core.appPlugin.frameString, - ), - ) + outputName = self.e_outputpath.text() + # outputName = os.path.join( + # os.path.dirname(self.e_outputpath.text()), + # "%s%s.exr" + # % ( + # os.path.splitext(os.path.basename(self.e_outputpath.text()))[0], + # self.core.appPlugin.frameString, + # ), + # ) rSettings = {"outputName": outputName} diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_disabled.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_disabled.ico new file mode 100644 index 0000000..5cd8f7f Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_disabled.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_idle.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_idle.ico new file mode 100644 index 0000000..f958fff Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_idle.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_paused.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_paused.ico new file mode 100644 index 0000000..7e5bf7c Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_paused.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_rendering.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_rendering.ico new file mode 100644 index 0000000..f16e5f4 Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_rendering.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_rest.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_rest.ico new file mode 100644 index 0000000..f958fff Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_rest.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_restarting.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_restarting.ico new file mode 100644 index 0000000..9d8dd5a Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_restarting.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_shut down.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_shut down.ico new file mode 100644 index 0000000..9d8dd5a Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_shut down.ico differ diff --git a/Pandora/Scripts/UserInterfacesPandora/pandora_slave_userActive.ico b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_userActive.ico new file mode 100644 index 0000000..f958fff Binary files /dev/null and b/Pandora/Scripts/UserInterfacesPandora/pandora_slave_userActive.ico differ