EDIT : en cours de modification pour adaptation au python de la r12, les captures d'écran ne sont pas encore à jour
Attention vous devez avoir au moins la version 12 de Cinema4D
Python : kesako ?
La version 12 de c4d vous permet de programmer des scripts et plugins en langage Python. Le python est déjà utilisé dans de nombreux autres logiciels tels que Blender, Vue, etc.. Le python est également utilisé pour créer des programmes autonomes.
Dans Cinema4D il y a en gros cinq possibilités d'utilisation différentes :
- les scripts
- les tags ou propriété Py4D
- les noeuds Xpresso
- les génerateurs
- les plugins
Les scripts sont comparables aux scripts C4D en COFFEE. Vous pouvez les écrire directement dans le Gestionnaire de script (Script Manager) du menu Python ou dans un autre programme et les enregistrer au format texte dans un fichier .py. On les utilisera pour des programmes simples dont l'action se fera sur demande (en cliquant sur exécuter ou en appelant le script via un menu)
Le tag Py4D est tout à fait comparable au tag COFFEE, le code s'exécute chaque fois qu'il y a un "évènement" dans C4D.
Le noeud Xpresso permettra d'inclure un bout de code personnalisé au milieu de chaines Xpresso.
Les générateurs servent à créer des objets similaires aux objets paramétriques, mais sans avoir besoin de créer un plugin
Pour les plugins c'est un tout petit peu plus compliqué, mais vous pourrez a peu près tout créer (objets paramétriques, déformateurs, tags, matières, etc...) et vous prendre pour les développeurs de Cinema4d. Ils sont chargés au lancement de c4D et toute modification nécessite de relancer cinema4d (pour l'instant).
Bon le mieux c'est de comprendre par l'exemple, donc au boulot
Premier Script en python
- Ouvrez la console du menu Python
- Ouvrez le Gestionnaire de script du menu Python
- Tapez : print "Hello world" à la place du texte existant (attention de bien écrire print en minuscule)
- Cliquez sur le bouton Exécuter
Si tout se passe bien vous devriez voir s'afficher "Hello world" dans la Console (je sais ça impressionne pas encore les filles (ou les garçons pour les filles), mais ça viendra...).
Le Gestionnaire de scripts sert à saisir le code, le bouton Exécuter je vous le donne en mille ...l'exécute.
Notre super programme comprend une ligne avec une fonction print . Cette fonction "imprime"le texte qui suit dans la console. Pour du texte il faut le mettre entre guillemets double ou simple
print 'Salut la French' fonctionne également.
Vous pouvez également envoyer des nombres et là pas besoin de guillemets : print 12345
Cette fonction print sera très utile pour faire des tests au milieu d'un programme. Vous pouvez effacer le texte existant dans la console en cliquant sur le menu Fichier/Effacer
Bon maintenant je vous apprend à faire faux, tapez Print 12345 (majuscule au début de print)
Eh beh ouais, ça marche pas à tout les coups, il faudra vous y habituer!
Il nous a mis un message d'erreur dans la cosole qui dit en gros qu'on a fait une connerie à la ligne 1, c'est une erreur de nom il connait pas ce Print. Donc première leçon le python est sensible à la casse, print n 'est pas la même chose que Print et encore moins que PRINT
la suite au prochain épisode ....
Dernière modification par oli_d ; 09/06/2011 à 21h26.
Ah, c'est malin. :roll: Comme si les journée était pas déjà assez courtes. :cry2:
J'en suis à la page 122 d' "apprendre le python" du coup. :wink:
Les deux premières questions:
- L'installation de Py4D est je présume obligatoire pour l'utilisation d'un plugin python, contrairement au coffee qui est directement rattaché au logiciel? Pas de conversion possible d'un plug réalisé en python en fichier binaire directement utilisable dans le menu plugin ? On peut rêver. :mrgreen:
- C'est quoi la différence entre 'hello' et "hello" ?
De mémoire en C++ c'était un caractère et une chaine de caractère, mais en python ça semble identique, c'est le cas ?
Très belle initiative en tout cas. :poucehaut:
SMC fan.
C'est pas perdu, je n'ai pas l'intention de réécrire le bouquin mais juste donner des pistes pour l'utilisation spécifique du python dans C4DEnvoyé par Jean-Laurent
Oui pour l'instant il faudra installer le plugin pour faire tourner les plug en python, mais à mon avis vu tous les avantages du python Maxon va sûrement intégrer ça dans une prochaine version et à mon avis il vont progressivement laisser tomber le COFFEE (ce ne sont que des suppositions).Envoyé par Jean-Laurent
Il y en a un qui a des guillemets doubles :mrgreen:Envoyé par Jean-Laurent
Plus sérieusement il y a une bonne explication page 46 du livre de Swinnen qui est cité ci-dessous (5.2.1) en gros si tu veux inclure des apostrophes dans ton texte utilise les guillemets doubles et vice et versa, exemple
Code:print 'la"sandbox" de Py4D'#affiche : la"sandbox" de Py4D print "l'olivier'" #affiche : l'olivier
Dernière modification par oli_d ; 09/06/2011 à 21h28.
:poucehaut:
Bon pareil, journée trop courtes pour apprendre ça pour ma part, mais ceci dit, je suis avec intérêt ! :bounce:
Qui fait le malin, tombe dans le ravin...
super Oli_D merci
Le language Python
Dans ce chapitre nous allons voir les bases du python pour nous permettre de coder dans C4D. Je ne vais pas faire un cours complet sur le python, il en existe d'ailleurs déjà un qui est très bien fait et que je vous conseille vivement (en plus il est gratuit) :
http://www.inforef.be/swi/download/python_notes.pdf Il s'agit de "Apprendre à programmer avec Python" de Gerard Swinnen. Je ferai souvent référence à ce livre
Le langage python est un langage interprété, c'est à dire qu'il n'a pas besoin d'être compilé (contrairement au c++). Il est directement interprétable par la machine (plus d'info p.13 du livre).
C'est un langage portable, c'est à dire que l'on peut le faire tourner sur Mac, PC, Linux ....
Vous m'avez souvent entendu pester contre le c++ parce qu'il faut le compiler une fois en mac, une fois en PC32 bits et une fois en PC64bits, et puis il faut la plupart du temps le recompiler d'une version de C4D à l'autre, avec python on oublie tout ça !
Les opérateurs (cf p19 du livre)
Bon on va faire un peu de calcul :
Donc on remarque que les opérateurs courants fonctionnent (+,-,*,/), il y en a un particulier "**" ça c'est "puissance" 2**3 signifie 2 3 c'est à dire 2*2*2. On remarque également que l'ordre prioritaire est pris en compte, multiplication avant les additions, etc...
Essayez maintenant print 7 / 2
Fichtre, diantre, saperlipopette ! ça donne 4 !
Rajoutez un point après le 7 : print 7. / 2 et tout rentre dans l'ordre, cela donne bien 3.5. Cela veut dire que dans le python si vous n'avez que des nombres entiers dans un calcul, le résultat sera en entier, si vous voulez un résultat en décimal il faut qu'il y ait au moins un nombre avec une décimale. Notez bien ce point, parce que perdu au milieu de nombreuse lignes de code un petit détail comme ceci peut devenir difficile à corriger (c'est du vécu !)
Parmi les opérateurs citons encore le modulo "%" que l'on utilise quelque fois en programmation et qui sert à retourner le reste d'une division :
6 % 2 = 0 (6 / 2 donne un chiffre entier, il ne reste rien)
7 % 2 = 1 (7 / 2 donne 2 et il y a encore 1 unité à diviser)
18 % 10 = 8 etc...
On peut utiliser ceci pour par exemple savoir si un chiffre est pair ou impair, pour calculer le jour de la semaine d'une date etc...
Les variables(cf p.21 du livre)
Les variables servent à stocker des données de toutes sortes pour les utiliser dans le code. En COFFEE et en C++ il faut mettre un terme particulier pour déclarer une variable, en c++ il faut en plus donner le type de la variable (texte, entier,décimal etc...) En python pas besoin vous pouvez directement utiliser une variable exemple :
ce code affichera 15 dans la sandbox. Là aussi attention aux minuscules.Code:base = 5 hauteur = 3 surface = base * hauteur print surface
Pour nommer vos variable vous êtes a à peu près libre (à part les mots réservés), mais prenez l'habitude de les commencer par une lettre minuscule pour la lisibilité du code. Je ne veux pas réécrire le chapitre 2.2 du livre de Swinnen. Je vous laisse donc le soin de lire attentivement
Les conditions(cf p.29 du livre)
C'est une des bases de la programmation, pouvoir diriger d'un côté ou d'un autre le code en fonction d'un résultat.
L'instruction principale est le if exemple :
Alors deux ou trois petite choses nouvelles :Code:nombre = 2 resultat = nombre % 2 if resultat == 0: print "c'est un nombre pair" else : print "c'est un nombre impair"
- l'instruction if () est suivie de deux points et la ligne suivante est décalée (on peut choisir mais normalement le tab correspond 4 espaces)
la ligne décalée ne s'effectuera que si la condition entre les parenthèse est vraie- dans la parenthèse on met une condition, notez le "==" qu'il ne faut pas confondre avec le signe égal simple
Si on traduit ce code en français :
- On a un nombre qui vaut 2
- On a un résultat qui vaut ce nombre modulo de 2
- Si résultat est égal à 0 on affiche "c'est un nombre pair"
- Sinon on affiche "c'est un nombre impair"
Dans les autres langages on conseille de décaler ce qui suit un if pour rendre le code plus lisible, dans le python on est obligé de le faire mais par contre on ne doit rien mettre d'autre (en COFFEE et C++ il faut mettre des accolades).
On peut encore insérer entre l'instruction if et else un elif, qui signifie "sinon si" exemple :
Les opérateurs de comparaison(cf p.31 du livre)Code:a = 0 if a > 0 : print "a est positif" elif a < 0 : print "a est négatif" else: print "a est nul"
x == y x est égal à y
x != y x est différent de y
x > y x est plus grand que y
x < y x est plus petit que y
x >= y x est plus grand que, ou égal à y
x <= y x est plus petit que, ou égal à y
Les boucles(cf p.35 du livre)
C'est sans doute le truc le plus indispensable en programmation, qui va nous permettre de répéter une opération autant de fois que l'on veut.
Un des deux boucles les plus courantes est le while exemple :
Attention également au deux points après l'instruction while() et au décalage de 4 espaces des deux lignes suivantes.Code:nombre = 0 while nombre<5 : print nombre nombre = nombre + 1
Si on traduit :
- On a un nombre qui vaut 0
- Tant que ce nombre est plus petit que 5 on effectue ces deux opérations
- on affiche la valeur de nombre
- on rajoute à chaque passage 1 à nombre
Mais attention c'est aussi la boucle la plus dangereuse ! L'instruction while va répéter une portion de code tant qu'une condition ne sera pas respectée, donc si le code ne modifie pas une variable contenue dans la condition elle tournera à l'infini et C4D plantera.... Si par exemple vous oubliez de mettre les 4 espaces au début de la dernière ligne, ce code ne s'effectuera qu'à la fin de la boucle et dans ce cas là jamais parce que votre boucle va tourner à l'infini vu que nombre va rester toujours avec la valeur 0
On a aussi la boucle for qui est très utile mais je préfère vous l'expliquer plus tard quand on sera au cœur de C4D
Je m'arrête là pour le moment pour les concepts du python, il y a encore beaucoup de chose à dire mais je sens que vous trépignez d'impatience et que les chiffres ça va un moment et vous aimeriez bien passer à la 3D ...
... mais il faudra patienter jusqu'au prochain épisode...
D'ici là potassez un peu le bouquin, la prochaine fois il y aura interro !
Dernière modification par oli_d ; 09/06/2011 à 21h37.
Oli_D oh nice ! :prie:
Clemz :poucehaut: :lol:
Oli_D je suis :shock: de ton savoir !
:prie:
You're the :boss:
http://dr-graphix.blogspot.com/-DRG Design / Portfolio
Waw super j'ai tout compris!
Les 4 espaces j'aime moins , j'aurais préféré un tab
Visitez www.base80.com et www.youtube.com/base80
Oui moi aussi surtout qu'il faut les refaire sur chaque ligne, mais si tu prends un autre éditeur comme IDLE ou Notepad ++ là tu peux utiliser le tab et en plus le code est tout beau en couleur ce qui est beaucoup plus lisibleEnvoyé par base80
Mais c'est un peu comme pour le COFFEE, si je fais un tout petit code je reste dans l'éditeur C4D, mais dès qu'il y a plus d'une dizaine de lignes, je préfère passer à Notepad++ puis copier-coller dans C4D.
En plus il ne faut pas oublier que c'est une version bêta, donc je pense que tout cela va être amélioré
le fait que la mise en page du code ait un sens dans le langage est en soi quelque chose de très risqué quand on a de gros codes, et qu'on commence à mélanger des bouts de code entre eux (et je parle d'expérience, j'ai été confronté au problème quand j'ai écrit un exporteur pour blender à partir d'un exporteur déjà existant pour kerkythea). L'utilisation des espaces a un avantage énorme comparé aux tab : quelque soit l'éditeur, ca fera toujours la meme taille. Et n'importe quel bon éditeur te permet d'inserer N espaces quand tu appuies sur la touche tab, plutot qu'un tab. ah, et en general il y a aussi des commandes pour indenter et desindenter un bloc de code, très pratique aussi
bonne exploration en tout cas !
Le rendu, c'est juste de l'intégration numérique sur un espââââââce de dimension infinie...trivial quoi
Créer un objet dans C4D
Bon rentrons dans le vif du sujet, je vais tout de suite commencer par la création d'un objet. Par rapport au Xpresso, un des grands avantages de la programmation, c'est qu'on peut créer et inclure autant d'objet que l'on veut.
Copiez ce code et collez le dans le script manager. Normalement il devrait y avoir un cube qui apparait chaque fois que vous cliquez sur le bouton ExécuterCode:import c4d #on importe la bibliothèque de C4D... obj = c4d.BaseObject(c4d.Ocube) #on crée un objet de type cube doc.InsertObject(obj) #on insère notre objet dans le document (doc est une constande de c4d qui renvoie le document c4d.EventAdd() # et on avertit C4D qu'il y a eu un évènement pour qu'il actualise
Dans le chapitre précédent, j'ai oublié de vous parler des commentaires . C'est toujours pratique, surtout lorsque l'on débute, de pouvoir inclure des commentaires dans notre code, histoire de se rappeler d'une fois à l'autre ce que l'on a fait. Dans le python il suffit de précéder le commentaire du signe #
Je vous propose pour l'instant de prendre le code comme il vient, les explications sur les classes viendront par la suite et surtout comment aller chercher des fonctions et classes dans la jungle de l'aide.
Exercice :
Pour mettre en pratique cette première partie, vous allez essayer de créer une boucle qui crée automatiquement 10 cubes. Réutilisez les fonctions du code en début de post.
Corrigé:
Code:import c4d nbre = 0 while nbre<10: #boucle jusqu'à 10 obj = c4d.BaseObject(c4d.Ocube) #on crée un objet de type cube doc.InsertObject(obj) #on insère notre objet dans le doc nbre = nbre+1 #ne pas oublier sinon la boucle tourne à l'infini c4d.EventAdd() #sans les 4 espaces comme cela il ne le fait qu'une fois à la sortie de la boucle->plus rapide
Dernière modification par oli_d ; 09/06/2011 à 21h49.
Ca ressemble beaucoup à du basic !
En tout cas, ça à l'air super simple !
Merci encore Oli_D
Qui fait le malin, tombe dans le ravin...
:shock: j'ai tout compris, merci oli :poucehaut:
Seven 64bits, I7 870 2.93Ghz, Nvidia Geforce GTS 240 1Go, 8 Go DDR3, DD 1To Raid0
http://laurent.fedorenko.free.fr
EDIT : PAS ENCORE MODIFIE POUR R12
Modifier un objet dans C4D
Pour bien comprendre ce qui suit je vous conseille de lire attentivement le chapitre 5.3 du livre (p.50) sur les listes. Pour ceux qui connaissent les tableaux COFFEE ou c++, c'est un peu la même chose mais en beaucoup plus simple et donc beaucoup mieux. Dans une même liste on peut stocker n'importe quel type de valeur et d'objet.
Chaque objet de c4d contient une liste avec toute ses spécificités, il faut juste connaître la référence de l'attribut pour y accéder. Pour trouver ce nombre de référence il suffit des cliquer-glisser le nom de l'attribut dans le champ en bas de la sandbox :
Dans cette exemple j'ai drag&droper Taille pour un objet cube, cela me donne [1100]
Dans celui-ci je n'ai pris que la valeur x de la taille cela me donne [1100,1000]
Utilisation dans le code :
On a juste à rajouter le ce fameux nombre de référence entre crochet après la variable de l'objet. Simple, non ?Code:import c4d #on importe la bibliothèque de C4D... from c4d import * # ...de cette bibliothèque on importe tous les modules obj = c4d.BaseObject(Ocube) #on crée un objet de type cube obj[1100,1000] = 500 #on modifie la taille en X doc = c4d.documents.get_active_document() #on récupère le document actif doc.insert_object(obj) #dans lequel on insère notre objet c4d.event_add() # et on avertit C4D qu'il y a eu un évènement pour qu'il actualise
Le seul bémol c'est que si vous laissez le numéro sans commentaire à côté, bonjour pour savoir deux semaines après à quoi ça correspond. Donc insérez un commentaire ! (je pense que dans les versions futures de Py4d on pourra rentrer un chaine de caractère plus explicite à la place du nombre, comme en COFFEE. A moins que cela ne soit déjà possible mais j'ai pas trouvé !)
Prenons l'exemple de la taille complète [1100]. En fait ce 1100 contient trois valeurs, dans c4D c'est un Vecteur (Vector())
Allez on rajoute un biseau de 5 subdivisé à 3Code:import c4d #on importe la bibliothèque de C4D... from c4d import * # ...de cette bibliothèque on importe tous les modules obj = c4d.BaseObject(Ocube) #on crée un objet de type cube obj[1100] = c4d.Vector(100,50,500) #on modifie la taille en X,Y,Z doc = c4d.documents.get_active_document() #on récupère le document actif doc.insert_object(obj) #dans lequel on insère notre objet c4d.event_add() # et on avertit C4D qu'il y a eu un évènement pour qu'il actualise
Vous pouvez ainsi changer tout ce qu'il y a dans la palette attributs, testez !Code:import c4d #on importe la bibliothèque de C4D... from c4d import * # ...de cette bibliothèque on importe tous les modules obj = c4d.BaseObject(Ocube) #on crée un objet de type cube obj[1100] = c4d.Vector(100,50,500) #on modifie la taille en X,Y,Z obj[1107] = True #biseau : case à cocher activée (on peut mettre 1 à la place deTrue) obj[1105] = 5 #rayon du biseau obj[1105] = 3 #subdivision du biseau doc = c4d.documents.get_active_document() #on récupère le document actif doc.insert_object(obj) #dans lequel on insère notre objet c4d.event_add() # et on avertit C4D qu'il y a eu un évènement pour qu'il actualise
Bon maintenant que vous savez créer des cubes et les modifier, vous êtes mûrs pour me faire un petit générateur d'escaliers. Allez au boulot tas de feignants !
Corrigé :
Code:import c4d from c4d import * nb_marches = 10 larg = 200 haut = 15 prof = 35 pos = c4d.Vector(0,0,0) nb = 0 doc = c4d.documents.get_active_document() #on récupère le document actif while(nb<nb_marches): #boucle ne pas oublier les deux points obj = c4d.BaseObject(Ocube) #on crée un objet de type cube obj[1100] = c4d.Vector(larg,haut,prof) #on règle la taille du cube obj[903] = pos #on règle la position doc.insert_object(obj) #on insère notre objet dans le doc pos = pos + c4d.Vector(0,haut,prof) #on modifie la position pour la suivante... #...en rajoutant chaque fois la hauteur et la profondeur nb=nb+1 #on incrémente, sinon la boucle est infinie c4d.event_add() # et on avertit C4D qu'il y a eu un évènement pour qu'il actualise
Dernière modification par oli_d ; 09/06/2011 à 21h50.
Créer un générateur d'objet
Py4D permet de créer très facilement un générateur d'objet (ce que l'on a pas en en COFFEE).
Puisque c'est si simple on va se faire notre générateur d'escaliers avec données utilisateurs et tout le tsoin-tsoin.
Pour commencer sélectionnez Python Generator dans le menu Py4D. Un nouvel objet apparait dans le gestionnaire. Double cliquez sur l'icône de l'objet, et là vous devriez avoir un fenêtre avec du code qui s'ouvre : le Py4D::Editor.
Vous devriez avoir le code suivant :
La première ligne on connaît c'est pour importer la bibliothèque c4d. Le welcome ça aussi on connaît.Code:import c4d #Welcome to the world of Py4D def main(): return c4d.BaseObject(c4d.Ocube)
Par contre de def main(): ???
Alors je vous invite à aller lire attentivement le chapitre 7 du bouquin (p. 62) sur les fonctions. Parceque là on à affaire à une fonction qui va renvoyer un truc à la fin grâce à l'instruction return. Notez bien que la fonction main() est suivie de deux points et que la suite est décalé de quatre espaces (là je sens que Base va pas être content):mrgreen:
Et ce truc que cette fonction main() (principale) renvoie, vous le connaissez c'est un objet cube, qu'on a déjà utilisé.
Faite les test appuyer sur la touche "C" dans C4D pour rendre l'objet éditable. Vous verrez que l'objet se transforme en cube, donc le code se confirme !
Mais vous allez me dire que c'est nul mon truc parce que l'on peut renvoyer qu'un seul objet et nous on a plein de marches. Ben y a cas feinter, on va lui renvoyer un neutre avec toutes nos marches en enfant, et youplazou !
Pour que notre générateur soit efficace on va pas aller chaque fois dans le code pour changer la largeur, le nombre de marche et cie. On va créer des données utilisateurs, ça vous devriez savoir faire :
Maintenant le problème, c'est pour récupérer tout ça dans notre générateur. Je pense qu'il y a des petits malins qui ont déjà essayé de drag&droper dans la sandbox pour obtenir un no de référence. Bon réflexe, mais je le mets où ce numéro qui en plus n'en est pas un : Python Generator[ID_USERDATA, 1]. Aaah, on fait moins les malins,là !
Je vous donne un tuyau, l'objet sur lequel on est s'appelle toujours "op". Que ce soit dans un tag Py4D ou dans un générateur (pour le tag se sera vraiment l'objet tag, pas l'objet sur lequel il y a le tag).
Avant de faire tout l'escalier on va tester ça sur un cube. Il faut que l'on modifie un peu le code d'origine pour que cela fonctionne (n'oubliez pas de cliquer sur le bouton commit en haut pour enregistrer les changements):
et là ça marche po :coup: :Code:import c4d #Welcome to the world of Py4D def main(): obj = c4d.BaseObject(c4d.Ocube) #on crée notre objet larg = op[ID_USERDATA, 2] #identifiant trouvé par drag &drop obj[1100,1000]= larg #on donne larg à la taille X return obj #et on retourne l'objet
et c'est dans ces moments là, que je la hais cette sandbox, n'essayez pas de lui taper dessus c'est votre super écran 32 pouces qui va ramasser.
Analysons, elle nous dit que ce ID_USERDATA à la ligne 6 n'est pas défini...
En fait, vous avez vu au début il y a bien import c4d, mais dans mes codes précédents j'avais rajouté ensuite "from c4d import * ". En fait je vous avais raconté n'importe quoi, ce truc ça importe pas tout les modules, ça évite simplement de marquer c4d. devant chaque fonction ou instruction de la bibliothèque. Du coup si vous le rajoutez ça devrait aller mieux (faites également attention aux quatre espaces après main(): !):
ou si vous ne voulez pas le rajouter vous pouvez rajouter c4d. devant ID_USERDATA et aussi devant OcubeCode:import c4d from c4d import * #Welcome to the world of Py4D def main(): obj = c4d.BaseObject(Ocube) #on crée notre objet larg = op[ID_USERDATA, 2] #identifiant trouvé par drag &drop obj[1100,1000]= larg #on donne larg à la taille X return obj #et on retourne l'objet
Et bien maintenant on a presque tout pour créer nos escaliers paramétriques. Vous avez noté que contrairement à avant on a plus besoin d'insérer l'objet dans le document, c'est directement le générateur qui le fait dès qu'on lui retourne.Code:import c4d #Welcome to the world of Py4D def main(): obj = c4d.BaseObject(c4d.Ocube) #on crée notre objet larg = op[c4d.ID_USERDATA, 2] #identifiant trouvé par drag &drop obj[1100,1000]= larg #on donne larg à la taille X return obj #et on retourne l'objet
On va créé un objet neutre dans lequel on va mettre toutes nos marches en enfant. Pour le neutre on va remplacer Ocube par Onull, et pour insérer l'objet on va utiliser la méthode enfant.insert_under(parent)
Dans ce cas là vous noterez que sous le while il faut doubler l'indentation, donc il faut 8 espaces, préparez la pommade contre les ampoules à l'index !Code:import c4d from c4d import * def main(): # fonction principale ne pas oublier de décaler de 4 espaces après nb_marches = op[c4d.ID_USERDATA, 1] #on récupère les DU dans des variables larg = op[ID_USERDATA, 2] haut = op[ID_USERDATA, 3] prof = op[ID_USERDATA, 4] pos = c4d.Vector(0,0,0) #on initialise la position à 0 nb = 0 neutre = c4d.BaseObject(Onull) #on crée un objet neutre while(nb<nb_marches): #boucle ne pas oublier les deux points marche = c4d.BaseObject(Ocube) #on crée un objet de type cube marche[1100] = c4d.Vector(larg,haut,prof) #on règle la taille du cube marche[903] = pos #on règle la position marche.insert_under(neutre) #on insère notre objet en enfant de neutre pos = pos + c4d.Vector(0,haut,prof) #on modifie la position pour la marche suivante... #...en rajoutant chaque fois la hauteur et la profondeur nb=nb+1 #on incrémente, sinon la boucle est infinie return neutre #on retourne notre objet neutre au générateur
N'oubliez pas également de régler vos DU pour qu'elles ne soient pas à 0, sinon ce sera tout de suite moins spectaculaire.
A part ça, elle est pas belle là vie, vous vous êtes fabriqué le générateur d'escaliers paramétrique de vos rêves en trois coups de cuillère à pot !
Allez un p'tit exercice, c'est pas le moment de fléchir, et si vous me faisiez un générateur de mur en brique (avec les briques en quinconces sinon c'est pas drôle !)
A bientôt pour de nouvelles aventures !
[edit] : solution : Générateur de mur en brique (fichier c4d)
encore une fois, n'importe quel éditeur fait pour la prog te permet de configurer ta touche tab pour qu'elle insère 4 espaces directement il n'y a pas plus fainéant que les programmeurs, donc t'en fait pas qu'ils ont prévu un max de trucs pour s'éviter des ampoules ^^ ah, pour éditer du python, il existe un IDE spécifique, qui s'appelle "eric" : http://eric-ide.python-projects.org/index.htmlDans ce cas là vous noterez que sous le while il faut doubler l'indentation, donc il faut 8 espaces, préparez la pommade contre les ampoules à l'index !
Le rendu, c'est juste de l'intégration numérique sur un espââââââce de dimension infinie...trivial quoi
Bien intéressant, tout ça ! :poucehaut:
Mets tes lunettes et écoute comme ça sent bon ! klik my links -> Firmament / PolyStudio / Myst Aventure / ufo-3DEnregistre
Merci pour les infos tarlack, je vais tester Eric (en tout bien tout honneur :mrgreen. Pour Notepad ++ je viens de trouver l'option de paramétrage du tab dans paramétrage/préférences onglet MISC.
Pour l'instant j'ai tout suivi. :poucehaut:
SMC fan.
Vraiment génial oli-D.
Plus je regarde python et plus je suis :bounce:
Par contre la syntaxe :puke:
Merci à tous pour les encouragements :odile:
Moi je la trouve géniale, tout est fait pour que ton code soit le plus simple et le plus lisible. Mais c'est vrai que quand on est habitué à d'autres codes, ça semble bizarre.Envoyé par valkaari
Ce que je trouve le plus génial et qui me frustrait au plus haut point entre c++ et COFFEE, c'est que tu peux vraiment tester ton code dans le programme. D'abord quelques lignes dans le script manager, puis tu peux le passer en générateur, en tag ou en menu (script) et puis ensuite si vraiment tu veux aller plus loin tu fais un plugin. Mais là tu peux chaque fois récupérer ton code. Entre COFFEE et c++ on était obligé de tout réécrire.
C'est surtout vrai en C++. En coffee, si on est dans un tag coffee c'est automatique, et si on réalise un plug il suffit à chaque modification de recharger le plug dans la console coffee de C4D. (Enfin quand tout se passe bien :winkEnvoyé par Oli_D
J'aime bien aussi cette syntaxe très proche du C++ mais avec les trucs pénibles en moins (typage dynamique etc ...).
Et si on accède à toutes les fonctions du SDK C++ sans avoir à compiler en permanence. :poucehaut:
SMC fan.
Jusque-là je suis aussi (enfin, disons que ça va à lire, après, à créer de toutes pièces, c'est encore autre chose). Mais c'est très instructif en tout cas !!!
Ouah ! Excellent, j'ai tout suivi, compris, aimé !! :poucehaut: :love:
kenavo !! // Pinterest KAMIGAZ®
rrhaa ??? pas le temps de suivre ...
je ferai du rattrapage d'ici un mois !
... je pourrai quand meme poser des questions betes ?
a suivre ...
Les questions avec plaisir, et même des propositions de petits plugs comme exercice ...
:bounce:
des propositions ?! ... mais tu ne sais pas a qui tu proposes ca !!!
a suivre ...
Maxon vient d'annoncer l'acquisition de Py4D, un interpréteur Python pour Cinema4D qui, promet Maxon, devrait permettre d'ajouter des fonctions personnalisées au logiciel très simplement.
http://www.maxon.net/en/news/singlev...n-of-py4d.html
Yesssss, :bounce:
Donc cela veut dire que le python sera probablement intégré dans la r12 et à mon avis
cela c'est également la mort annoncée du COFFEE, ou en tous cas du développement du COFFEE.
Cela fait maintenant quelques mois que je teste ce Py4D et je confirme que c'est réellement trop d'la balle ! Ce n'est que la beta, il manque encore quelques fonctions du c++ et il y a quelques bugs, mais depuis que j'y ai touché, impossible de me remettre au c++ et au COFFEE ! (edit : le python est même devenu mon avatar, c'est dire si je suis atteint !)