Fazer um script que percorrerá 3 estados diferentes no Maya Python
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
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.