2016-07-26 23 views
0

Ich versuche, ein Skript für Maya zu erstellen, die im Wesentlichen schnelle Auswahl Sets als Indizes innerhalb einer Liste macht.Problem beim Erstellen von benutzerdefinierten Schaltflächen in Maya

Ich habe es Speichern und Laden der Informationen mit Schaltflächen, die bereits vorhanden sind, aber ich möchte der Benutzer in der Lage sein, neue Schaltflächen zu generieren, wenn die Standardanzahl von Auswahlsätzen nicht ausreicht.

Ich habe derzeit eine Schaltfläche, die neue Schaltflächen generiert. Wenn nur eine Schaltfläche generiert wird, funktioniert es einwandfrei.

Mein erstes Problem: Wenn Sie eine zweite Schaltfläche generieren, verwendet die erste generierte Schaltfläche dann den gleichen Listenindex wie die zweite generierte Schaltfläche.

z.B. Ich erstelle eine neue Schaltfläche (Schaltfläche 4). Es speichert und lädt die Auswahl ohne Problem. Ich erstelle eine weitere neue Schaltfläche (Schaltfläche 5). Jetzt speichert und lädt Knopf 4, als ob es Knopf 5 wäre, ebenso wie Knopf 5 selbst.

Mein zweites Problem: Wenn Sie bereits eine Auswahl gespeichert haben, können Sie keine neue Schaltfläche erstellen.

Mein Code so weit ist:

import maya.cmds as mc 

favsWindowName = 'favsWindow' 
numButtons = 4 

def favsWindowUI(): 
    if mc.window(favsWindowName, exists=True): 
     mc.deleteUI(favsWindowName, wnd=True) 
    mc.window(favsWindowName, title="Favourites", resizeToFitChildren=True, bgc=(0.20, 0.50, 0.50), s=True) 
    mc.rowColumnLayout(nr=1) 
    mc.button("newSet", label="New Selection Set", c=("newButton()")) 
    mc.rowColumnLayout(nr=2) 
    mc.button("Load1", label="Load Slot 1", w=200, c=("Load(1)")) 
    mc.button("Sel1", label="Select Slot 1", w=200, c=("Sel(1)")) 
    mc.button("Load2", label="Load Slot 2", w=200, c=("Load(2)")) 
    mc.button("Sel2", label="Select Slot 2", w=200, c=("Sel(2)")) 
    mc.button("Load3", label="Load Slot 3", w=200, c=("Load(3)")) 
    mc.button("Sel3", label="Select Slot 3", w=200, c=("Sel(3)")) 
    mc.showWindow() 

selList = [] 

def Load(favNum): 
    try: 
     # if a selection has already been loaded for this button, replace it. 
     selList[favNum-1] = mc.ls(sl=True) 
    except IndexError: 
     try: 
      #if the previous index exists 
      if selList[favNum-2] > 0: 
       # if a selection has not yet been loaded for this button, create it. 
       selList.append(mc.ls(sl=True)) 
     except IndexError: 
      # if the previous index doesn't exist 'cause this is the first entry 
      if favNum == 1: 
       selList.append(mc.ls(sl=True)) 
      else: 
       #if the previous index doesn't exist, raise an error. 
       mc.error("Load the previous selection first!") 


def Sel(favNum): 
    try: 
     # if a selection has been loaded for this button, select it. 
     mc.select(selList[favNum-1], r=True) 
    except IndexError: 
     # if no selection has been loaded for this button, raise an error. 
     mc.error("No selection loaded.") 

def newButton(): 
    #generate a new button set using the next available index. 
    global numButtons 
    mc.button("Load"+str(numButtons), label="Load Slot "+str(numButtons), w=200, c=("Load(numButtons-1)")) 
    mc.button("Sel"+str(numButtons), label="Select Slot "+str(numButtons), w=200, c=("Sel(numButtons-1)")) 
    numButtons += 1 

favsWindowUI() 

Ich bin auch nicht sicher, warum mit den generierten Tasten Wir brauchen Load(numButtons-1) zu verwenden, wie zum Load(numButtons) in der NewButton Funktion im Gegensatz ... aber es scheint, das zu tun Trick.

Antwort

0

Falls jemand ein ähnliches Problem hat, werde ich die Lösung veröffentlichen, die wir (ich und ein paar Freunde aus der Schule) herausgefunden haben. Die Verwendung von partial löste das Problem aller neu generierten Schaltflächen mit dem gleichen Index. Das andere Problem (es wurde nicht möglich, neue Schaltflächen zu generieren, nachdem eine Auswahl geladen wurde), war aufgrund des übergeordneten Elements für die neuen Schaltflächen nicht festgelegt. Wir gaben einem unserer rowColumnLayout einen Namen und setzten ihn als Eltern mit dem setParent maya Befehl. Um dies im Zusammenhang zu sehen, beziehen Sie sich auf den folgenden Code.

import maya.cmds as mc 
from functools import partial 

favsWindowName = 'favsWindow' 

def favsWindowUI(): 
    if mc.window(favsWindowName, exists=True): 
     mc.deleteUI(favsWindowName, wnd=True) 
    mc.window(favsWindowName, title="Favourites", resizeToFitChildren=True, bgc=(0.20, 0.50, 0.50), s=True) 
    mc.rowColumnLayout(nr=2) 
    mc.textFieldGrp('btnName', tx='new button name') 
    mc.button("newSet", label="New selection Set", c=(newButton)) 
    mc.rowColumnLayout('selectionLayout', nc=2) 
    mc.showWindow() 

selList = {} 

def load(favNum, *args): 
    # Load the selection into the dictionary entry 
    selList[favNum] = mc.ls(sl=True) 


def sel(favNum, *args): 
    try: 
     # if a selection has been loaded for this button, select it. 
     mc.select(selList[favNum], r=True) 
    except IndexError: 
     # if no selection has been loaded for this button, raise an error. 
     mc.error("No selection loaded.") 


def newButton(*args): 
    buttonName = mc.textFieldGrp('btnName', q=True, tx=True) 
    mc.setParent('selectionLayout') 
    if buttonName != 'new button name': 
     if mc.button("load"+str(buttonName), exists=True, q=True): 
      mc.error("A selection set named %s already exists." % buttonName) 
     mc.button("load"+str(buttonName), label="Load Slot "+str(buttonName), w=200, c=(partial(load,buttonName))) 
     mc.button("sel"+str(buttonName), label="Select Slot "+str(buttonName), w=200, c=(partial(sel,buttonName))) 
     mc.textFieldGrp('btnName', tx='new button name', e=True) 
    else: 
     mc.error("Rename the button first.") 


favsWindowUI()