Fazer um script que percorrerá 3 estados diferentes no Maya Python

Sep 12 2020

Quero criar um script em Maya usando Python e vinculá-lo a uma tecla de atalho. Cada vez que executo o script, desejo percorrer 3 estados, cubo / cilindro / plano. Por exemplo, na primeira vez que executo o script, ele criará um cubo, na segunda vez apague o cubo e crie um cilindro, na terceira vez apague o cilindro e crie um plano., Na quarta vez apague o plano e crie um cubo etc ... Eu quero isso acontecerá até que o usuário decida qual primitiva deseja e finalize o loop. Tentei usar o loop while, mas falhei miseravelmente.

Terminou com isso:

def createCube():
    return "cube"

def createCylinder():
    return "cylinder"

def createPlane():
    return "plane"

def numbers_to_primitives(argument):
    switcher = {
        1: createCube,
        2: createCylinder,
        3: createPlane,
    }
    # Get the function from switcher dictionary
    func = switcher.get(argument, lambda: "Invalid primitive")
    # Execute the function
    print func()

numbers_to_primitives(2)

Isso meio que parece funcionar. Mas prevejo problemas ao executar o comando repetidamente, pois estou criando mais e mais primitivos em vez de substituir os existentes. Também seria necessário criar um botão de alternância para alternar entre eles?

Respostas

1 haggikrey Sep 13 2020 at 10:01

Você tem vários problemas de perguntas para resolver. Primeiro, você deseja usar o script em uma tecla de atalho, o que significa que ele deve produzir um resultado diferente toda vez que você chamar numbers_to_primitive () sem nenhum argumento. Portanto, primeiro você precisa salvar e ler o estado atual. Você tem várias maneiras de fazer isso. Se você só precisa do estado na sessão maya atual, pode usar uma variável global como esta:

state = 0

def box():
    print "Box"

def cyl():
    print "Cylinder"

def sph():
    print "Sphere"
    
def creator():
    global state
    print "current state", state
    state = state + 1
    if state > 2:
        state = 0
        
creator()

Dessa forma, a variável de estado percorre os valores 0-2. Agora você deseja criar geometria e substituí-la assim que a função for chamada novamente. Funciona de maneira muito semelhante: Salve o objeto atual e exclua-o assim que a função for chamada novamente desta forma:

import maya.cmds as cmds
state = 0
transformName = "" #again a global variable

def box():
    print "Box"
    global transformName #to use the global variable you have do use "global" keyword
    transformName, shape = cmds.polyCube()

def cyl():
    print "Cylinder"
    global transformName
    transformName, shape = cmds.polyCylinder()

def sph():
    print "Sphere"
    global transformName
    transformName, shape = cmds.polySphere()
    
def creator():
    global state
    funcs = [box, cyl, sph]
    print "current state", state
    print "TransformName", transformName
    if cmds.objExists(transformName):
        cmds.delete(transformName)
    funcs[state]()
    state = state + 1
    if state > 2:
        state = 0

Agora você pode chamar a função creator () e toda vez que ela deletar o objeto antigo e criar um novo.