Bon alors chose promise chose dûe, je vais détailler le script:
Premiere chose,
la composition du script en lui-même
En gros ya 2 parties principales dans le script: la
première on où déclare tout ce qui touche à l'interface
graphique du script: boutons, texte, .... et la
deuxième partie qui contient les procédures correspondant aux
actions à effectuer lorsqu'on clique sur tel bouton, qu'on change telle valeur...etc
Pour la première partie, ya pas à s'en faire c'est généré tout seul par visual Maxscript: la fenêtre représentant
le rollout s'affiche et ya plus qu'à placer ses boutons où on veut. une fois que c'est fait on ferme la fenêtre
et le code correspondant est généré tout seul. (ya même possibilté d'écrire tout le code directement dans depuis
visual maxscript mais j'aime pas parcequ'on voit pas tout ce qu'on fait. Mais bon c'est chacun selon ses gouts.
Tout d'abord on définit une fonction:
fn filtre_l ob = superClassOf(ob)==light
Cette fonction filtre_l teste si l'objet ob est de type (superClassOf) light;
C'est cette fonction qui servira de filtre au bouton suivant qui permet de choisir sa lumière dans la scène en
cliquant dessus:
pickbutton pick_l "Light:" pos:[6,8] width:148 height:20 filter:filtre_l
le bouton qui permettra de choisir la lumière dans la scène: il s'appelle pick_l et il est de type pickbutton,
ie qu'après avoir cliqué dessus, il attend que l'on clique sur un élément de la scène. On peut en plus filtrer
les objets sur lesquels on peut cliquer, ce qui est fait ici avec la fonction filtre_l qui n'autorise que les lights.
button btne "Exclure" pos:[6,228] width:148 height:26 enabled:false
déclaration simple d'un bouton, nom btne, de titre (ou caption) "exclure", paramètres de position, de taille et enfin
enabled:false, ie que par défaut il n'est pas cliquable.
global lum=undefined
global sel=undefined
déclaration de deux variables globales lum et sel qui contiendront respectivement la lumiere qui nous interesse et la liste
des objets à garder.
listBox listb "A illuminer:" pos:[18,48] width:124 height:8
groupBox grp1 "Selection" pos:[8,34] width:146 height:180
button btn_def "Définir" pos:[20,182] width:120 height:20
déclarations d'une listbox, qui affichera les noms des éléments à garder, d'une groupbox (n'intervient que pour l'interface
graphique, aucun interet en soi) et d'un autre bouton.
Voila pour la première partie...
Maintenant la deuxième, le "vrai" script en lui-même:
on commence par une fonction liste selc qui sert à remplir la listbox avec les noms des objets de selc
fn liste selc =
(
if (selc.count != 0) then
(
listb.items=#(selc[1].name)
for i=2 to selc.count do
listb.items=listb.items + #(selc[i].name)
)
)
si la liste n'est pas vide (son nombre d'élèments est différent de 0) on ajoute le nom du premier élèment de selc à la liste des objets de listb
-> tout est sous forme de liste d'où les #() qui indiquent qu'il s'agit de tableaux donc listb.items=#(selc[1].name) ensuite du deuxième
élèment au dernier, on ajoute à la liste des objets le i-ième.
mais il y a moyen de faire légèrement plus court en utilisant, à la place de
listb.items=listb.items + #(selc[i].name)
la construction
listb.items+=#(selc[i].name) qui revient exactement au même.
Ici, on choisit la lumière de la scène qui nous interesse:
on pick_l picked objl do
(
btne.enabled=true
pick_l.caption="Light: " + objl.name
lum=objl
)
lorsque le bouton
pick_l est enfoncé,
objl contenant l'objet de la scène sur lequel on a cliqué,
- on active le bouton btne (enabled=true)
- on change le titre (ou caption) du bouton pick_l par "Light: " + le nom de l'objet
- et enfin on affecte à la variable lum l'objet en question.
Même principe mais cette fois pour ce qui est des objets à garder:
on btn_def pressed do
(
sel=selection as array
liste sel
)
lorsqu'on clique sur le bouton
btn_def, la sélection en cours d'objets de la scène est affectée à la variable
sel en tant que tableau (
as array).
Ensuite on appelle la fonction
liste qu'on a définie plus haut pour remplir la
listbox avec les noms de la sélection.
Vient en fin la proocédure principale:
on btne pressed do
(
undo on "Exclusion"
(
select $*
deselect lights
deselect sel
lum.excludeList=(selection as array)
deselect $*
)
)
Il apparait ici la structure
undo on "Exclusion" ( ... ). Elle permet simplement de pouvoir anuler, sous le nom d'i>Exclusion, tout ce qui est entre parenthèses
en passant par le menu edit de max.
Tout d'abord, on sélectionne tous les objets de la scène grâce à
select $* (on peut tout aussi bien selectionner uniquement
les objets dont le nom commence par "xyz" en faisant
select $xyz*, ...etc)
Puis, on déselectionne tous les objets de type
light:
deselect lights
Enfin, on déselectionne les objets que l'on voulait garder qui sont sotckés dans la variable
sel:
deselect sel.
A ce niveau-là, tous les objets de la scène sont selectionnés sauf les lumières et ceux qu'on veut garder. Tous ceux qui sont selectionnés sont donc à exclure de l'illumination de la
lumière
lum, ce qui est fait par:
lum.excludeList=(selection as array).
Pour finir, on déselectionne tout:
deselect $*.
Et voila.
haut