2016-07-26 2 views
0

마야를위한 스크립트를 만들려고합니다.이 스크립트는 빠른 선택 세트를 목록 내부의 인덱스로 만듭니다.maya에서 사용자 생성 버튼을 생성 할 때 문제가 발생했습니다.

이미 존재하는 버튼으로 정보를 저장하고로드해야하지만 기본 선택 세트 수가 충분하지 않은 경우 사용자가 새 버튼을 생성 할 수있게하려고합니다.

현재 새 버튼을 생성하는 버튼이 있습니다. 하나의 버튼 만 생성하면 제대로 작동합니다.

첫 번째 문제 : 두 번째 단추를 생성하면 첫 번째 생성 된 단추는 두 번째 생성 단추와 같은 목록 색인을 사용합니다.

새 버튼을 만듭니다 (버튼 4). 선택 사항을 문제없이 저장하고로드합니다. 다른 새로운 버튼 (버튼 5)을 만듭니다. 이제 버튼 4는 버튼 5와 마찬가지로 저장하고로드합니다.

두 번째 문제점 : 선택 항목을 이미 저장 한 경우 새 단추를 만들 수 없습니다. 나는 또한 확실하지 않다

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() 

이유는 newButton 기능에 Load(numButtons) 반대로 Load(numButtons-1)를 사용할 필요가 생성 된 버튼으로 ...하지만 할 것 같다

내 코드는 지금까지입니다 장난.

답변

0

누구나 비슷한 문제가있는 경우, 우리 (내가 학교에서 온 친구들)가 알아 낸 해결책을 게시 할 것입니다. partial을 사용하면 새로 생성 된 모든 단추가 동일한 색인을 사용하여 문제가 해결되었습니다. 다른 문제 (선택 항목을로드 한 후 새 단추를 생성 할 수 없음)는 부모가 새 단추를 설정하지 않아서 발생했습니다. 우리는 rowColumnLayout의 이름 중 하나를주고 setParent maya 명령을 사용하여 부모로 설정했습니다. 컨텍스트에서 보려면 아래 코드를 참조하십시오.

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() 
관련 문제