MAXScript et VrayProxy

By 23/02/2012Blog, Tutoriaux

Ce sera le premier tuto MAXScipt du blog! Rien de bien prétentieux, au contraire, juste une petite intro vous permettant de gagner du temps sans forcement « vraiment » apprendre MAXScript! La Manica Lunga Library, m’a donné pas mal de fil à retordre pour une raison simple, le nombre d’objets présent dans la scène. Du coup, je me suis servi de MAXScript pour automatiser les actions simples et récurrentes de la création de la scène. Un exemple simple, la gestion de l’affichage des VrayProxy.

Avant de commencer la scène, j’ai placer un certains nombre de livres à la main, forcement c’est devenu compliquer de les sélectionner pour ensuite les afficher en box étant donne que l’option « bounding box » n’est plus accessible… Comme vous ne le savez peut-être pas, je viens du Web, et la productivité se résume parfois à réduire le nombre de clics pour accomplir une tache. J’essayerai de vous présenter un autre outil « fait-maison » pour gagner du temps dans un autre billet mais pour le moment on va se concentrer sur la création d’un outil simple de gestion de l’affichage des VrayProxy.

Mise en place

Avant de commencer à appréhender la bête, (je mets pas apprendre, j’ai pas franchement le sentiment d’être capable de vous apprendre MAXScript) voici deux petites notions de base. Le MAXScript Listener et le Macro Recorder doivent être actif afin d’enregistrer vos actions dans la scène et vous en donner les bouts de codes qui correspondent a vos actions. Faites le test, créer une box dans votre scène et votre MAXScript Listener vous donnera le code nécessaire pour refaire exactement la même action. La seconde chose à connaitre est l’utilisation du symbole « $ » (sans les guillemets) qui consiste à écrire  » la sélection active ». Sachant cela en sélectionnant un objet de la scène, plutôt que d’utiliser son nom un simple « $ » suffira à dire que vous voulez travailler sur l’objet sélectionné. Petit raccourci bonus, Ctrl+D vous permet d’effacer le code inscrit dans la fenêtre.

Observation

Maintenant que vous savez comment ça marche, attaquons la création de notre script! Je crée une teapot et l’exporte en VrayProxy. Une fois l’opération termine, lancez le MAXScript Listener avec le Macro Recorder actif. Vous trouverez ça dans le menu MAXScript. Selectionnez votre teapot et modifiez le Display mode de votre proxy. Vous remarquerez que le code change et donc que :

  • bounding box = 0
  • preview from file = 1
  • preview from file (faces) = 3
  • point = 2
Je vous laisse faire le test, copiez le proxy (en mode « copy ») et vous ne pouvez plus changer le mode d’affichage… voila l’idée du script! C’est simple et sans prétention mais le temps gagner en prod vaut la peine de perdre un quart d’heure a écrire un script 😉

Tester le code

Rappelez-vous du point numéro 1  et de ceci: $
C’est vrai que je vous ai lancer un truc du style « Observez le MAXScript Listener, copiez/collez et ça roule! »  c’est pas tout a fait juste. En fait si mais il faut rendre le script universel. Par cela j’entends qu’il doit fonctionner avec tous les VrayProxy de la scène et surtout avec une selection de plusieurs VrayProxy en même temps. Vous savez donc que le code observé doit être écrit d’une autre manière pour permettre la modification de plusieurs objets puisqu’elle n’est pas nominative.
Ainsi, dans un premier temps, on va faire un code qui marche avec un seul VrayProxy. Pour en revenir au code, vous pouvez tester ce code :
  • $.display = 3
Si on devait dire cela en langage humain, cela voudrait dire « le mode d’affichage de la sélection active est égale a 3 » MAXScript vous répond alors 3 pour confirmer le changement et l’objet change dans le viewport… magique!

Traduire en script

