vendredi 16 octobre 2015

INDICATORZ : Demistification du knob("indicators")





    Hey me voila de retour ! Ca va faire plus d'un an que je n'ai pas ecrit de topic. De plus j'ai plein de suites et correction a ecrire (Blink, NodeGraph...)  mais je suis une grosse feignasse donc ce n'est toujours pas fait...

    Ce topic va traiter du knob indicator qui est present dans tous les nodes nuke et qui permet de gerer les petites vignettes de couleur sur le node comme le V ou le X...

Une vrai guirlande!

    Mais derriere tout ca nous allons surtout comprendre comment marche un systeme de flag comme celui-la et pas que dans Nuke (dans le monde du developpement, tres utilise dans Unity par exemple).


ICI les differentes siginification de chaque indicateur.

Les indicateurs sont generes par un knob de type float (Array_Knob). Si je demande la valeur du knob indicators de ce node :







 
nuke.toNode("NoOp").knob("indicators").value()
# Result:
33.0

Donc nous en concluons que les vignettes V et A correspondent a la valeur 33, si je prend n'importe quel node et que je fais
 
nuke.toNode("Nawak").knob("indicators").setValue(33)

Le node Nawak se verra attribuer ces deux vignettes, si avant il possedait d'autres vignettes elles disparaitront pour etre remplace par V et A.
Attention a chaque knob changed la valeur du knob indicator est reinitialise donc dans notre cas V et A disparaitront.


Nous comprenons que chaque vignette a une valeur definit, voici leur valeur :

A  :  1
E  :  2
M  :  4
C  :  8
X  :  16
V  :  32

Nous remarquons que chaque valeur est une puissances de deux et mieux encore ca nous fait penser a un codage binaire, en bit.

Eh bien ce n'est pas pour rien ! c'est la base du systeme de flags. Dans nuke une vignette/indicateur est un flag.
Grace a ce systeme nous pouvons genere des combinaisons de flag a partir d'une seul valeur. Et meme mieux, nous pouvons tester la presence d'un flag dans cette seul valeur, savoir si l'indicateur V est present sur mon node.

Avant de savoir faire tout ca, nous allons voir en peu de binaire.
Nous allons convertir nos flag en binaire :

Flag  :  Valeur  :  Binaire
A      :       1      :      1
E      :       2      :       10
M     :       4      :       100
C      :      8       :       1000
X      :     16      :       10000
V      :      32     :       100000


Maintenant imaginons que nous voulions un ensemble de flags de type E M X :
(petit rappel 1 + 0 = 1, 0 + 0 = 0, 1 + 1 = 1)

EMX  :   22    :               10
                                     100
                                 10000
                              = 10110

La valeur binaire de la somme de nos flags est 10110.
Grace a cette somme nous allons pouvoir tester la presence d'un flag. Est ce que dans ma somme de flag 22 (EMX mais nous ne sommes pas sense le savoir) il y a present le flag M qui a comme valeur 4 ?
Pour cela nous allons "comparer" notre somme binaire de maniere bit a bit avec la valeur binaire du flag que nous cherchons, a l'inverse d'une somme classique 1 + 0 = 0 des lors qu'il y a le presence d'un 0 la somme sera 0. Pour symboliser cette "comparaison" bit a bit nous utilisons &.

EMX & M
22 & 4
10110 & 100

    10110
& 00100
=  00100

Le resultat est 00100 soit 4 soit notre flag E, il est bien present dans nos flags. Si la sommes bit a bit n'est pas egale (ou = 0) au flag recherche alors il n'est pas present dans notre ensemble de flags.

Autres exemples :
EMX & M
22 & 4
10110 & 1
    10110
& 00001
 = 00000

Le flag A n'est pas present.

En programmation les operateurs bit a bit s'appel bitwise symbolise par & pour la "comparaison". (il existe bien d'autres operateur bitwise mais cela ne nous regarde pas ... ).

Un petit exemple concret d'utilisation dans nuke:
Nous allons chercher tous les nodes qui possedes des knobs de stereos, c'est a dire qui possede l'indicateur V soit la valeur 32.
Attention les & bitwise fonctionnent avec des Integer.

 
stereo_nodes = []
view_flag = 32
for node in nuke.allNodes():
    flags_value = 0
    try:
        flags_value = node.knob("indicators").value()
    except AttributeError:
        print "this node doesnt have indicators"
    if int(flags_value) & view_flag != 0 :
        stereo_nodes.append(node)


Pour etre safe j'ai mis un try except mais sachez que tout les nodes ont un knob indicator, il est meme possible de mettre des indicateurs sur des dot ou des backdrops =))).

STYLAYYYY


















Aucun commentaire:

Enregistrer un commentaire