Boutique Cinema 4D
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 30 sur 37

Discussion: Créer un filtre d'exportation

  1. #1
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483

    Créer un filtre d'exportation

    Bonjour,


    Je souhaiterais créer un filtre d'exportation vers le format DOF pour le jeu Racer dont la structure est détaillée ici : http://www.racer.nl/dof.htm

    Cependant, vu que je ne suis pas encore à l'aise en binaire, j'aimerais commencer par exporter un petit fichier texte regroupant les paramètres des matériaux (fichier .shd pour Racer).


    Peut-on créer ce filtre en Python ou forcément en C++ ?

  2. #2
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    En python, il y a la fonction c4d.plugins.SceneSaverData qui correspond à la fonction pour sauvegarder ses propres formats de fichier. Donc j'imagines qu'il est possible de le faire en python, si tout a été implémenté.

    Il n'y a pas d'exemple en python à ma connaissance, mais il y en a dans le répertoire plugins cinema4DSDK pour le C++

  3. #3
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Si jamais va voir du côté de la bibliothèque struct pour la lecture et l'écriture en python des fichiers binaires.

    Pour ce qui est du plugin dans les règles de l'art, c'est probablement avec la classe c4d.plugins.SceneSaverData comme déjà dit par Val

  4. #4
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    D'accord, peut-on créer ce filtre d'exportation avec un script Python ou faut il faire un module à part comme en C++ ? Mes connaissances se limitent à du script COFFEE.

    Ou bien est-ce que script et module Python signifient la même chose ? J'ai l'impression qu'ils sont confondus, lorsque je recherche sur la toile comment créer un module Python pour C4d.


    Si créer un module Python est aussi complexe qu'en C++, ne vaut-il pas mieux utiliser le C++ d'office, qui a forcément toutes les fonctionnalités ?

  5. #5
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    D'accord, peut-on créer ce filtre d'exportation avec un script Python ou faut il faire un module à part comme en C++ ?
    Ben justement en python tu as le choix, si tu veux un module d'exportation comme ceux qui existent déjà (3ds,dwg,obj etc...) avec réglages divers dans les préférences générales et tout et tout, il faut passer par un plugin, c 'est à dire en gros que tu vas créer une classe qui hérite de c4d.plugins.SceneSaverData.

    Sinon tu peux très bien passer par un script, donc taper ton code directement dans le gestionnaire de script qui générera ton fichier binaire.
    Ou bien est-ce que script et module Python signifient la même chose ? J'ai l'impression qu'ils sont confondus, lorsque je recherche sur la toile comment créer un module Python pour C4d.
    Regarde les exemples fournis avec la doc python (y en a pas pour un module d'export, mais comme l'a dit Val il y en a un pour le c++, tu peux largement t'en inspirer en python, le principe sera le même

    Si créer un module Python est aussi complexe qu'en C++, ne vaut-il pas mieux utiliser le C++ d'office, qui a forcément toutes les fonctionnalités ?
    vaste débat ... L'avantage du python c'est justement de pouvoir faire à la fois rapidement un petit script pour te dépanner, et de pouvoir également faire des plugins plus complexes. En gros on a les avantages du COFFEE et du c++ dans un seul langage.

    Pour moi le python est également plus "intuitif" et plus compact, tu économises pas mal de ligne de code. Par contre cela a des défauts on peut plus facilement faire des conneries, surtout au niveau des variables non déclarées et non typées.

    Après cela va dépendre aussi des autre softs que tu utilises, le python je le retrouve dans Vue, ArcMap, Open office ...

    Pour ce qui est des fonctions/classes qui manquent, il n'y en a plus beaucoup, et cela va s'améliorer à chaque version.

    L'inconvénient du python, c'est également qu'il sera un peu plus lent.

    Après les bibliothèques externes à disposition peuvent également jouer, et là je ne pourrai pas te dire cela dépend de tes besoins, mais on en trouve beaucoup dans les deux camps

    En résumé, je dirais que si ton but c'est de devenir un programmeur quasiment pro qui vit de ses plugins ->C++
    Si c'est comme moi pour dépanner vite créer une petite fonction que tu n'as pas sous la main, un petit plug de temps en temps, bref programmeur du dimanche -> Python

  6. #6
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Oui, je vais juste faire un petit outil qui me facilitera la tâche pour exporter vers ce jeu comme je fais quelques scripts pour me facilter la modélisation en Coffee, de la prog de dimanche comme tu dis.

    Je vais tenter le coup avec un module Python !


    Je n'ai encore jamais vraiment touché à ce langage, faut dire qu'il est apparu dans C4d juste au moment où je commençais à bien comprendre le COFFEE, mais bon, faut bien commencer un jour.


    J'ai regardé à droite à gauche comment créer un module, donc je créé mon fichier .pyp, je le place dans le dossier plugins de C4D :


    Code:
    import c4d
    from c4d import plugins, gui
    
    MODULE_ID = 1000002
    
    class ExporteurDof(c4d.plugins.SceneSaverData):
        gui.MessageDialog('Essai 2.')
    
    if __name__=='__main__':
        c4d.plugins.RegisterSceneSaverPlugin(MODULE_ID, "Racer DOF (*.dof)", ExporteurDof(), 0, "Essai", "dof", __res__)
    Et là, trois choses :

    - En lançant C4D ou en cliquant sur « Recharger les modules Python », ma fonction ExporteurDof s'exécute d'emblée car mon message d'essai s'affiche à l'écran.
    - Le message d'erreur « TypeError: You can just reload already registered plugins » apparaît dans la console.
    - Et mon filtre n'apparaît pas dans la liste Fichier > Exporter.


    J'ai l'impression que le numéro d'identifiant du module est la cause de ces problèmes... j'ai beau le changer, mais les erreurs persistent.
    Les identifiants d'essais sont pourtant bien 100000x ?
    Dernière modification par César Vonc ; 12/01/2012 à 19h40.

  7. #7
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    En fait je viens de voir dans la doc qu'il y a un exemple dans la classe c4d.plugins.SceneSaverData : Py IES-Meta à cliquer en haut sous "see also"". (il est même installé chez moi mais je me souviens pas si c'est moi ou si c'est d'origine)

    Pour ce qui est du numéro tu as meilleur temps d'en demander un sur plugin cafe.

  8. #8
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Ah ça y est j'ai compris !

    Il y a bel et bien un exemple d'utilisation de c4d.plugins.SceneSaverDatadans la doc de Python : Py-IESMeta.
    Édition : On semble l'avoir vu en même temps, Oli_d !

    Donc il y avait plus d'une erreur :


    Le dernier argument de ResdisterSceneSaverPlugin semble être facultatif, j'ai tenté de l'utiliser sans savoir mais je n'ai pas compris son utilité.

    L'argument reste légèrement mystérieux, est-ce le nom du dossier res sans « res » ?

    Si ma fonction s'exécutait d'emblée c'est parce qu'elle était nue dans ma classe, il fallait la mettre dans une fonction def chose():.


    Visiblement il vaut mieux créer un nouveau dossier dans le dossier plugins, y mettre son fichier .pyp, créer un dossier res contenant un fichier c4d_symbols.h ainsi qu'un dossier strings_fr contenant c4d_strings.str.

    Le fichier c4d_symbols.h semble initier des choses, on dirait des identifiants pour les éventuels menus du module, sous la forme enum { variable = numéro }.

    Quant au fichier c4d_strings.str, il semble contenir la description des éventuels menus du module en fonction de la langue définie par le suffixe du dossier strings_fr, sous la forme STRINGTABLE { variable "Description" }


    Voilà ce que j'en ai déduit, je peux me tromper bien sûr, qu'un spécialiste me corrige.


    Le code semble mieux tenir la route à présent :

    Code:
    import os
    import c4d
    from c4d import plugins, gui
    
    MODULE_ID = 1000002
    
    class ExporteurDof(plugins.SceneSaverData):
        def __init__(self):
            gui.MessageDialog('Essai 3.')
    
    if __name__=='__main__':
        plugins.RegisterSceneSaverPlugin(id=MODULE_ID, str="Racer DOF (*.dof)", g=ExporteurDof, info=0, description="", suffix="dof")
    Le filtre est désormais visible dans le menu Fichier > Exporter !


    Je continue ma prospection sous vos yeux ébahis.
    Dernière modification par César Vonc ; 12/01/2012 à 22h41.

  9. #9
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Hmm avant de continuer, quelqu'un peut-il me dire si le module Py-IESMeta de la doc de Python fonctionne chez lui ?

    J'ai le message d'erreur : « Impossible d'enregistrer le fichier [...] (le fichier est peut être protégé en écriture) » lorsque je tente d'exporter.

    Pour ceux qui voudraient faire l'essai mais qui n'ont pas de lumières IES sous la main, des gratuites sont dispos ici.


    Édition : le problème semble être lié au fait qu'un des dossiers du répertoire d'enregistrement du fichier à exporter comporte un caractère spécial (une lettre accentuée). Quelqu'un peut-il confirmer ?
    Ça marche chez moi si j'exporte dans D:\Cesar\ et plante dans D:\César\
    Dernière modification par César Vonc ; 12/01/2012 à 23h40.

  10. #10
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    sur mac OSX ça passe, même avec les accents (ce que j'évite comme la peste en général)

  11. #11
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Étrange, j'espère que ça ne vient pas de chez moi.

    En attendant je poursuis mon module, j'arrive à créer un fichier texte en me basant sur l'exemple se la doc :


    Code:
    import os
    import c4d
    from c4d import plugins, documents, utils, gui
    
    MODULE_ID = 1000002
    
    class ExporteurDof(plugins.SceneSaverData):
        
        def Save(self, node, nom, doc, filterflags):
            
            def ecriture(doc, nom):
                try:
                    f = open(nom, "w")
                except IOError, e:
                    return c4d.FILEERROR_OPEN
                
                f.write("DOF1")
                
                try:
                    f.close()
                except IOError, e:
                    return c4d.FILEERROR_CLOSE
                
                return c4d.FILEERROR_NONE
            
            statut = ecriture(doc, nom)
            return statut
        
    if __name__=='__main__':
        plugins.RegisterSceneSaverPlugin(id=MODULE_ID, str="Racer DOF (*.dof)", g=ExporteurDof, info=0, description="", suffix="dof")

    Par contre, je sèche complètement pour écrire en binaire.
    Comment, par exemple, ajouter un entier 32 bits non signé après DOF1 ?

    J'ai essayé f.WriteLong(monentier) mais je n'ai eu que des erreurs.

  12. #12
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Il faut que tu transformes ton nombre en chaine avec la fonction str(nbre)

    ça c'est pour un fichier texte, pour la lecture/écriture d'un fichier binaire à l'aide de la bibliothèque struct un petit exemple :

    Code PHP:
    import c4d
    import struct

    def ecrire
    ():
        
    open('test.bin','w')
        
    f.write(struct.pack('<d',1234.56789))
        
    f.close()
        
    def lire():
        
    open('test.bin','r')
        print 
    struct.unpack('<d',f.read(8))
        
    f.close()

    if 
    __name__=='__main__':
        
    ecrire()
        
    lire() 
    ici j'écris un double ('d') en byte order Little endian ('<').
    pour lire on utilise read avec le nombre de byte correspondant (8 pour un double, voir tableau dans la doc)

    Donc si tu veux un entier non-signé tu remplacera 'd' par 'I' et à la lecture tu liras 4bytes et si tu veux un order byte spécifique tu rajoute le <ou> (voir les différents tableaux dans la doc struct):
    Code PHP:
    import c4d
    import struct

    def ecrire
    ():
        
    open('test.bin','w')
        
    f.write(struct.pack('I',123456))
        
    f.close()
        
    def lire():
        
    open('test.bin','r')
        print 
    struct.unpack('I',f.read(4))
        
    f.close()

    if 
    __name__=='__main__':
        
    ecrire()
        
    lire() 
    Après tu peux même "packer" plusieurs variables même de différents types à la suite (voir aussi exemples dans doc) : struct.pack('Id',123456,98.4567)
    Dernière modification par oli_d ; 14/01/2012 à 18h18.

  13. #13
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Parfait, toujours aussi clair, Oli_d !

    D'après la structure du format en question, l'ordre des octet est de type petit-boutiste, donc <I pour les entiers non signés.


    J'ai en revanche un petit soucis pour écrire un entier 16 bits non signé (10), je fais : whrite(struct.pack('<H', 10)), mais j'obtiens 0D0A 00 en hexa, au lieu de 0A00.

    Pourtant, lorsque j'écris 11 : whrite(struct.pack('<H', 11)), j'obtiens bien 0B00. Comment cela se fait-il ?


    Cet entier représente la longueur d'une chaîne de caractère, donc peut-être y a-t-il un autre moyen de l'écrire ?


    Autre chose, peut-on mélanger write("texte") et whrite(struct.pack()) ? Les chaînes de caractère sont écrites en clair dans ce format, donc le fichier reste bon en hexa, mais est-ce propre pour autant ?
    Dernière modification par César Vonc ; 14/01/2012 à 21h59.

  14. #14
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    J'ai remarqué que cette anomalie concerne les valeurs précédant 0A, en hexa :

    Décimal : Entier 16 bits en héxadécimal
    01 : 0100
    02 : 0200
    03 : 0300
    04 : 0400
    05 : 0500
    06 : 0600
    07 : 0700
    08 : 0800
    09 : 0900
    10 : 0D0A00
    11 : 0B00
    12 : 0C00
    13 : 0D00
    14 : 0E00
    15 : 0F00
    16 : 1000
    17 : 1100
    18 : 1200
    19 : 1300
    20 : 1400


    De même pour :

    266 : 0D0A01
    522 :
    0D0A02
    778 :
    0D0A03
    etc.

    Je ne comprends vraiment pas ce que vient foutre ce 0D (13). Et pourtant, à la lecture, C4d lit bien 10 pour 0D0A00.

    Mais du coup, si mon fichier contient l'entier 2573, soit 0D0A, C4d plante à la lecture :
    struct.unpack('H', f.read(2))
    « unpack requires a string argument of lengh 2 », comme s'il ne voyait pas 0D



    Je vois aussi que 0D correspond au retour chariot (CR) d'un texte, donc peut-être que C4d interprête le fichier binaire comme un fichier texte et ignore ce caractère...


    Si quelqu'un a une explication ou une solution, je suis preneur, car ce soucis bloque complètement mon code.
    Dernière modification par César Vonc ; 17/01/2012 à 11h56.

  15. #15
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Tu es sûr que c'est pas ton lecteur hexadecimal qui déconne, car sur mon mac avec HexEdit je n'ai pas ce problème ...

  16. #16
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    On va vérifier. Ci-joint se trouve le fichier dix.bin généré avec ce script :

    Code:
    import c4d
    import struct
    
    def ecrire():
        f = open('dix.bin','w')
        f.write(struct.pack('H', 10))
        f.close()
    
    if __name__=='__main__':
        ecrire()
    J'utilise Hex Workshop qui m'affiche toujours 0D0A00.


    Peut-être est-ce dû au fait que tu sois sur Mac, oui.


    Édition : J'apprends que 0D et 0A caractérisent respectivement un retour chariot et un saut de ligne (CR et LF), qui sont utilisés conjointement, sauf sur les mac qui n'utilisent que CR, ce qui expliquerait pourquoi tu n'as pas ce problème.
    http://fr.wikipedia.org/wiki/Fin_de_ligne

    Si tel est le cas, cela reste un défaut de C4d, peut-on le signaler ?
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip dix.zip (151 octets, 3 affichages)
    Dernière modification par César Vonc ; 17/01/2012 à 17h47.

  17. #17
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Je confirme, sur ton fichier j'ai bien 0D0A00 alors qu'avec ton code ci-dessus sur mac j'obtiens bien 0A00 (voir fichier en pj). Cela m'étonne que cela soit dû à c4d mais plutôt à python, essaie peut-être de poser la question sur PluginCafe ...

    Ou teste peut-être sur le shell python sur ton PC pour voir si le résultat est le même
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip dix.zip (160 octets, 2 affichages)

  18. #18
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Merde, je viens d'essayer avec le Python 2.7.2 que j'avais d'installé, sans passer par C4d, et le problème est toujours là...


    Pour ceux qui ont Python et veulent vérifier, il suffit de copier le code de mon précédent message, de virer import c4d, d'enregistrer au format .py et de l'executer avec python.exe. Le fichier dix.bin devrait apparaître au même endroit que le fichier .py.


    Je vais faire un tour sur le forum de Python, ça m'étonnerait que ce problème soit passé inaperçu (en espérant que la solution ne sera pas de passer au C++...).



    Édition : Ah, putain ! J'ai compris...

    Il faut lire et écrire en précisant le mode binaire, le mode texte étant par défaut, soit rajouter « b » à côté du mode d'écriture :

    Code:
    import c4d
    import struct
    
    def ecrire():
        f = open('dix.bin','wb')
        f.write(struct.pack('H', 10))
        f.close()
    
    if __name__=='__main__':
        ecrire()
    Et là, tout fonctionne à merveille !


    J'avoue avoir eu une sueur froide pendant un bref instant.

  19. #19
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    ha ben je crois qu'on s'est tous fait avoir ^^
    merci pour le retour.

    (oui je suivais la conversation sans rien comprendre)

  20. #20
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    "Une seule lettre vous manque et tout est dépeuplé" Lamartine

    Autant pour moi, je n'avais jamais vu ce petit "b"

    Bravo pour la trouvaille, c'était tordu. C'est vraiment les joies de la programmation, on peut de temps en temps perdre un temps fou pour un petit détail comme ça.

  21. #21
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Je suis content, mon filtre marche plutôt bien, je cherche maintenant à le peaufiner.


    Dans une propriété Texture, lorsque le type de projection n'est pas UVW, j'utilise la fonction :
    CallCommand(12235) # Générer des coordonnées UVW
    après avoir précédemment sélectionné la propriété Texture en question avec SetActiveTag(), mais l'opération s'exécute sur le document actif, et non sur la copie invisible sur laquelle j'applique toutes les modifications pour la conversion (triangulation des polygones, conversion en objets éditables, etc.)


    Donc ma question est : comment appliquer un CallCommand() sur un document précis ?
    J'ai essayé avec SendModelingCommand(), comme j'avais fait pour les autres, mais je n'arrive pas à m'en servir correctement vu que la commande s'applique sur une propriété et non un objet.
    Une idée ?
    Dernière modification par César Vonc ; 21/01/2012 à 11h51.

  22. #22
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252
    Plutôt que de générer des coordonnées UVW, pourquoi ne pas tout simplement ajouter une propriété "texture adaptative" sur ton objet, cette propriété "colle" la texture au maillage (comme une projection UVW) avec l'avantage de conserver le tag de texture conservant une projection autre que UVW (ex: planaire, cubique, cylindrique.)

    et pour la programmation ça simplifie les choses, une fois que l'objet et sa texture sont inséré dans la projet, on a juste à ajouter un tag "texture adaptative" et ça y est.

  23. #23
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Hmm, je ne dois pas bien m'en servir, car lorsque j'ajoute une propriété Texture adaptative à un objet qui a : une propriété UVW, et une propriété Texture dont la projection est de type sphérique, par exemple ; lorsque je récupère les coordonnées de la propriété UVW, elle restent les mêmes qu'avant l'ajout de la texture adaptative.

    Donc je récupère toujours le dépliage UVW de base et non le sphérique.

  24. #24
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252
    c'est normal que tu récupère les mêmes UVW qu'à l'origine, le tag "texture adaptative" ne génère pas des coordonnées UVW et ne les modifie pas si elles existent.

    Ce tag est totalement dissocié des coordonnées UVW de l'objet, même si il produit par contre le même effet, à savoir coller la texture au maillage quand celui-ci se déforme.

    cette propriété est une alternative à l'UVWn elle a comme avantage de pouvoir garder une projection différente qu'UVW, ce qui permet donc, quand la texture est collée au maillage, de pouvoir, à tout moment, déplacer/tourner/mettre à l'échelle la texture qui est restée en projection "sphérique/cubique/planaire, etc...

    donc ici, même si tu supprimes le tag UVW de ton objet, le tag "texture adaptative" collera quand même la texture sur le maillage.
    ce tag est aussi utilisable sur des objet non-polygonaux (primitives, objets Nurbs, etc...), c'est en cela qu'il est interessant par rapport à la projection UVW qui oblige de convertir les objets en polygonal...

    A toi de voir si tu veux absolument rester sur un projection UVW + tag UVW, ou bien passer par une projection autre + tag "texture adaptative"...

  25. #25
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    D'accord, je comprends mieux.

    Le but ici est de récupérer les coordonnées UV pour les écrire ensuite dans mon fichier exporté, donc je suis un peu obligé d'avoir une propriété UVW.
    À moins qu'on ne puisse récupérer celles de la propriété Texture adaptative ?
    En tout cas textureadaptative.GetSlow(0) ne marche pas.

  26. #26
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Citation Envoyé par César Vonc Voir le message
    Donc ma question est : comment appliquer un CallCommand() sur un document précis ?
    Essaie de rendre le document actif par c4d.documents.SetActiveDocument(doc) avant de lancer la commande.

  27. #27
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252
    Citation Envoyé par César Vonc Voir le message
    D'accord, je comprends mieux.

    Le but ici est de récupérer les coordonnées UV pour les écrire ensuite dans mon fichier exporté, donc je suis un peu obligé d'avoir une propriété UVW.
    À moins qu'on ne puisse récupérer celles de la propriété Texture adaptative ?
    En tout cas textureadaptative.GetSlow(0) ne marche pas.

    Ah ok j'avais pas capté que c'etait pour récupérer les données de projection et les exporter, comme un imbécile je m'etais mis en tête que c'etait pour un import de fichier et non un export, alors que c'est pourtant bien mentionné dans le titre de ton sujet.

    mea culpa !

  28. #28
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Pas de soucis, Tengaal, j'aurais au moins appris l'utilité de la texture adaptative. ^^


    Ah oui, bien vu, Oli_d.

    Je précise qu'il faut pas oublier de redéfinir l'ancien document une fois l'export terminé et de fermer le clone avec KillDocument(), sans quoi on se retrouve avec une sorte de document impossible à éditer, avec tous les menus grisés, qui rend c4d très instable.




    Pour ceux qui chercheraient à faire une boîte de dialogue qui s'ouvre avant l'exportation, je propose ceci :

    Code PHP:
    class Dialogue(gui.GeDialog):
        
    def CreateLayout(self):
            
    self.SetTitle("Paramètres d'exportation")
            
    self.AddStaticText(0c4d.BFH_CENTER00"Essai"c4d.BORDER_NONE)
            return 
    True

    class ExporteurDof(plugins.SceneSaverData):
        
    def Save(selfnodenamedocfilterflags):
            
    self.dial Dialogue()
            
    self.dial.Open(c4d.DLG_TYPE_MODALMODULE_ID, -1, -1)

    if 
    __name__=='__main__':
        
    plugins.RegisterSceneSaverPlugin(id=MODULE_IDstr="Racer DOF (*.dof)"g=ExporteurDofinfo=0description=""suffix="dof"
    Ça marche, n'empêche que la variable info de la classe RegisterSceneSaverPlugin m'intrigue.
    D'après la doc, celle-ci peut prendre la valeur :

    c4d.PLUGINFLAG_SCENEFILTER_DIALOGCONTROL

    Avec comme description, en anglais : « By default the scene loader/saver displays its own description dialog during importing/exporting of scene files. By setting this flag it will surpress this behaviour allowing to display another extended dialog for example. »

    Si je comprends bien, cela signifie qu'elle permet d'afficher une boîte de dialogue d'exportation ? Pourtant je ne vois pas de changement en appliquant cette valeur plutôt que 0. J'ai pu créer ma boîte de dialogue sans, donc je ne comprends pas bien son intérêt.
    Dernière modification par César Vonc ; 23/01/2012 à 23h58.

  29. #29
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Citation Envoyé par César Vonc Voir le message
    Si je comprends bien, cela signifie qu'elle permet d'afficher une boîte de dialogue d'exportation ? Pourtant je ne vois pas de changement en appliquant cette valeur plutôt que 0. J'ai pu créer ma boîte de dialogue sans, donc je ne comprends pas bien son intérêt.
    Sur ce coup là je ne peux pas t'aider, mais je comprend à peu près la même chose que toi, c'est à dire si on ne veut pas utiliser la boîte de dialogue d'importation par défaut il faut utiliser ce c4d.PLUGINFLAG_SCENEFILTER_DIALOGCONTROL. Donc si tu as testé et que cela ne change rien, je ne vois pas.
    A tout hasard, est-ce que cela n'agirait pas dans les paramètres d'importation dans les préférencesgénérales de c4d ??? (mais bon même avec mon faible niveau d'anglais, cela n'a pas l'air d'être ça ...)

  30. #30
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    excellent en tout cas merci pour le partage, j'apprends pleins de trucs ^^

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/03/2011, 10h55
  2. Comment créer un filtre
    Par César Vonc dans le forum Programmation
    Réponses: 2
    Dernier message: 13/04/2008, 17h27
  3. Filtre CPL ??
    Par L-op dans le forum Rendu
    Réponses: 3
    Dernier message: 28/12/2007, 15h23
  4. optimisation d'exportation
    Par Nathy dans le forum Général Cinema 4D
    Réponses: 2
    Dernier message: 17/07/2005, 15h46
  5. Filtre de sélection
    Par lenogre dans le forum Général Cinema 4D
    Réponses: 3
    Dernier message: 10/02/2005, 19h51

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