Jump to content
Sign in to follow this  
Balboza

Lien entre control panel et Attribute holder

Recommended Posts

Bonjour tout le monde,

 

J'aimerai faire un script qui permet de changer les valeurs de Mass et de Drag de mon spring (control panel) directement de mon contrôleur d'animation grâce à un attribute holder custom.

J'arrive à changer ces valeurs en bougeant mon spinner, mais lorsque je reviens sur mon contrôleur, la valeur ne correspond plus a la valeur réelle de ma mass et de mon drag, mais à la valeur par défaut de mon spinner.

Il faudrait que je rajoute un bout de script qui aille chercher la valeur actuelle dans mon Control panel pour l'utiliser sur le spinner.

Le problème c'est que je n'ai aucune idée de comment faire cela, et que ce que j'ai déjà fait fut déjà assez douloureux à sortir XD

Si l'un de vous peut m'aider, ce serait vraiment génial. 

 

Voici ce que j'ai déjà :

"SPRING_Control_Custom_attribute = attributes custom_Attributes
(
rollout SpringControlRollout "Spring Control"
(
spinner spn_Mass "Height" range:[0,2000,500] type:#float
spinner spn_Drag "Height" range:[0,10,2] type:#float

on spn_Mass changed val do $'Point001'.position.controller.setMass val
on spn_Drag changed val do $'Point001'.position.controller.setDrag val
)
)

CustAttributes.add $.modifiers[1] SPRING_Control_Custom_attribute"

 

Share this post


Link to post
Share on other sites

Salut,

Je ne suis pas devant mon PC, ça va être compliqué d'être précis, mais dans l'idée il faudrait peut-être que la valeur par défaut de ton spinner corresponde à la valeur de ton contrôleur non ? Il y a peut-être des variables getMass et getVal ?

Sinon, tu as pensé aux Wire Parameters ?

Share this post


Link to post
Share on other sites

Coucou Nicolas,

Ouais j'ai pensé aux Wire Parameters mais la valeur du Mass et du Drag du spring n'est pas modifiable par ce biais malheureusement.

Et ouais je pense que tu suggères la bonne solution mais pour la réalisation , je n'ai aucune idée de la façon de faire. 

merci

Share this post


Link to post
Share on other sites

Bonjour @Balboza,

Alors, je vais tenter, pas ouvert MXS depuis des mois ... au risque de me faire chambrer par @SugaR :P

On pourrait tenter un truc dans ce genre:

"SPRING_Control_Custom_attribute = attributes custom_Attributes
(
rollout SpringControlRollout "Spring Control"
(

local MyMass = $'Point001'.position.controller.getMass -- je ne connais pas la syntaxe exacte pour ce contrôleur, à vérifier

local MyDrag = $'Point001'.position.controller.getDrag -- je ne connais pas la syntaxe exacte pour ce contrôleur, à vérifier
spinner spn_Mass "Height" range:[0,2000,MyMass] type:#float -- on injecte la variable définie précédemment en tant que valeur par défaut du spinner
spinner spn_Drag "Height" range:[0,10,MyDrag] type:#float -- on injecte la variable définie précédemment en tant que valeur par défaut du spinner

on spn_Mass changed val do $'Point001'.position.controller.setMass val
on spn_Drag changed val do $'Point001'.position.controller.setDrag val
)
)

CustAttributes.add $.modifiers[1] SPRING_Control_Custom_attribute"

 

Share this post


Link to post
Share on other sites

Si je comprend bien, à chaque fois que tu sélectionnes ton spring, la valeur affiché du spinner dans le control panel est celle par default ?

Si c'est le cas et de tête (je n'ai pas touché à tout ça depuis, pfioouuuu... 😁 ), @Nicolas Caplat est sur la bonne voie, il faut que tu rajoutes un truc dans ce genre dans la définition de ton rollout:

rollout SpringControlRollout "Spring Control"
(
  spinner spn_Mass "Height" range:[0,2000,500] type:#float
  spinner spn_Drag "Height" range:[0,10,2] type:#float

  on SpringControlRollout open do
  (
    spn_Mass.value = $.position.controller.getMass -- je ne connais pas la syntaxe exacte pour ce contrôleur, à vérifier
    spn_Drag .value = $.position.controller.getDrag -- je ne connais pas la syntaxe exacte pour ce contrôleur, à vérifier
  )

  on spn_Mass changed val do $.position.controller.setMass val
  on spn_Drag changed val do $.position.controller.setDrag val
)

