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
Code:
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()
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.