PDA

Voir la version complète : Le cube revisité en Python



tabou
21/09/2011, 23h23
Bonjour à tous,

Je commence à apprendre à programmer en Python, et j'ai donc préféré attaquer par un sujet pas trop compliqué, à savoir le cube :icon_mrgreen:
L'idée est de me simplifier la vie, en effet l'axe du cube standard est obligatoirement situé au centre. Cela n'est pas gênant quand il faut que l'objet soit centré mais c'est rarement le cas, le plus souvent on a besoin de l'aligner par rapport au sol ou un autre objet et du coup, chaque fois qu'on change la taille du cube il faut le repositionner :sweatdrop:



http://vimeo.com/29378448

J'ai utilisé un générateur Python mais je pense le transformer en plugin, accessible d'un clic sur une icône. Pour l'instant le plus simple c'est de le glisser dans la médiathèque pour l'avoir à portée de souris.
Il faudra que j'optimise le code, là c'est brut de fonderie :icon_redface: je suis d'ailleurs ouvert à toute suggestion pouvant l'améliorer.
Il me reste aussi à implémenter les poignées de contrôle, pour le moment il faut passer par les attributs pour changer la taille, mais comme il fonctionne déjà bien comme ça, je le mets à disposition.

Le fichier (http://tabou.free.fr/tabou/2011/Py_Cube.c4d.zip)




import c4d
from c4d import *

def biseauClamp(rayon,x,y,z): # évite que le rayon du biseau soit supérieur à la moitié de la plus
if rayon> x/2 : # petite dimension de l'objet sinon l'objet disparait
rayon = x/2
elif rayon> y/2 :
rayon = y/2
elif rayon> z/2 :
rayon = z/2
else :
rayon = rayon
return rayon

def creaCube():
ancreX = op [ID_USERDATA, 3] # DU point d'ancrage sur les axes X, Y et Z
ancreY = op [ID_USERDATA, 4]
ancreZ = op [ID_USERDATA, 6]
tailleX = op [ID_USERDATA, 7] # DU dimensions du cube en X, Y, Z
tailleY = op [ID_USERDATA, 8]
tailleZ = op [ID_USERDATA, 9]
segX = op [ID_USERDATA, 10] # DU nombre de segments en X, Y, Z
segY = op [ID_USERDATA, 11]
segZ = op [ID_USERDATA, 12]
biseau = op [ID_USERDATA, 14] # DU biseau
rayonBiseau = op [ID_USERDATA, 15] # DU rayon du biseau
biseauSubd = op [ID_USERDATA, 16] # DU subdivisions du biseau
phongMax = op [ID_USERDATA, 18] # DU tag lissage
phongAngle = op [ID_USERDATA, 19]
phongAretes = op [ID_USERDATA, 20]
neutre = BaseObject(Onull) # création d'un neutre
cube = BaseObject(Ocube) # création d'un cube
cube.InsertUnder(neutre) # insertion du cube en tant qu'enfant du neutre
tagphong = BaseTag(Tphong) # création d'un tag de lissage
cube.InsertTag(tagphong)
cube.SetPhong(phongMax,phongAretes,phongAngle) # envoie la valeur de la DU dans le tag
biseauRayon = biseauClamp(rayonBiseau,tailleX,tailleY,tailleZ) # appel fonction pour clamper le rayon du biseau
op [ID_USERDATA, 15] = biseauRayon # affiche dans la DU la valeur réelle du rayon après un éventuel clampage
cube[1100] = Vector(tailleX,tailleY,tailleZ) # modif taille x,y,z du cube
cube[1102] = segX # modif segments X
cube[1103] = segY # modif segments Y
cube[1104] = segZ # modif segments Z
cube[1107] = biseau # activation biseau
cube[1105] = biseauRayon # modif rayon du biseau
cube[1106] = biseauSubd # modif subdivisions du biseau
posX= (tailleX/2)*ancreX # calcule le décalage du cube par rapport au null parent
posY= (tailleY/2)*ancreY
posZ= (tailleZ/2)*ancreZ
cube[903] = Vector(posX,posY,posZ) # déplace le cube selon l'ancrage choisi

return neutre

def main():
cube = creaCube()
return cube

valkaari
21/09/2011, 23h37
rien à dire sur le code.

Tu as la doc python (toujours pas la R13 mais bon) à cette adresse que tu dois connaitre
http://www.maxon.net/fr/support/plugin-cafe.html

Dedans, tu as également des exemples dont Py-RoundedTube qui permet de créer un objet avec les poignets et tout et tout.

Relativement simple à comprendre (surtout la création des poignées)


edit :
si en fait j'ai une remarque sur le code.
Si tu ouvres ta console (en mode python pour la R13) et que tu drag and drop un champ de l'interface, par exemple le filet radius d'un cube la console vas t'afficher ceci Cube[c4d.PRIM_CUBE_FRAD]
Il est préférable d'utiliser ces noms plutôt que Cube[1105]. Ce qui revient au même mais l'utilisation de la variable rends plus lisible le code et si par le plus grand des hasards ce numéro change, la variable serait changé aussi et ton code fonctionnera quand même.

Voir si tu utilise le script manager de c4d tu peux directement faire un drag and drop de ton champ dans l'éditeur. Idem pour les données utilisateurs. Presque tout en fait.

Aurety
21/09/2011, 23h59
Magnifique Tabou ! Franchement ca change tout un cube pareil :icon_clap:

tabou
22/09/2011, 00h20
Merci Val pour le RoundedTube, je vais le décortiquer, j'ai bien sûr téléchargé la doc mais je n'ai pas encore pris le temps de farfouiller dans les exemples.
Ok pour changer les numéros de code en nom, mais est ce que ce sera toujours compatible avec la R12 ?

Merci pour le compliment, Lapin, mais quand je vois comment un débutant comme moi arrive à implémenter cette fonction, je me demande vraiment pourquoi ce n'est pas intégré depuis longtemps :icon_rolleyes:

valkaari
22/09/2011, 01h18
vivi ça sera compatible R12/R13

Avec la R12 et la "vrai" intégration du python, il a pas grand chose qui devrait bouger. Juste des rajouts de fonctions.
A moins d'une refonte comme à l'arrivée de la R12 où tous les plugs ont sauté mais ça devrait pas arriver avant longtemps maintenant.

Vcyrille
22/09/2011, 08h55
Big merci tabou, on voit que tu fais de l'archi, ça va grandement me simplifier la vie, je vais gagner un temps fou :thumbup1:

genghiskhan
22/09/2011, 09h46
super tabou, j'avoue que rien que la manipulation de l'ancrage change tout. super important comme fonction.

Loriel
22/04/2012, 14h41
J'avais pas vu ton cube énorme et trop pratique, merci Tabou :icon_boss::icon_boss::icon_boss: