예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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.")
예제 #4
0
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.")
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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)
예제 #8
0
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())
예제 #9
0
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
예제 #10
0
def copy_with_inputs():
    global nodeInputs
    sourceNode = nuke.selectedNode()
    nodeInputs=sourceNode.dependencies()
    nuke.nodeCopy(nukescripts.cut_paste_file())
예제 #11
0
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