2017-01-04 12 views
1

Так что это мой первый вопрос на форуме, и я надеюсь, что я делаю это правильно. Общий вопрос: Как я могу гарантировать, что python не возвращает никаких ошибок при написании скрипта, который позволяет пользователю вводить значения разных типов данных в зависимости от контекста или параметра, который они хотят изменить? Конкретно: Я новичок в python и хочу написать скрипт, который позволяет пользователям The Foundry's Nuke изменять значения на нескольких узлах одного и того же класса одновременно. В зависимости от того, нужно ли изменить желаемый параметр, есть флажок ('bool') и вход RGBA ('4 floats') ... вход должен быть другого типа. Поиск в форуме Я обнаружил, что тип может быть проверен type() функцией и сравнивается в операторе if с помощью функции isinstance(). Думаю, я мог бы с этим справиться, но тип, например. Многократная кнопка Gradenode возвращает тип «AColor_Knob». Я ожидал чего-то вроде поплавка. И сравнение его в isinstance() не дает мне соответствия независимо от типа данных, с которым я сравниваю.Как обеспечить, чтобы пользователь мог вводить любой тип данных (str, float, int, boolean ...)?

скрипт до сих пор:

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') 

ответ

0

Вы можете вызвать команду TCL с nuke.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) 

альтернативный маршрут идти вниз может строить себя пользовательскую таблицу подстановок для типов ручки и ожидаемых значений.

Edit:

TCL Nuke Команды: http://www.nukepedia.com/reference/Tcl/group__tcl__builtin.html#gaa15297a217f60952810c34b494bdf83d

Если нажать X в НИОТ Node Graph или перейдите в меню Файл> Комп Command Script, вы можете выбрать TCL и запустить:

knob root.node_name.knob_name knob_value 

Пример:

knob root.Grade1.white "0 3.5 2.1 1" 

Это установит значения для именованного регулятора.

+0

Большое спасибо за ваш ответ. Я, как новичок, многому научился. Но у меня все еще есть несколько вопросов, если вы разрешаете: я не знаком с tcl, так что: '' root. {0}. {1} "{2}" '. Format (node.fullName(), knob_name, knob_value) 'do? Кроме того, я никогда не видел этот формат: ''new = {} (example)'' Как python знает, что делать с '(example)'? – leabum

+0

@leabum Вам нужно искать форматирование строк, вот несколько ссылок: formatstrings pep-3101 str.format Я отредактировал исходное сообщение выше, чтобы включить некоторую информацию о командах TCL в Nuke. Кстати, этот пост отмечен python-3.x, но Nuke по-прежнему работает на 2.7 (в настоящее время на версии 10.x). –