PDA

Voir la version complète : Scripts divers python by oli_d



oli_d
06/05/2011, 16h38
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()

NiKo
06/05/2011, 16h54
Génial! J'avais raté ça!
Super script, et super initiative...
(ok, c bon, je vais passer en R12... ;-) )

Sir Gong
06/05/2011, 16h55
Merci Oli-D, t'es un chef ! :icon_boss:

shtl
06/05/2011, 17h02
Ah bah oui ça tombe bien ça. Super! Merci Oli_d :kiss::thumbup1:

oli_d
06/05/2011, 17h06
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()

oli_d
06/05/2011, 17h19
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, 17h44
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…

oli_d
06/05/2011, 19h11
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, 19h31
Superbe !
Tiens !… ben! je vais tester l'extrusion de spline en polygones sur la 11.5…


merci !

oli_d
06/05/2011, 19h59
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...

shtl
06/05/2011, 20h57
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, 21h17
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…

NiKo
07/05/2011, 02h09
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à?

oli_d
07/05/2011, 07h58
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, 09h25
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 ?)

oli_d
07/05/2011, 10h02
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 ...

xs_yann
07/05/2011, 12h08
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, 14h56
Quel message ?
ce message :

chatbraque
07/05/2011, 15h07
… 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, 15h24
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:)

xs_yann
07/05/2011, 16h30
… 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, 16h34
Cette discussion va vite devenir un "incontournable", merci Oli_d :thumbup:

clemz
07/05/2011, 23h26
merci Oli_D :) ! je suis toujours en apprentissage et tes scripts sont de super tutoriaux !

clem

oli_d
08/05/2011, 10h43
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, 11h54
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…

oli_d
08/05/2011, 12h41
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, 13h04
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 !

oli_d
08/05/2011, 13h16
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, 13h23
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: )

oli_d
08/05/2011, 14h06
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, 10h41
… 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 !!!… )

ksaa
09/05/2011, 11h46
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

xs_yann
09/05/2011, 12h25
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

oli_d
09/05/2011, 21h59
… … 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)

user4D
09/05/2011, 23h15
oli_d t'as pas un site ou blog ou tu référence tes scripts ?

oli_d
10/05/2011, 07h17
oli_d t'as pas un site ou blog ou tu référence tes scripts ?

Prochainement sur vos écrans ...

ksaa
11/05/2011, 16h38
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

oli_d
11/05/2011, 20h55
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...

ksaa
12/05/2011, 00h59
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…

clemz
12/05/2011, 13h21
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

xs_yann
12/05/2011, 17h33
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.

oli_d
12/05/2011, 17h47
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 ...

clemz
13/05/2011, 00h10
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
13/05/2011, 00h18
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:

clemz
13/05/2011, 12h39
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 )

clemz
13/05/2011, 18h24
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 ^^ )

shtl
13/05/2011, 23h28
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, 03h15
Comment ce serait trop bon de faire ça

oli_d
14/05/2011, 09h37
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.