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
Tester le code
- $.display = 3
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
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)
Le Lock/Unlock je l’adopte! Merci V!nc3r 🙂 > http://bit.ly/xr99tU
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.
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 !
Sympa Matt d’avoir abordé ce sujet 😀 pour ma part du maxscript aussi bien expliqué, je peux dire que oui ! et merci
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)
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
)
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 !
les guillemets ont merdé ^^
actionMan.executeAction 0 « 40247 »
Bon ben apparement c’est le système de commentaire qui me les modifie, donc c’est 2 guillemets de la touche 3 😉
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 😉
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
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)
T’es pas obligé de cliquer … et puis ses scripts sont intéressants ;>D