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

Discussion: python : accéder aux préférences de Cinema4D

  1. #1
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707

    python : accéder aux préférences de Cinema4D

    Bonjour,

    Est-ce qu'un pythonneur fou connaitrait la formule magique pour accéder aux préférence générales de Cinema4D. J'ai un script qui traite différents fichiers 3DS et j'aimerais mettre systématiquement les options d'importation en mètre.

    Est-ce possible ?

  2. #2
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    t'as essayé avec GetWorldContainerInstance() ?

  3. #3
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Merci Val, cela me sera aussi utile, mais pour mon problème de paramètres d'import 3Ds (je sais la question était mal posée ) je viens de voir le post de César 3 lignes plus bas (oui je sais j'aurais pu faire une recherche avant ). J'ai pas tout compris mais j'm'en va tester

  4. #4
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Bon ça m'a l'air bien pourri tout ça, si je lance le script qui me permet de retrouver les id des plugins d'import :
    Code:
    import c4d
    from c4d import plugins
     
    def main():
        plugs = plugins.FilterPluginList(c4d.PLUGINTYPE_SCENELOADER, True)
        for plug in plugs:
            print plug.GetName(), '-', plug.GetID()
     
    if __name__=='__main__':
        main()
    Je trouve l'id 1001037 pour 3ds

    Si je fouille les sous containers pour trouver le bon ...
    Code:
    import c4d
    
    
    def main():
        for i,data in c4d.GetWorldContainer():
            if type(data) == c4d.BaseContainer:
                for i2,val in data:
                    if i2 == 1001037:
                        print val[c4d.F3DSIMPORTFILTER_SCALE].GetUnitScale()
       
    if __name__=='__main__':
        main()
    J'obtiens bien un tuple (1.0, 3) qui correspond à l'échelle et à l'unité. Mais j'ai beau essayer de le modifier directement dans l'interface il me donne toujours la même chose. C'est exactement la même chose si je passe par GetWorldPluginData().

    Si c'est effectivement impossible de le modifier, j'aimerais au minimum pouvoir vérifier que l'unité d'import du format 3ds est bien en mètres ...

  5. #5
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    j'ai cherché la fonction c4d.plugins.GetWorldPluginData dans l'aide python
    dans la description il y a un script pour l'export d'alembic (une traduction de l'exemple en c++ que l'on retrouve dans le post de césar)

    par contre j'ai l'ID 1001038 pour le plug. je retrouves les data correspondant à l'export.
    le getUnitScale te donne les deux valeurs, réel et l'entier de la liste déroulante.

    En r16 ça a l'air de fonctionner en tout cas (ce qui était pas le cas en r15)

    Code:
    import c4d
    from c4d import documents, plugins, storage
    
    def main():
        
        plug = plugins.FindPlugin(1001038, c4d.PLUGINTYPE_SCENESAVER)
        if plug is None:
            return
    
        op = {}
        # Send MSG_RETRIEVEPRIVATEDATA to Alembic export plugin
        if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op):
            print op
            if "imexporter" not in op:
                return
            
            # BaseList2D object stored in "imexporter" key hold the settings
            abcExport = op["imexporter"]
            if abcExport is None:
                return
            print abcExport[c4d.F3DSEXPORTFILTER_SCALE].GetUnitScale()
            print abcExport[c4d.F3DSEXPORTFILTER_GROUP]
            
          
    if __name__=='__main__':
        main()

    edit :
    j'aurais bien poussé les tests un peu plus loin mais je reprends la prog là, j'ai peur de me froisser un muscle T.T
    Dernière modification par valkaari ; 25/11/2014 à 00h24.

  6. #6
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    le code, c'est comme le vélo, quand t'en fait pas pendant longtemps t'as mal au cul quand tu reprends.
    Je comprends pas trop la fonction pour merge le document.

    Bref ça fonctionnouille en r16. (j'ai pas dépassé le test du fichier 3DS avec uniquement un cube dedans sans autre info)

    (j'ai confondu pendant un moment le load et le export, donc un mauvais ID de plugin et tout et tout bref T.T)

    je passe par une variable intermédiaire pour utiliser la fonction SetUnitScale, directement ça fonctionne pas T.T

    Code:
    import c4d,os
    from c4d import documents, plugins, storage
    
    
    def main():
        # Get 3DS Import plugin, 1001037 is its ID
        plug = plugins.FindPlugin(1001037, c4d.PLUGINTYPE_SCENELOADER)
        if plug is None:
            return
    
    
        # Get a path to open the files
        filePath = storage.LoadDialog( title="Select Directory", flags=c4d.FILESELECT_DIRECTORY, force_suffix="abc")
        if filePath is None:
            return
        #
        
        
        op = {}
       
        if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op):
            if "imexporter" not in op:
                return
            
            # BaseList2D object stored in "imexporter" key hold the settings
            abcExport = op["imexporter"]
            if abcExport is None:
                return
            
            # Change Alembic export settings
            scale = abcExport[c4d.F3DSIMPORTFILTER_SCALE]
            scale.SetUnitScale(0.5,3)
           
            
            abcExport[c4d.F3DSIMPORTFILTER_SCALE] = scale
            abcExport[c4d.F3DSIMPORTFILTER_RENAMETEXTURES] = True
            abcExport[c4d.F3DSIMPORTFILTER_TEXTURESUFFIX] = "tata"
        
        dirList=os.listdir(filePath)
        for fname in dirList:
            if os.path.splitext(fname)[1] == '.3ds':
                if (c4d.documents.MergeDocument(doc, os.path.join(filePath, fname),c4d.SCENEFILTER_OBJECTS)):
                    continue
                else:
                    print "error while loading files fuck shit !!!"
                    break
                
        
        
        c4d.EventAdd()    
    
    
    
    
    if __name__=='__main__':
        main(
    Dernière modification par valkaari ; 25/11/2014 à 01h42.

  7. #7
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Merci, merci , merci, ça marche en r14, r 15 et r16. J'étais un peu fatigué (et énervé) et je n'ai pas pensé pouvoir utiliser Message ailleurs que dans un plugin (pourtant César montrait un exemple plus bas dans son post )

    C'est quand même un peu tordu toutes ces lignes de code pour pouvoir modifier un seul paramètre.

    Encore merci d'avoir pris le temps, t'as beau avoir mal au cul tu as encore un sacré coup de pédale ! Je te dois au moins une barrique de cervoise tiède ...
    Dernière modification par oli_d ; 25/11/2014 à 07h25.

  8. #8
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    cool

    tant qu'on y est je mets l'exemple de la doc comme je disais plus haut pour l'export de donnée

    Comme ça on a deux exemple pour l'export et l'import.
    (tu me dira c'est pas forcement le plus hard de passer de l'un à l'autre. bien que ...)


    Code:
    """
    Export Settings Example
    
    This example shows how to change an exporter settings.
    This works also for importers/scene loaders.
    """
    
    import c4d
    from c4d import documents, plugins, storage
    
    def main():
        # Get Alembic export plugin, 1028082 is its ID
        plug = plugins.FindPlugin(1028082, c4d.PLUGINTYPE_SCENESAVER)
        if plug is None:
            return
        
        # Get a path to save the exported file
        filePath = storage.LoadDialog(title="Save File for Alembic Export", flags=c4d.FILESELECT_SAVE, force_suffix="abc")
        if filePath is None:
            return
        
        op = {}
        # Send MSG_RETRIEVEPRIVATEDATA to Alembic export plugin
        if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op):
            print op
            if "imexporter" not in op:
                return
            
            # BaseList2D object stored in "imexporter" key hold the settings
            abcExport = op["imexporter"]
            if abcExport is None:
                return
            
            # Change Alembic export settings
            abcExport[c4d.ABCEXPORT_SELECTION_ONLY] = True
            abcExport[c4d.ABCEXPORT_PARTICLES] = True
            abcExport[c4d.ABCEXPORT_PARTICLE_GEOMETRY] = True
            
            # Finally export the document
            if documents.SaveDocument(doc, filePath, c4d.SAVEDOCUMENTFLAGS_DONTADDTORECENTLIST, 1028082):
                print "Document successfully exported to:"
                print filePath
            else:
                print "Export failed!"
    
    
    if __name__=='__main__':
        main()

  9. #9
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    C'est à devenir fou cette histoire, tout marchait bien sur mon mac avec OSX 10.9.4, je teste sur PC : marche pas. Je me dis c'est la faute à Bill Gates, je me remets sur un MAC avec OSX 10.6.8 marche pas non plus, sur r14,r15 (r16 tourne pas sur 10.6).

    Est-ce que quelqu'un pourrait confirmer qu ce n'est pas à cause de mon signe du zodiaque (gémeau ascendant balance) que tout foire. Coller ce bout de script dans le gestionnaire de script, éxécuter et ouvrir la console, si ça marque 'ok' c'est que ça devrait marcher et si ça marque "pas de data pour l'import 3Ds", c'est foireux.

    Code:
    import c4d
    
    
    def main():
        plug = c4d.plugins.FindPlugin(1001037, c4d.PLUGINTYPE_SCENELOADER)
        if plug is None:
            print "pas de module d'import 3DS"
            return
        op = {}
      
        if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op):
           
            import_data = op.get("imexporter",None)
            if not import_data:
                print "pas de data pour l'import 3Ds"
                return
           
            # Change 3DS import settings
            scale = import_data[c4d.F3DSIMPORTFILTER_SCALE]
            scale.SetUnitScale(1,c4d.DOCUMENT_UNIT_M)
            import_data[c4d.F3DSIMPORTFILTER_SCALE] = scale
            print 'ok'
           
           
    if __name__=='__main__':
        main()

  10. #10
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    En R16 sous Win 7, ça semble bien fonctionner !

    Par contre en R15 sous Win, ça foire, op est toujours vide, comme dans mes précédents essais de l'autre sujet.
    Dernière modification par César Vonc ; 26/11/2014 à 08h41.

  11. #11
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    ça m'étonnais que ça fonctionne sur les versions précédente


    sur osx 10.9.5
    R16.027 --> ok
    R15.064 --> ok
    R14.042 --> ok
    R13.061 --> pas de data, l'op reste vide


    windows 7 (j'ai profité de faire des mises à jours pour tester pleins de versions)
    14.014 --> pas de data
    14.041 --> ok
    14.042 --> ok

    13.058 --> pas de data
    13.061 --> pas de data
    12.043 --> me dit d'aller me faire mettre avec mon vieux truc !!!


    windows 10 :
    R16.027 --> ok


    on retrouve bien les résultats des tests de yann

    (j'ai pas de r15 sous windows moi tient ^^')

  12. #12
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Merci pour les tests, donc j'abandonne en attendant que mes étudiants aient la r16 ....

    Citation Envoyé par valkaari Voir le message
    on retrouve bien les résultats des tests de yann
    Je me sens un peu boulet, là ....

  13. #13
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Citation Envoyé par oli_d Voir le message
    Citation Envoyé par valkaari Voir le message
    on retrouve bien les résultats des tests de yann
    Merci pour les tests, donc j'abandonne en attendant que mes étudiants aient la r16 ....


    Je me sens un peu boulet, là ....
    les tests de yann et de césar

Discussions similaires

  1. accéder à un mesh déformé en Python ou Coffee ?
    Par clemz dans le forum Programmation
    Réponses: 3
    Dernier message: 25/08/2011, 09h02
  2. accéder à la couleur d'un clone ? ( en COFFEE )
    Par clemz dans le forum MoGraph
    Réponses: 2
    Dernier message: 23/11/2010, 19h40
  3. Réponses: 0
    Dernier message: 01/11/2010, 10h47
  4. difficulté à acceder au site de la FC4D
    Par woody1979 dans le forum Nouveaux membres
    Réponses: 9
    Dernier message: 17/01/2007, 09h44
  5. SVP laissez moi acceder sur votre site !!!
    Par publicitologue dans le forum Le site
    Réponses: 4
    Dernier message: 12/10/2006, 00h44

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