Код не будет работать при запуске и вопросе текстового поля connectAttr

Итак, я работаю над простой демонстрацией, похожей на один из моих других вопросов, это довольно просто, просто запустите скрипт, загрузите объект в узел A, загрузите объект в узел B, нажмите «подключить узлы» и перевести из ваших 2 предметов будут связаны.

По крайней мере, я бы хотел, чтобы это произошло. Вместо этого я продолжаю получать «# Ошибка: имя« SetSource »не определено» или любая из моих других команд, говорящая «Не определено», как ни странно, я могу временно исправить это, если я просто перейду к «c = SetSource» или любая другая команда , вырежьте их из кода, повторно запустите окно, затем вставьте их обратно на место, и они будут работать: но это хлопотно, и я просто хочу, чтобы это работало сразу при запуске.

Вторая проблема заключается в том, что когда я загружаю данные в текстовое поле и пытаюсь соединить их с помощью кнопки «Подключить узлы», я получаю сообщение об ошибке «# Ошибка: исходный атрибут «Объект, который вы загрузили в текстовое поле узла A», не может быть найден».

Есть пара вещей, которые я уже пробовал, например: проблема с запуском. Я попытался обернуть кнопки и текстовые поля в их собственную маленькую категорию «def», я назвал ее ui(): и разместил ui() в конце кода. , и это заставляет его работать нормально при запуске, за исключением того, что когда я запускал скрипт, он отказывался загружать что-либо в текстовые поля

для команды подключения для подключения переводов я попытался поставить def connect (attr, * args) вместо просто def_connect (), но если я попытаюсь сделать attr командой * args, она просто будет проигнорирована, и мне говорят «attr не определен»

Я как бы в конце моей веревки здесь. Я компилирую все, что сделал в других скриптах, чтобы сделать один основной скрипт для создания вспомогательных соединений в оснастке, и это двойное текстовое поле — последнее, что стоит на моем пути.

import maya.cmds as cmds

if cmds.window("dumWin", exists =True):
    cmds.deleteUI("dumWin")

window = cmds.window("dumWin",title='DS selection connector demo')
column = cmds.columnLayout(adj=True)
cmds.showWindow(window)



sld_textFldA = cmds.textField('sld_surfaceText1', width =240)
load_button = cmds.button( label='Load A Node', c = SetSource)

sld_textFldB = cmds.textField('sld_surfaceText2', width =240)
load_button = cmds.button( label='Load B Node', c = SetTarget)

load_button = cmds.button( label='Connect Nodes', c = connect)


def SetSource(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldA, edit=True, text=sel[0])

def SetTarget(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldB, edit=True, text=sel[0])

def connect(_):
    cmds.connectAttr( source + '.', target + '.', f=True)

Мой ожидаемый результат состоит в том, чтобы код просто работал при запуске, не вызывая мои определения «неопределенно», и чтобы узлы подключения просто подключали переводы.


person Dasteel    schedule 27.12.2018    source источник


Ответы (1)


Причина, по которой вы получаете ошибку Error: name 'SetSource' is not defined, заключается в том, что вы определили ее после создания кнопки. Его необходимо оценить, прежде чем вы установите командную функцию вашей кнопки, иначе он не сможет ее найти. Решение здесь простое, и оно состоит в том, чтобы переместить ваши 3 функции сверху.

Что касается вашей функции connect, вы используете переменные source и target, но они нигде не инициализируются в рамках этой функции, поэтому она не работает. Вместо этого вам нужно запросить textField их текущий текст. Поскольку пользователь также может свободно вводить их, было бы неплохо включить простую проверку, чтобы убедиться, что узлы, которые мы получаем из обоих textField, действительно существуют.

import maya.cmds as cmds


def SetSource(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldA, edit=True, text=sel[0])


def SetTarget(_):
    sel = cmds.ls(selection=True)
    cmds.textField(sld_textFldB, edit=True, text=sel[0])


def connect(_):
    obj_a = cmds.textField(sld_textFldA, q=True, text=True)
    obj_b = cmds.textField(sld_textFldB, q=True, text=True)

    if not cmds.objExists(obj_a) or not cmds.objExists(obj_b):
        raise RuntimeError("Unable to find objects in the scene.")

    cmds.connectAttr(obj_a + '.translate', obj_b + '.translate', f=True)


if cmds.window("dumWin", exists =True):
    cmds.deleteUI("dumWin")

window = cmds.window("dumWin",title='DS selection connector demo')
column = cmds.columnLayout(adj=True)
cmds.showWindow(window)

sld_textFldA = cmds.textField('sld_surfaceText1', width =240)
load_button = cmds.button( label='Load A Node', c = SetSource)

sld_textFldB = cmds.textField('sld_surfaceText2', width =240)
load_button = cmds.button( label='Load B Node', c = SetTarget)

load_button = cmds.button( label='Connect Nodes', c = connect)
person Green Cell    schedule 27.12.2018
comment
Большое спасибо @Greencell, это помогло. Если вы не возражаете, я спрошу: есть ли причина, по которой кнопки находятся внизу? В каждом примере скрипта, который я видел заранее, они находятся вверху. Я действительно не возражаю в любом случае, но это помогает знать рассуждения в учебных целях. Во-вторых, есть ли способ, которым я могу проголосовать за вас или как-то пометить этот вопрос как ответ? Я чувствую себя ужасно из-за того, что получаю помощь и не имею ничего взамен. - person Dasteel; 27.12.2018
comment
В документах для button показано, что функция находится сверху, поэтому я не уверен, о каком примере вы говорите. Он должен быть сверху, так как команда пытается подключиться к функции, которая еще не инициализирована. Можно передать string в параметр команды, и в этом случае порядок не имеет значения, так как вы передаете не саму функцию, а только ее имя. Что касается пометки вопроса, в левом верхнем углу моего сообщения должна быть галочка, где его можно принять, и пометить ваш вопрос как решенный. - person Green Cell; 27.12.2018