Boutique Cinema 4D
Affichage des résultats 1 à 20 sur 20

Discussion: Extraire les coordonnées x,y,z d'objets

  1. #1
    Pilier Avatar de user4D
    Date d'inscription
    août 2006
    Messages
    1 708

    Extraire les coordonnées x,y,z d'objets

    Bonjour à tous,

    je souhaiterais extraire les coordonnées x,y,z de tous les objets présents dans ma scène avec leurs noms et leurs coordonnées.

    Je sais que je peux exporter les données ASCII via l'onglet structure (points, polygones, uvw,...) mais j'ai pas trouvé pour les coordonnées objets

    Au final, j'aimerais regrouper dans un tableur, une colonne le nom des objets et dans une autre colonne leurs positions x,y,z.

    Quelqu'un aurait une piste à me proposer ?

  2. #2
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Citation Envoyé par user4D Voir le message
    Quelqu'un aurait une piste à me proposer ?

    ouais

  3. #3
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    en m'appuyant sur cette page http://c4dprogramming.wordpress.com/...chy-iteration/

    (et en corrigeant les petits oublie de code genre parenthèse ou des modifs du sdk)

    Si tu enregistre avec une extention .csv, tu devrais pouvoir importer ton fichier dans openoffice ou excel en lui spécifiant que tes colonnes sont séparées par des ;




    Code:
    import c4d
    from c4d import gui
    #Welcome to the world of Python
    
    
    
    
    def print_object_name(op,fn):
        if not op:
            return False
        
        xyz = str(op.GetMg().off.x) + ";" + str(op.GetMg().off.y) +";" + str(op.GetMg().off.z)
        fn.write(op.GetName() + ";" +  xyz + "\n")
        return True
     
    
    
     
    # Recurses a hierarchy, starting from op
    # Returns number successful callbacks
    def recurse_hierarchy(op, callback,fn):
        count = 0
        while op:
            if callback(op,fn):
                count += 1
            count += recurse_hierarchy(op.GetDown(),callback,fn)
            op = op.GetNext()
        return count
    
    
    
    
    
    
    def main():
    
    
        fn = open(c4d.storage.SaveDialog(),"w")
        fn.write("Nom de l'objet;x;y;z\n")
            
        count = recurse_hierarchy(doc.GetFirstObject(), print_object_name,fn)
        fn.write("Nombre d'objet traité " + str(count))
        fn.close()
    
    
    if __name__=='__main__':
        main()

    on notera que je me suis même pas emmerdé à renommer la fonction "print_object_name"

    Faignasse que je suis T.T

  4. #4
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Alors juste une piste !


    Tu peux récupérer le premier objet de ta scène avec doc.GetFirstObject().

    Ses enfants avec GetChildren().

    L'objet suivant avec GetNext().

    La matrice de l'objet avec GetMg() pour les coordonnées globales, ou relatives avec GetMl().

    Le nom de l'objet avec GetName().


    Et enfin, t'as la fonction print de Python qui permet d'écrire dans la console.

  5. #5
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    quand je disais juste "ouais" c'était le temps de bouffer une biscotte et de pondre le code hein (puis tester un peu en passant)

    Tu soulèves un points important, j'ai pris les cordonnées globales de chaque objets et pas les relatives.

  6. #6
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    C'est dommage pour User4D qui aurait pu apprendre quelques notions tant qu'il avait encore un intérêt pour le codage.

    On se retrouve de nouveau seuls ici.

  7. #7
    Vieux Croûton Avatar de Sir Gong
    Date d'inscription
    juillet 2002
    C4D version
    R19 Studio
    OS
    10.13.4 High Sierra
    Messages
    10 353
    Billets dans le blog
    2
    Citation Envoyé par César Vonc Voir le message
    On se retrouve de nouveau seuls ici.
    On participerait volontiers, mais perso, le seul mot de la discussion que j'ai compris c'est "biscotte".
    ÷ R19 Studio ÷ cacahuètes ÷

  8. #8
    Pilier Avatar de user4D
    Date d'inscription
    août 2006
    Messages
    1 708
    Citation Envoyé par valkaari Voir le message
    quand je disais juste "ouais" c'était le temps de bouffer une biscotte et de pondre le code hein (puis tester un peu en passant)

    Tu soulèves un points important, j'ai pris les cordonnées globales de chaque objets et pas les relatives.
    God save you Mister Val

    Je pensais à une piste avec moins de code en fait

    En parlant de pondre, je suis tombé sur une vidéo qui devrait te plaire Il y a du nude et des boobs

  9. #9
    Pilier Avatar de user4D
    Date d'inscription
    août 2006
    Messages
    1 708
    Salut Val

    Es-ce qu'il serait possible pour toi de modifier ce script pour qu'il récupère les coordonnées des objets par rapport à une caméra à la place du monde ?

    Merci

  10. #10
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Je m'y suis collé.

    J'ai repris le code de Val et modifié les coordonnées des objets par rapport à la caméra de rendu. J'ai également rajouté une ligne biscotte pour que sir Gong comprenne au moins une ligne .

    Fais peut-être quelques vérifications sur un petit fichier avant de l'utiliser en prod ...

    Code PHP:
    import c4d
    from c4d import gui


    def print_object_name
    (op,fn,pos_cam):
        if 
    not op:
            return 
    False
        
    #on soustrait la position globale de la caméra à la position globale de l'objet
        
    pos op.GetMg().off pos_cam
        xyz 
    str(pos.x) + ";" str(pos.y) +";" str(pos.z)
        
    fn.write(op.GetName() + ";" +  xyz "\n")
        return 
    True
     


     
    # Recurses a hierarchy, starting from op
    # Returns number successful callbacks
    def recurse_hierarchy(opcallback,fn,pos_cam):
        
    count 0
        
    while op:
            if 
    callback(op,fn,pos_cam):
                
    count += 1
            count 
    += recurse_hierarchy(op.GetDown(),callback,fn,pos_cam)
            
    op op.GetNext()
        return 
    count


    def main
    ():
        
    #biscotte
        #récupération de la vue de rendu
        
    bd doc.GetRenderBaseDraw()
        
    #récupération de la camera de la scene
        
    cam bd.GetSceneCamera(doc)
        
    #si on n'a pas de camera active on prend la camera de la vue
        
    if not cam cam bd.GetEditorCamera()
        
    pos_cam =  cam.GetMg().off

        fn 
    open(c4d.storage.SaveDialog(),"w")
        
    fn.write("Nom de l'objet;x;y;z\n")
            
        
    count recurse_hierarchy(doc.GetFirstObject(), print_object_name,fn,pos_cam)
        
    fn.write("Nombre d'objet traité " str(count))
        
    fn.close()


    if 
    __name__=='__main__':
        
    main() 
    Dernière modification par oli_d ; 14/02/2015 à 06h38.

  11. #11
    Vieux Croûton Avatar de Sir Gong
    Date d'inscription
    juillet 2002
    C4D version
    R19 Studio
    OS
    10.13.4 High Sierra
    Messages
    10 353
    Billets dans le blog
    2
    haha, merci !
    ÷ R19 Studio ÷ cacahuètes ÷

  12. #12
    Pilier Avatar de user4D
    Date d'inscription
    août 2006
    Messages
    1 708
    Merci oli_d

    Je vais tester ça demain, mais connaissant ton niveau, ça m'étonnerait que cela ne fonctionne pas .

    Et merci pour la biscotte

  13. #13
    Gourou Avatar de Realzeb
    Date d'inscription
    octobre 2003
    C4D version
    R14 Studio
    OS
    OSX 10.8.4
    Messages
    3 715

    Question Juste une question :

    Juste une question :

    Ça participe un peu de la question de base, mais c'est un poil différent, quand je modélise un gros truc comme en ce moment, je ne modélise pas toujours mes nouvelles pièces sur un nouveau fichier avant d'importer dans mon document principal, mais je modélise parfois in situ.

    Mon problème est alors le suivant : Chaque nouvelle primitive que je créé se retrouve au point 0,0,0 (normal jusque là !) je dois alors lui coller les valeurs X, Y et Z de la pièce la plus proche pour l'amener au plus près de l'endroit où je vais en avoir besoin.

    Ma question : Est-ce qu'il existe une fonction dans C4D, ou un truc quelconque, ou un plug-in, que gros bêta que je suis, je ne connais pas, pour copier / coller instantanément ces 3 valeurs d'un objet sur un autre, autre que le fastidieux copier / coller manuel valeur par valeur que je me coltine à chaque fois ?
    • Mon très vieux site : http://frapatsai.free.fr
    • Mon WIP : Robotiquement vôtre / Roberta : http://frenchcinema4d.fr/showthread....eus-in-Machina
    • Mon WIP : Curiosity on Mars : http://frenchcinema4d.fr/showthread....=1#post1013768

  14. #14
    Pilier Avatar de sansalvador
    Date d'inscription
    décembre 2012
    C4D version
    R13 Studio
    OS
    windows 7 ultimate 64
    Messages
    1 744
    Ma question : Est-ce qu'il existe une fonction dans C4D, ou un truc quelconque, ou un plug-in, que gros bêta que je suis, je ne connais pas, pour copier / coller instantanément ces 3 valeurs d'un objet sur un autre, autre que le fastidieux copier / coller manuel valeur par valeur que je me coltine à chaque fois ?
    Alors moi je travaille en mode "monde" , lorsque j'ajoute une primitive , je la mets en enfant de l'objet aux coordonnées désirées , je passe en mode "objet réel" et je mets les coordonnées XYZ à 0 , ce qui est très rapide en utilisant la touche "Tab" , la primitive vient alors se placer sur le même axe que l'objet , il ne me reste plus qu'à ôter la primitive mise en enfant et de repasser en mode "monde" , cela évite les copier/coller que tu fais.
    Quant à l'éventuel plugin , aucune idée

  15. #15
    Vieux Croûton Avatar de Sir Gong
    Date d'inscription
    juillet 2002
    C4D version
    R19 Studio
    OS
    10.13.4 High Sierra
    Messages
    10 353
    Billets dans le blog
    2
    Sérieux ?

    Et la fonction "transférer" c'est du mou de veau ? ©PP
    Cliquez sur l'image pour la voir en taille réelle 

