Cinema4D Python Script

Transformation de l’image du presse-papier en matériau

Il s’agit d’un script pour coller sous forme de texture dans Cinema4D une image provenant du presse-papier. Très pratique pour récupérer des images provenant d’internet ou des zones sélectionnées depuis photoshop.

  • par défaut, si le document est enregistré l’image est directement enregistrée dans le dossier tex sous un nom incrémental de type image001, sinon on choisit le nom et l’emplacement
  • si un objet est sélectionné, il lui applique la texture
  • un objet plan avec la texture appliquée est directement placé dans le document avec les bonne proportions

Sinon en modifiant dans le code les constantes en majuscules vous pouvez modifier les paramètres par défaut:

  • CHOISIR_NOM = True (attention de respecter la casse) vous donne la possibilité de choisir l’emplacement et le nom de l’image chaque fois
  • CREER_PLAN = False évite que l’on crée un nouvel objet plan
  • NOM_IMG_DEFAUT = ‘xxxx’ (entre guillemets simples ou double) vous permet de choisir le nom de l’image par défaut
import c4d,os

#si CHOISIR_NOM = True une boîte de dialogue s'ouvre pour choisir le nom et l'emplacement de la sauvegarde

#si CHOISIR_NOM = False c'est NOM_IMG_DEFAUT qui est pris en compte et l'image est sauvagardée dans le dossier tex
#les images sont numérotées pour ne pas écraser une existante

#Attention si le document actif n'est pas enregistré CHOISIR_NOM = True'

CHOISIR_NOM = False

#Mettre CREER_PLAN = True pour creer un plan avec la texture appliquée sinon False
CREER_PLAN = True

NOM_IMG_DEFAUT = 'image'
SUFFIXE = '.jpg'

def main():
    choix_nom = CHOISIR_NOM
    
    bmp =  c4d.GetBitmapFromClipboard()
    if not bmp : return
    
    path =  doc.GetDocumentPath()
    if not path : 
        choix_nom = True
    else :
        path = os.path.join(path,'tex')
        if not os.path.isdir(path):
            os.makedirs(path, mode=0777)
    
    x, y = bmp.GetSize()
    relatif = True
    
    if choix_nom:
        fn = c4d.storage.SaveDialog(type=c4d.FILESELECTTYPE_IMAGES, title="Sauvegarder l'image :", force_suffix=SUFFIXE[1:],  def_path = path)
        if not fn : return
        if os.path.dirname(fn)!= doc.GetDocumentPath():
            relatif = False
        
        
    else :
        id_nom = 0
    
        fn = os.path.join(path, NOM_IMG_DEFAUT+str(id_nom).zfill(3)+SUFFIXE)
        
        while os.path.isfile(fn):
            id_nom+=1
            fn = os.path.join(path, NOM_IMG_DEFAUT+str(id_nom).zfill(3)+SUFFIXE)
    
    bmp.Save(fn, c4d.FILTER_JPG)
    
    
    mat = c4d.BaseMaterial(c4d.Mmaterial)
    mat.SetName( os.path.basename(fn))
    doc.InsertMaterial(mat)
    shd = c4d.BaseList2D(c4d.Xbitmap)
    
    if relatif:
        shd[c4d.BITMAPSHADER_FILENAME] = os.path.basename(fn)
    else :
        shd[c4d.BITMAPSHADER_FILENAME] = fn
        
    mat[c4d.MATERIAL_COLOR_SHADER] = shd
    mat.InsertShader(shd)
    mat[c4d.MATERIAL_PREVIEWSIZE] = c4d.MATERIAL_PREVIEWSIZE_NO_SCALE
    mat.Message(c4d.MSG_UPDATE)
    mat.Update(True, True)
    
    if op:
        tag = c4d.TextureTag()
        tag.SetMaterial(mat)
        op.InsertTag(tag)
    
    if CREER_PLAN:
        #rep = c4d.gui.QuestionDialog('Créer un plan ? ')
        #if not rep : return

        plan = c4d.BaseObject(c4d.Oplane)
        plan[c4d.PRIM_PLANE_WIDTH] = x
        plan[c4d.PRIM_PLANE_HEIGHT] = y
        plan[c4d.PRIM_PLANE_SUBW] = plan[c4d.PRIM_PLANE_SUBH] = 1
        plan.SetName(os.path.basename(fn))
        tag = c4d.TextureTag()
        tag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW
        tag.SetMaterial(mat)
        plan.InsertTag(tag)
        doc.InsertObject(plan)
        
    c4d.EventAdd()

    
    

if __name__=='__main__':
    main()
clipboard2material

Leave a Reply