Voir la version complète : Scripts divers python by oli_d
Je me rends compte que je commence à semer des petits scripts un peu partout dans le forum, je vais tenter d'en regrouper quelques un dans ce sujet, jusqu'à ce que je me sorte les pouces et que je fasse un jour un site web avec des plugins plutôt que des scripts
Les bouts de code sont à coller dans le menu python/gestionnaire de scripts puis bouton créer un script. Le script apparaitra après redémarrage dans python script personnalisé
Import automatique d'un dossier d'images :
premières versions dans ce sujet ici (http://frenchcinema4d.fr/showthread.php?72296-Automatiser-la-cr%E9ation-de-mat%E9riaux&highlight=automatiser)
Importe toutes les images d'un dossier en créant une texture et un plan avec la texture appliquée
première boîte de dialogue pour choisir le dossier
attention la seconde boîte de dialogue est discrète ; il y a 3 cases à cocher
chemin absolu si la texture n'est pas dans le dossier tex
canal alpha : si l'image a un alpha que l'on veut retrouver dans le canal du même nom
plan pour chaque texture : si on veut créer les objets plan avec la texture appliquée
Si vous avez beaucoup d'images ou si elles sont lourdes, il faut être patient (mais c'est toujours plus rapide qu'à la mano)
retours sur bugs , crises de nerf, orgasmes, améliorations souhaitées, bienvenus ...
import c4d
import os,glob
ABSOLU = 1101
ALPHA = 1102
PLAN = 1103
OK = 1201
CANCEL = 1202
lst_ext = ['.jpg','.tif','.tga','.png','.psd','.b3d','.gif']
class ImportImages():
def __init__(self,dossier,absolu,alpha,plan):
self.pos = c4d.Vector(0)
os.chdir(dossier)
if plan :
grpe = c4d.BaseObject(c4d.Onull)
path,name = os.path.split(dossier)
grpe.SetName(name)
for fn in os.listdir(dossier):
nom,ext = os.path.splitext(fn)
if absolu : fn = os.path.abspath(fn)
if ext in lst_ext:
mat = self.creer_mat(fn,nom,alpha)
if plan :
#affiche = self.creer_plan_image(fn,nom,mat)
affiche = self.creer_poly_image(fn,nom,mat)
if affiche :
affiche.InsertUnder(grpe)
if plan : doc.InsertObject(grpe)
def creer_mat(self,fn,nom,alpha=True):
mat = c4d.BaseMaterial(c4d.Mmaterial)
mat.SetName(nom)
doc.InsertMaterial(mat)
shd = c4d.BaseList2D(c4d.Xbitmap)
shd[c4d.BITMAPSHADER_FILENAME] = fn
mat[c4d.MATERIAL_COLOR_SHADER] = shd
mat.InsertShader(shd)
mat[c4d.MATERIAL_USE_SPECULAR]=False
if alpha :
mat[c4d.MATERIAL_USE_ALPHA]=True
shda = c4d.BaseList2D(c4d.Xbitmap)
shda[c4d.BITMAPSHADER_FILENAME] = fn
mat[c4d.MATERIAL_ALPHA_SHADER]=shda
mat.InsertShader(shda)
mat.Message(c4d.MSG_UPDATE)
mat.Update(True, True)
return mat
def creer_plan_image(self,fn,nom,mat):
bmp = c4d.bitmaps.BaseBitmap()
if bmp.InitWith(fn)[0]== c4d.IMAGERESULT_OK:
larg,haut = bmp.GetSize()
bmp.FlushAll()
plan = c4d.BaseObject(c4d.Oplane)
plan.SetAbsPos(self.pos)
self.pos.x+=larg
plan.SetName(nom)
plan[c4d.PRIM_PLANE_WIDTH]=larg
plan[c4d.PRIM_PLANE_HEIGHT]=haut
plan[c4d.PRIM_PLANE_SUBW]=1
plan[c4d.PRIM_PLANE_SUBH]=1
plan[c4d.PRIM_AXIS]=5
tag = c4d.TextureTag()
tag.SetMaterial(mat)
tag[c4d.TEXTURETAG_PROJECTION]=6
plan.InsertTag(tag)
return plan #doc.InsertObject(plan)
else : return None
def creer_poly_image(self,fn,nom,mat):
bmp = c4d.bitmaps.BaseBitmap()
if bmp.InitWith(fn)[0]== c4d.IMAGERESULT_OK:
larg,haut = bmp.GetSize()
self.pos.x+=larg/2
mi_l=larg/2
bmp.FlushAll()
plan = c4d.PolygonObject(4,1)
plan.SetAbsPos(self.pos)
plan.SetName(nom)
plan.SetPoint(0,c4d.Vector(mi_l,0,0))
plan.SetPoint(1,c4d.Vector(mi_l,haut,0))
plan.SetPoint(2,c4d.Vector(-mi_l,haut,0))
plan.SetPoint(3,c4d.Vector(-mi_l,0,0))
plan.SetPolygon(0,c4d.CPolygon(0,1,2,3))
self.pos.x+=larg/2
tag = c4d.TextureTag()
tag.SetMaterial(mat)
tag[c4d.TEXTURETAG_PROJECTION]=6
plan.InsertTag(tag)
tuvw = c4d.UVWTag(1)
tuvw.SetSlow(0,c4d.Vector(0,1,0),
c4d.Vector(0,0,0),
c4d.Vector(1,0,0),
c4d.Vector(1,1,0))
plan.InsertTag(tuvw)
plan.Message(c4d.MSG_UPDATE)
return plan #doc.InsertObject(plan)
else : return None
class MonDlg(c4d.gui.GeDialog):
def __init__(self):
self.dossier = c4d.storage.LoadDialog(flags=c4d.FILESELECT_DIRECT ORY,title="Dossier contenant les images")
self.absolu = True
self.alpha= True
self.plan = True
def CreateLayout(self):
self.SetTitle("Options d'importation")
self.GroupBegin(1100,flags=c4d.BFH_SCALEFIT, cols=1, rows=3)
self.GroupBorderSpace(10, 10, 10, 10)
self.AddCheckbox(ABSOLU,flags=c4d.BFH_MASK, initw=250,inith=15,name="chemin absolu ")
self.AddCheckbox(ALPHA,flags=c4d.BFH_MASK, initw=250,inith=15,name='canal alpha')
self.AddCheckbox(PLAN,flags=c4d.BFH_MASK, initw=250,inith=15,name='plan pour chaque texture')
self.GroupEnd()
self.GroupBegin(1200,flags=c4d.BFH_SCALEFIT, cols=2, rows=1)
self.GroupBorderSpace(10, 10, 10, 10)
self.AddButton(OK,flags=c4d.BFH_MASK, initw=50,inith=15,name='OK')
self.AddButton(CANCEL,flags=c4d.BFH_MASK, initw=50,inith=15,name='Annuler')
self.GroupEnd()
return True
def InitValues(self):
self.SetBool(ABSOLU,True)
self.SetBool(ALPHA,True)
self.SetBool(PLAN,True)
self.absolu = True
self.alpha= True
self.plan = True
return True
def Command(self,id,msg):
if id == ABSOLU : self.absolu = self.GetBool(ABSOLU)
if id == ALPHA : self.alpha = self.GetBool(ALPHA)
if id == PLAN : self.plan = self.GetBool(PLAN)
if id == OK:
self.Close()
ImportImages(self.dossier,self.absolu,self.alpha,s elf.plan)
if id == CANCEL:
self.Close()
return True
if __name__=='__main__':
dlg = MonDlg()
dlg.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE)
c4d.EventAdd()
Génial! J'avais raté ça!
Super script, et super initiative...
(ok, c bon, je vais passer en R12... ;-) )
Sir Gong
06/05/2011, 15h55
Merci Oli-D, t'es un chef ! :icon_boss:
Ah bah oui ça tombe bien ça. Super! Merci Oli_d :kiss::thumbup1:
Appliquer aléatoirement des textures à des sous-objets :
Pour appliquer aléatoirement les matériaux sélectionnés aux sous-objets de l'objet actif. Si un tag texture existe déjà il remplace simplement le lien du matériau (discussion initiale (http://frenchcinema4d.fr/showthread.php?72397-Comment-r%E9partir-al%E9atoirement-des-textures&p=958612#post958612) )
sélectionner les matériaux
sélectionner l'objet parent contenant les objets à texturer
lancer le script
import c4d
import random
def main():
mats= doc.GetActiveMaterials()
if mats :
parent = doc.GetActiveObject()
if parent:
for obj in parent.GetChildren():
tg = c4d.TextureTag()
tg[c4d.TEXTURETAG_MATERIAL]=random.choice(mats)
obj.InsertTag(tg)
c4d.EventAdd()
if __name__=='__main__':
main()
Objet extrusion en objet polygonal :
Transforme un objet extrusion spline en polygone en connectant les chanfreins et couvercles et en optimisant
Sélectionner l'objet extrusion
Lancer le script
Cliquer sur le bouton ok de la boîte de dialogue optimiser
Fait un peu la même chose que le script COFFEE de Majoul opti-connect. Je ne l'ai pas testé avec d'autres objets type extrusion contrôlée mais cela devrait également fonctionner.
import c4d
def main():
c4d.CallCommand(12236)# Autoriser les modifications
obj = doc.GetActiveObject()
if obj :
for o in obj.GetChildren():
o.SetBit(c4d.BIT_ACTIVE)
for o2 in o.GetChildren():
o2.SetBit(c4d.BIT_ACTIVE)
c4d.CallCommand(16768)#Connecter+Supprimer
c4d.CallCommand(14039)# Optimiser...
if __name__=='__main__':
main()Merci pour les commentaires, ça fait toujours plaisir les retours
schnekie
06/05/2011, 16h44
Merci oli_d pour la nouvelle version de l'import automatique avec les plans, c'est vraiment super pratique! Je vais m'empresser les 2 autres scripts…
Regrouper les passes :
selon sujet de Gyom ici (http://frenchcinema4d.fr/showthread.php?71816-Gestion-automatique-des-images-calculees&p=952869#post952869)
Crée un dossier par type de passe ou par masque et y déplace les images correspondantes.
Lancer le script une fois le rendu multipasses effectué
Choisir le dossier contenant le rendu dans la boîte dialogue
Normalement les sous-dossiers sont créés et les images rangées à l'intérieur (tous les fichiers ne contenant pas d' '_' (underscore) sont ignorés
import c4d
import os
import shutil
def regrouperImages():
dir = c4d.storage.LoadDialog(flags=c4d.FILESELECT_DIRECT ORY)
if dir:
listdir = os.listdir(dir)
for file in listdir:
if os.path.isfile:
basename= os.path.basename(file)#nom avec extension
name = os.path.splitext(basename)[0]#sans extension
try :
name = name.split('_',1)[1]#on enlève toute la partie avant le premier_
except:continue
cnt = len(name)-1
r = name[cnt].isdigit()
while (r==1):
cnt-=1
r = name[cnt].isdigit()
dir2 = os.path.join(dir ,name[:cnt+1])
if not os.path.exists(dir2):
os.makedirs(dir2)
dst = os.path.join(dir2,basename)
file = os.path.join(dir,file)
shutil.move(file, dst)
if __name__=='__main__':
regrouperImages()
chatbraque
06/05/2011, 18h31
Superbe !
Tiens !… ben! je vais tester l'extrusion de spline en polygones sur la 11.5…
…
merci !
Tiens !… ben! je vais tester l'extrusion de spline en polygones sur la 11.5…
merci !
C'est pas dit que ça fonctionne sur la 11.5, tiens moi au courant...
Je vais essayer de pas m'emballer à chacun de tes posts, histoire de pas trop encombrer ce thread, pour les recherches ultérieures, alors je le dit maintenant, comme ça c'est fait:
Hey mais… je t'aime toi ! :icon_love:
chatbraque
06/05/2011, 20h17
C'est pas dit que ça fonctionne sur la 11.5, tiens moi au courant...
En tous cas, la manip de changement d'heure marche impec…
(et en effet, comme tu le dis sur l'autre fil, on peut remettre la date correcte juste après l'ouverture de C4D, puisque py4D reste actif tant que le logiciel est ouvert… le fichier restera donc "à la bonne heure" ;o))
… pour la suite, c'est surtout que je n'ai jamais pratiqué, il me faudrait un mini-tuto… ou bien, un ou deux conseils…
Je l'entre où le script :
- plutôt quelque part en "A" ?
- dans le python generator en "B" ?
- Ailleurs ? ;o)) … je suis une bille !… c'est clair !
merci pour le tuyau…
Back... Je viens d'essayer l'import automatique de fichiers image, j'ai une erreur. La console me donne:
AttributeError: 'module' object has no attribute 'FILESELECT_DIRECTORY'
Je suis en 11.5. ça viendrai de là?
Bon avec la 11.5 c'est pas gagné, j'ai testé il n'y a que objet extrusion en objet polygonal qui fonctionne.
En plus la doc n'existe plus sur le site de py4d, donc pour modifier le code c'est galère (sans parler des fonctions qui manquent réellement ou qui ne fonctionnent pas)
- plutôt quelque part en "A" ?
- dans le python generator en "B" ?
En A Dans le Script Manager, mais bon pour l'instant un seul script fonctionne ...
chatbraque
07/05/2011, 08h25
En A Dans le Script Manager, mais bon pour l'instant un seul script fonctionne ...
OK !… j'avais commencé par là, mais il me donne un message d'erreur à chaque fois (même avec le script "objet extrusion en objet polygonal")
1- Existerait-ll un petit descriptif pour chacune des fonctions de Py C4D ?
2- cette versionde Py C4D pour C4D 11.5 est-elle toujours compatible avec le code python tel qu'il existe aujourd'hui ?
(besides that : Il apporte quoi de plus qu'un "curent state to object" ce scipt ?… pakompri ?)
mais il me donne un message d'erreur à chaque fois (même avec le script "objet extrusion en objet
Quel message ?
1- Existerait-ll un petit descriptif pour chacune des fonctions de Py C4D ?Malheureusement la doc pour py4d de la r11.5 était en ligne et n'est plus disponible, à moins que quelqu'un l'aie "aspirée"
Sinon il y a toujours celle de la 12 disponible chez Maxon (http://www.maxon.net/fr/support/plugin-cafe.html)
cette versionde Py C4D pour C4D 11.5 est-elle toujours compatible avec le code python tel qu'il existe aujourd'hui ? La plupart des fonctions sont semblables, mais il suffit d'une fonction où on a changé une virgule pour que le code ne marche plus.
Par exemple j'utilise la fonction c4d.storage.LoadDialog() qui fonctionne également sur la 11.5 et qui sert à lancer la boîte de dialogue de choix d'un fichier, mais si on veut choisir un dossier cela devient :c4d.storage.LoadDialog(flags=c4d.FILESELECT_DIREC TORY) et ça ne marche pas dans la 11.5 d'où le message d'erreur reporté par Nico ci-dessus.
Pour les tags textures il y avait aussi un bug qu'avait signalé miro dans ce sujet (http://frenchcinema4d.fr/showthread.php?71255-Ins%E9rer-un-mat%E9riau-avec-texture-par-Py4d)(dernier message) et que je confirme.
Enfin la 11.5 était vraiment une version beta ...
En R12 les constantes ont été toutes regroupées dans le module c4d. En R11.5 non, cela donne donc :
dir = c4d.storage.LoadDialog(flags=c4d.storage.FILESELEC T_DIRECTORY)ou
dir = storage.LoadDialog(flags=storage.FILESELECT_DIRECT ORY)avec
from c4d import storageau début. ;)
chatbraque
07/05/2011, 13h56
Quel message ?
ce message :
chatbraque
07/05/2011, 14h07
… J'ai donc remplacé la première ligne de code par celle proposée par xs-yann… et maintenant, c'est à la ligne 3 qu'il y a un blème…
"Error in line 3, col 17: def main():"
…c'est la "tuile" !…
(et même la "python-tuile"… comme disent les Alsaciens qui roulent au 2-temps)
chatbraque
07/05/2011, 14h24
Sinon, j'ai aussi essayé le script de texture aléatoire sur sous-objets…
… en changeant la première ligne, plus de message d'erreur…
Alors j'ai cliqué :
- "execute" = rien
- "render icon" = ça m'affiche une jolie icône qui reprend les objets de mon écran principal
- "create script" = il me demande un nom, je lui donne un nom, il me rétorque : "create sucess"… je lui dis "Ok"…
… et on se quitte bons amis…
… mais mes textures ne bronchent pas !
(c'est une tuerie python :whistling:)
… J'ai donc remplacé la première ligne de code par celle proposée par xs-yann… et maintenant, c'est à la ligne
Cela ne sert a rien, le 'from c4d import x' se met après 'import c4d'. Et chez moi le script de oli_d s'execute sans erreur (en R11.5).
Vcyrille
07/05/2011, 15h34
Cette discussion va vite devenir un "incontournable", merci Oli_d :thumbup:
merci Oli_D :) ! je suis toujours en apprentissage et tes scripts sont de super tutoriaux !
clem
En R12 les constantes ont été toutes regroupées dans le module c4d. En R11.5 non, cela donne donc :
dir = c4d.storage.LoadDialog(flags=c4d.storage.FILESELEC T_DIRECTORY)Merci xs_yann, donc si on remplace c4d.storage.LoadDialog(flags=c4d.FILESELECT_DIRECT ORY) par c4d.storage.LoadDialog(flags=c4d.storage.FILESELEC T_DIRECTORY) le script regrouper les passes fonctionne en 11.5 (en tous cas chez moi).
Par contre pour les autres y a encore d'autres constantes à changer et c'est pas gagné ... j'ai pas trop le temps de tout regarder en détail
Pour les tutos, je me prépare psychologiquement, mais j'aimerais plutôt essayer de partir dans des tut'vidéos (avec mon accent suisse super sexy ça va être l'émeute!)
[QUOTE](et même la "python-tuile"… comme disent les Alsaciens qui roulent au 2-temps) :biggrin::biggrin::biggrin:
- "create script" = il me demande un nom, je lui donne un nom, il me rétorque : "create sucess"… je lui dis "Ok"…il faudra redémarrer c4d et après il devrait apparaître dans le menu py4d/script (mais s'il ne fonctionnait pas, il ne marchera pas mieux)
chatbraque
08/05/2011, 10h54
il faudra redémarrer c4d et après il devrait apparaître dans le menu py4d/script (mais s'il ne fonctionnait pas, il ne marchera pas mieux)
effectivement, le script apparait après redémarrage…
Je ne veux pas polluer trop ton fil, qui s'annonce très utile à tous…
… je te propose donc (si tu le veux bien) de continuer la discussion sur ce fil dédié pyC4d et 11.5 :
http://frenchcinema4d.fr/showthread.php?72426-Recherche-Py4D-pour-la-R11.5
Merci de ton aide…
C'est bizarre tu as toujours cette erreur à la première ligne.
Essaie juste de coller ce code dans le script manager et dis moi si le mot "test" apparaît dans la console (menu py4d/console)
import c4d
print 'test'sinon essaie de voir si tu n'as pas un caractère bizarre après import c4d
chatbraque
08/05/2011, 12h04
Je suis sûr que je fais une grosse boulette de newbie de base…
j'ai copié/collé ton petit bout de code-test : "message d'erreur" ! (grrrr!)
…
…Du coup, je l'ai "re-copié", re-collé… et là, ça à l'air de marcher (voir capture d'écran jointe)
… il y aurait moyen de faire des pâtés juste en copiant/collant ????
c'est vraiment étrange, lorsque j'enlève l'espace entre"import" et "c4d", le message d'erreur disparaît, et passe à la ligne suivante…
… là si j'enlève l'espace entre "c4d" et "import", le nouveau message disparaît également… pour laisser la place a un message d'erreur en ligne 6… pfuuuuu !
Dans le message de la console il my a un EOL qui doit signifier End Of Line donc il y a effectivement le caractère de fin de ligne qu'il ne doit pas digérer...
Si tu arrives à ne plus avoir le message d'erreur teste déjà le script qui fonctionne (objet extrusion ...).
Pour répondre à ta question sur l'utilité de ce script, quand tu fais simplement convertir en objet une extrusion, les couvercles et chanfreins viennent dans des objets polygonaux séparés en enfant. Si tu veux n'avoir qu'un seul objet polygonal, il faut ensuite les sélectionner, les connecter puis otimiser les points pour les souder. Le script fait tout ça en un seul clic.
chatbraque
08/05/2011, 12h23
Dans le message de la console il my a un EOL qui doit signifier End Of Line donc il y a effectivement le caractère de fin de ligne qu'il ne doit pas digérer...
Donc un blème au "copié/collé" ?!… je vais essayer de passer par simpletext pour voir si ça marche mieux.
Si tu arrives à ne plus avoir le message d'erreur teste déjà le script qui fonctionne (objet extrusion ...).
Pour répondre à ta question sur l'utilité de ce script, quand tu fais simplement convertir en objet une extrusion, les couvercles et chanfreins viennent dans des objets polygonaux séparés en enfant. Si tu veux n'avoir qu'un seul objet polygonal, il faut ensuite les sélectionner, les connecter puis optimiser les points pour les souder. Le script fait tout ça en un seul clic.
Yeaaaah ! les fameux couvercles !
…//… édité …//…
En passant par simpletext, je n'ai plus ces messages de fin de ligne… en revanche, j'ai ça maintenant :
(pas son truc le "x", il a tendance à censurer… faut peut-être éviter "les animes de boules" :sweatdrop: )
from c4d import *(astérisque) et pas x
Mais tu n'es pas obligé de le mettre (ça sert juste à éviter de mettre c4d. avant chaque fonction ou classe de la bibliothèque c4d.
Mais encore une fois celui-ci ne marche pas chez moi en 11.5 il y un truc qui bloque à cause du TextureTag
chatbraque
09/05/2011, 09h41
… En effet, cela marche impec sur la 12… (mais rien de rien sur ma 11.5… :crying:)
merci
… je digresse, mais franchement, cette manie de Maxon de ne pas permettre l'enregistrement en version inférieure… GRrrrr!…
(si Adobbe faisait pareil, on (et "ils") seraient bien "enmer…" avec leur prise en compte Néanderthalienne de "Illustrator 8" pour le travail en vecteur !!!… surtout avec les pauvres fonctions de travail sur vecteur que Maxon propose !… Tiens ! voilà un truc à mettre dans la "wish list"… la copie conforme de l'outil plume Illustrator… ce ne serait pas un mal !!!… )
Super boulot !!
Je ne m’y connais pas en python mais ça donne envie de se lancer dans la programmation
D’ailleurs, Ou se trouve le point de départ de ces scripts ? (j’veux dire la première méthode que python ira exécuter... un peu comme la fonction main dans java)
Au début j’ai pensé que c’était cette partie :
if __name__=='__main__':
Mais dans certains scripts elle n’y est même pas
from c4d import *(astérisque) et pas x
J'avais écris 'from c4d import x', le x désignant un module à importer. :P
Mieux vaut importer seulement les modules nécessaires, exemple :
from c4d import plugins, utils, documents
… … je digresse, mais franchement, cette manie de Maxon de ne pas permettre l'enregistrement en version inférieure… GRrrrr!…
(si Adobbe faisait pareil
On voit que tu ne connais pas Adobe Indesign, c'est pas toutes les 6 versions qu'ils changent mais à chaque fois ...
J'avais écris 'from c4d import x', le x désignant un module à importer:icon_smile:
Personnellement je ne les utilise pas, j'ai pris l’habitude et je trouve plus clair avec les noms complets.
Au début j’ai pensé que c’était cette partie :
Code:
if __name__=='__main__':
T'as tout juste, et ça marche en dehors mais je crois que c'est une histoire d'espace global et tu risques d'avoir des variables dont la valeur est conservée d'une fois à l'autre
(ce qui peut être pratique dans certains cas)
oli_d t'as pas un site ou blog ou tu référence tes scripts ?
oli_d t'as pas un site ou blog ou tu référence tes scripts ?
Prochainement sur vos écrans ...
Merci oli_d pour ta réponse
J’ai essayé de toucher un peu à python et là…petit problème !!
En fait j’ai fait une boucle et j’ai oublié d’incrémenter ma variable >> bonjour la boucle infinie :(
Y a-t-il un moyen d’arrêter le script sans fermer c4d pour autant, pasque là bye-bye le code ! Faut tout recommencer !
Je profite de ce post pour partager avec vous mon tout premier script.
Je fais souvent des tests de rendu avec une scène assez basique (sphère + lumière + sol), alors j’ai fait ce script pour créer le tout en un clic ;)
>>> ici <<< (http://safina3d.blogspot.com/2011/05/c4d-script-basic-test-scene.html)
*edit : lien code source
Yessss un de plus qui va bientôt être accro à la programmation ...
Pour ta boucle infinie, c'est un classique du genre, cela m'est arrivé je ne sais combien de fois. Le mieux c'est de taper ton code à l'extérieur dans un logiciel "fait pour", style Notepad ++ sur PC ou Xcode sur mac, puis copier-coller dans c4d. Cela évite ce genre de problème et en plus c'est plus agréable de taper dans ce genre d'environnement.
L'autre chose c'est d'utiliser le plus possible la boucle for ... plutôt que while .... Si tu veux utiliser while prend l'habitude d'incrémenter tout de suite ta variable (au bout de 10 boucles infinie et de perte de code cela viendra tout seul).
Le danger quand on code c'est de réécrire des trucs qui existent déjà dans c4d. Pour ta problématique il me semble qu'un simple fichier c4d dans un catalogue de la médiathèque serait plus souple d'utilisation (un simple glissé-déposé dans ta scène et tu as tout tes éléments qui apparaissent et ensuite pour modifier le fichier origine c'est également plus simple).
De toute façon c'est très bien pour l'apprentissage du python, donc bravo !
Les CallCommand() sont très bien pour apprendre, mais après si on a d'autres possibilités c'est souvent plus optimum d'utiliser d'autres fonctions, notamment pour la gestion des annulations (undo) car chaque CallCommand génère un undo différent.
N'hésites pas à ouvrir plutôt un autre post pour présenter tes avancées...
Oups… désolé pour la gêne occasionnée
J’ai remplacé le code par un lien, de cette façon le titre gardera tout son sens ;)
Merci pour les conseils, je dl Notepad++ de suite…
hellolo Oli_D et les autres ,
je me demandais si on peut faire en python , une interface utilisateur où l'on peut ajouter des éléments à la demande :
par exemple je veux stocker une pose d'un personnage (donc les controleurs de son rig et les userdatas si possible) et je veux qu'il me crée une vignette preview , qu'il me nomme la pose ou que je puisse la nommer spécifiquement etc , et me faire une bibliothèque de pose ainsi ?
en gros comme l'ancien 'pose to pose' de mocca en gros .. c'est poussible tout ça ?
merki
clem
Salut,
Je ne sais pas si j'ai tout compris, mais en Python pour ajouter un gadget à l'interface utilisateur dynamiquement, tu peux le faire si c'est fenêtré (GeDialog et fils) avec LayoutFlushGroup et LayoutChanged de la classe GeDialog. Par contre si c'est un tag, dans le gestionnaire d'attribut, en cpp il faut utiliser la méthode GetDDescription() de la classe NodeData qui, si je ne dis pas de bêtise, n'est pas dispo en Python.
ben euh je pense que oui.
En gros t'as besoin de récupérer des données UserData ça no problemo avec un truc genre objet[c4d.ID_USERDATA,1] (par glisser/déposer de ton UD dans le truc où tu tapes le code)
Pour les contrôleurs de ton rig ça doit être possible mais je suis une bille en anim de perso donc je sais même plus trop ce que c'est, mais teste le glisser/déposer ...
Pour la vignette preview il y a une fonction c4d.documents.RenderDocument(doc, rdata, bmp, renderflags) qui permet de lancer le rendu et de récupérer le résultat dans bmp (jamais testé).
Pour le stockage, soit tu le fais dans un fichier texte soit il y a une classe c4d.storage.HyperFile qui doit permettre de faire ce genre de truc, mais là aussi jamais testé
Après pour récupérer les données c'est la même chose mais dans l'autre sens ...
EDIT : toasted by XSyann, mais je crois qu'on a pas compris la même chose ...
arf je connais pas encore ces fonctions/commandes que vous citez là :S .. je vais potasser ça .
en gros voici un exemple de l'ancien Pose2Pose ( qui a été viré il me semble ) . on drag&drop le parent du rig et il enregistre toutes les positions/rotations des enfants ..enfin un truc du genre. :)
valkaari
12/05/2011, 23h18
c'est forcement possible puisque maxon l'a fait.
Par contre, est ce que c'est possible avec le sdk, c'est autre chose. Comme dit Yann, il faudra utiliser le GetDescription et te battre avec les Desclevel il me semble pour avoir les DescID. (je l'ai croisé qu'une fois ce truc pour mettre à jour une liste déroulante dynamiquement mais bonjour l'angoisse me demande surtout pas de l'expliquer).
Maintenant, savoir si c'est intégrés via python, c'est encore une autre histoire.
ps : sympas ton père noël !!! :whistling:
ha ok :) bon bein si même vous vous semblez pas sur du truc , c'est surement pas moi qui vais y arriver ^^ . merci quad même pour les infos .
(ps : ce n'est pas ti popo noël , c'est mr monopoly :P )
voila un lien vers un plugin maya qui est exactement ce que j'aimerais faire/avoir pour animer :)
http://www.creativecrash.com/maya/downloads/scripts-plugins/animation/c/poseman-pose-manager--2
donc si ya des progr qui savent pas quoi faire là :D ! je serais votre premier client ^^
(edit : ce plug est freeware et on peut ouvrir le .mel dans un blocknote ... faut juste capter le mel ^^ )
Quelqu'un m'a expliqué un truc à propos du mel : lorsque tu fais quelque chose dans maya, n'importe quoi, l'équivalent en code mel peut être lu directement. Lu, copier, collé ailleurs!
Ma question : on peut le faire en python dans c4d ça?
genghiskhan
14/05/2011, 02h15
Comment ce serait trop bon de faire ça
voila un lien vers un plugin maya qui est exactement ce que j'aimerais faire/avoir pour animer
3600 lignes de code, ah ben oui quand-même ... ça calme
je regarde dès que j'ai une année de libre ...:biggrin:
Quelqu'un m'a expliqué un truc à propos du mel : lorsque tu fais quelque chose dans maya, n'importe quoi, l'équivalent en code mel peut être lu directement. Lu, copier, collé ailleurs!
Ma question : on peut le faire en python dans c4d ça?
Ce qui ressemble le plus à ce que tu décris dans Maya, passe encore par les scripts en COFFEE. Il y a un très bon tuto du côté de chez Fluffy : http://fluffy4d.com/?p=79
EDIT : c'est bien ma veine, le jour où Fluffy met à jour son site, pas disponible pour le moment ...
Pour le Python c'est pas encore possible directement, il faut retoucher un tout petit peu le code, ce n'est pas juste du copié/collé.
Mais bon cela ne fait pas tout, c'est uniquement une succession de commandes, mais cela peut être une bon début.
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. Tous droits réservés