Maya Python TextField + имя объекта Помощь Пожалуйста - PullRequest
0 голосов
/ 18 декабря 2018

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

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

По крайней мере, так и должно быть, но на самом деле мне не хватает знаний, чтобы понять это, и каждый поиск в 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)

1 Ответ

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

ОК, здесь есть несколько вещей, которые нужно рассмотреть.

Во-первых, графические виджеты Maya выглядят как строки - точно так же, как вы создаете polyCube, и он возвращается к вам в виде строки '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)

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

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)

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

Один - это _ в определении функции;Кнопки майя всегда вызывают свои функции с одним аргументом.В этом подчеркивании нет ничего магического, это просто сленг 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)
...