Код не работает при запуске и подключается к текстовому полю connectAttr - PullRequest
0 голосов
/ 27 декабря 2018

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

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

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

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

для команды подключения to соединить переводы, я попытался поместить 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)

Мой ожидаемый результат - получитькод просто работает при запуске, не вызывая мои defs "undefined" и просто соединяйте узлы подключения, переводит

1 Ответ

0 голосов
/ 27 декабря 2018

Причина, по которой вы получаете ошибку 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)
...