maya python textField + имя объекта Помогите пожалуйста

Вот мой план. Сначала создайте соединение и откройте редактор узлов. Когда вы создали свой сустав, назовите его «A_Joint», нажмите «загрузить сустав» после запуска скрипта, затем нажмите «test» после нажатия test, вы должны создать узел с именем «A_Joint_firstGuy».

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

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

https://drive.google.com/file/d/1NvL0MZCDJcKAnVu6voVNYbaW0HurZ6Rh/view?usp=sharing

Или здесь, в формате SO:

import maya.cmds as cmds

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

window = cmds.window(title = "DS Selection Loader Demo", widthHeight=(300, 200) )
cmds.columnLayout(adjustableColumn=True) 

def sld_loadHelperJoint():
    sel = cmds.ls(selection=True)
    selString = " ".join(sel)
    add = cmds.textField('sld_surfaceTextHJ', edit=True, text=selString)

#def sld_loadParentJoint():
 #   sel = cmds.ls(selection=True)
  #  selString = " ".join(sel)
   # add = cmds.textField('sld_surfaceTextPJ', edit=True, text=selString)


def createNode():
    testNode = cmds.createNode( 'transform', selString = "sld_surfaceTextHJ", name = '_firstGuy' )



cmds.columnLayout(adjustableColumn=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
cmds.button( label='Load Helper Joint', command = "sld_loadHelperJoint()")
cmds.setParent('..')

#cmds.columnLayout(adjustableColumn=True)
#name = cmds.textField('sld_surfaceTextPJ', width =240)
#cmds.button( label="Load Parent Joint", command = "sld_loadParentJoint()")
#cmds.setParent('..')

testNode = cmds.createNode( 'transform', name = textField +'_firstGuy' )


# you must first create "def" group for the attributes you 
# want to be created via button, "testNode" is our example

# Connect the translation of two nodes together
#cmds.connectAttr( 'firstGuy.t', 'secondGuy.translate' )

# Connect the rotation of one node to the override colour
# of a second node.
#cmds.connectAttr( 'firstGuy.rotate', 'secondGuy.overrideColor' )

cmds.showWindow (window)

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


Ответы (1)


Хорошо, есть несколько вещей, которые нужно учитывать.

Во-первых, виджеты графического интерфейса Maya выглядят как строки — точно так же, как вы создаете поликуб и он возвращается к вам в виде строки «pCube1», виджет возвращается в виде строки, например «myWindow» или «textField72». Так же, как и при работе с объектами сцены, вам всегда нужно фиксировать результаты выполнения команды, чтобы знать, как она на самом деле называется — вы не можете гарантировать, что получите именно то имя, которое запрашивали, поэтому всегда фиксируйте результаты.

Итак, вы хотите сделать что-то вроде этого, просто чтобы графика работала:

window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)
load_button = cmds.button( label='Load Helper Joint')
cmds.show_window(window)

Например, если вам нужно спросить, что находится в текстовом поле, вы должны сделать:

text_contents = cmds.textField(sld_textFld, q=True, text=True)

Вы заметили, что это связано с переменной, а не со строкой, поэтому мы уверены, что все сработало.

Однако, чтобы кнопка использовала эту информацию, сценарий кнопки должен иметь доступ к этой переменной. Есть несколько способов сделать это — это распространенный вопрос о переполнении стека — но самый простой — просто определить команду кнопки, где у вас уже есть эта переменная. Таким образом, приведенный выше образец становится:

window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)

def set_textfield(_):
    sel = cmds.ls(selection=True)
    add = cmds.textField(sld_textFld, edit=True, text=sel[0])

load_button = cmds.button( label='Load Helper Joint', c = set_textfield)
cmds.showWindow(window)

Здесь есть два бита.

Одним из них является _ в определении функции; Кнопки Maya всегда вызывают свои функции с одним аргументом. В подчеркивании нет ничего волшебного, это просто сленг Python для «игнорировать меня» — но если у вас нет аргумента в функции def, она завершится ошибкой.

Более важным моментом является то, что кнопка получает определение функции напрямую, без кавычек. Вы говорите вызывать эту функцию при нажатии. Если вы используете строковую версию — пережиток MEL — позже вы столкнетесь с проблемами. Причины подробно объясняются здесь, но TLDR не использует строковую форму. Всегда.

Теперь, когда структурные части на месте, вы сможете либо создать узел для функции, которую я назвал set_textfield(), либо создать вторую комбинацию кнопка/функция, которая фактически создает узел, что-то вроде:

window = cmds.window(title='selection loader demo')
column = cmds.columnLayout(adj=True)
sld_textFld = cmds.textField('sld_surfaceTextHJ', width =240)

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

load_button = cmds.button( label='Load Helper Joint', c = set_textfield)

def make_node(_):
   text_value = cmds.textField(sld_textFld, q = True, text=True)
   if text_value:
       print "created:", cmds.createNode('transform', n=text_value +'_firstGuy')

   else:
       cmds.warning("select an object and add it to the window first!")

node_button = cmds.button( label='Make Node', c = make_node)

cmds.showWindow(window)
person theodox    schedule 18.12.2018
comment
Большое спасибо за ваш ответ @theodox, вы только что спасли меня от проблемы, которая мучила меня несколько дней! У меня есть еще один вопрос, скажем, я хотел сделать этот скрипт еще на шаг вперед и создать 2 узла с текстовым полем, ТОГДА соединить два атрибута, скажем, ради этого примера вращение узла A_Joints к вращению узла B_Joint: как бы я пойти об изменении сценария, чтобы сделать это? - person Dasteel; 20.12.2018
comment
Легко сделать больше полей и кнопок для обработки дополнительных входных данных. Затем вам понадобится последняя кнопка, которая собирает входные данные и выполняет соединение или предоставляет хорошее предупреждение, если пользователь пытается сказать «подключиться», но не дал вам ничего для работы. - person theodox; 21.12.2018
comment
можно ли как-то добиться создания узлов и связать их атрибуты одним нажатием кнопки? - person Dasteel; 21.12.2018
comment
В основном потому, что процесс, который я сокращаю, имеет 4 разных узла для создания, поэтому вместо того, чтобы вручную соединять все узлы, было бы проще просто загрузить соединение, создать узлы на основе имени соединения в текстовом поле, а затем иметь все эти суставы подключены к их различным выходам в то же время, когда они созданы.. - person Dasteel; 21.12.2018
comment
Привет, @theodox, если ты не возражаешь, я спрошу: ты знаешь каких-нибудь наставников по Maya Python? Вам не нужно отвечать, если вам это не нравится, но поиск информации самостоятельно, похоже, идет не очень хорошо: поэтому я бы предпочел нанять репетитора по этим вещам, а не загромождать форумы stackoverflow тем, что, вероятно, является новичком. вопросы с точки зрения профессионала. - person Dasteel; 22.12.2018
comment
Репетиторов не так много (есть несколько онлайн-курсов), но есть пара хороших книг: amazon.com/Practical-Programming-Python-Robert-Galanakis/dp/ и amazon.com/Maya-Python-Games-Film-Reference-ebook/dp/B005OI23OO/ довольно хороши. И попробуйте tech-artists.org - person theodox; 22.12.2018