Как мне отредактировать указанные c кнопки полки во время выполнения в Maya с помощью Python? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать скрипт в Python в Maya, который позволит мне динамически изменять изображение определенной кнопки c и ничего больше об этой кнопке. Я сталкиваюсь с некоторыми серьезными проблемами, которые я подробно опишу ниже:

import maya.cmds as cmds
import maya.mel as mel

cmds.refresh(cv=1, f=1)

gShelfTopLevel = mel.eval("global string $gShelfTopLevel; $temp = $gShelfTopLevel;")
currentShelf = cmds.tabLayout(gShelfTopLevel,q=1,st=1)
buttons = cmds.shelfLayout(currentShelf,q=1,ca=1)
buttonName = "Button 1"

for button in buttons:  
    if cmds.shelfButton(button, q=True, l=True) == buttonName:
        cmds.shelfButton(button, h=35, w=35, e=1, i="icons/axis_Object.png", p=currentShelf )
        #If this was working I'd have an if statement here for a second image.
        break

Toggler()

class Toggler():

    if ctx == 'moveSuperContext':

        tool = 'Move'
        mode = cmds.manipMoveContext(tool, q=1, m=1)

        if mode != 2:
            cmds.manipMoveContext(tool, e=1, m=2)
        else:
            cmds.manipMoveContext(tool, e=1, m=0)

    if ctx == 'RotateSuperContext':

        tool = 'Rotate'
        mode = cmds.manipRotateContext(tool, q=1, m=1)

        if mode != 0:
            cmds.manipRotateContext(tool, e=1, m=0)
        else:
            cmds.manipRotateContext(tool, e=1, m=1)  

    if ctx == 'scaleSuperContext':

        tool = 'Scale'
        mode = cmds.manipScaleContext(tool, q=1, m=1)

        if mode != 0:
            cmds.manipScaleContext(tool, e=1, m=0)
        else:
            cmds.manipScaleContext(tool, e=1, m=2)  

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

Мои проблемы заключаются в следующем:

  1. Изображение изменяется для всех кнопок на панели. Это невероятно бесполезно, и я не уверен, почему это так.
  2. Названия всех кнопок изменяются на то, что является buttonName. Таким образом, в этом случае все кнопки переименовываются в «Button 1», что также невероятно расстраивает меня.
  3. Сценарий оригинальной кнопки клонируется для всех остальных кнопок.

Приложение к 2: я пытался переименовать мою переменную buttonName при вероятности того, что buttonName является переменной intrinsi c, назначенной этим сценариям кнопок.

В прошлом мне удавалось выполнить sh редактирование просто изображение кнопки со следующим MEL-кодом:

shelfButton -edit -image "icons/axis_World.png" $button;

Я не могу понять, что является уникальным в этом коде по сравнению с тем, что я сделал в Python, но ясно, что что-то происходит для я.

Любая помощь приветствуется, потому что на данный момент я в полном недоумении. Похоже, что нажатие любой кнопки на полке вызовет повторение всех кнопок на этой полке.

Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2020

Я не могу говорить с вашим Toggler() классом, потому что я совершенно смущен его назначением, но приведенный ниже фрагмент скрипта полностью функционален в Maya 2018.4:

import maya.cmds as cmds
import maya.mel as mel

gShelfTopLevel = mel.eval("global string $gShelfTopLevel; $temp = $gShelfTopLevel;")
currentShelf = cmds.tabLayout(gShelfTopLevel, q=True, st=True)
buttons = cmds.shelfLayout(currentShelf, q=True, ca=True)
targetButton = 'Button 1' # Button 'name' not 'icon label'
toggleIcons = ['showManip.png', 'globalManip.png']

for b in buttons:
    label = cmds.shelfButton(b, q=True, l=True)

    if label != targetButton:
        continue

    print('Found target button: `{}` -> {}'.format(targetButton, b))

    currentIcon = cmds.shelfButton(b, q=True, i=True)
    newIcon = toggleIcons[0] # default
    if currentIcon in toggleIcons:
        try:
            idx = toggleIcons.index(currentIcon) + 1
            newIcon = toggleIcons[idx] if idx < len(toggleIcons) else toggleIcons[0]
        except Exception as e:
            print('Failed to iterate through list of icons, using default: {}'.format(e))

    print('Current image is {} -> swapping to {}'.format(currentIcon, newIcon))
    cmds.shelfButton(b, e=True, i=newIcon)
    break

Я не используя флаги width, height и parent, которые вы использовали. Кроме этого, все более или менее совпадает с вашим собственным кодом. Возможно, редактирование parent не работает должным образом? Ваша эквивалентная команда mel также не устанавливает этот флаг.

...