PDA

Voir la version complète : Question script python pour assembler des objets de la mediatheque a partir d'un texte importé



leto
27/12/2014, 22h51
Bonjour à tous,

j'aurais besoin pour mon boulot d'un script python qui aurait les fonctionnalités suivantes :
- import d'un document txt qui contient un texte classique (phrases - paragraphes - .... )
- identification dans ce texte de plusieurs noms d'objet et recherchent de correspondance avec des objets 3d de la médiathèque de c4d
- import de tous ces objets 3d dans une scene c4d.

est ce, à votre avis, possible ou suis-je à coté de la plaque ?

merci
L

César Vonc
30/12/2014, 19h51
Pour ouvrir un fichier texte et le parcourir, ça va, mais pour le chercher dans la médiathèque, là j'avoue que je ne vois pas comment !

J'ai fait rapidement un début de script qui recherche dans un fichier texte une série de mots et affiche ceux trouvés dans la console, mais c'est tout...

Si quelqu'un a une idée pour la suite :


import c4d
from c4d import gui

# Dictionnaire
# Mot à chercher dans le fichier : mot à chercher dans la médiathèque
dico = {"voiture" : [False, "car"],
"ferrari" : [False, "car"],
"avion" : [False, "plane"]
}

def accents(txt) :
txt = txt.replace("à", "a")
txt = txt.replace("â", "a")
txt = txt.replace("é", "e")
txt = txt.replace("ê", "e")
txt = txt.replace("è", "e")
txt = txt.replace("ë", "e")
txt = txt.replace("î", "i")
txt = txt.replace("ï", "i")
txt = txt.replace("ù", "u")
return txt

def main():
chem = c4d.storage.LoadDialog()
if chem is None : return
chem = chem.decode('UTF-8', 'strict')
fic = open(chem, 'r')

ligne = fic.readline()
while ligne :
ligne = ligne.lower()
ligne = accents(ligne)

for mc in dico.keys() :
if dico[mc][0] : continue
if mc in ligne : dico[mc][0] = True
ligne = fic.readline()

fic.close()

for mot, tab in dico.items() :
if not tab[0] : continue
media = tab[1]
print mot, media

if __name__=='__main__':
main()

leto
30/12/2014, 20h51
merci beaucoup , ça fonctionne !

l'idée est de pouvoir créer des scènes rapidement en important les bons objets lorsqu'il faut faire de manière répétitive des illustrations de documents écrits.

Par contre, je n'ai effectivement pas trouvé sur la doc python en ligne de maxon de référence à la médiathèque ?
C'est peut être contournable mais cela oblige à créer une bibliothèque perso de scènes et d'objet en dehors de 4cd
, avec perte des avantages de la médiathèque.
je continue à chercher..et je vais étudier ton code à la loupe (je démarre dans le python)

Merci encore
L

oli_d
31/12/2014, 06h14
Bonjour,

Pour la médiathèque voici un exemple pour charger Fred de la bibliothèque Prime :



import c4d


def main():
#le nom commence par preset:// ensuite nom de la librairie, etc... la casse n'a apparemment pas d'influence
fn = 'preset://prime.lib4d/humans/fred.c4d'

#chargement du doc sans l'ouvrir dans c4d (sinon utiliser LoadFile)
#dans ce cas je ne charge que les objets voir exemple suivant pour avoir objets et matériaux
doc_media = c4d.documents.LoadDocument(fn,c4d.SCENEFILTER_OBJE CTS)

#on cherche l'objet Fred (atention ici la casse est importante
fred = doc_media.SearchObject('Fred')

#on clone l'objet et on l'insère dans notre document ouvert (doc)
copie = fred.GetClone()
doc.InsertObject(copie)

#on rafraichit la vue
c4d.EventAdd()

if __name__=='__main__':
main()


Variante si on veut importer tout le document :



import c4d


def main():
#le nom commence par preset:// ensuite nom de la librairie, etc... la casse n'a apparemment pas d'influence
fn = 'preset://prime.lib4d/humans/fred.c4d'

#on importe tout le document dans notre document ouvert (doc)
# dans ce cas on importe les matériaux et les objets
c4d.documents.MergeDocument(doc, fn, c4d.SCENEFILTER_MATERIALS | c4d.SCENEFILTER_OBJECTS)

#on rafraichit la vue
c4d.EventAdd()

if __name__=='__main__':
main()


Par contre vu que l'on n'a pas accès aux dossiers de la médiathèque via la bibliothèque os ou glob je ne vois pas comment lister les contenu d'un dossier autrement qu'à la main ( ce qui protège un peu les éléments de la médiathèque selon la version de c4d...)