Au passage, je te conseille de lire la doc sur Scripted Plugins ansi que sur Scripted Utilities and Rollouts

d'ailleurs, je constate que tu n'a pas de parameters dans ton custom attributes, c'est plutôt important car c'est ce qui permet de rajouter tes propres parametres à un objet, quelque chose du genre:

$.myParameter01

$.myParameter02

etc..., le tout link justement avec l'ui dans le rollout, et qui te permet de modifier ces valeurs ailleurs. Pas forcement necessaire en fonction de ce que tu veux faire mais généralement utile.

Sinon je te constellerais aussi peut-être de démarrer par quelque chose de plus simple que les custom attributes et les animations controler, qui sont de réel plaie a dev... :) 

N'hésite pas à partager une simple scène de test avec les scripts en question si tu veux que je regarde ça plus en détails :)

Share this post


Link to post
Share on other sites

T'es un boss Nicolas!!!

Merci beaucoup , j'ai passé deux soirs de suite sans succès!! Et là hop, tu me débloques ! 

la syntaxe exacte est

"       local MyMass = $'Point001'.position.controller.getMass()
        local MyDrag = $'Point001'.position.controller.getDrag()"

Et c'est nickel , encore merci :)

Share this post


Link to post
Share on other sites

Merci pour ta réponse SugaR!

 

J'ai réussi (enfin Nicolas plutot ^^) avec ce script :

"

SPRING_Control_Custom_attribute = attributes custom_Attributes
(
    rollout SpringControlRollout "Spring Control"
    (
        local MyMass = $'Point001'.position.controller.getMass()
        local MyDrag = $'Point001'.position.controller.getDrag()
        spinner spn_Mass "Mass" range:[0,2000,MyMass] type:#float
        spinner spn_Drag "Drag" range:[0,10,MyDrag] type:#float
        
        on spn_Mass changed val do $'Point001'.position.controller.setMass val
        on spn_Drag changed val do $'Point001'.position.controller.setDrag val
    )
)

CustAttributes.add $.modifiers[1] SPRING_Control_Custom_attribute

"

Je ne sais pas si le tiens est mieux mais en l'état ça fonctionne :) Merci a vous deux

Le but c'est de contrôler la mass et la drag du spring qui agit sur 6 objets en passant par un seul contrôleur.

Je vous ai fait un envoie avec le fichier de test et le spring et un screen du perso si vous etes curieux du contexte. 

https://we.tl/t-5dMMMnxmea

 

 

 

Share this post


Link to post
Share on other sites

2021, ok je vais faire une save avec une version moins récente mdr 

 

J'ai une nouvelle erreur

"

SPRING_Control_Custom_attribute = attributes custom_Attributes
(
    rollout SpringControlRollout "Spring Control"
    (
        local MyMass = $'PtDrv_OZO_R_Spring_earA01'.position.controller[1].getMass()
        local MyDrag = $'PtDrv_OZO_R_Spring_earA01'.position.controller[1].getDrag()
        spinner spn_Mass "Mass" range:[0,2000,MyMass] type:#float
        spinner spn_Drag "Drag" range:[0,10,MyDrag] type:#float
        

        on spn_Mass changed val do $'PtDrv_OZO_R_Spring_earA01'.position.controller[1].setMass val
        on spn_Mass changed val do $'PtDrv_OZO_R_Spring_earB01'.position.controller[1].setMass val
        on spn_Drag changed val do $'PtDrv_OZO_R_Spring_earA01'.position.controller[1].setDrag val
        on spn_Drag changed val do $'PtDrv_OZO_R_Spring_earB01'.position.controller[1].setDrag val        
        
    )
)

CustAttributes.add $.modifiers[1] SPRING_Control_Custom_attribute"

 

Lorsque je mets plusieurs objets pour que leur spring soit affecté par le controleur, celui ci ne le change que pour un seul...

Dans le cas présent sur le "PtDrv_OZO_R_Spring_earA01" et non le earB01

Sachant qu'il y a 12 objets à faire rentrer dans le script... ^^' Y a t'il quelque chose de particulier à faire lorsque l'on veut changer plusieurs chose à la fois? Nomemclature ou syntax?

Merci , j'abandonne pour ce soir, dodo! :) (les enfants ne dormiront pas demain matin ! XD)

https://we.tl/t-D1BSOOVXPq    la version test en max2018 (si vous voulez la version pas test du singe, je l'envoie par mail perso seulement :))

 

Share this post


Link to post
Share on other sites

