def selectBackdropContents(backdropNode): '''Select all nodes inside a backdrop. There is a built in method for this on Nuke6.3v5, but this is kept here to expand compatibility to earlier versions ''' bx, by = backdropNode.xpos(), backdropNode.ypos() nukescripts.clear_selection_recursive() backdropNode.setSelected(True) nuke.nodeCopy(nukescripts.cut_paste_file()) nuke.nodeDelete(popupOnError=False) nuke.nodePaste(nukescripts.cut_paste_file()) nuke.selectedNode().setXYpos(bx, by)
def copy_knobs(args): g1 = nuke.thisGroup() selNodes = g1.selectedNodes() g2 = nuke.nodes.Group(name="____tempcopyknobgroup__") with g2: nuke.nodePaste(nukescripts.cut_paste_file()) excludedKnobs = ["name", "xpos", "ypos"] nodes = g2.nodes() for i in g2.nodes(): for j in selNodes: k1 = i.knobs() k2 = j.knobs() intersection = dict([ (item, k1[item]) for item in k1.keys() if item not in excludedKnobs and k2.has_key(item) ]) for k in intersection.keys(): x1 = i[k] x2 = j[k] x2.fromScript(x1.toScript()) nuke.delete(g2)
def PasteToSelected(): # put selection in variable and find out if nodes are valid original_selection = nuke.selectedNodes() for node in original_selection: if node.Class() == "Viewer" or node.name() == "VIEWER_INPUT": node.knob("selected").setValue(False) valid_selection = nuke.selectedNodes() for a in nuke.allNodes(): a.knob("selected").setValue(False) # create dict for new nodes so they can be selected later new_nodes = [] # go through selection and paste from clipboard to each for b in valid_selection: b.knob("selected").setValue(True) nuke.nodePaste(nukescripts.cut_paste_file()) new_nodes += nuke.selectedNodes() for pasted in nuke.selectedNodes(): pasted.knob("selected").setValue(False) # re-select original nodes for c in new_nodes: c.knob("selected").setValue(True) if len(valid_selection) is not len(original_selection): nuke.message("Some Viewer or VIEWER_LUT nodes were ignored. Rad.")
def PasteToSelected(): # put selection in variable and find out if nodes are valid original_selection = nuke.selectedNodes() for node in original_selection: if node.Class() == "Viewer" or node.name() == "VIEWER_INPUT": node.knob("selected").setValue(False) valid_selection = nuke.selectedNodes() for a in nuke.allNodes(): a.knob("selected").setValue(False) # create dict for new nodes so they can be selected later new_nodes = [] # go through selection and paste from clipboard to each for b in valid_selection: b.knob("selected").setValue(True) nuke.nodePaste(nukescripts.cut_paste_file()) new_nodes += nuke.selectedNodes() for pasted in nuke.selectedNodes(): pasted.knob("selected").setValue(False) # re-select original nodes for c in new_nodes: c.knob("selected").setValue(True) if len(valid_selection) is not len(original_selection): nuke.message("Some Viewer or VIEWER_LUT nodes were ignored. Rad.")
def sendNodes(): # ---------------------------------------------------------------------------- # (NOTE: Change this to an email address you have created.) fromaddr = '*****@*****.**' username = '******' password = '******' # ---------------------------------------------------------------------------- # Grab the selected nodes and copy to the clipboard. try: nuke.selectedNodes() nuke.nodeCopy(nukescripts.cut_paste_file()) clipboard = QtGui.QApplication.clipboard() clipboard = clipboard.text() except: nuke.message( "You have to select something first. Try clicking and dragging") return # Grab some input from the user, exit if they pressed cancel p = nuke.Panel('Send nodes via email') p.addSingleLineInput('To:', '*****@*****.**') p.addSingleLineInput('Subject:', 'My copied node setup') p.addNotepad('Body:', clipboard) p.addButton('Cancel') p.addButton('Send') if p.show() == 0: return # Exit if we only have the default/example email address toaddrs = p.value('To:') if toaddrs == '*****@*****.**': nuke.message( "Please provide an email address other than the default example.") return # Exit if we don't have a message body body = p.value('Body:') if body == '': nuke.message("Please provide a message body.") return # Format the body to include the subject lines body = 'Subject: %s\n\n%s' % (p.value('Subject:'), body) # Everything checks out, let's try to send it! try: server = SMTP('smtp.gmail.com:587') server.ehlo() server.starttls() server.login(username, password) server.sendmail(fromaddr, toaddrs, body) server.quit() nuke.message('Your nodes have been sent to "%s"!' % toaddrs) except: nuke.message("Error occured. Couldn't send nodes.") nuke.tprint("Error occured. Couldn't send nodes.") nuke.tprint(sys.exc_type) nuke.tprint(sys.exc_value)
def copySpecial(): """copy selection, paste and reconnect (just one node)""" depNode = nuke.dependencies(nuke.selectedNode()) dependNode = nuke.dependentNodes(nuke.INPUTS or nuke.HIDDEN_INPUTS or nuke.EXPRESSIONS, [nuke.selectedNode()]) i = 0 if dependNode[0].Class() in ['Scene', 'MergeGeo']: i = nuke.inputs(dependNode[0])+1 nuke.nodeCopy(nukescripts.cut_paste_file()) for node in nuke.allNodes(): node['selected'].setValue(0) nuke.nodePaste(nukescripts.cut_paste_file()) newNode = nuke.selectedNode() newNode.setInput(0, depNode[0]) dependNode[0].setInput(i+1, newNode)
def branch(): top_node = None selnodes = nuke.selectedNodes() for i in selnodes: totalinputs = i.inputs() for j in range(totalinputs): if i.input(j).knob("selected").value() is False: top_node = i.input(j) if top_node is None: return nuke.nodeCopy(nukescripts.cut_paste_file()) nuke.nodePaste(nukescripts.cut_paste_file()) firstpastenode = None selnodes = nuke.selectedNodes() for i in selnodes: firstpastenode = i xpos = i.knob("xpos").value() i.knob("xpos").setValue(xpos + 80) if firstpastenode is not None: firstpastenode.setInput(0, top_node)
def node_copypaste(): nuke.nodeCopy(cut_paste_file()) nodes = nuke.allNodes() for i in nodes: i.knob("selected").setValue(False) nuke.nodePaste(nukescripts.cut_paste_file())
def shareNodes(): print dirName folder = next(os.walk(dirName))[1] folder = " ".join(folder) folder = folder.replace('Disable', '') folder = 'Root ' + folder try: # < Nuke 11 import PySide.QtGui as QtGui from PySide.QtGui import QApplication except: # >= Nuke 11 import PySide2.QtWidgets as QtGui from PySide2.QtWidgets import QApplication try: nuke.selectedNodes() nuke.nodeCopy(nukescripts.cut_paste_file()) clipboard = QtGui.QApplication.clipboard() clipboard = clipboard.text() except: nuke.message("You have to select something first.") return p = nuke.Panel('Share nodes with other') p.addEnumerationPulldown('Project', folder) p.addSingleLineInput('Node Name Setup:', '') p.addButton('Cancel') p.addButton('Share') if p.show(): fullName = p.value("Node Name Setup:") fileName = fullName.split("/")[-1] fileNameChanged = "_" + fileName newFolder = fullName.split("/")[0] if p.value('Project') == 'Root': if fileName == newFolder: nukeFile = dirName + fileNameChanged + '.nk' else: subDir = dirName + newFolder os.mkdir(subDir) nukeFile = subDir + "\\" + fileNameChanged + '.nk' else: folderChoose = p.value('Project') nukeFile = dirName + folderChoose + "\\" + fileNameChanged + '.nk' if fileName == '': nuke.message('WARNING: The setup need a name') p.show() else: if os.path.isfile(nukeFile) == True: nuke.message('WARNING: File Already exist') p.show() else: menu_file = open(nukeFile, 'w+') menu_content = menu_file.read() menu_file.close() menu_content = menu_content.replace("", clipboard) menu_file = open(nukeFile, 'w') menu_file.write(menu_content) menu_file.close() nuke.load("Reload") reloadSpecific("F Toolsets", "F_Toolsets") else: return
def copy_with_inputs(): global nodeInputs sourceNode = nuke.selectedNode() nodeInputs=sourceNode.dependencies() nuke.nodeCopy(nukescripts.cut_paste_file())
def bake_gizmo(gizmo): ''' copy gizmo to group and replace it in the tree, so all inputs and outputs use the new group. returns the new group node ''' parent = get_parent(gizmo) gizmo_outputs = get_outputs(gizmo) gizmo_inputs = gizmo.inputs() print "INPUTS:", gizmo_inputs #[inputnodes.name() for inputnodes in gizmo_inputs] print "OUTPUTS:", gizmo_outputs #[output_nodes.name() for output_nodes in gizmo_outputs] # This old method can't detect failures #groupName = nuke.tcl( 'global no_gizmo; set no_gizmo 1; in %s {%s -New} ; return [value [stack 0].name]' % ( parent.fullName(), gizmo.Class() ) ) for n in get_all_nodes(nuke.root()): n.setSelected(False) try: nuke.tcl('copy_gizmo_to_group {0}'.format(gizmo.fullName())) #group = nuke.toNode( '.'.join( (parent.fullName(), groupName) ) ) ## We will use the selected node to get the created group group = nuke.selectedNode() if gizmo_outputs: #RECONNECT OUTPUTS IF THERE ARE ANY for node, pipes in gizmo_outputs.iteritems(): for i in pipes: node.setInput(i, group) #RECONNECT INPUTS for i in range(gizmo.inputs()): group.setInput(i, gizmo.input(i)) group.setSelected(False) except RuntimeError: # Occurs if the gizmo was sourced: "RuntimeError: This gizmo was created with a "load" or "source" command. Copy to group does not work for it." print "This gizmo was created with a 'load' or 'source' command. Manually re-creating it..." with parent: # gizmo.Class() fails because the gizmo class is defined as "Gizmo" - super hacky but we'll try to use the node's name gizmo_guess_class = re.split('[0-9]*$', gizmo.name())[0] tmp_gizmo = nuke.createNode(gizmo_guess_class, inpanel=False) nuke.tcl('copy_gizmo_to_group {0}'.format(tmp_gizmo.fullName())) # fix bug where the copy_gizmo_to_group puts node outside of the parent: cut node outside group, paste node inside group nuke.nodeCopy(nukescripts.cut_paste_file()) nukescripts.node_delete(popupOnError=True) with parent: nuke.nodePaste(nukescripts.cut_paste_file()) group = nuke.selectedNode() nuke.delete(tmp_gizmo) group.setSelected(False) group.hideControlPanel() if gizmo_outputs: #RECONNECT OUTPUTS IF THERE ARE ANY for node, pipes in gizmo_outputs.iteritems(): for i in pipes: node.setInput(i, group) #RECONNECT INPUTS for i in range(gizmo_inputs): group.setInput(i, gizmo.input(i)) group.setXYpos(gizmo.xpos(), gizmo.ypos()) # COPY VALUES group.readKnobs(gizmo.writeKnobs(nuke.TO_SCRIPT)) gizmoName = gizmo.name() nuke.delete(gizmo) group.setName(gizmoName) return group