PDA

Voir la version complète : Script python: conversion de l'image du presse-papier en matériau



oli_d
25/12/2014, 14h42
Joyeux Noël à toutes et à tous,

Je n'ai pas eu le temps de participer au calendrier cette année, je mets donc mon petit cadeau sous le sapin.

Il s’agit d'un script pour coller sous forme de texture 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_IMA GES, 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()



Pour l'instant je n'ai testé que sous MacOs et sur la r16

Merci à tous les contributeurs pour le calendrier de l'avent et l'année prochaine j'essaierai d'être à l'heure.

Aurety
25/12/2014, 16h03
Merci Oli !! Quelle bonne idée, je teste dès que mon rendu est terminé :thumbup1:

Aurety
25/12/2014, 18h48
Top ! Ca marche super bien.. ca serait cool si dans le cas de Photoshop, on pouvait récuperer un png+alpha plutôt qu'un Jpg car si on met dans le presse papier un calque, on se retrouve avec un fond-noir en lieu et place de l'alpha.
Merci encore Oli :icon_wavey:

oli_d
26/12/2014, 12h25
Salut Aurety,

J'y avais pensé, mais l'image du presse-papier que je récupère via une méthode du python c4d ne semble pas avoir de couche alpha, ou alors je m'y prends mal. Donc cela ne changera rien en png.

Si je trouve une autre piste, je modifierai....