Maintenant que nous savons a quoi nous en tenir au niveau des valeurs correspondant a l’affichage souhaité, reste a créer un code capable de s’adapter et agir en fonction de l’etat d’affichage actuel du proxy. Evidemment il faut tout de même quelques notions de code pour cette partie mais l’ensemble reste assez simple a comprendre et l’aide de MaxScript étant un vrai bijou (on en reparlera plus bas) je crois que ce genre de fonction reste accessible a tous.

La première étape consiste a penser la manière la plus simple et efficace pour écrire notre bout de code. Le raisonnement est assez simple:

  • Je n’utilise que deux modes d’affichage, bounding box et preview from file soit 0 et 1
  • Comme on l’a vu dans la partie observation,  le reste des options a une valeur en code plus élevés soit 2 et 3

Sachant cela, je n’ai pas besoin de détecter la valeur actuelle de l’objet pour le modifier de la bonne façon, puisque je peut me servir de la valeur display comme référence. Afin de couvrir tout le champ des possible, cela nous donne une logique du style « Si la valeur display de la sélection actuelle est plus grande ou égale a 1, elle devient 0, sinon elle devient 1 » En écrivant ceci en code, il sera en manière de réagir correctement si la sélection est en mode 0, 1, 2 et 3. Evidemment cela implique que le tous les VrayProxy soit déjà dans le même mode, mais pour un premier script (et pour mon workflow sur cette scène) c’est amplement suffisant. Revenons-en au code, je traduis la phrase exactement comme on l’a pensé plus haut :

  • if $.display >= 1 then ($.display =0) else $.display = 1

Et voila! Une simple ligne de code qui change de manière simple et efficace toute la gestion de ma scène 🙂 Vous vous en doutez, ce genre de petits bouts de code change vraiment la donne en terme de productivité! J’ai toujours préféré regarder un ordi travailler… 😉

Rendre le Script fonctionnel

C’est ici que les choses se complique. Pas tant que ça si vous avez déjà des notions en script, je pense particulièrement a l’AcionScript 3, mais il va falloir comprendre l’utilisation de « for ». C’est assez simple, le but est de dire en code: « Pour chaque objet dans la sélection, tu appliques ceci. » Ceci étant notre précédente ligne de code. Ainsi nous allons devoir transformer notre basique « $ »  afin qu’il puisse marcher avec tout le monde, ce qui nous fait:

for i in selection do
 (
 if i.display >= 1 then i.display = 0 else i.display = 1
 )

Enregistrer le script

La dernière étape n’est pas une obligation, c’est juste ma manière de sauvegarder/gérer mes scripts. Pour cela je le convertis en macro afin de pouvoir le gérer dans le panneau de configuration de 3dsMax. Ca a l’avantage de pouvoir ensuite se rajouter dans une toolbar ou un menu… ou vous voulez en fait 🙂

macroScript Disp_Proxy category:"Matt" buttonText:"Disp_Proxy" tooltip:"www.mattguetta.com"
(
  for i in selection do
  (
    if i.display >= 1 then i.display = 0 else i.display = 1
  )
)

Une fois le fichier créer, enregistrez-le dans votre dossier script. Faites un Run Script et vous pourrez ensuite le trouver dans le « Customise User Interface ».

Se servir de l’aide de MAXScript

L’aide de MAXScript est franchement top, je voudrais juste souligner un point: l’installation en locale. Je vais pas vous refaire le topo mais pour ceux que ça intéresse je vous invite a lire: MAXScript Help for 3dsMax 2012

Aller plus loin

Et pour finir, bien que ce ptit bout de code soit sympa etc. je suis plus que conscient que cela reste du bidouillage, ce n’est pas ce que l’on pourrait appeler un vrai développement d’outils de production mais ça reste pratique. Par exemple, pour reprendre le même sujet, il aurait été intéressant de créer une fonction qui détecte le type d’objet sélectionner, détecte le mode dans lequel est l’objet pour ensuite appliquer le code adéquat. Ce qui nous ferait un vrai outil de prod… Tout ça pour dire que je vous encourage à apprendre MAXScript, écrire des fonctions, créer des variables, utiliser des tableaux etc. A ce sujet, je vous recommande chaudement MAXScript 101.
Premier article sur le sujet alors je réclame votre indulgence et surtout votre avis sur le sujet, plus de MAXScript sur ce blog ou pas ?