Ah bah oui logique cette " erreur" ;)

Je pense que tu dois construire ton script de façon un peu différente, avec un loop utilisant "for ..... do" . Regarde la doc MXS pour plus d'infos... je n'ai malheureusement pas du tout de temps ce week-end :(:(

edit: je vais essayer de te montrer d'ici ce soir

Share this post


Link to post
Share on other sites

Bon, pas le temps de tester, fait vraiment à l'arrache ... j'espère que ça fonctionnera. Il y a des choses à ajuster, mais au moins je pense que le principe est correct :P

 

SPRING_Control_Custom_attribute = attributes custom_Attributes
(
    
    rollout SpringControlRollout "Spring Control"
    (
        myObjs = selection as array --collecte les objets sélectionnés dans un array. On peut aussi utiliser des objets de la scène selon leur préfixe, suffixe, etc selon les besoins
        local MyMass = myObjs[1].position.controller[1].getMass() --stocke la valeur de Mass du contrôleur du premier objet sélectionné
        local MyDrag = myObjs[1].position.controller[1].getDrag() --stocke la valeur de Drag du contrôleur du premier objet sélectionné

        spinner spn_Mass "Mass" range:[0,2000,MyMass] type:#float
        spinner spn_Drag "Drag" range:[0,10,MyDrag] type:#float
        

        on spn_Mass changed val do
        (
            for obj in myObjs do --loop sur les objets stockés dans l'array myObjs, ici ce sont les objets sélectionnés
            (
               obj.position.controller[1].setMass val
            )
        ) 

        on spn_Drag changed val do 
        (
            for obj in myObjs do --loop sur les objets stockés dans l'array myObjs, ici ce sont les objets sélectionnés
                (
                    obj.position.controller[1].setDrag val 
                )
        )
        
    )
)

CustAttributes.add $.modifiers[1] SPRING_Control_Custom_attribute"

Share this post


Link to post
Share on other sites

@Nicolas Caplat A première vue c'est un poil plus complexe que ça pour

myObjs = selection as array

Le problème ici, c'est que tu veux choper la selection actuelle, hors la selection actuelle doit être le contrôler principal et pas les objets à modifier, à cause de: 

CustAttributes.add $.modifiers[1] SPRING_Control_Custom_attribute"

donc ce qu'il va se passer ici, c'est que tu va stocker dans ton array 'myObjs' l'objet sur lequel tu ajoutes le custom attrib :) 

il faut donc changer l'une des deux lignes de codes dans ce cas, soit hard coder la manière dont tu récupères 'myObjs' (en utilisant par exemple les noms des objets), soit hard coder l'objet sur lequel tu veux ajouter le custom attrib. Et à mon avis aucune des deux méthodes d'ailleurs n'est à conseiller, le hard coding étant à bannir :D . Imagine un simple changement de nom, et faut reprendre le script, la misère...

 

Pour ce genre de cas, ce qu'il vaut mieux faire à mon avis, c'est avoir dans la def du custom attrib une partie parameters avec soit un '#nodeTab' soit un '#maxObjectTab'
 

SPRING_Control_Custom_attribute = attributes custom_Attributes
(
    parameters SpringControlParms rollout:SpringControlRollout 
    (
        nodeArray  type:#nodeTab tabSizeVariable:true tabSize:0
    )

    rollout SpringControlRollout "Spring Control" (...)

)

ou encore mieux en utilisant des weaks references

SPRING_Control_Custom_attribute = attributes custom_Attributes
(
    parameters SpringControlParms rollout:SpringControlRollout 
    (
        weakRefArray type:#maxObjectTab tabSizeVariable:true tabSize:0
    )

    rollout SpringControlRollout "Spring Control" (...)

)

et avoir par exemple un bouton en plus dans le rollout pour selectionner et stocker les objets à modifier derrière. Et ajouter au passage les deux paramètre type float pour "Mass" et "Drag", ce qui permet au passage d'accéder à tout ça par d'autre moyen, puisque ca devient de vrai parametre du contrôleur ($.modifiers[1].custom_Attributes.Mass via mxs par exemple), entre autres avantages (retenir la valeur actuelle par exemple).

Certes ca complexifie le tout, mais bon... J'ai proposé à @Balboza qu'on regarde ça ensemble quand il aura le temps, je te transmettrais le tout si tu es intéressé ;) 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Who's Online   0 Members, 0 Anonymous, 12 Guests (See full list)

    There are no registered users currently online

×
×
  • Create New...