Affichage des résultats 1 à 8 sur 8

Discussion: DU Nom du fichier et chemin relatif

  1. #1
    Touriste
    Date d'inscription
    février 2013
    C4D version
    R9
    Messages
    7

    DU Nom du fichier et chemin relatif

    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 !

  2. #2
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    775
    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.
    3D 3e année MJM NANTES

    Website : graphos.xyz

  3. #3
    Touriste
    Date d'inscription
    février 2013
    C4D version
    R9
    Messages
    7
    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 !

  4. #4
    Touriste
    Date d'inscription
    février 2013
    C4D version
    R9
    Messages
    7

    Post

    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 !

  5. #5
    Touriste
    Date d'inscription
    février 2013
    C4D version
    R9
    Messages
    7
    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.

  6. #6
    Touriste
    Date d'inscription
    février 2013
    C4D version
    R9
    Messages
    7
    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 actif
    doc=c4d.documents.GetActiveDocument()

    #récupère le chemin du projet C4D
    racine = c4d.documents.BaseDocument.GetDocumentPath(doc)

    #récupère le chemin du fichier DU
    chemin_fichier = os.path.relpath(fichier_DU)

    #extrait le nom du fichier
    nom_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.

  7. #7
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    R19 Studio
    OS
    MacOS X
    Messages
    635
    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() 

  8. #8
    Touriste
    Date d'inscription
    février 2013
    C4D version
    R9
    Messages
    7
    Merci beaucoup oli_d d'avoir pris le temps de me donner ces indications !
    Je vais pouvoir creuser un peu...

Discussions similaires

  1. Texture path relatif > absolu
    Par NiKo dans le forum Textures
    Réponses: 18
    Dernier message: 04/06/2008, 09h45
  2. Réponses: 2
    Dernier message: 02/10/2007, 15h03
  3. relatif à la vente du logiciel ..
    Par Maha dans le forum Emploi/Formations/Annonces
    Réponses: 23
    Dernier message: 31/05/2007, 19h07
  4. fichier structure incorrecte...fichier perdu ?
    Par norris dans le forum Général Cinema 4D
    Réponses: 12
    Dernier message: 08/10/2006, 11h29
  5. Réponses: 4
    Dernier message: 05/07/2006, 17h39

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •