PDA

Voir la version complète : sauver un fichier .C4D de manière automatique en pthyton



phobos34
05/12/2012, 17h59
Salut,

voila j'ai un petit problème pour sauver un fichier .c4d en python de manière automatique.

j’utilise la fonction suivante:



documents.SaveDocument(doc, "test.c4d", c4d.SAVEDOCUMENTFLAGS_0, c4d.FORMAT_C4DEXPORT)
qui sauve très bien le fichier .c4d mais je suis obliger de valider le bouton "enregistré " a la main (donc cela ne sert pas a grande chose)

y a t-il un moyen pour forcer la sauvegarde sans avoir cette boite de dialogue ?
sinon peut-on automatiser le click sur le bouton enregistré de cette boite de dialogue ?

par avance merci

xs_yann
05/12/2012, 18h39
Salut,

La solution :
http://www.plugincafe.com/forum/forum_posts.asp?TID=5896


import os
import c4d
from c4d import documents, storage


def main():
path = storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)
path = os.path.join(path,'testscene.c4d')
documents.SaveDocument(doc, path, c4d.SAVEDOCUMENTFLAGS_0, c4d.FORMAT_C4DEXPORT)

if __name__=='__main__':
main()

valkaari
05/12/2012, 20h35
sinon pour le coté "automatique" j'imagine que tu veux une sauvegarde toutes les X minutes, il y a dans les exemples python un plug qui fait un refresh automatique (le plug avec le rss).

Il faut utiliser la fonction "timer" (ce qui oblige d'avoir la fenêtre de dialogue ouverte ou dans un coin de l'écran).


A voir si un autre type de plug permet de le faire.

phobos34
06/12/2012, 09h17
merci, cela semble fonctionner sur le bureau.
juste une petite question, cette ligne sert a définir comme chemin le bureau:



path = storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)


mais si je la remplace par un autre chemin cela ne fonctionne plus (genre c:\toto\...)
il faut utiliser quelle fonction pour modifier le chemin ?

encore merci

phobos34
06/12/2012, 09h43
bon j'ai trouver, il faut utiliser la syntaxe suivante



path= "E:\\Work\\cine4d\\test\\"
a la place de "path = storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)"

xs_yann
06/12/2012, 10h15
Si tu veux une solution plus propre et portable, tu peux utiliser les paramètres de c4d.storage.GeGetC4DPath() :


C4D_PATH_PREFS CINEMA 4D prefs directory
C4D_PATH_RESOURCE CINEMA 4D resource directory
C4D_PATH_LIBRARY CINEMA 4D library directory (builtin)
C4D_PATH_LIBRARY_USER CINEMA 4D library directory (different if multiuser mode enabled).
C4D_PATH_ONLINE_HELP CINEMA 4D Online Help Directory.
C4D_PATH_DESKTOP OS Desktop Directory
C4D_PATH_HOME OS Home Directory
C4D_PATH_STARTUPWRITE Writeable StartupDir.
C4D_PATH_MYDOCUMENTS The user’s documents directory.

ou bien ces fonctions :


GeGetPluginPath()
GeGetStartupApplication()
GeGetStartupWritePath()
GeGetStartupPath()

pour avoir un chemin de base et ensuite tu peux ajouter des répertoires avec os.path.join.

phobos34
06/12/2012, 14h54
ok merci xs_yann,

par contre comment fait-on dans c4d en python pour exécuter une ligne de commande externe ?
je veux lancer un programme externe avec des option via une ligne de commande dans une fenêtre dos ?
on peut attendre sue la fenêtre dos ce ferme ou pas ? (comme avec la fonction python "os.popen(cmd)")

merci

César Vonc
06/12/2012, 15h17
Je ne comprends pas ta question, tu sembles y répondre.

En Python, tu peux lancer une commande DOS avec os.popen(), oui.

Et pour lancer un programme en DOS suffit juste de taper son chemin, non ?

phobos34
06/12/2012, 15h28
ba non, la commande "os.popen(cmd)" ne marche pas, il doit falloir utiliser une fonction spécial de c4d pour executer
une ligne de commande externe

César Vonc
06/12/2012, 15h58
Tu as bien mis import os en début de code ?

La doc Python recommande d'utiliser subprocess plutôt que os.popen() :

http://docs.python.org/2/library/subprocess.html

Voici un exemple qui ouvre le dossier courant avec la commande "start .\" :



import c4d
import subprocess

def main():
proc = subprocess.Popen("start .\\", shell=True)
proc.wait()
print "Dossier ouvert"

if __name__=='__main__':
main()wait() permet d'attendre que la commande DOS se termine.

valkaari
06/12/2012, 16h47
si jamais la solution Python ne fonctionne pas, tu peux regarder du coté


c4d.storage.GeExecuteProgram(app, path)
ou
c4d.storage.GeExecuteFile


Attention, il y a peut être des restrictions sur l'exécution de programmes extérieurs à c4d via une commande dans c4d. (pour des raisons de sécurités)


(.... enfin j'espères)

Tengaal
06/12/2012, 19h16
heu... j'ai un doute, ou alors j'ai pas du tout compris le problème de départ, mais pourquoi ne pas utiliser la fonction de sauvegarde automatique de C4D tout simplement ?

Préférences générales -> fichiers et là on active la sauvegarde automatique on définit l'intervalle de temps entre chaque sauvegarde, le chemin de sauvegarde du projet ou un chemin spécifique, etc.. et voilà.

non ? j'ai loupé un truc peut-être ? :mellow:

phobos34
09/12/2012, 09h32
merci César,

effectivement "subprocess" marche parfaitement.

pour répondre a Tengaal, le but de cette fonction est de pouvoir sauver de manière automatique mais
sous un nom diffèrent et/ou un emplacement différent.

Tengaal
09/12/2012, 10h47
ok mais justement, la fonction intégrée de C4D ne permet pas cela déjà ?

on peut définir le chemin des sauvegardes (dossier du projet, ou dossier personnalisé)
on peut définir le nombre de copie également, c'est à dire qu'à chaque sauvegarde le nom du fichier sera incrémenté.

si on définit le nombre de copies à 20 par exemple, avec un délais de sauvegarde de 5 minutes, alors, toutes les minutes on aura un nouveau fichier, du genre:
fichier_001.c4d
fichier_002.c4d
fichier_003.c4d
etc...
fichier_020.c4d (donc ici au bout de 20x5min = 1h40m de travail)

au dela de 20, le fichier le plus récent se sauvegarde à nouveau avec le nom 001, puis 002, etc... jusqu'à 020.

l'autre intérêt de la fonction interne de c4d, c'est que si on doit s'absenter un instant et qu'on oublie de désactiver l'enregistrement automatique, le fichier ne sera pas enregistré si aucune action n'a été faite depuis la dernier sauvegarde.