2015-11-25 11 views
0

Я хотел бы добавить несколько новых кнопок в редактор майя-графики - особенно в верхней части списка каналов со всеми атрибутами в левой части окна. Однако я бы предпочел не гадоваться с сценариями запуска Maya для самого редактора графов. Есть ли способ «родительского» новых кнопок, которые я хочу в каждом новом окне редактора графиков, используя отдельный скрипт?Как создать новые, созданные пользователем кнопки внутри окна редактора графиков?

В идеале это может быть все Python.

ответ

2

TL; DR;

if cmds.window("GE_ui_window", exists=True): #If the window exists 
    cmds.deleteUI("GE_ui_window") #Delete it 
cmds.window("GE_ui_window", title="My custom Graph Editor") #Create your custom win 

cmds.frameLayout("GE_ui_frameLayout", p="GE_ui_window", lv=False, bv=False) 

if cmds.scriptedPanel("GE_ui_scriptedPanel", exists=True): #If the scriptel panel already exists 
    cmds.deleteUI("GE_ui_scriptedPanel") #Delete it 
cmds.scriptedPanel("GE_ui_scriptedPanel", unParent=True, type="graphEditor") 
cmds.scriptedPanel("GE_ui_scriptedPanel", e=True, parent="GE_ui_window|GE_ui_frameLayout") #parent the scripted panel to your frame layout 

cmds.showWindow("GE_ui_window") 

channelLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[0] #Get the channel box's layout 
filterLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[1] #Get the filter's layout 

myRowLayout=cmds.rowLayout(numberOfColumns=3, p="GE_ui_scriptedPanelOutlineEdForm") #Create a row layout 
cmds.button(label="Café", h=100, p=myRowLayout) #Add some buttons 
cmds.button(label="Clope", p=myRowLayout) 
cmds.button(label="Caca", p=myRowLayout) 

#This will reorder the content of the left formLayout 
cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", edit=True, af=[ \ 
      (channelLayout, "bottom", 0), \ 
      (channelLayout, "right", 0), \ 
      (filterLayout, "top", 0), \ 
      (myRowLayout, "left", 0), \ 
      (myRowLayout, "right", 0)], \ 
      ac=[(myRowLayout, "top", 0, filterLayout), \ 
      (channelLayout, "top", 0, myRowLayout)]) 

Есть два действительно Полезные вещи, чтобы знать, когда дело доходит до редактирования пользовательского интерфейса Майи.

Флажок History -> Echo all commands в редакторе скриптов. Это может распечатать много мусора с полезными фрагментами информации внутри.

Вторая вещь - команда whatIs (Doc).

Эта команда принимает один аргумент типа строки и возвращает строку , указывающей, является ли аргумент встроенным «Команда», и «Мел процедура», и «Сценарий», или переменный. Если это переменная, то также указывается тип переменной. Если аргументом является процедура Mel или файл сценария , путь к файлу, содержащему сценарий или процедуру , включен в возвращаемое значение.

Эта комбинация позволит вам отслеживать, как и где создается редактор графа. Теперь давайте сделаем это.

1: Открыть граф редактор Window -> Animation Editors -> Graph Editor

GraphEditor; 
tearOffPanel "Graph Editor" "graphEditor" true; 
// Result: graphEditor1Window // 

GraphEditor; это время команда Run, которая выполняет tearOffPanel "Graph Editor" "graphEditor" true; при вызове. Вот почему он появляется в редакторе скриптов.

2: Запуск whatIs "tearOffPanel"; (MEL)

// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2014/scripts/startup/tearOffPanel.mel // 

С небольшим расследование в этом файле, вы можете сделать вывод, что вы можете создать совершенно новый Graph Editor с помощью команды scriptedPanel.

3: Создайте свое собственное Graph Panel

scriptedPanel doc показать вам, как создать сценарную панель и включить его в окне. Теперь вы можете создать вам собственный редактор графов с помощью этого:

if cmds.window("GE_ui_window", exists=True): 
    cmds.deleteUI("GE_ui_window") 
cmds.window("GE_ui_window", title="My custom Graph Editor") 

cmds.frameLayout("GE_ui_frameLayout", p="GE_ui_window", lv=False, bv=False) 

if cmds.scriptedPanel("GE_ui_scriptedPanel", exists=True): 
    cmds.deleteUI("GE_ui_scriptedPanel") 
cmds.scriptedPanel("GE_ui_scriptedPanel", unParent=True, type="graphEditor", label='Sample') 
cmds.scriptedPanel("GE_ui_scriptedPanel", e=True, parent="GE_ui_window|GE_ui_frameLayout") 

cmds.showWindow("GE_ui_window") 

4: Постарайтесь понять, как Graph Editor построен

Этот скрипт выведет иерархии виджетов в виде редактора Graph (создание пользовательский Graph Editor первый):

