def toggle(knob): """ "Inverts" some flags on the selected nodes. What this really does is set all of them to the same value, by finding the majority value and using the inverse of that.""" value = 0 n = nuke.selectedNodes() for i in n: try: val = i.knob(knob).value() if val: value += 1 else: value -= 1 except: pass status = value < 0 for i in n: if not nuke.exists(i.name()+"."+knob): continue knobbie = i.knob(knob) knobbie_str = i.name()+"."+knob size = nuke.animation(knobbie_str, "size") if size is not None and int(size) > 0: knobbie.setKeyAt(nuke.frame()) knobbie.setValue(status) else: knobbie.setValue(status) nuke.modified(True)
def restartNuke(): if nuke.ask('Are you sure you want to restart Nuke?'): scriptName = nuke.root().knob('name').getValue() subprocess_options = {"shell": True} separate_terminal_options = { "close_fds": True, "preexec_fn": os.setsid } if nuke.env['nukex'] == True: session = '--nukex' else: session = '--nuke' if 'REZ_VOLT_SESSION_ROOT' in os.environ: subprocess_options.update(separate_terminal_options) if os.path.isfile(scriptName): nuke.scriptSave() launch_cmd = '{} {} {}'.format(sys.executable, session, scriptName) subprocess.Popen(launch_cmd, **subprocess_options) nuke.modified(False) nuke.scriptExit() else: nuke.scriptNew('') nuke.modified(False) nuke.scriptExit()
def restartNuke(): """ Restarts Nuke. :return: None """ # https://community.foundry.com/discuss/topic/135555/ nuke.scriptNew('') nuke.modified(False) # doesn't ask for saving nuke.scriptExit()
def backup_autosave(): global next_autosave_version #get autosave file autosave_file = nuke.toNode("preferences")["AutoSaveName"].evaluate() #compute next autosave file name file = autosave_file + str(next_autosave_version) #check if original autosave file exists if os.path.exists(autosave_file): try: shutil.copy(autosave_file, file) except: pass # A message box every time it can't find an autosave file is irritating AF # nuke.message("Attention! Autosave file could not be copied!") nuke.tprint("Copied autosave file to: %s"%file) #start from the beginning if max files are reached if next_autosave_version==max_autosave_files: next_autosave_version=0 else: next_autosave_version+=1 elif nuke.Root()['name'].value(): #warn if there is no autosave at all has_autosave=False for i in range(max_autosave_files): if os.path.exists(autosave_file + str(i)): has_autosave=True if not has_autosave and nuke.modified(): pass
def hasModification(cls): """ Return a boolean telling if the scene has modifications. This is used to decide if the scene needs to be saved. """ return nuke.modified()
def color_nodes(): """Set all selected nodes to be the same colour as the first selected node.""" n = nuke.selectedNode() if n is None: nuke.message("No node selected") return c = n.knob("tile_color") c = nuke.getColor(c.value()) n.knob("tile_color").setValue(c) # get other nodes: n = nuke.selectedNodes() for i in n: i.knob("tile_color").setValue(c) nuke.modified(True)
def check(): ok = True if nuke.modified(): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText("File is not saved continue?") msg.setWindowTitle("Continue?") msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) ret = msg.exec_() ok = ret == 1024 return ok
def camera_up(): """All new camera_up that uses the version_get/set functions. This script takes the render camera up one in selected iread/writes. Camera may be _c# or _p# for previs camera number""" n = nuke.selectedNodes() for i in n: _class = i.Class() if _class == "Read" or _class == "Write": name = nuke.filename(i) if name is not None: (prefix, v) = nukescripts.version_get(name, "[cp]") if v is not None: # use expression instead of expr so 0 prefix does not make octal # format result so it has 2 digits v = str("%(#)02d" % {"#": int(nuke.expression(v + "+1"))}) i.knob("file").setValue( nukescripts.version_set( i.knob("file").value(), prefix, v)) i.knob("proxy").setValue( nukescripts.version_set( i.knob("proxy").value(), prefix, v)) nuke.modified(True)
def renderNodes(nodes, fparams, storeframes): global af af = __import__('af', globals(), locals(), []) scenepath = nuke.root().name() if scenepath == 'Root': scenepath = os.getenv('NUKE_AF_TMPSCENE', 'tmp') scenepath = os.path.abspath(scenepath) scenename = os.path.basename(scenepath) ftime = time.time() tmp_suffix = time.strftime('.%m%d-%H%M%S-') + str(ftime - int(ftime))[2:5] renderscenename = scenepath + tmp_suffix jobsparameters = [] for node in nodes: newjobparameters = [] newjobparameters = None if node.Class() == AfanasyNodeClassName: oldparams = dict() for key in fparams: oldparams[key] = node.knob(key).value() node.knob(key).setValue(fparams[key]) newjobparameters = getJobsParameters(node, scenename, dict()) if newjobparameters is None: return if not storeframes: for key in oldparams: node.knob(key).setValue(oldparams[key]) if node.Class() == RenderNodeClassName \ or node.Class() == DailiesNodeClassName: blocksparameters = [] bparams = BlockParameters(None, node, False, '', fparams) if not bparams.valid: return blocksparameters.append(bparams) jobparams = JobParameters(None, scenename, blocksparameters, fparams) if not jobparams.valid: return newjobparameters = [jobparams] if newjobparameters is None: if VERBOSE: print('Job(s) parameters generation error on "%s"' % node.name()) return if len(newjobparameters) > 0: jobsparameters.extend(newjobparameters) jobs = [] for jobparams in jobsparameters: job = jobparams.genJob(renderscenename) if job is None: if VERBOSE: print('Job generatiton error on "%s"' % jobparams.nodename) return jobs.append(job) if len(jobs) == 0: nuke.message('No jobs generated.') return cgrupathmap = __import__('cgrupathmap', globals(), locals(), []) pm = cgrupathmap.PathMap(UnixSeparators=True, Verbose=False) changed = nuke.modified() for i in range(len(jobs)): scenename = jobsparameters[i].scenename if jobsparameters[i].pathsmap and pm.initialized: pm_scenename = scenename + '.pm' nuke.scriptSave(pm_scenename) pm.toServerFile( pm_scenename, scenename, SearchStrings=['file ', 'font ', 'project_directory '], Verbose=False ) os.remove(pm_scenename) else: nuke.scriptSave(scenename) if not jobs[i].send()[0]: nuke.message('Unable to send job to server.') os.remove(scenename) break time.sleep(0.1) nuke.modified(changed)
def isSceneModified(self): """Checks the currently open scene saved or not""" logger.debug("Func: isSceneModified") return nuke.modified()
def __init__(self): """ Initializes a ZyncRenderPanel """ # make sure this isn't an unsaved script if nuke.root().name() == "Root" or nuke.modified(): msg = "Please save your script before rendering on ZYNC." raise Exception(msg) nukescripts.panels.PythonPanel.__init__(self, 'ZYNC Render', 'com.atomicfiction.zyncRender') if platform.system() in ('Windows', 'Microsoft'): self.usernameDefault = os.environ['USERNAME'] else: self.usernameDefault = os.environ['USER'] #GET WRITE NODES FROM FILE self.writeDict = dict() self.update_write_dict() # CREATE KNOBS proj_response = ZYNC.get_project_list() if proj_response['code'] != 0: nuke.message(proj_response['response']) return self.existing_project = nuke.Enumeration_Knob('existing_project', 'Existing Project:', [' ']+proj_response['response']) self.new_project = nuke.String_Knob('project', ' New Project:') self.new_project.clearFlag(nuke.STARTLINE) self.upload_only = nuke.Boolean_Knob('upload_only', 'Upload Only') self.upload_only.setFlag(nuke.STARTLINE) self.parent_id = nuke.String_Knob('parent_id', 'Parent ID:') self.parent_id.setValue("") # create shotgun controls - they'll only be added if shotgun integration # is enabled. self.sg_create_version = nuke.Boolean_Knob('sg_create_version', 'Create Shotgun Version') self.sg_create_version.setFlag(nuke.STARTLINE) self.sg_create_version.setValue(False) self.sg_user = nuke.String_Knob('sg_user', 'Shotgun User:'******'sg_project', 'Shotgun Project:') self.sg_project.setFlag(nuke.STARTLINE) self.sg_shot = nuke.String_Knob('sg_shot', 'Shotgun Shot:') self.sg_shot.setFlag(nuke.STARTLINE) self.sg_version_code = nuke.String_Knob('sg_version_code', 'Version Code:') self.sg_version_code.setFlag(nuke.STARTLINE) script_base, ext = os.path.splitext(os.path.basename(nuke.root().knob('name').getValue())) self.sg_version_code.setValue( script_base ) self.hideSGControls() self.priority = nuke.Int_Knob('priority', 'Job Priority:') self.priority.setDefaultValue((50,)) self.num_slots = nuke.Int_Knob('num_slots', 'Num. Slots:') self.num_slots.setDefaultValue((1,)) self.only_running = nuke.Boolean_Knob('only_running', 'Only Use Running Slots') type_list = [] non_default = [] for inst_type in ZYNC.INSTANCE_TYPES: if inst_type == zync.DEFAULT_INSTANCE_TYPE: type_list.append( '%s (%s)' % ( inst_type, ZYNC.INSTANCE_TYPES[inst_type]["description"] ) ) else: non_default.append( '%s (%s)' % ( inst_type, ZYNC.INSTANCE_TYPES[inst_type]["description"] ) ) for label in non_default: type_list.append( label ) self.instance_type = nuke.Enumeration_Knob( 'instance_type', 'Type:', type_list ) self.skip_check = nuke.Boolean_Knob('skip_check', 'Skip File Check') self.skip_check.setFlag(nuke.STARTLINE) self.notify_complete = nuke.Boolean_Knob('notify_complete', 'Notify When Complete') self.notify_complete.setFlag(nuke.STARTLINE) first = nuke.root().knob('first_frame').value() last = nuke.root().knob('last_frame').value() frange = '%d-%d' % (first, last) self.frange = nuke.String_Knob('frange', 'Frame Range:', frange) self.fstep = nuke.Int_Knob('fstep', 'Frame Step:') self.fstep.setDefaultValue((1,)) selected_write_nodes = [] for node in nuke.selectedNodes(): if node.Class() == "Write": selected_write_nodes.append( node.name() ) self.writeNodes = [] colNum = 1 for writeName in self.writeListNames: knob = nuke.Boolean_Knob( writeName, writeName ) if len(selected_write_nodes) == 0: knob.setValue(True) elif writeName in selected_write_nodes: knob.setValue(True) else: knob.setValue(False) if colNum == 1: knob.setFlag( nuke.STARTLINE ) if colNum > 3: colNum = 1 else: colNum += 1 knob.setTooltip( self.writeDict[writeName].knob("file").value() ) self.writeNodes.append( knob ) self.chunk_size = nuke.Int_Knob('chunk_size', 'Chunk Size:') self.chunk_size.setDefaultValue((10,)) # ADD KNOBS self.addKnob(self.existing_project) self.addKnob(self.new_project) self.addKnob(self.parent_id) if "shotgun" in ZYNC.FEATURES and ZYNC.FEATURES["shotgun"] == 1: self.addKnob(self.sg_create_version) self.addKnob(self.sg_user) self.addKnob(self.sg_project) self.addKnob(self.sg_shot) self.addKnob(self.sg_version_code) self.addKnob(self.upload_only) self.addKnob(self.priority) self.addKnob(self.num_slots) self.addKnob(self.only_running) self.addKnob(self.instance_type) self.addKnob(self.skip_check) self.addKnob(self.notify_complete) self.addKnob(self.frange) self.addKnob(self.fstep) for k in self.writeNodes: self.addKnob( k ) self.addKnob(self.chunk_size) # collect render-specific knobs for iterating on later self.render_knobs = (self.num_slots, self.instance_type, self.frange, self.fstep, self.chunk_size, self.skip_check, self.only_running, self.priority, self.parent_id) if "shotgun" in ZYNC.FEATURES and ZYNC.FEATURES["shotgun"] == 1: height = 450 else: height = 350 self.setMinimumSize( 400, height )
def __init__(self): if nuke.root().name() == 'Root' or nuke.modified(): msg = 'Please save your script before rendering on Zync.' raise Exception(msg) self.zync_conn = zync.Zync(application='nuke') nukescripts.panels.PythonPanel.__init__(self, 'Zync Render', 'com.google.zync') if platform.system() in ('Windows', 'Microsoft'): self.usernameDefault = os.environ['USERNAME'] else: self.usernameDefault = os.environ['USER'] # Get write nodes from scene self.writeListNames = [] self.writeDict = dict() self.update_write_dict() # Create UI knobs self.num_slots = nuke.Int_Knob('num_slots', 'Num. Machines:') self.num_slots.setDefaultValue((1,)) sorted_types = [t for t in self.zync_conn.INSTANCE_TYPES] sorted_types.sort(self.zync_conn.compare_instance_types) display_list = [] for inst_type in sorted_types: inst_desc = self.zync_conn.INSTANCE_TYPES[inst_type]['description'].replace(', preemptible', '') label = '%s (%s)' % (inst_type, inst_desc) inst_type_base = inst_type.split(' ')[-1] pricing_key = 'CP-ZYNC-%s-NUKE' % (inst_type_base.upper(),) if 'PREEMPTIBLE' in inst_type.upper(): pricing_key += '-PREEMPTIBLE' if (pricing_key in self.zync_conn.PRICING['gcp_price_list'] and 'us' in self.zync_conn.PRICING['gcp_price_list'][ pricing_key]): label += ' $%s/hr' % (self.zync_conn.PRICING['gcp_price_list'][pricing_key]['us'],) display_list.append(label) self.instance_type = nuke.Enumeration_Knob('instance_type', 'Type:', display_list) self.pricing_label = nuke.Text_Knob('pricing_label', '') self.pricing_label.setValue('Est. Cost per Hour: Not Available') calculator_link = nuke.Text_Knob('calculator_link', '') calculator_link.setValue('<a style="color:#ff8a00;" ' + 'href="http://zync.cloudpricingcalculator.appspot.com">Cost Calculator</a>') proj_response = self.zync_conn.get_project_list() existing_projects = [' '] + [p['name'] for p in proj_response] self.existing_project = nuke.Enumeration_Knob('existing_project', 'Existing Project:', existing_projects) self.new_project = nuke.String_Knob('project', ' New Project:') self.new_project.clearFlag(nuke.STARTLINE) self.upload_only = nuke.Boolean_Knob('upload_only', 'Upload Only') self.upload_only.setFlag(nuke.STARTLINE) self.parent_id = nuke.String_Knob('parent_id', 'Parent ID:') self.parent_id.setValue('') self.priority = nuke.Int_Knob('priority', 'Job Priority:') self.priority.setDefaultValue((50,)) self.skip_check = nuke.Boolean_Knob('skip_check', 'Skip File Sync') self.skip_check.setFlag(nuke.STARTLINE) first = nuke.root().knob('first_frame').value() last = nuke.root().knob('last_frame').value() frange = '%d-%d' % (first, last) self.frange = nuke.String_Knob('frange', 'Frame Range:', frange) self.fstep = nuke.Int_Knob('fstep', 'Frame Step:') self.fstep.setDefaultValue((1,)) selected_write_nodes = [] for node in nuke.selectedNodes(): if node.Class() == 'Write': selected_write_nodes.append(node.name()) self.writeNodes = [] col_num = 1 for writeName in self.writeListNames: knob = nuke.Boolean_Knob(writeName, writeName) if len(selected_write_nodes) == 0: knob.setValue(True) elif writeName in selected_write_nodes: knob.setValue(True) else: knob.setValue(False) if col_num == 1: knob.setFlag(nuke.STARTLINE) if col_num > 3: col_num = 1 else: col_num += 1 knob.setTooltip(self.writeDict[writeName].knob('file').value()) self.writeNodes.append(knob) self.chunk_size = nuke.Int_Knob('chunk_size', 'Chunk Size:') self.chunk_size.setDefaultValue((10,)) # controls for logging in and out self.loginButton = nuke.Script_Knob('login', 'Login With Google') self.logoutButton = nuke.Script_Knob('logout', 'Logout') # keep everything on the same line self.logoutButton.clearFlag(nuke.STARTLINE) self.userLabel = nuke.Text_Knob('user_label', '') self.userLabel.setValue(' %s' % self.zync_conn.email) self.userLabel.clearFlag(nuke.STARTLINE) # these buttons must be named okButton and cancelButton for Nuke to add default OK/Cancel functionality. # if named something else, Nuke will add its own default buttons. self.okButton = nuke.Script_Knob('submit', 'Submit Job') self.cancelButton = nuke.Script_Knob('cancel', 'Cancel') self.addKnob(self.num_slots) self.addKnob(self.instance_type) self.addKnob(self.pricing_label) self.addKnob(calculator_link) self.addKnob(ZyncRenderPanel._get_divider()) self.addKnob(self.existing_project) self.addKnob(self.new_project) self.addKnob(self.parent_id) self.addKnob(self.upload_only) self.addKnob(self.priority) self.addKnob(self.skip_check) self.addKnob(self.frange) self.addKnob(self.fstep) for k in self.writeNodes: self.addKnob(k) self.addKnob(self.chunk_size) self.addKnob(ZyncRenderPanel._get_divider()) self.addKnob(self.loginButton) self.addKnob(self.logoutButton) self.addKnob(self.userLabel) self.addKnob(ZyncRenderPanel._get_divider()) self.addKnob(self.okButton) self.addKnob(self.cancelButton) # Collect render-specific knobs for iterating on later self.render_knobs = ( self.num_slots, self.instance_type, self.frange, self.fstep, self.chunk_size, self.skip_check, self.priority, self.parent_id) self.setMinimumSize(600, 410) self.update_pricing_label()
def __init__(self): # make sure this isn't an unsaved script if nuke.root().name() == 'Root' or nuke.modified(): msg = 'Please save your script before rendering on Zync.' raise Exception(msg) nukescripts.panels.PythonPanel.__init__(self, 'Zync Render', 'com.google.zync') if platform.system() in ('Windows', 'Microsoft'): self.usernameDefault = os.environ['USERNAME'] else: self.usernameDefault = os.environ['USER'] #GET WRITE NODES FROM FILE self.writeDict = dict() self.update_write_dict() # CREATE KNOBS self.num_slots = nuke.Int_Knob('num_slots', 'Num. Machines:') self.num_slots.setDefaultValue((1,)) sorted_types = [t for t in ZYNC.INSTANCE_TYPES] sorted_types.sort(ZYNC.compare_instance_types) display_list = [] for inst_type in sorted_types: label = '%s (%s)' % (inst_type, ZYNC.INSTANCE_TYPES[inst_type]['description']) pricing_key = 'CP-ZYNC-%s-NUKE' % (inst_type.upper(),) if (pricing_key in ZYNC.PRICING['gcp_price_list'] and 'us' in ZYNC.PRICING['gcp_price_list'][pricing_key]): label += ' $%s/hr' % ( ZYNC.PRICING['gcp_price_list'][pricing_key]['us'],) display_list.append(label) self.instance_type = nuke.Enumeration_Knob('instance_type', 'Type:', display_list) self.pricing_label = nuke.Text_Knob('pricing_label', '') self.pricing_label.setValue('Est. Cost per Hour: Not Available') calculator_link = nuke.Text_Knob('calculator_link', '') calculator_link.setValue('<a style="color:#ff8a00;" ' + 'href="http://zync.cloudpricingcalculator.appspot.com">' + 'Cost Calculator</a>') divider01 = nuke.Text_Knob('divider01', '', '') proj_response = ZYNC.get_project_list() self.existing_project = nuke.Enumeration_Knob('existing_project', 'Existing Project:', [' '] + [p['name'] for p in proj_response]) self.new_project = nuke.String_Knob('project', ' New Project:') self.new_project.clearFlag(nuke.STARTLINE) self.upload_only = nuke.Boolean_Knob('upload_only', 'Upload Only') self.upload_only.setFlag(nuke.STARTLINE) self.parent_id = nuke.String_Knob('parent_id', 'Parent ID:') self.parent_id.setValue('') # create shotgun controls - they'll only be added if shotgun integration # is enabled. self.sg_create_version = nuke.Boolean_Knob('sg_create_version', 'Create Shotgun Version') self.sg_create_version.setFlag(nuke.STARTLINE) self.sg_create_version.setValue(False) self.sg_user = nuke.String_Knob('sg_user', 'Shotgun User:'******'sg_project', 'Shotgun Project:') self.sg_project.setFlag(nuke.STARTLINE) self.sg_shot = nuke.String_Knob('sg_shot', 'Shotgun Shot:') self.sg_shot.setFlag(nuke.STARTLINE) self.sg_version_code = nuke.String_Knob('sg_version_code', 'Version Code:') self.sg_version_code.setFlag(nuke.STARTLINE) script_base, ext = os.path.splitext(os.path.basename( nuke.root().knob('name').getValue())) self.sg_version_code.setValue(script_base) self.hideSGControls() self.priority = nuke.Int_Knob('priority', 'Job Priority:') self.priority.setDefaultValue((50,)) self.skip_check = nuke.Boolean_Knob('skip_check', 'Skip File Check') self.skip_check.setFlag(nuke.STARTLINE) first = nuke.root().knob('first_frame').value() last = nuke.root().knob('last_frame').value() frange = '%d-%d' % (first, last) self.frange = nuke.String_Knob('frange', 'Frame Range:', frange) self.fstep = nuke.Int_Knob('fstep', 'Frame Step:') self.fstep.setDefaultValue((1,)) selected_write_nodes = [] for node in nuke.selectedNodes(): if node.Class() == 'Write': selected_write_nodes.append(node.name()) self.writeNodes = [] colNum = 1 for writeName in self.writeListNames: knob = nuke.Boolean_Knob(writeName, writeName) if len(selected_write_nodes) == 0: knob.setValue(True) elif writeName in selected_write_nodes: knob.setValue(True) else: knob.setValue(False) if colNum == 1: knob.setFlag(nuke.STARTLINE) if colNum > 3: colNum = 1 else: colNum += 1 knob.setTooltip(self.writeDict[writeName].knob('file').value()) self.writeNodes.append(knob) self.chunk_size = nuke.Int_Knob('chunk_size', 'Chunk Size:') self.chunk_size.setDefaultValue((10,)) # ADD KNOBS self.addKnob(self.num_slots) self.addKnob(self.instance_type) self.addKnob(self.pricing_label) self.addKnob(calculator_link) self.addKnob(divider01) self.addKnob(self.existing_project) self.addKnob(self.new_project) self.addKnob(self.parent_id) if 'shotgun' in ZYNC.FEATURES and ZYNC.FEATURES['shotgun'] == 1: self.addKnob(self.sg_create_version) self.addKnob(self.sg_user) self.addKnob(self.sg_project) self.addKnob(self.sg_shot) self.addKnob(self.sg_version_code) self.addKnob(self.upload_only) self.addKnob(self.priority) self.addKnob(self.skip_check) self.addKnob(self.frange) self.addKnob(self.fstep) for k in self.writeNodes: self.addKnob(k) self.addKnob(self.chunk_size) # collect render-specific knobs for iterating on later self.render_knobs = (self.num_slots, self.instance_type, self.frange, self.fstep, self.chunk_size, self.skip_check, self.priority, self.parent_id) if 'shotgun' in ZYNC.FEATURES and ZYNC.FEATURES['shotgun'] == 1: height = 470 else: height = 370 self.setMinimumSize(530, height) self.update_pricing_label()
def __init__(self): # make sure this isn't an unsaved script if nuke.root().name() == 'Root' or nuke.modified(): msg = 'Please save your script before rendering on Zync.' raise Exception(msg) self.zync_conn = zync.Zync(application='nuke') nukescripts.panels.PythonPanel.__init__(self, 'Zync Render', 'com.google.zync') if platform.system() in ('Windows', 'Microsoft'): self.usernameDefault = os.environ['USERNAME'] else: self.usernameDefault = os.environ['USER'] #GET WRITE NODES FROM FILE self.writeDict = dict() self.update_write_dict() # CREATE KNOBS self.num_slots = nuke.Int_Knob('num_slots', 'Num. Machines:') self.num_slots.setDefaultValue((1,)) sorted_types = [t for t in self.zync_conn.INSTANCE_TYPES] sorted_types.sort(self.zync_conn.compare_instance_types) display_list = [] for inst_type in sorted_types: label = '%s (%s)' % (inst_type, self.zync_conn.INSTANCE_TYPES[inst_type]['description'].replace(', preemptible','')) inst_type_base = inst_type.split(' ')[-1] pricing_key = 'CP-ZYNC-%s-NUKE' % (inst_type_base.upper(),) if 'PREEMPTIBLE' in inst_type.upper(): pricing_key += '-PREEMPTIBLE' if (pricing_key in self.zync_conn.PRICING['gcp_price_list'] and 'us' in self.zync_conn.PRICING['gcp_price_list'][pricing_key]): label += ' $%s/hr' % ( self.zync_conn.PRICING['gcp_price_list'][pricing_key]['us'],) display_list.append(label) self.instance_type = nuke.Enumeration_Knob('instance_type', 'Type:', display_list) self.pricing_label = nuke.Text_Knob('pricing_label', '') self.pricing_label.setValue('Est. Cost per Hour: Not Available') calculator_link = nuke.Text_Knob('calculator_link', '') calculator_link.setValue('<a style="color:#ff8a00;" ' + 'href="http://zync.cloudpricingcalculator.appspot.com">' + 'Cost Calculator</a>') proj_response = self.zync_conn.get_project_list() self.existing_project = nuke.Enumeration_Knob('existing_project', 'Existing Project:', [' '] + [p['name'] for p in proj_response]) self.new_project = nuke.String_Knob('project', ' New Project:') self.new_project.clearFlag(nuke.STARTLINE) self.upload_only = nuke.Boolean_Knob('upload_only', 'Upload Only') self.upload_only.setFlag(nuke.STARTLINE) self.parent_id = nuke.String_Knob('parent_id', 'Parent ID:') self.parent_id.setValue('') # create shotgun controls - they'll only be added if shotgun integration # is enabled. self.sg_create_version = nuke.Boolean_Knob('sg_create_version', 'Create Shotgun Version') self.sg_create_version.setFlag(nuke.STARTLINE) self.sg_create_version.setValue(False) self.sg_user = nuke.String_Knob('sg_user', 'Shotgun User:'******'sg_project', 'Shotgun Project:') self.sg_project.setFlag(nuke.STARTLINE) self.sg_shot = nuke.String_Knob('sg_shot', 'Shotgun Shot:') self.sg_shot.setFlag(nuke.STARTLINE) self.sg_version_code = nuke.String_Knob('sg_version_code', 'Version Code:') self.sg_version_code.setFlag(nuke.STARTLINE) script_base, ext = os.path.splitext(os.path.basename( nuke.root().knob('name').getValue())) self.sg_version_code.setValue(script_base) self.hideSGControls() self.priority = nuke.Int_Knob('priority', 'Job Priority:') self.priority.setDefaultValue((50,)) self.skip_check = nuke.Boolean_Knob('skip_check', 'Skip File Check') self.skip_check.setFlag(nuke.STARTLINE) first = nuke.root().knob('first_frame').value() last = nuke.root().knob('last_frame').value() frange = '%d-%d' % (first, last) self.frange = nuke.String_Knob('frange', 'Frame Range:', frange) self.fstep = nuke.Int_Knob('fstep', 'Frame Step:') self.fstep.setDefaultValue((1,)) selected_write_nodes = [] for node in nuke.selectedNodes(): if node.Class() == 'Write': selected_write_nodes.append(node.name()) self.writeNodes = [] colNum = 1 for writeName in self.writeListNames: knob = nuke.Boolean_Knob(writeName, writeName) if len(selected_write_nodes) == 0: knob.setValue(True) elif writeName in selected_write_nodes: knob.setValue(True) else: knob.setValue(False) if colNum == 1: knob.setFlag(nuke.STARTLINE) if colNum > 3: colNum = 1 else: colNum += 1 knob.setTooltip(self.writeDict[writeName].knob('file').value()) self.writeNodes.append(knob) self.chunk_size = nuke.Int_Knob('chunk_size', 'Chunk Size:') self.chunk_size.setDefaultValue((10,)) # controls for logging in and out self.loginButton = nuke.Script_Knob('login', 'Login With Google') self.logoutButton = nuke.Script_Knob('logout', 'Logout') # keep everything on the same line self.logoutButton.clearFlag(nuke.STARTLINE) self.userLabel = nuke.Text_Knob('user_label', '') self.userLabel.setValue(' %s' % self.zync_conn.email) self.userLabel.clearFlag(nuke.STARTLINE) # these buttons must be named okButton and cancelButton for Nuke # to add default OK/Cancel functionality. if named something else, # Nuke will add its own default buttons. self.okButton = nuke.Script_Knob('submit', 'Submit Job') self.cancelButton = nuke.Script_Knob('cancel', 'Cancel') # ADD KNOBS self.addKnob(self.num_slots) self.addKnob(self.instance_type) self.addKnob(self.pricing_label) self.addKnob(calculator_link) self.addKnob(self.__getDivider()) self.addKnob(self.existing_project) self.addKnob(self.new_project) self.addKnob(self.parent_id) if 'shotgun' in self.zync_conn.FEATURES and self.zync_conn.FEATURES['shotgun'] == 1: self.addKnob(self.sg_create_version) self.addKnob(self.sg_user) self.addKnob(self.sg_project) self.addKnob(self.sg_shot) self.addKnob(self.sg_version_code) self.addKnob(self.upload_only) self.addKnob(self.priority) self.addKnob(self.skip_check) self.addKnob(self.frange) self.addKnob(self.fstep) for k in self.writeNodes: self.addKnob(k) self.addKnob(self.chunk_size) self.addKnob(self.__getDivider()) self.addKnob(self.loginButton) self.addKnob(self.logoutButton) self.addKnob(self.userLabel) self.addKnob(self.__getDivider()) self.addKnob(self.okButton) self.addKnob(self.cancelButton) # collect render-specific knobs for iterating on later self.render_knobs = (self.num_slots, self.instance_type, self.frange, self.fstep, self.chunk_size, self.skip_check, self.priority, self.parent_id) if 'shotgun' in self.zync_conn.FEATURES and self.zync_conn.FEATURES['shotgun'] == 1: height = 510 else: height = 410 self.setMinimumSize(600, height) self.update_pricing_label()
def __init__(self): """ Initializes a ZyncRenderPanel """ # make sure this isn't an unsaved script if nuke.root().name() == "Root" or nuke.modified(): msg = "Please save your script before rendering on ZYNC." raise Exception(msg) nukescripts.panels.PythonPanel.__init__( self, 'ZYNC Render', 'com.atomicfiction.zyncRender') if platform.system() in ('Windows', 'Microsoft'): self.usernameDefault = os.environ['USERNAME'] else: self.usernameDefault = os.environ['USER'] #GET WRITE NODES FROM FILE self.writeDict = dict() self.update_write_dict() # CREATE KNOBS proj_response = ZYNC.get_project_list() if proj_response['code'] != 0: nuke.message(proj_response['response']) return self.existing_project = nuke.Enumeration_Knob( 'existing_project', 'Existing Project:', [' '] + proj_response['response']) self.new_project = nuke.String_Knob('project', ' New Project:') self.new_project.clearFlag(nuke.STARTLINE) self.upload_only = nuke.Boolean_Knob('upload_only', 'Upload Only') self.upload_only.setFlag(nuke.STARTLINE) self.parent_id = nuke.String_Knob('parent_id', 'Parent ID:') self.parent_id.setValue("") # create shotgun controls - they'll only be added if shotgun integration # is enabled. self.sg_create_version = nuke.Boolean_Knob('sg_create_version', 'Create Shotgun Version') self.sg_create_version.setFlag(nuke.STARTLINE) self.sg_create_version.setValue(False) self.sg_user = nuke.String_Knob('sg_user', 'Shotgun User:'******'sg_project', 'Shotgun Project:') self.sg_project.setFlag(nuke.STARTLINE) self.sg_shot = nuke.String_Knob('sg_shot', 'Shotgun Shot:') self.sg_shot.setFlag(nuke.STARTLINE) self.sg_version_code = nuke.String_Knob('sg_version_code', 'Version Code:') self.sg_version_code.setFlag(nuke.STARTLINE) script_base, ext = os.path.splitext( os.path.basename(nuke.root().knob('name').getValue())) self.sg_version_code.setValue(script_base) self.hideSGControls() self.priority = nuke.Int_Knob('priority', 'Job Priority:') self.priority.setDefaultValue((50, )) self.num_slots = nuke.Int_Knob('num_slots', 'Num. Slots:') self.num_slots.setDefaultValue((1, )) self.only_running = nuke.Boolean_Knob('only_running', 'Only Use Running Slots') type_list = [] non_default = [] for inst_type in ZYNC.INSTANCE_TYPES: if inst_type == zync.DEFAULT_INSTANCE_TYPE: type_list.append( '%s (%s)' % (inst_type, ZYNC.INSTANCE_TYPES[inst_type]["description"])) else: non_default.append( '%s (%s)' % (inst_type, ZYNC.INSTANCE_TYPES[inst_type]["description"])) for label in non_default: type_list.append(label) self.instance_type = nuke.Enumeration_Knob('instance_type', 'Type:', type_list) self.skip_check = nuke.Boolean_Knob('skip_check', 'Skip File Check') self.skip_check.setFlag(nuke.STARTLINE) self.notify_complete = nuke.Boolean_Knob('notify_complete', 'Notify When Complete') self.notify_complete.setFlag(nuke.STARTLINE) first = nuke.root().knob('first_frame').value() last = nuke.root().knob('last_frame').value() frange = '%d-%d' % (first, last) self.frange = nuke.String_Knob('frange', 'Frame Range:', frange) self.fstep = nuke.Int_Knob('fstep', 'Frame Step:') self.fstep.setDefaultValue((1, )) selected_write_nodes = [] for node in nuke.selectedNodes(): if node.Class() == "Write": selected_write_nodes.append(node.name()) self.writeNodes = [] colNum = 1 for writeName in self.writeListNames: knob = nuke.Boolean_Knob(writeName, writeName) if len(selected_write_nodes) == 0: knob.setValue(True) elif writeName in selected_write_nodes: knob.setValue(True) else: knob.setValue(False) if colNum == 1: knob.setFlag(nuke.STARTLINE) if colNum > 3: colNum = 1 else: colNum += 1 knob.setTooltip(self.writeDict[writeName].knob("file").value()) self.writeNodes.append(knob) self.chunk_size = nuke.Int_Knob('chunk_size', 'Chunk Size:') self.chunk_size.setDefaultValue((10, )) # ADD KNOBS self.addKnob(self.existing_project) self.addKnob(self.new_project) self.addKnob(self.parent_id) if "shotgun" in ZYNC.FEATURES and ZYNC.FEATURES["shotgun"] == 1: self.addKnob(self.sg_create_version) self.addKnob(self.sg_user) self.addKnob(self.sg_project) self.addKnob(self.sg_shot) self.addKnob(self.sg_version_code) self.addKnob(self.upload_only) self.addKnob(self.priority) self.addKnob(self.num_slots) self.addKnob(self.only_running) self.addKnob(self.instance_type) self.addKnob(self.skip_check) self.addKnob(self.notify_complete) self.addKnob(self.frange) self.addKnob(self.fstep) for k in self.writeNodes: self.addKnob(k) self.addKnob(self.chunk_size) # collect render-specific knobs for iterating on later self.render_knobs = (self.num_slots, self.instance_type, self.frange, self.fstep, self.chunk_size, self.skip_check, self.only_running, self.priority, self.parent_id) if "shotgun" in ZYNC.FEATURES and ZYNC.FEATURES["shotgun"] == 1: height = 450 else: height = 350 self.setMinimumSize(400, height)
def _isSceneModified(self): return nuke.modified()