Créer un script qui parcourra 3 états différents dans Maya Python

Sep 12 2020

Je souhaite créer un script dans Maya en utilisant Python et le lier sur un raccourci clavier. Chaque fois que j'exécute le script, je veux parcourir 3 états, cube / cylindre / plan. Ainsi, par exemple, la première fois que j'exécute le script, il créera un cube, la deuxième fois supprimera le cube et créera un cylindre la troisième fois supprimera le cylindre et créera un plan., La quatrième fois supprimera le plan et créera un cube, etc. cela se produit jusqu'à ce que l'utilisateur décide de la primitive qu'il veut et termine la boucle. J'ai essayé d'utiliser la boucle while mais j'ai lamentablement échoué.

J'ai fini avec ceci:

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)

Cela semble fonctionner. Mais je prévois des problèmes lors de l'exécution de la commande encore et encore, car je crée de plus en plus de primitives au lieu de remplacer celles existantes. Aurait-il également besoin de créer un bouton bascule pour parcourir ces derniers?

Réponses

1 haggikrey Sep 13 2020 at 10:01

Vous avez plusieurs problèmes de questions à résoudre. Tout d'abord, vous voulez utiliser le script dans une touche de raccourci, ce qui signifie qu'il devrait produire un résultat différent à chaque fois que vous appelez numbers_to_primitive () sans aucun argument. Vous devez donc d'abord enregistrer et lire l'état actuel. Vous pouvez procéder de plusieurs manières. Si vous n'avez besoin que de l'état dans la session maya actuelle, vous pouvez utiliser une variable globale comme celle-ci:

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

De cette façon, la variable d'état parcourt les valeurs 0-2. Vous voulez maintenant créer une géométrie et la remplacer dès que la fonction est à nouveau appelée. Cela fonctionne de manière très similaire: enregistrez l'objet actuel et supprimez-le dès que la fonction est appelée à nouveau comme ceci:

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

Vous pouvez maintenant appeler la fonction creator () et à chaque fois, elle supprimera l'ancien objet et en créera un nouveau.