nbIteration = 0 
def getChildren(uiItem, nbIteration): 
    for childItem in cmds.layout(uiItem, query=True, childArray=True): 
     try: 
      print "|___"*nbIteration + childItem 
      getChildren(uiItem + "|" + childItem, nbIteration+1) 
     except: 
      pass 
getChildren("GE_ui_window|GE_ui_frameLayout|GE_ui_scriptedPanel", nbIteration) 

Кроме того, вы можете проверить в C:\Program Files\Autodesk\Maya2014\scripts\others\graphEditorPanel.mel, @939: global proc addGraphEditor (string $whichPanel)

Теперь вы можете понять, что многим виджетам не дано никакого имени, а только имя по умолчанию, данное Maya. Следовательно, мы не можем добавлять виджеты и родительские их с использованием полного пути, потому что этот путь будет меняться каждый раз, когда будет создан новый редактор графов.

Пункт мы будем стараться, чтобы полагаться на это GE_ui_scriptedPanelOutlineEdForm который является formLayout, содержащий другой formLayout и paneLayout.

|___|___GE_ui_scriptedPanelOutlineEdForm 
|___|___|___paneLayout123 #layout containing the two channel boxes 
|___|___|___|___GE_ui_scriptedPanelOutlineEd 
|___|___|___|___GE_ui_scriptedPanelOutlineEdSlave 
|___|___|___formLayout276 #Layout containing the "filter part" 
|___|___|___|___textField63 #It's text 
|___|___|___|___iconTextButton102 

5: Создайте кнопки и реорганизовать содержание GE_ui_scriptedPanelOutlineEdForm

channelLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[0] #Get the channel box's layout 
filterLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[1] #Get the filter's layout 

myRowLayout=cmds.rowLayout(numberOfColumns=3, p="GE_ui_scriptedPanelOutlineEdForm") #Create a row layout 
cmds.button(label="Café", h=100, p=myRowLayout) #Add some buttons 
cmds.button(label="Clope", p=myRowLayout) 
cmds.button(label="Caca", p=myRowLayout) 

#This will reorder the content of the left formLayout 
cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", edit=True, af=[ \ 
      (channelLayout, "bottom", 0), \ 
      (channelLayout, "right", 0), \ 
      (filterLayout, "top", 0), \ 
      (myRowLayout, "left", 0), \ 
      (myRowLayout, "right", 0)], \ 
      ac=[(myRowLayout, "top", 0, filterLayout), \ 
      (channelLayout, "top", 0, myRowLayout)]) 
+0

nice, я не знал о scriptedPanel – DrWeeny

+0

Точно, что я искал, спасибо! Отличное пошаговое руководство. – john

1

Для этого вам может потребоваться PySide/PyQt. Найдите указатель в редакторе графа и найдите способ компоновки элементов.

Вот пример о смене стилей в меню майо:

from maya.OpenMayaUI import MQtUtil as omui 
import sip 
from PyQt4 import QtGui 

def changeMayaMenuColors(fontStyle='italic', fontWeight='bold', fontColor='cyan'): 
    # Get the widget 
    widgetStr = mel.eval('string $tempString = $gMainCreateMenu') 
    ptr = omui.findControl(widgetStr) 
    widget = sip.wrapinstance(long(ptr), QtGui.QWidget) 
    widget.setStyleSheet('font-style:%s;'%fontStyle +'font-weight:%s;'%fontWeight + 'color:%s;'%fontColor) 

А вот sonme опытов о channelBox:

from PySide import QtGui, QtCore 
from shiboken import wrapInstance 
from maya.OpenMayaUI import MQtUtil 


channelbox = wrapInstance(long(MQtUtil.findControl('mainChannelBox')), QtGui.QWidget) 
channelbox_children = channelbox.children() 

first_widget = channelbox_children[0] # EDIT 
first_widget.hide() 
#first_widget.show() 
#--------------------------------------------------------------------------------------------------------------- 
mySubWdget = first_widget.children() 

new_button = QtGui.QPushButton() 
new_layout = QtGui.QVBoxLayout() 
first_widget.setLayout(new_layout) 
new_layout.addWidget(new_button) 

def print_hodor(): 
    print 'HODOR' 

new_button.clicked.connect(print_hodor) 

Вы можете сделать это kingd экспериментов со всем май виджетом (найти pointer, а затем используйте wrapInstance для получения указателя QT, а затем итерации пользователей, чтобы найти подходящий формат)

надеюсь, что это поможет

+0

Есть ли способ, чтобы получить эту работу с PySide? Я сделал довольно сложную попытку, но у меня есть парочка ошибок на 'first_widget.setLayout' и' first_widget.hide' – john

+1

first_widget = channelbox_children [1] должно быть «first_widget = channelbox_children [0]» Хранить в ум, вы должны проверить, что .children() вернуться, чтобы найти макеты, чтобы вставить ваши кнопки. – DrWeeny

 Смежные вопросы

  • Нет связанных вопросов^_^