Nom : 		Capture d’écran 2015-02-17 à 10.29.57.jpg 
Affichages :	61 
Taille :		10,0 Ko 
ID : 			14240
    (Outils > réorganiser les objets > transférer) à docker dans ton interface
    ÷ R19 Studio ÷ cacahuètes ÷

  16. #16
    Pilier Avatar de sansalvador
    Date d'inscription
    décembre 2012
    C4D version
    R13 Studio
    OS
    windows 7 ultimate 64
    Messages
    1 744
    ah bin , je ne connaissais pas non plus^^....comme on dit "l'imbécile ne le reste que 5 mn s'il pose sa question mais le reste toute sa vie s'il ne dit rien" ...me voilà donc moins gourde grâce à toi Sir Gong ....qui a dit " oui mais il te reste encore un long chemin "?

  17. #17
    Vieux Croûton Avatar de Sir Gong
    Date d'inscription
    juillet 2002
    C4D version
    R19 Studio
    OS
    10.13.4 High Sierra
    Messages
    10 353
    Billets dans le blog
    2
    Pour les scènes complexes, un autre petit truc qui peut servir :
    Dans les préférences générales > interface > Créer un nouvel objet au centre de la vue.

    Comme son nom l'indique, une fois cette option cochée, les nouveaux objets seront crées au centre de la vue au lieu de 0,0,0.
    Utile pour bosser une zone et que l'origine est hors champ.
    ÷ R19 Studio ÷ cacahuètes ÷

  18. #18
    Gourou Avatar de Itsmil
    Date d'inscription
    décembre 2006
    C4D version
    R16 Studio
    OS
    Win 7 pro 64bits
    Messages
    2 752
    Citation Envoyé par sansalvador Voir le message
    Alors moi je travaille en mode "monde" , lorsque j'ajoute une primitive , je la mets en enfant de l'objet aux coordonnées désirées , je passe en mode "objet réel" et je mets les coordonnées XYZ à 0 , ce qui est très rapide en utilisant la touche "Tab" , la primitive vient alors se placer sur le même axe que l'objet , il ne me reste plus qu'à ôter la primitive mise en enfant et de repasser en mode "monde" , cela évite les copier/coller que tu fais.
    Quant à l'éventuel plugin , aucune idée
    sinon dans la même veine, tu peux t'amuser a mettre ton objet en enfant et faire maillage/centrer les axes/centrer sur le parent. Il y a plusieurs chemins pour arriver au Rhum !

  19. #19
    Gourou Avatar de Realzeb
    Date d'inscription
    octobre 2003
    C4D version
    R14 Studio
    OS
    OSX 10.8.4
    Messages
    3 715
    Citation Envoyé par Sir Gong Voir le message
    Sérieux ?

    Et la fonction "transférer" c'est du mou de veau ? ©PP
    Cliquez sur l'image pour la voir en taille réelle 

