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
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 ...
Code PHP:
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_DIRECTORY,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,self.plan)
if id == CANCEL:
self.Close()
return True
if __name__=='__main__':
dlg = MonDlg()
dlg.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE)
c4d.EventAdd()
Dernière modification par oli_d ; 06/05/2011 à 17h29.
Génial! J'avais raté ça!
Super script, et super initiative...
(ok, c bon, je vais passer en R12... ;-) )
--- www.aerografik.fr ---
Merci Oli-D, t'es un chef !
÷ R19 Studio ÷ cacahuètes ÷
Ah bah oui ça tombe bien ça. Super! Merci Oli_d
2x6coreXéon2.66(24T);64Gram; GTX 1080; OSX10.13.6 ////
Mac Studio 128 Ram ; OSX 12.3.1 ; papiercrayoncerveau;S22Studio;Redshift;Zbrush2022; CS2022
///SHTL 2011 DEMO HERE : http://demo.shtl.org/ /// NEW! 2014 WIP
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 )
- sélectionner les matériaux
- sélectionner l'objet parent contenant les objets à texturer
- lancer le script
Code PHP:
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.
Merci pour les commentaires, ça fait toujours plaisir les retoursCode PHP:
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 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
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
Code PHP:
import c4d
import os
import shutil
def regrouperImages():
dir = c4d.storage.LoadDialog(flags=c4d.FILESELECT_DIRECTORY)
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()
Dernière modification par oli_d ; 06/05/2011 à 18h16.
Superbe !
Tiens !… ben! je vais tester l'extrusion de spline en polygones sur la 11.5…
…
merci !
Dernière modification par chatbraque ; 06/05/2011 à 18h39.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
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 !
2x6coreXéon2.66(24T);64Gram; GTX 1080; OSX10.13.6 ////
Mac Studio 128 Ram ; OSX 12.3.1 ; papiercrayoncerveau;S22Studio;Redshift;Zbrush2022; CS2022
///SHTL 2011 DEMO HERE : http://demo.shtl.org/ /// NEW! 2014 WIP
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…
Dernière modification par chatbraque ; 06/05/2011 à 20h49.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
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à?
--- www.aerografik.fr ---
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)
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 ?)
Dernière modification par chatbraque ; 07/05/2011 à 08h40.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
Quel message ?
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"1- Existerait-ll un petit descriptif pour chacune des fonctions de Py C4D ?
Sinon il y a toujours celle de la 12 disponible chez Maxon (http://www.maxon.net/fr/support/plugin-cafe.html)
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.cette versionde Py C4D pour C4D 11.5 est-elle toujours compatible avec le code python tel qu'il existe aujourd'hui ?
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_DIRECTORY) 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 (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 :
ouCode:dir = c4d.storage.LoadDialog(flags=c4d.storage.FILESELECT_DIRECTORY)
avecCode:dir = storage.LoadDialog(flags=storage.FILESELECT_DIRECTORY)
au début.Code:from c4d import storage
… 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)
Dernière modification par chatbraque ; 07/05/2011 à 14h27.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
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 )
Dernière modification par chatbraque ; 07/05/2011 à 14h30.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
Cette discussion va vite devenir un "incontournable", merci Oli_d
merci Oli_D ! je suis toujours en apprentissage et tes scripts sont de super tutoriaux !
clem
[QUOTE=xs_yann;959020]En R12 les constantes ont été toutes regroupées dans le module c4d. En R11.5 non, cela donne donc :
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).Code:dir = c4d.storage.LoadDialog(flags=c4d.storage.FILESELECT_DIRECTORY)
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!)
:biggrin::biggrin::biggrin:(et même la "python-tuile"… comme disent les Alsaciens qui roulent au 2-temps)
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)- "create script" = il me demande un nom, je lui donne un nom, il me rétorque : "create sucess"… je lui dis "Ok"…
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....-pour-la-R11.5
Merci de ton aide…
Dernière modification par chatbraque ; 08/05/2011 à 11h34.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
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)
sinon essaie de voir si tu n'as pas un caractère bizarre après import c4dCode PHP:
import c4d
print 'test'
Dernière modification par oli_d ; 08/05/2011 à 11h54.
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 !
Dernière modification par chatbraque ; 08/05/2011 à 12h15.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
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.
Donc un blème au "copié/collé" ?!… je vais essayer de passer par simpletext pour voir si ça marche mieux.
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" )
Dernière modification par chatbraque ; 08/05/2011 à 12h35.
"Athos pour un !… un Porthos !" (devise des 3 mousquetaires, lorsqu'ils n'étaient encore que 2)
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