Example #1
0
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()
Example #3
0
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()
Example #4
0
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
Example #5
0
    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()
Example #6
0
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)
Example #7
0
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
Example #8
0
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)
Example #9
0
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)
Example #10
0
 def isSceneModified(self):
     """Checks the currently open scene saved or not"""
     logger.debug("Func: isSceneModified")
     return nuke.modified()
Example #11
0
    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 )
Example #12
0
  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()
Example #13
0
  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()
Example #14
0
  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()
Example #15
0
    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()