Nom : 		Capture d’écran 2015-02-17 à 10.29.57.jpg 
Affichages :	61 
Taille :		10,0 Ko 
ID : 			14240
    (Outils > réorganiser les objets > transférer) à docker dans ton interface

    Aaaah ! je le savais, je le savais qu'il y avait un truc comme ça ! O-BLI-GÉ !
    Merci Sir Gong
    (mais tu sais il y a des tonnes des fonctions dont je ne fais que de me dire : "c'est quoi encore ce truc ? Bah on verra plus tard !")

    Efficace en effet, je me coucherai encore moins bête ce soir, cool !


    Citation Envoyé par sansalvador Voir le message
    Alors moi je travaille en mode "monde" , lorsque j'ajoute une primitive , je la mets en enfant de l'objet aux coordonnées désirées , je passe en mode "objet réel" et je mets les coordonnées XYZ à 0 , ce qui est très rapide en utilisant la touche "Tab" , la primitive vient alors se placer sur le même axe que l'objet , il ne me reste plus qu'à ôter la primitive mise en enfant et de repasser en mode "monde" , cela évite les copier/coller que tu fais.
    Quant à l'éventuel plugin , aucune idée

    Je ne connaissais pas, mais ça semble logique !
    Merci Sansa


    Citation Envoyé par Itsmil Voir le message
    sinon dans la même veine, tu peux t'amuser a mettre ton objet en enfant et faire maillage/centrer les axes/centrer sur le parent. Il y a plusieurs chemins pour arriver au Rhum !

    J'en use et j'en abuse aussi dans pas mal de cas !


    Merci les copains et copine !

    Plus qu'à tester le mou de veau !
    Dernière modification par Realzeb ; 17/02/2015 à 15h15.
    • Mon très vieux site : http://frapatsai.free.fr
    • Mon WIP : Robotiquement vôtre / Roberta : http://frenchcinema4d.fr/showthread....eus-in-Machina
    • Mon WIP : Curiosity on Mars : http://frenchcinema4d.fr/showthread....=1#post1013768

  20. #20
    Pilier Avatar de paspas
    Date d'inscription
    février 2004
    Messages
    990
    hello

    Citation Envoyé par César Vonc Voir le message
    C'est dommage pour User4D qui aurait pu apprendre quelques notions tant qu'il avait encore un intérêt pour le codage.

    On se retrouve de nouveau seuls ici.
    c 'est a dire que vous été trop rapide et trop fort pour moi du coup je ferme ma g.....

    pour répondre a Realzeb tu as aussi l objet "grille de construction " tu les rend visible ou non pour les rendre actives

    C4D te créera tj ton nouvelle objet au centre de cette nouvelle grille et orienté comme les axe de cette grille ,
    tu peut avoir plusieurs grilles par défaut il prend celle la plus haute dans la hiérarchie si tu ne joue pas avec la visibilité de la grille, la grille du monde est la plus basse de la hiérarchie

Discussions similaires

  1. Extraire une sélection de géométrie
    Par MisterWhite dans le forum Nouveaux membres
    Réponses: 3
    Dernier message: 02/12/2010, 16h23
  2. Réponses: 4
    Dernier message: 12/03/2010, 10h53
  3. Extraire une valeur d'un déformateur
    Par walien dans le forum MoGraph
    Réponses: 14
    Dernier message: 21/12/2007, 12h22
  4. Extraire une matière en jpeg
    Par Sickman dans le forum Nouveaux membres
    Réponses: 24
    Dernier message: 17/03/2007, 11h28
  5. Extraire et attribuer des valeurs aux ressorts
    Par PRot158 dans le forum Simulations
    Réponses: 2
    Dernier message: 17/03/2004, 18h52

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
  •  
Mediaworks - Logiciels 3D | Design Internet - Creation site internet