所以这是我在论坛上的第一个问题,我希望我做得正确。一般问题:在编写允许用户根据要更改的上下文或参数输入不同数据类型的值的脚本时,我如何确保python不会返回任何错误?更具体地说:我是python的新手,想写一个脚本,允许The Foundry的Nuke用户同时更改同一类的多个节点上的值。取决于要更改的所需参数是复选框("工具")还是RGBA输入("4个浮动")。。。输入必须是不同类型的。在搜索论坛时,我发现type()函数可以检查该类型,并在if语句中与isinstance()函数进行比较。我想我可以处理这个问题,但Gradenode的乘法旋钮的类型返回类型"AColor_knob"。我期待着像浮子一样的东西。无论我比较的数据类型是什么,在isinstance()中进行比较都不会得到匹配。
到目前为止的主要脚本:
nukescripts.clear_selection_recursive()
userInput = nuke.getInput('Which type of nodes would you like to select? (!!!first char has to be capitalized!!!)',
'Shuffle')
matchingNodes = []
for each in nuke.allNodes():
if each.Class() == userInput:
matchingNodes.append(each)
else:
pass
for i in matchingNodes:
i.setSelected(True)
nuke.message(str(len(
matchingNodes)) + ' matching Nodes have been found and are now selected! (if 0 there either is no node of this type or misspelling caused an error!)')
userInput_2 = nuke.getInput('Which parameter of these nodes would you like to change? n' +
'(!!!correct spelling can be found out by hovering over parameter in Properties Pane!!!)',
'postage_stamp')
userInput_3 = nuke.getInput('To what do you want to change the specified parameter? n' +
'(allowed input depends on parameter type (e.g. string, int, boolean(True/False)))', 'True')
for item in matchingNodes:
item.knob(userInput_2).setValue(userInput_3)
到目前为止我是如何检查数据类型的:
selected = nuke.selectedNode()
knobsel = selected.knob('multiply')
print(type(knobsel))
#if type(knobsel) == bool:
if isinstance(knobsel, (str,bool,int,float,list)):
print('match')
else:
print('no match')
您可以用nuke.TCL()调用TCL命令。在TCL中,所有内容都是字符串,因此类型是不相关的(在某些命令中)。
p = nuke.Panel('Property Changer')
p.addSingleLineInput('class', '')
p.addSingleLineInput('knob', '')
p.addSingleLineInput('value', '')
p.show()
node_class = p.value('class')
knob_name = p.value('knob')
knob_value = p.value('value')
for node in nuke.allNodes(node_class):
tcl_exp = 'knob root.{0}.{1} "{2}"'.format(node.fullName(),knob_name,knob_value)
print tcl_exp
nuke.tcl(tcl_exp)
这应该能回答你的问题。有很多方法可以处理你想要做的事情——如果你想把它全部保存在python中,你可以对旋钮的值进行类型检查。例如:
b = nuke.nodes.Blur()
print type(b.knob('size').value()).__name__
这将创建一个模糊节点并打印该类型的字符串值。虽然我不推荐这条路线,但你可以用它来转换值:
example = '1.5'
print type(example)
exec('new = {}(example)'.format('float'))
print type(new)
另一种方法可能是为旋钮类型和期望值建立一个自定义查找表。
编辑:
TCL Nuke命令:http://www.nukepedia.com/reference/Tcl/group__tcl__builtin.html#gaa15297a217f60952810c34b494bdf83d
如果你在核节点图中按X或进入文件>Comp Script命令,你可以选择TCL并运行:
knob root.node_name.knob_name knob_value
示例:
knob root.Grade1.white "0 3.5 2.1 1"
这将设置命名旋钮的值。