PDA

Voir la version complète : Question Script : CompositeScene



Hardisk
28/05/2013, 15h56
Salut !

Après avoir sorti sur ce même forum un script bash permettant de résoudre un bug pour les artistes VFX qui travaillent avec Boujou et Cinema4D , je travaille actuellement sur mon premier script Python (J'apprend Python).

Le but de ce script est d'automatiser en un clic ce que je fait à chaque fois que j'ouvre C4D en tant qu'artiste VFX :

- Créer un sol avec une texture blanche, un tag compositing et activer le "Compositing Background"
- Créer un ciel , ajouter un matériel Luminance avec une image HDR, un tag compositing et le rendre invisible à la caméra
- Créer un Background, y ajouter un matériel Couleur avec la séquence d'image de mon plan à truquer.

J'ai presque terminé le script, il me manque juste la partie des matériels qui me donne du fil à retordre en tant que débutant Python.

Je vous laisse ici le code actuel du script, je cherche à faire ce que j'ai dit plus haut avec les matériaux, vous pouvez le tester dans votre C4D , il est assez simpliste.

Merci !




# By Hardisk (YouTube.com/Hardisk)
# TODO
# Add Materials


import c4d #Import C4D Library


def main(): #Main Function

#Add HDRI Sky
HDR_Sky = c4d.BaseObject(5105)
HDR_Sky.SetName("HDRI")
Tag = c4d.BaseTag(5637)
HDR_Sky.InsertTag(Tag)
doc.InsertObject(HDR_Sky)
Tag[c4d.COMPOSITINGTAG_SEENBYCAMERA] = False
c4d.EventAdd()

#Add Floor
Floor = c4d.BaseObject(5168)
Floor.SetName("Floor")
Tag = c4d.BaseTag(5637)
Floor.InsertTag(Tag)
doc.InsertObject(Floor)
Tag[c4d.COMPOSITINGTAG_BACKGROUND] = True

c4d.EventAdd()

#Add Background
Background = c4d.BaseObject(5122)
Background.SetName("Video Background")
Tag = c4d.BaseTag(5637)
Background.InsertTag(Tag)
doc.InsertObject(Background)
Background[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = True
Background[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = False
c4d.EventAdd()


if __name__=='__main__':
main()

valkaari
31/05/2013, 01h48
il y a quelques """""" erreurs"""""" dans ton script :

Il faut éviter de nommer tes variables en commençant par une majuscule. C'est "réservé" aux classes ou nom de fonctions. (bien que tu peux ajouter un _ au début des noms de fonctions pour ne pas confondre nom de classe et nom de fonctions ou méthode)
C'est juste histoire pour rendre ton code plus "lisible" (enfin moi ça m'arrive encore souvent de le faire ..... saleté de mauvaise habitudes)

Il faut éviter si possible (bien que ça ne change rien au bon fonctionnement du code) d'utiliser les IDs directement.
Il faut écrire myNull = c4d.BaseObject(c4d.Onull) et non pas c4d.BaseObject(5140)
Si maxon change les IDs le code ne fonctionnerait plus. (y a quand même peut de chance qu'ils changent mais on sait jamais)

Sinon je t'ai modifié ton script pour ajouter la matière et une boite de dialogue qui demande le premier fichier.
Il y a un bouton pour "calculer" la longueur d'animation qui peut être appelé via la fonction CallButton()

Tu peux continuer ton script qui peut être assez intéressant pour gagner du temps en rajoutant les "undo" et par exemple modifier le type de projection et la taille du plan pour que soit aux bonnes dimensions.



import c4d #Import C4D Library
import os

def main(): #Main Function

myfile = c4d.storage.LoadDialog (c4d.FILESELECTTYPE_IMAGES) #ask for a file

if not os.path.exists(myfile):
#if file doesn't exist return
c4d.gui.MessageDialog("file doesn't exist Oo !!!!")
return

myMat = c4d.BaseMaterial(c4d.Mmaterial) #create a new Material

myMat.SetName("my sequence") #set name

myShader = c4d.BaseList2D(c4d.Xbitmap) #create the shader
myShader[c4d.BITMAPSHADER_FILENAME] = myfile #set the texture path
myMat.InsertShader(myShader) #insert the shader to the material
myMat[c4d.MATERIAL_COLOR_SHADER] = myShader #assign bitmap shader to the color channel
c4d.CallButton(myShader,c4d.BITMAPSHADER_CALCULATE ) # activate the "calculate button" in the bitmap shader

myMat[c4d.MATERIAL_ANIMATEPREVIEW] = True # activate the animate preview option
doc.InsertMaterial(myMat)

#updates
myMat.Message(c4d.MSG_UPDATE)
myMat.Update(True, True)



#Add HDRI Sky
sky = c4d.BaseObject(c4d.Osky)
sky.SetName("HDRI")
sct = c4d.BaseTag(c4d.Tcompositing)
sky.InsertTag(sct)
doc.InsertObject(sky)
sct[c4d.COMPOSITINGTAG_SEENBYCAMERA] = False

#Add Floor
floor = c4d.BaseObject(c4d.Oplane)
floor.SetName("Floor")
fct = c4d.BaseTag(c4d.Tcompositing)
floor.InsertTag(fct)
doc.InsertObject(floor)
fct[c4d.COMPOSITINGTAG_BACKGROUND] = True
textureTag = c4d.BaseTag(c4d.Ttexture) #create the texture tag
textureTag[c4d.TEXTURETAG_MATERIAL] = myMat #assign the material
textureTag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW #set the projection ot the texture tag
floor.InsertTag(textureTag) #insert tag to the floor object

#Add Background
bg = c4d.BaseObject(c4d.Obackground)
bg.SetName("Video Background")
bct = c4d.BaseTag(c4d.Tcompositing)
bg.InsertTag(bct)
doc.InsertObject(bg)
bg.SetRenderMode(c4d.MODE_ON)
bg.SetEditorMode(c4d.MODE_OFF)






#main update
c4d.EventAdd()



if __name__=='__main__':
main()

oli_d
31/05/2013, 06h13
Mêmes remarques que Vaalkari sur le code.

Mais sur le fond, tu as la possibilité d'enregistrer un fichier nommé new.c4d dans le dossier Maxon/Cinema 4D R... dans lequel tu peux mettre tous les éléments et régler toute les préférences de document. Chaque fois que tu auras un nouveau document dans c4d ce sera une copie de celui-ci.

C'est plus simple, mais moins bon pour l'apprentissage du python ...

César Vonc
31/05/2013, 14h10
Il me semble que tu peux également faire Script > Scripts personnalisés > Enregistrer comme modèle, qui a le même effet.

gaff
31/05/2013, 14h24
Il y a une petite nuance entre les deux : il me semble que le new.c4d va te créer systématiquement le document à chaque nouveau projet, tandis qu'en passant par le script enregistrer comme modèle, il va te créer ton document à l'ouverture de C4d, mais pas si tu crées d'autres nouveaux projets par la suite. C'est au choix, personnellement je préfère le script qui est plus souple.

oli_d
31/05/2013, 14h36
Il me semble que tu peux également faire Script > Scripts personnalisés > Enregistrer comme modèle, qui a le même effet.
Et encore un truc que je savais pas, merci !

César Vonc
31/05/2013, 15h56
Ah oui c'est juste, Gaff, j'avais pas fait gaffe !

valkaari
31/05/2013, 23h17
Il est toujours bon de rappeler l'utilité des fichiers new.c4d et template.c4d même si là, à moins qu'il charge tout le temps la même séquence dans sa texture et travail toujours sur le même plan c'est assez cool de se faire un petit script.

Comme dans les logiciels de MAO ou on nous propose des "templates" pour plusieurs type de projets.