Join the discussion 14 Comments

  • V!nc3r dit :

    Du partage de maxscript, personnellement je suis toujours pour, ça aide souvent à gagner du temps sur des petites taches ; et pas forcément besoin de pondre un roman dans le script, quelques lignes suffisent bien souvent.
    (mes contributions au scripting si ça peut servir à certains http://www.nothing-is-3d.com/tips/categorie7/maxscript)

  • matt dit :

    Le Lock/Unlock je l’adopte! Merci V!nc3r 🙂 > http://bit.ly/xr99tU

  • Zawt dit :

    Merci matt !
    même si je n’aime pas la programmation je trouve ça très intéressant et comme l’a si bien dit V!nc3r ça aide à gagner du temps.
    Je vais me pencher un peu sur l’aide qui effectivement a l’air très bien faite.

  • sidetmc dit :

    Un grand MERCI pour ce petit bout de code et pour le reste !

    Ça risque de me servir dans la salle de concert où j’ai 18000 sièges ! Mon boss a du mal avec les « boites » à la place des sièges !

  • AdrienRollet dit :

    Sympa Matt d’avoir abordé ce sujet 😀 pour ma part du maxscript aussi bien expliqué, je peux dire que oui ! et merci

  • Dec13els dit :

    Merci Matt pour ces lignes de codes, et merci à toi V!nc3r pour ton script de lock 🙂 super pratique !

    J’attends impatiemment un nouveau billet du blog X)

  • Tony D. dit :

    Salut Matt, un petit coup de test avec classof i == VrayProxy pour ne pas que le script plante quand tu as sélectionné autre chose qu’un proxy mange pas de pain et permet de faire des sélection à la porc

    for i in selection where (classof i == VrayProxy) do
    (
    if i.display >= 1 then i.display = 0 else i.display = 1
    )

  • Rémi dit :

    Sympa ce petit tuto 🙂

    Un autre truc qui permet de gagner un peu de temps :

    actionMan.executeAction 0 « 40247 »

    ça permet, quand on est en vue caméra de la sélectionner, plutôt que d’aller cliquer en haut à gauche du viewport sur le nom de la camera et faire « select camera »… surtout quand y a d’autres fenetres par dessus !

  • Rémi dit :

    les guillemets ont merdé ^^

    actionMan.executeAction 0 « 40247 »

  • Rémi dit :

    Bon ben apparement c’est le système de commentaire qui me les modifie, donc c’est 2 guillemets de la touche 3 😉

  • matt dit :

    Salut, en fait j’avais fait ça et si c’était pas un VrayProxy il utilise le « display as box » de Max mais pour le tuto, j’ai simplifié, le but étant de faire découvrir Maxscript. Des que j’ai un Pc sous la main je colle le code complet 😉

  • rauquenrol dit :

    Super initiative, les tutos Maxscripts Matt, comme d’hab.

    Le maxscript ça peut faire peur, mais la plupart du temps 2 ou 3 lignes de code peuvent vous faire gagner beaucoup de temps. Pas besoin de connaissances en programmation pour s’y mettre, j’encourage vraiment tout le monde à y jeter un petit coup d’oeil, perso je m’y suis mis y un peu plus d’un an et après avoir compris l’étendue des possibilités, depuis je n’arrête plus.

    Peut-être que certains de mes outils pourront vous être utiles : http://rauquenrol.over-blog.com/pages/maxscripts-3995278.html

  • Olivier dit :

    Merci beaucoup Matt !

    Y’en a qui mette leur pub de partout, sur les blog des autres, et pour des scripts payant… c’est pénible (cf avant dernier post)

  • TallDwarf dit :

    T’es pas obligé de cliquer … et puis ses scripts sont intéressants ;>D