Bonjour à tous,
Je pense que c'est assez basique, mais je cherche et bidouille depuis un moment sans trouver de réponse...
J'ai créé une donnée utilisateur "nom de fichier" grâce à laquelle je viens charger un .csv qui est lu par un Xpresso Python pour récupérer des données d'un tableau. Jusque là ça marche bien.
Le problème est que quand je change de poste de travail, il faut à chaque fois que je recharge mon .csv car le chemin est un chemin absolu, ce qui rend mon outil fastidieux à utiliser...
Y'a-t-il un moyen d'utiliser un chemin relatif à mon projet .c4d avec ce type de DU ?
Merci !
Je pense que le seul moyen est de faire en sorte que quand le DU change, tu regarde si le fichier existe et absolut (via os.path.exists et os.path.isabs).
Si il est absolut tu builds le chemin relatif toi même en utilisant ceci https://stackoverflow.com/questions/...absolute-paths.
Avec comme première entrée le chemin de ton doc que tu peux avoir grâce à doc.GetDocumentPath et le chemin absolu de ton fichier.
Puis une fois que tu as ton chemin relatif tu sets ton DU path à ce chemin relatif
La vu que ton DU as changé normalement ça devrais trigger ta première fonction. Sauf que cette fois le chemin sera relatif, te reste plus qu'a reconstruire le chemin avec os.path.join et voila !
Dernière modification par gr4ph0s ; 24/07/2017 à 17h49.
SDK Specialist
MAXON Computer GmbH
Super merci pour le conseil !
Je ne suis pas encore bien rodé au python et à la programmation, mais je vais tenter de suivre ta piste...avec sûrement d'autres questions / difficultés !
Bon comme prévu je galère un peu...
Le problème que je rencontre est que dans le chemin du fichier DU, il y a le nom du fichier...
Pour être plus parlant, voilà mon code python :
import c4d
import os
import csv
def main():
global lien_rel_fichier
#récupère le projet c4d actif
doc=c4d.documents.GetActiveDocument()
#récupère le chemin absolu du projet
chemin_projet = c4d.documents.BaseDocument.GetDocumentPath(doc)
print "chemin projet : ", chemin_projet
#récupère le chemin absolu du fichier DU
chemin_fichier = os.path.abspath(lien_fichier_DU)
print "chemin fichier settings : ",chemin_fichier
#chemin relatif
lien_rel_fichier = os.path.relpath(chemin_projet,chemin_fichier)
print "chemin relatif : ", lien_rel_fichier
Et du coup le résultat console :
chemin projet : /Users/JuK-IDS/Dropbox/__JUK C4D TOOLS/REBOOT 2017
chemin fichier settings : /Users/JuK-IDS/Dropbox/__JUK C4D TOOLS/REBOOT 2017/data/data.csv
chemin relatif : ../..
Il faudrait que j'arrive à virer le nom du fichier pour ne conserver que le chemin, mais je coince
Je continue à chercher, mais si une âme charitable à une solution simple, je suis preneur
Mes premiers pas pythonesques sont un peu hésitants !
En fait je ne suis pas sur que le problème vienne de là.
J'ai essayé en remplaçant "os.path.abspath" par "os.path.dirname", le résultat est différent (.. à la place de ../..) mais c'est pas encore ça...
Ce que je voudrais obtenir c'est : "/data/data.csv"
Grrr
Dernière modification par Juk ; 29/07/2017 à 23h09.
Pour clore le sujet : je me suis un peu embrouillé sur mes posts précédents, mais finalement j'ai trouvé une solution simple, sûrement pas très conventionnelle ni propre, mais qui fonctionne pour mon besoin :
def main():
global fichier_sortie
#récupère le projet C4d actifdoc=c4d.documents.GetActiveDocument()
#récupère le chemin du projet C4Dracine = c4d.documents.BaseDocument.GetDocumentPath(doc)
#récupère le chemin du fichier DUchemin_fichier = os.path.relpath(fichier_DU)
#extrait le nom du fichiernom_fichier = os.path.basename(chemin_fichier)
#reconstruit le chemin relatif (sous_repertoire en input du noeud)fichier_sortie = racine + sous_repertoire + nom_fichier
Voilà !
En tout ca merci à gr4ph0s ! Et désolé si ça fait mal aux yeux des vrais codeurs !
Dernière modification par Juk ; 30/07/2017 à 00h33.
Salut bienvenue et content de voir un nouveau codeur.
Déjà bravo pour ton code, l'essentiel c'est qu'il fasse ce que tu attends de lui !
Juste quelques petites remarques:
- en python à l'intérieur de c4d (tout sauf les plugins) la variable doc est directement implémentée. Tu peux l'utiliser telle quelle sans avoir besoin de faire doc=c4d.documents.GetActiveDocument() (essaie de supprimer cette ligne dans ton code, tu verras ça marchera quand-même).
- ta ligne chemin_fichier = os.path.relpath(fichier_DU)
ne sert à rien tu peux l'enlever et faire directement nom_fichier = os.path.basename(fichier_DU), le résultat sera le même- attention à fichier_sortie = racine + sous_repertoire + nom_fichier. Je te conseille d'utiliser systématiquement os.path join(racine,sous_repertoire,nom_fichier). Avec ça tu pourras utiliser ton code sur windows et sur mac en principe sans aucun souci.
Je te donne un lien très utile pour manipuler les fichiers : https://python.developpez.com/faq/?page=Fichier
Inspiré des exemples de ce lien je te mets un bout de code que j'utilise pour aller chercher une image n'importe où dans le dossier tex, si le fichier n'existe pas. C'est un peu ce qu'utilise c4d, on peut ainsi mettre des sous-répertoires dans le dossier tex et il retrouve en principe l'image. Attention le code est fait pour un script, pas pour un noeud xpresso.
Code PHP:
import c4d
from glob import glob
import os.path
def findFile(path,filename):
"""fonction récursive pour rechercher un nom de fichier (filename)
dans un répertoire et dans tous les sous-répertoires"""
res = None
#glob est super pour parcourir tous les éléments d'un dossier
#si on veut rechercher que les fichier jpg par exemple
#on remplace '*' par '*.jpg'
for f in glob(os.path.join(path,'*')):
#si on tombe sur un dossier
#on relnce la fonction => récursivité
if os.path.isdir(f): res = findFile(f,filename)
#sinon c'est un fichier
#et on compare le nom
else:
if os.path.basename(f) == filename:
#si le nom correspond on l'attribue à res
res = f
#si on a trouvé un résultat on arrête tout et on renvoie le nom du fichier
if res : return res
return res
def main():
fn = '/Chemin/vers/mon/image.jpg'
#si le fichier n'existe pas on va le chercher dans le dossier 'tex' du doc
#si le fichier existe on pourra directement travailler avec ...
if not os.path.isfile(fn):
pathdoc = c4d.documents.BaseDocument.GetDocumentPath(doc)
if not pathdoc:
print 'doc pas enregistré'
return
pathtex = os.path.join(pathdoc,'tex')
fn = findFile(pathtex,os.path.basename(fn))
if not fn:
print"fichier pas trouvé, c'est la m..."
return
#à partir de là on peut travailler sereinement avec notre fichier
print fn
if __name__=='__main__':
main()
Merci beaucoup oli_d d'avoir pris le temps de me donner ces indications !
Je vais pouvoir creuser un peu...