2017-04-23 2 views
1

J'ai un curseur qui va de 1 à 10 et je veux stocker la valeur que l'utilisateur a choisi avec le curseur à chaque fois. Je veux que la valeur soit mise à jour avec le mouvement du curseur. Voilà ce que j'ai jusqu'à présentComment stocker la valeur de floatSliderGrp en Python Maya

def PrintValue(): 
    print value 

cmds.floatSliderGrp(label='Angle', field=True, minValue=0.0, maxValue=10.0, 
value=0 ,dc=PrintValue(PASSVALUE)) 

Je veux passer la valeur où l'argument PASSVALUE est, est-il un moyen d'obtenir la valeur du curseur?

Répondre

2

'valeur' ​​est un drapeau pour la floatSliderGrp - pas une variable. C'est pourquoi vous ne pouvez pas l'imprimer directement. En fonction de ce que vous voulez faire, vous avez deux façons d'aller de l'avant.

  1. Vous pouvez stocker le nom du contrôle que vous avez créé, puis demander la valeur pour d'autres fonctions. Vous pouvez utiliser partial pour lier des noms de contrôle à des fonctions, ou vous pouvez simplement réorganiser la façon dont vous les créez afin que les fonctions soient créées en connaissant les noms des éléments d'interface utilisateur qui les intéressent. Vous ne mettez pas une commande sur le curseur dans ce cas, mais sur quelque chose d'autre qui a besoin de connaître la valeur du curseur
  2. vous pouvez créer une variable et la mettre à jour chaque fois que la valeur du curseur change. Si un grand nombre d'outils différents doivent connaître la valeur, une bonne option consiste à créer une classe et à y insérer la valeur du curseur. Ensuite, un autre code peut simplement saisir la valeur sans se soucier de l'interface utilisateur. Si vous voulez faire quelque chose dans la scène lorsque le curseur change, vous pouvez changer la fonction update_slider_value() pour faire les choses lorsque le curseur est déplacé.

Voici l'approche n ° 1. Il ne cherche pas à accrocher l'événement dc sur le curseur - il se souvient que le nom des objets curseur et interroge la valeur quand il a besoin de savoir:

wnd = cmds.window() 
col = cmds.columnLayout() 
slider = cmds.floatSliderGrp(label='Angle', field=True, minValue=0.0, maxValue=10.0, value=0) 
b = cmds.button('print value') 
# since this is defined after `slider`, it knows the value 
def print_value(*_): 
    print cmds.floatSliderGrp(slider, q=True, v=True) 
cmds.button(b, e=True, c=print_value) 
cmds.showWindow(wnd) 

est ici la même chose accomplie avec l'approche # 2:

class SliderWindow(object): 

    def __init__(self): 
     self.value = 0 
     self.window = cmds.window(title ="SliderWindow") 
     self.column = cmds.columnLayout() 
     self.slider = cmds.floatSliderGrp(label='Angle', field=True, minValue=0.0, maxValue=10.0, value=0, dc= self.update_slider_value) 
     cmds.button('print value', c= self.print_value) 
     cmds.showWindow(self.window) 

    def update_slider_value(self, *_): 
     self.value = cmds.floatSliderGrp(self.slider, q=True, v=True) 


    def print_value(self, *_): 
     print self.value 

example = SliderWindow() 

Tous ceux qui connaissent example peut simplement demander example.value et obtenir la valeur actuelle du curseur. C'est bon pour les cas plus complexes, mais trop pour les choses simples.

information associée: Maya callbacks cheatsheet

1

utiliser le module: partiel

form functools import partial 

#update the query of the slider 
def getSliderValue(sliderName): 
    return cmds.floatSliderGrp(sliderName, q=1, v=1) 

#funciton for the ui 
def PrintValue(sliderName, *args): 
    value = getSliderValue(sliderName) 
    print value 

#define slider into var 
Slider = cmds.floatSliderGrp(label='Angle', field=True, minValue=0.0, maxValue=10.0, 
value=0, dc='placeholder') 
#now that we have the name of the slider, edit the function to pass it throught 
cmds.floatSliderGrp(Slider , e=True, dc= partial(PrintValue, Slider)) 

--- EDIT ---- Voici un autre poste avec la même question

How to create Maya sliders to move objects in interface