Salut,
voila j'ai un petit problème pour sauver un fichier .c4d en python de manière automatique.
j’utilise la fonction suivante:
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)Code PHP:
documents.SaveDocument(doc, "test.c4d", c4d.SAVEDOCUMENTFLAGS_0, c4d.FORMAT_C4DEXPORT)
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
Dernière modification par phobos34 ; 05/12/2012 à 18h25.
Salut,
La solution :
http://www.plugincafe.com/forum/foru...s.asp?TID=5896
Code PHP:
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()
Dernière modification par xs_yann ; 05/12/2012 à 18h42.
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.
merci, cela semble fonctionner sur le bureau.
juste une petite question, cette ligne sert a définir comme chemin le bureau:
mais si je la remplace par un autre chemin cela ne fonctionne plus (genre c:\toto\...)Code PHP:
path = storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)
il faut utiliser quelle fonction pour modifier le chemin ?
encore merci
bon j'ai trouver, il faut utiliser la syntaxe suivante
a la place de "path = storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)"Code PHP:
path= "E:\\Work\\cine4d\\test\\"
Si tu veux une solution plus propre et portable, tu peux utiliser les paramètres de c4d.storage.GeGetC4DPath() :
ou bien ces fonctions :Code PHP:
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.
pour avoir un chemin de base et ensuite tu peux ajouter des répertoires avec os.path.join.Code PHP:
GeGetPluginPath()
GeGetStartupApplication()
GeGetStartupWritePath()
GeGetStartupPath()
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
Dernière modification par phobos34 ; 06/12/2012 à 14h57.
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 ?
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
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 .\" :
wait() permet d'attendre que la commande DOS se termine.Code PHP:
import c4d
import subprocess
def main():
proc = subprocess.Popen("start .\\", shell=True)
proc.wait()
print "Dossier ouvert"
if __name__=='__main__':
main()
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)
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 ?
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.
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.