Maxscript Copie d'un sommet.

GO TO ADMIN PANEL > ADD-ONS AND INSTALL VERTIFORO SIDEBAR TO SEE FORUMS AND SIDEBAR
#1
Bonjour.
J'aurais besoin d'un peu d'aide pour un bout de code sur 3DsMax 15, pour automatiser une tâche fastidieuse.

J'ai un plan déformé qui représente donc un terrain. Je clic dessus et je convertie en maillage éditable, puis sélectionne un sommet.
J'aimerais via un bouton récupérer les coordonnées X, Y et Z du sommet sélectionné et les coller dans une checkbox (Checkbox X pour coordonnée X, Y pour Y et Z pour Z)
Ensuite lorsque je sélectionne un autre sommet (qui peux être dans un autre objet que j'ai passé en maillage editable), en fonction des checkbox valide, cela colle les coordonnées dans le sommet sélectionnée.

Je ne sais pas si c'est assez clair dans ma description.

Pour le moment j'en suis au point de ......... pas grand chose.
JavaScript:
try (closerolloutfloater MainFloater) catch()

Rollout Menu01 "Selection"
(
    button Recup_coord "Sélectionner un vertex" pos:[50,8] width:200 height:20
        On Recup_coord pressed do
            (
               
                    Vert = meshop.getVert
                    messageBox vert
                messageBox  "Vertex Sélectionné"
               
            )
)

Rollout Menu02 "Information"
(
    Checkbox Xpos "X :" pos:[2,8] width:40 height:20
    Label Xcoord "..." pos:[45,8] width:40 height:20
    Checkbox Ypos "Y :" pos:[100,8] width:40 height:20
    Label Ycoord "..." pos:[145,8] width:40 height:20
    Checkbox Zpos "Z :" pos:[200,8] width:40 height:20
    Label Zcoord "..." pos:[245,8] width:40 height:20
)

Rollout Menu03 "Insertions"
(
    Label Info "Sélectionner le sommet pour appliquer les coordonées. Cocher dans le panneau information les coordonnées à reprendre." pos:[2,8] width:295 height:40
    button Colle_coord "Colle les coordonnées" pos:[50,55] width:200 height:20
)

Rollout Menu04 "Crédit"
(
    )


MainFloater = NewRolloutFloater "Copie Colle Coordonées" 300 300
addRollout Menu01 MainFloater
addRollout Menu02 MainFloater
addRollout Menu03 MainFloater
addRollout Menu04 MainFloater
Merci de votre aide
 

malikarn

Membre très actif
#2
salut
Ecoute si t'es pas trop pressé, je vais voir si je peux te bricoler un truc. Mais cette semaine ca va etre chaud, je suis bien occupé au taf. Ce week end je tache de trouver un moment si tu n'as pas trouvé par toi-même d'ici là.
Globalement :
- Je ne créerais pas plusieurs rollout, ca pose des "problèmes" d'espace de noms. Mets tout dans le meme rollout, ce sera plus simple pour le scope/portée des variables. Et ca fera un code plus court.
- Il te manque une variable importante, celle qui stocke la position du vertice. Elle est de classe point3
- il manque quelques error handlers pour sécuriser un peu tout ca (tous les nodes n'ont pas de vertices, il faut être en subobject level 1, quid si tu sélectionnes un autre objet etc.)
- il manque la procédure qui écrit les coordonnées… ou une partie des coordonnées.
- il manque eventuellement des procédures qui décrivent l'espace de transformation si tu veux rendre le tout plus robuste.

++
 
#3
Bonjour et merci pour ta réponse.
Il manque beaucoup de chose effectivement. Je programme pas mal en Vbnet, et j'avoue que le script est pas simple. Enfin passer de l'un à l'autre. Ne t'inquiète pas, je ne suis pas pressé à la minute. J'ai moi même une semaine pas mal chargé.

Je vais tacher de regarder dans l'aide,, la classe Point3
Pour ce qui est des error, oui je pense qu'il faut en mettre. En revanche, quand je recupère les coordonnées d'un sommet d'un objet... Je veux pouvoir les coller dans un sommet du même objet ou dans un sommet d'un autre objet.

En tout cas merci de ton aide.
 

malikarn

Membre très actif
#4
Re
Oui concernant ce dernier point (coller la position sur un autre objet) il faut préciser l'espace de transformation car si tu ne le fais pas ca pause au moins 2 problèmes.
En effet les coordonnées des vertices sont exprimées dans l'espace parent, donc "l'espace object" du node auquel appartiennent les vertices, et donc par rapport au pivot pour vulgariser (quoique ce ne soit pas complètement exact).
Du coup :
- probleme 1 : si tu colles la position Y d'un vertice sur un node dont le Y est aligné sur le X du précédent, ben tu ne vas pas déplacer le vertice sur l'axe "attendu" intuitivement.
- problème 2 : si l'objet a été mis a l'échelle, la quantité de transformation du vertice sera scale d'autant et c'est là encore contre-intuitif meme si "logique" dans l'absolu.
Ben écoute, laisse moi un petit moment et je te bricole ca, c'est pas bien méchant mais il est tard, on est que lundi et je rentre à peine :'s (semaine compliquée ^^)
++
 

malikarn

Membre très actif
#6
re non c'est pas complexe,
ce qui l'est en revanche c'est de penser à tout. Par exemple les choses peuvent être différentes selon qu'il s'agisse d'un mesh editable, d'un poly editable, d'un modificateur edit poly, d'un modificateur edit poly en mode animate etc.
Du coup parfois meme un code simple peut devenir relou a mettre en œuvre quand tu veux t'assurer qu'il ne plantera jamais.
En l'état voici une version qui fait "juste" ce que tu lui demandes :

JavaScript:
rollout RLL "Parameters" width:405 height:60
(
    fn isValidMesh =
    (
        if ($selection as array).count == 1
            then classOf $ == Editable_mesh or classOf $ == Editable_Poly
                else false
    )
   
    fn getVal s = (filterString s " ")[3] as float
   
    --UI DEF
    checkButton chk_x "X : 0.0"     pos:[0,0]     width:130     height:30 checked:true
    checkButton chk_y "Y : 0.0"     pos:[130,0] width:130     height:30 checked:true
    checkButton chk_z "Z : 0.0"     pos:[260,0] width:130     height:30 checked:true
    button         btn_get "Get"         pos:[0,30]     width:195     height:30
    button         btn_set "Set"         pos:[195,30] width:195     height:30
   
    on btn_get pressed do
    (
        if isValidMesh() then
        (
            local C = $.selectedVerts[1].pos --worldspace
            if chk_x.checked do chk_x.caption = "X : " +  C[1] as string
            if chk_y.checked do chk_y.caption = "Y : " +  C[2] as string
            if chk_z.checked do chk_z.caption = "Z : " +  C[3] as string
        )
        else format "Impossible de retrouver les coordonnées\n"
    )
   
    on btn_set pressed do with undo "set_coord" on
    (
        if isValidMesh() then
        (
            if chk_x.checked do
                for j in $.selectedVerts do j.pos.x = getVal chk_x.caption
            if chk_y.checked do
                for j in $.selectedVerts do j.pos.y = getVal chk_y.caption
            if chk_z.checked do
                for j in $.selectedVerts do j.pos.z = getVal chk_z.caption
            update $
        )
        else format "Impossible d'appliquer les coordonnées\n"
    )
)

try (closerolloutfloater MainFloater) catch()
MainFloater = NewRolloutFloater "Copie Colle Coordonnées" 405 90
addRollout RLL MainFloater
Les coordonnées sont exprimées en worldspace.
 
Haut