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

Discussion: Apprendre le Python

  1. #1
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8

    Apprendre le Python

    Salut la French.

    Bon, j'ai décidé de me lancer dans l'apprentissage du Python, et je peux vous dire que ça va pas être de la tarte, vu que mes compétences au niveau de la programmation sont proches du zéro absolu.
    J'ai commencé à éplucher la doc, et c'est pas gagné, j'y comprends pas grand-chose, aussi j'aurai besoin de quelques pistes pour me mettre le pied à l'étrier.

    Voici mon tout premier code, et j'en suis pas peu fier :

    Code PHP:
    import c4d
    mat 
    c4d.BaseMaterial(c4d.Mmaterial)
    doc.InsertMaterial(mat)
    c4d.EventAdd() 
    Je me sens comme à la création de ma première sphère réfléchissant un damier !

    Le but de la suite de l'exercice, c'est d'activer la transparence, de désactiver la couleur et de régler la réfraction à 1.5. Et déjà les choses se gâtent !
    Peut-être que le Material.SetChannelState me serait d'une quelconque utilité, mais je n'arrive pas à le positionner correctement ou à avoir la syntaxe correcte, en bref, je nage pas, je coule !

    Donc si de généreux codeurs pouvaient me tendre la main, ce serait bien cool !

  2. #2
    avant de vouloir utiliser l'api de c4d pour python, je ne peux que recommander d'apprendre au moins les bases de python. Des tutoriaux sont disponibles en nombre sur internet, tel que par exemple http://docs.python.org/tutorial/. C'est sans recommandation particuliere, je ne l'ai pas suivi mais c'est le tutorial du site officiel de python, donc il doit pas etre trop mal. Bon courage et bienvenu dans le monde de la programmation
    Le rendu, c'est juste de l'intégration numérique sur un espââââââce de dimension infinie...trivial quoi

  3. #3
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Merci, j'y jetterai un globe oculaire.

    En attendant, j'ai réussi à obtenir ce que je voulais, ayant enfin pigé le principe des ID :

    Code PHP:
    import c4d

    Mat 
    c4d.BaseMaterial(c4d.Mmaterial)
    Mat[c4d.MATERIAL_USE_TRANSPARENCY] = 1
    Mat
    [c4d.MATERIAL_USE_COLOR] = 0
    Mat
    [c4d.MATERIAL_TRANSPARENCY_REFRACTION] = 1.5
    doc
    .InsertMaterial(Mat)
    c4d.EventAdd() 
    C'est jouissif !

    Bon, ok, script créé, avec sa petite icône, ajouté dans l'interface, tout va bien. Maintenant, une petite question d'ordre esthétique : lorsque je survole l'icône, l'infobulle et le message d'aide utilisateur me disent : exécuter xxxxxxx.py. Comment mettre une petite description à la place ?

    Ouais, bon, je fais mon débutant de base, avec des questions con, mais c'est vraiment pas évident au départ, on ne sait pas où chercher et surtout QUOI chercher ! Y'a pas un bac à sable pour les développeurs en herbe ?

  4. #4
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Salut Seb,

    Je ne sais pas si c'est possible de changer la BubbleHelp d'un script (je n'y connais pas grand chose aux scripts), mais tu peux le faire en transformant ton script en plugin comme ceci :
    Code PHP:
    import os
    import c4d
    from c4d import plugins

    # be sure to use a unique ID obtained from www.plugincafe.com
    PLUGIN_ID 1000007

    class MyScript(c4d.plugins.CommandData):

        
    def Execute(selfdoc):
            
    mat c4d.BaseMaterial(c4d.Mmaterial
            
    mat[c4d.MATERIAL_USE_TRANSPARENCY] = True 
            mat
    [c4d.MATERIAL_USE_COLOR] = False 
            mat
    [c4d.MATERIAL_TRANSPARENCY_REFRACTION] = 1.5 
            doc
    .InsertMaterial(mat
            
    c4d.EventAdd(c4d.EVENT_0)
            return 
    True

    if __name__ == "__main__":
        
    bmp c4d.bitmaps.BaseBitmap()
        
    dirfile os.path.split(__file__)
        
    fn os.path.join(dir"res""icon.tif")
        
    bmp.InitWith(fn)
        
    c4d.plugins.RegisterCommandPlugin(id=PLUGIN_IDstr="MyScript",
            
    info=0icon=bmphelp="Create a preset Material"dat=MyScript()) 
    Une seule petite critique sur ton code : évite de nommer tes variables avec une majuscule au début c'est réservé aux noms de classes.
    Un petit article qui a l'air pas mal : http://all4dev.libre-entreprise.org/...taxe_en_python

    Bon courage.
    Dernière modification par xs_yann ; 09/06/2011 à 15h05.

  5. #5
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Merci pour ta réponse Yann. Pour le moment, j'en suis à l'étape du script, celle du plugin comporte quelques notions que je n'ai pas encore découvertes.

    Et comme je n'arrive à mémoriser que par l'exemple, peut-être aurais-tu la gentillesse de compléter mon explication de texte...

    Code PHP:
    import os 
    import c4d 
    from c4d import plugins 
    Ici on importe les libraries générales de C4D ainsi que celles liées aux plugins, j'ai bon ?

    Code PHP:
    # be sure to use a unique ID obtained from www.plugincafe.com 
    PLUGIN_ID 1000007 
    On renseigne l'ID du plugin, obtenue sur C4D Café. Les ID entre 1000000 et 1000010 sont réservées au développement.

    Code PHP:
    class MyScript(c4d.plugins.CommandData): 

        
    def Execute(selfdoc): 
    Là, je sèche, mais au pif, je dirais : exécuter le script dans le doc courant ? (MyScript, c'est le nom de la classe ou bien à remplacer par un nom perso ?)

    Bon, ensuite c'est mon script.

    Code PHP:
            return True 

    if __name__ == "__main__"
        
    bmp c4d.bitmaps.BaseBitmap() 
        
    dirfile os.path.split(__file__
        
    fn os.path.join(dir"res""icon.tif"
        
    bmp.InitWith(fn
        
    c4d.plugins.RegisterCommandPlugin(id=PLUGIN_IDstr="MyScript"
            
    info=0icon=bmphelp="Create a preset Material"dat=MyScript()) 
    Là, pareil, je pédale. J'y vois quand même la référence à l'icône (qui doit se trouver dans le répertoire res), la référence au plugin ID (j'imagine qu'on devra lui mettre l'ID obtenue sur C4D café), le type d'icône (?) ainsi que le texte d'infobulle. Après, pourquoi c'est agencé ainsi, et ce que ça signifie au final, j'en sais foutre rien. Mais je compte bien le découvrir.

    Je rappelle que je suis un total noob en programmation, tous langages confondus. Mes derniers programmes étaient en basic sur un Tandy MC-10 ou un tout petit peu plus récemment sur une Texas Instruments (bref, rien depuis le début des années 90, et encore, c'étaient vraiment des programmes ultra-basiques). J'ai donc tout à apprendre, mais ça a l'air vraiment passionnant.

    Edit : 'tain, je me sens comme un petit garçon qui veut tout savoir et qui pose des milliers de questions.

  6. #6
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Code PHP:
    import os 
    import c4d 
    from c4d import plugins 
    Citation Envoyé par Seb-bbl
    Ici on importe les libraries générales de C4D ainsi que celles liées aux plugins, j'ai bon ?
    Presque, le module os est un module Python (qui n'est pas propre à c4d) : http://docs.python.org/library/os.html
    Ensuite on importe le module c4d ; la ligne 'from c4d import plugins' permet d'importer le module c4d.plugins ce qui permet d'écrire plugins.toto au lieu de c4d.plugins.toto (d'ailleurs ce n'est pas utile pour le plugin que je t'ai présenté étant donné que j'ai écris c4d. avant à chaque fois )

    Code PHP:
    # be sure to use a unique ID obtained from www.plugincafe.com 
    PLUGIN_ID 1000007 
    Citation Envoyé par Seb-bbl
    On renseigne l'ID du plugin, obtenue sur C4D Café. Les ID entre 1000000 et 1000010 sont réservées au développement.
    Tout à fait.

    Code PHP:
    class MyScript(c4d.plugins.CommandData): 

        
    def Execute(selfdoc): 
    MyScript est le nom de ta classe de plugin, en général je l'appelle du même nom que mes plug (sauf que xsFooBar devient XSFooBar pour les mêmes raison évoquées dans mon post précédent).

    '(c4d.plugins.CommandData)' signifie que ta classe hérite de la classe CommandData, tu as dans la doc Python les méthodes découlant de cette classe que tu peux surcharger. (Les cours t'expliquerons mieux que moi ce que sont l'héritage et la surcharge (overriding) )

    L'idéal étant de trouver des exemples de plugins Python, comme ça tu peux voir ce qui est nécessaire au bon fonctionnement de tel ou tel type de plugin.

    Code PHP:
            return True 

    if __name__ == "__main__"
        
    bmp c4d.bitmaps.BaseBitmap() 
        
    dirfile os.path.split(__file__
        
    fn os.path.join(dir"res""icon.tif"
        
    bmp.InitWith(fn
        
    c4d.plugins.RegisterCommandPlugin(id=PLUGIN_IDstr="MyScript"
            
    info=0icon=bmphelp="Create a preset Material"dat=MyScript()) 
    Je ne saurais pas exactement t'expliquer l'utilité du 'if __name__ == "__main__":', tu peux l'enlever, cela fonctionnera toujours. D'après ce que je sais cela est utile si tu veux réutiliser ton fichier en tant que module sans que ce code soit executé à l'import.

    Code PHP:
    dirfile os.path.split(__file__
    os.path.split(path)
    Split the pathname path into a pair, (head, tail) where tail is the last pathname component and head is everything leading up to that. The tail part will never contain a slash; if path ends in a slash, tail will be empty. If there is no slash in path, head will be empty. If path is empty, both head and tail are empty. Trailing slashes are stripped from head unless it is the root (one or more slashes only). In all cases, join(head, tail) returns a path to the same location as path (but the strings may differ).
    Tu récupères donc 'dir = /Applications/MAXON/Cinema 4D/plugins' et 'file = MyScript.pyp'

    Code PHP:
    fn os.path.join(dir"res""icon.tif"
    Tu peux donc récupérer le filename de ton icone qui sera dans le dossier res (au même niveau que ton fichier .pyp)

    Code PHP:
    c4d.plugins.RegisterCommandPlugin(id=PLUGIN_IDstr="MyScript",  
            
    info=0icon=bmphelp="Create a preset Material"dat=MyScript()) 
    C'est là que tu dis à c4d que ton plugin existe avec son id, son nom, les paramètres du plug (si tu veux le cacher dans le menu et autre, voir la doc), son icône, l'aide affichée dans la status bar et le tool tips, et une instance de ton plugin (que c4d va mémoriser et qui lui servira à intégrer ton plugin, si tu veux en savoir plus regarde du côté des Design Patterns).

    Si je n'ai pas été clair sur quelque chose, dis le moi j'essayerais de développer / reformuler.
    Il faut aussi que tu saches que je suis également débutant en Python (moins d'un an de pratique non régulière) donc je ne connais pas toutes les subtilités du langages.

  7. #7
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Un grand merci pour ces explications qui m'en apprennent déjà un peu plus. Reste à apprendre la langue. Le plus difficile étant la théorie (chose dont j'ai horreur, comme je l'ai dit, j'apprends mieux par l'exemple) et surtout le fait qu'il y ait des choses générales de python et d'autres spécifiques à C4D, du coup on sait pas trop où chercher. Mais ça va venir !

    Si vous connaissez des liens vers des tutos (avec des exemples concrets et commentés) je suis preneur. Allez, on va potasser tout ça !

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

    Je te conseillerais de commencer par les bases du python puis après quand tu commences à comprendre les boucles, les fonctions, les classes de regarder dans cette section les petits scripts qui trainent et de les décortiquer en parallèle avec la doc python. Dans certaines version de la doc (faut que je vérifie laquelle) il y a des exemples de plugins, de scripts et de scènes avec des générateurs ou des tags python.

    Pour les bases du python je te conseille vivement ces deux liens :



    • Si tu préfères les vidéos, "les Pythonneries" (avec une pointe d'humour pas désagréable)

  9. #9
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Je sens que je vais aimer le second lien.

    Sinon, une question me taraude : fondamentalement, quelle est la différence entre un script en un plugin ? Qu'est-ce qui les caractérise ? (oui, je sais, ça fait 2 questions).

  10. #10
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Là je me sens obligé de mettre à jour mon tuto, tu m'as déjà tellement appris de trucs avec les tiens qu'il faut que je te renvoie l'ascenseur.

    J'ai mis à jour jusqu'à Créer un objet dans c4d mais sans changer les captures d'écran (il y a plein de trucs que je ne ferai plus la même chose, comme la boucle while que j'utilise très peu je préfère de loin le for , mais bon le principe est là).

    Je pars demain pour quelques jours donc il faudra patienter pour la suite, mais bon entre les pythonneries, le livre de Swinnen et le reste tu as largement de quoi occuper tes prochaines nuits

  11. #11
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Citation Envoyé par xs_yann Voir le message
    Je ne saurais pas exactement t'expliquer l'utilité du 'if __name__ == "__main__":', tu peux l'enlever, cela fonctionnera toujours. D'après ce que je sais cela est utile si tu veux réutiliser ton fichier en tant que module sans que ce code soit executé à l'import.
    ha ben voilà un mystère pour moi de soulevé ^^

    voir le 6.1.1. Executing modules as scripts
    http://docs.python.org/tutorial/modules.html

  12. #12
    Squatteur Avatar de ksaa
    Date d'inscription
    janvier 2007
    C4D version
    R10.5
    Messages
    207
    Hello,
    cela fait quelques jours déjà que j'ai touché a Rien! Pas de c4d ni python >>> période de déménagement, mais je vais essayer d'apporter quelques réponses

    Pour ce qui est du 'if __name__ == "__main__":, c'est une façon de dire à python " OoHooo je veux exécuter ce module en tant que programme indépendant ... par exemple:
    J'importe un module toto.py contenant une méthode qui affiche le message " j'aime python " dans mon script coco.py
    J’écris :
    Code:
    import toto
    au début pour importer… rien de bien compliqué…
    Coco.py lui affiche le message " j’aime c4d "…. Maintenant si j'exécute coco.py j’aurai seulement " j’aime c4d ", par contre si j'integre 'if __name__ == "__main__": dans toto.py. J’aurai les deux messages .


    Citation Envoyé par Seb-bbl Voir le message
    Sinon, une question me taraude : fondamentalement, quelle est la différence entre un script en un plugin ? Qu'est-ce qui les caractérise ? (oui, je sais, ça fait 2 questions).

    Ben... je pense qu'au début c'est une question de choix ...
    Le corps du plugin reste le script lui-même... après.... admettons que je veuille partager ce que j'ai fait sans partager le code source pour autant ... dans ce cas le plugin est plus adapté, car je peux crypter mon code...
    Autre cas .... si par exemple j’ai une interface dans mon programme, mon interface sera en français, pour un utilisateur anglais ce n’est pas top, avec un plugin le changement de langue se fait automatiquement, à condition d'avoir réalisé la traduction >> à mettre dans des dossiers portants des noms du style strings_fr ou strings_US etc...

    Sinon niveau écriture, le plugin a besoin de deux ou trois choses par exemple un ID, un Type, et une class qui contient notre code

    Type >>> dépend de ce que fait le plugin, voir Register Methods
    La classe >>> son argument dépend du type choisi
    Y a surement d’autres différences plus "fondamentales", mais c’est tout ce qui me vient à l’esprit maintenant (à 4h du mat )…

    Bon courage
    Dernière modification par ksaa ; 10/06/2011 à 04h48.

  13. #13
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Merci !

    J'ai regardé la première vidéo des pythonneries, et au niveau de la méthode explicative, c'est exactement ce qu'il me faut (faut qu'on m'explique comme si j'avais 5 ans sinon je comprends rien).
    On va voir la suite. Et merci pour ces explications (mais je continuerai à vous emmerder avec mes questions de gros zéro !)

  14. #14
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Je suis à la recherche des valeurs acceptées en fonction de l'attribut choisi.

    Par exemple, pour :

    [c4d.GI_SETUP_DATA_IR_COUNT_METHOD]

    je sais que je peux entrer

    =c4d.GI_SETUP_COUNT_LOW

    mais ça, c'est parce qu'on me l'a dit.

    Je sais qu'en faisant un drag n'drop du paramètre dans l'éditeur, il se retrouve correctement écrit dans le code, mais où trouver les valeurs acceptées ? La doc python relative à C4D n'est pas exhaustive sur ce sujet (je n'ai par exemple pas trouvé les réglages relatifs à l'IG).

    Je suis persuadé que j'ai loupé quelque chose, mais si vous pouviez me dire quoi, je me coucherais moins c...

  15. #15
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Je te conseille de charger aussi la doc du C++, le python utilise les mêmes constantes et il y a plein de trucs qui ne sont pas encore dans la doc python.

    Dans le cas que tu cites, la constante n'est pas non plus dans la doc du c++ (je sais c'est pas simple) mais tu peux ruser en faisant une recherche du mot GI_SETUP_DATA_IR_INTERPOLATION_SMOOTHING dans le dossier Maxon et tu verras que dans ce cas il y a un fichier vpgisetup.h dans /Applications/MAXON/CINEMA 4D R12/modules/advanced render/advanced render/res/description et si tu ouvres ce fichier dans un éditeur de texte tu auras la liste de toutes les constantes.

    Mais le drag and drop est beaucoup plus simple ...
    Dernière modification par oli_d ; 15/06/2011 à 10h15.

  16. #16
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Salut,

    Je vois que oli_d a été plus rapide.

    Voici ma méthode, qui n'est pas loin de celle de oli_d : Je paste 'GI_SETUP_DATA_IR_COUNT_METHOD' dans le Spotlight et je tombe directement sur le fichier vpgisetup.res, je pense qu'il vaut mieux chercher dans le .res parce que les définitions sont groupées comme dans l'interface (alors qu'elle sont un peu dispersées dans le .h), voire dans le .str avec une recherche du nom affiché dans c4d (exemple : "Custom Sample Count").

  17. #17
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    héhé, ça, c'est bon quand tu es sur mac, qui a une indexation excellente, sur PC, tu peux te brosser pour qu'il te trouve efficacement quelque chose dans le contenu.

    Mais je comprends mieux où chercher, en fait, c'est relatif à chaque module. Merci beaucoup !

  18. #18
    Touriste
    Date d'inscription
    janvier 2011
    C4D version
    R18 Studio
    OS
    Windows 7 64bit
    Messages
    23

    Lightbulb

    salut,

    allez voir cet excellent tuto sur python pour c4d a http://www.smart-page.net/blog/2011/...for-cinema-4d/

    peit bonus:
    dans le script manager de python dans c4d ecrivez : help("modules") vous donne tous les modules python installes;
    help("c4d") vous donne l'arborescence des classes et des fonctions de python pour c4d (utiles pour creer fichier xml pour notepad++) mais aussi les elements data de cinema4d et des plugins.

    en souhaitant que ceci vous sera utile.

  19. #19
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Merci !

  20. #20
    Big Boss Avatar de luistappa
    Date d'inscription
    mars 2003
    C4D version
    R19 Studio
    OS
    Windows 10
    Messages
    5 648
    Citation Envoyé par Seb-bbl Voir le message
    Salut la French.

    Bon, j'ai décidé de me lancer dans l'apprentissage du Python, et je peux vous dire que ça va pas être de la tarte, vu que mes compétences au niveau de la programmation sont proches du zéro absolu.
    J'ai commencé à éplucher la doc, et c'est pas gagné, j'y comprends pas grand-chose, aussi j'aurai besoin de quelques pistes pour me mettre le pied à l'étrier.
    ...
    Voilà qui est courageux Seb.
    Bon je suis dans ton cas si ce n'est que j'ai programmé il y a longtemps en Basic et Pascal et que je pratique toujours un peu pour le boulot en Visual Basic dans Excel. mais comme tu le dis bien, pour le moment c'est obscure dans ma tête et oui je sens que ça va pas être de la tarte

    Donc je prends ce post en route et je vais suivre ta progression Seb en espérant que cela m'aidera à avancer moi aussi.
    Ce n'est pas parce que les choses sont difficiles que l'on n'ose pas, c'est parce que l'on ose pas quelles sont difficiles. I7 4700MQ 2.4/3.2Ghz 16GO + W10

  21. #21
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Oulà, chouette déterrage, Luis, ça fait un moment que j'ai pas touché à Python. Je porterais bien mon RockGen dessus, mais je manque de motivation !

  22. #22
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Salutations,

    Voilà, j'ai ce petit bout de code qui me pose souci :

    Code PHP:
    import c4d

    def main
    ():
        
    selec doc.GetActiveObject()
        if 
    selec :
            
    HyperNurbs=c4d.BaseObject(c4d.Osds)
            
    doc.InsertObject(HyperNurbs)
            
    selec.InsertUnder(HyperNurbs)
            
    c4d.EventAdd() 
            
    if 
    __name__=='__main__':
        
    main() 
    Lorsque j'applique le script, pas de souci, l'objet se retrouve bien dans un HN. Mais lorsque j'annule, mon objet disparaît et je me retrouve avec tout un tas de HN... Qu'est-ce que j'ai fait de travers ?

  23. #23
    Bonjour à vous tous et une chouette année,

    Pour ceux qui comme moi sont franchement nul en programmation,
    voici sur le site du zéro qui propose des cours en français sur Python :

    http://www.siteduzero.com/tutoriel-3...e-donnees.html
    Dernière modification par fabrice.sierra ; 09/01/2012 à 15h59.
    Le bœuf est lent, mais la terre est patiente.
    PHAB

  24. #24
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Lorsque tu programmes des actions, il faut aussi mettre en place le undo. Ce n'est pas logique par contre de se retrouver avec un tas d'HN.

    Par exemple :
    tu crées un cube via l'interface -> il ajoute un undo dans la liste des undo.
    Ton script rajoutes l'HN, mets le cube enfant de l'HN mais tu n'ajoutes pas d'undo à la liste des undo.

    Du coup, quand tu annules il annule uniquement le premier élément de la liste qui est la création de ton cube.
    En gros, il faut faire un startundo au début, à chaque action que tu veux rajouter dans ton undo, avant ou après suivant les cas, rajouter l'action et finir par un endUndo ou stopundo je sais plus de tête ^^

    Je regarderais dans 1h à la louche, faut que je vire le sapin de noël rapidos avant .....

    edit : sapin viré script modifié.

    Code:
    import c4d 
    
    def main(): 
        selec = doc.GetActiveObject() 
        if selec :
            doc.StartUndo()  #start undo
    
            HyperNurbs=c4d.BaseObject(c4d.Osds) 
            doc.AddUndo(c4d.UNDOTYPE_NEW,HyperNurbs) #add après l'HN puisque l'ajout de l'HN c'est une création
            
            doc.AddUndo(c4d.UNDOTYPE_CHANGE, HyperNurbs) #ajout dans l'undo de la modification de la hiérarchie. Se place avant la modification.
            doc.InsertObject(HyperNurbs) 
            
            doc.AddUndo(c4d.UNDOTYPE_CHANGE,selec) # ajout de la modification de la hiérarchi pour l'objet selectionné.
            selec.InsertUnder(HyperNurbs) 
            
            doc.EndUndo() #fin de l'undo.
            
            #un control Z vas annuler 3 actions
            c4d.EventAdd() 
            
            
             
    if __name__=='__main__': 
        main
    Une minuscule précision. En générale, avant de faire le select.InsertUnder(HyperNurbs) on doit faire un select.Remove().
    En gros, le supprimer de la hiérarchie (mais il reste en mémoire) et après l'insérer dans le nouvel objet.
    En python, ça ne plante pas visiblement, mais il est préférable de prendre l'habitude de le faire au cas où tu passerais en c++

    C'est plus propre. D'ailleurs je me demande si la fonction InsertUnder ne le fait pas d'office.
    Dernière modification par valkaari ; 09/01/2012 à 17h15.

  25. #25
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Ouch ! Excellent, je n'en demandais pas tant ! Je m'en vais mettre ça en pratique aussi sur mon autre script ! Un gros merci !

  26. #26
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Je fais face à un nouveau problème, auquel je n'avais pas pensé et qui est lié à ma commande selec.InsertUnder(HyperNurbs) : si mon objet est à l'origine enfant d'un autre, il est sorti de la hiérarchie et placé dans le HN qui est en haut de la hiérarchie. Le script perd de son intérêt donc si l'objet fait partie d'une hiérarchie. La question est donc : comment placer le HN au même niveau hiérarchique que l'objet avant de glisser l'objet dans le HN ?



    PS : je n'ai pas réussi à mettre en place mon undo sur mon autre script, mais j'y reviendrai plus tard, c'est moins important.

  27. #27
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    là comme ça, je dirais que tu prends l'objet sélectionné, et tu fais un MonParent = select.GetUp() histoire de récupérer l'objet parent. Ensuite tu fais un If MonParent: inserer l'hn enfant de l'objet MonParent Else: insérer l'HN dans le document.

    La fonction GetUp() renvoie l'objet ou None s'il n'existe pas.


    Accessoirement, tu sais que quand on appuie sur la touche Alt, ça mets l'objet crée (que ça soit un HN ou pas) en parent de l'objet sélectionné ?
    (puis shift c'est pour le mettre en enfant)

  28. #28
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Super ! Je comprends tout à fait une fois que le nom de la commande est énoncé, le souci, c'est justement de trouver le nom de cette commande !

    Accessoirement, oui, je sais, mais ça me fait découvrir le scripting ! Pis je suis un gros fainéant : si je peux ne faire qu'un clic en lieu et place d'un alt+clic, je prends !

    Edit : ça fonctionne au poil, merci ! Je posterai le script bientôt !

  29. #29
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Pas grand chose à rajouter, Val a tout dit. Juste un petit truc qui peut faire gagner un peu de temps; dans un script au lieu de selec = doc.GetActiveObject() tu peux simplement utiliser la variable op et commencer par :
    Code PHP:
    if op
    au lieu de :
    Code PHP:
    selec doc.GetActiveObject()
    if 
    selec 
    soit 31 frappages de touche en moins, au prix du frappage de touche actuel c'est toujours ça de pris...

    Val toutes mes condoléances pour la perte de ton sapin

  30. #30
    Big Boss Avatar de Seb-bbl
    Date d'inscription
    mai 2005
    C4D version
    R13 Studio
    OS
    Mac OSX 10.7
    Messages
    6 507
    Billets dans le blog
    8
    Si on utilise ce "if : op", comment ensuite dire à l'objet actif de se mettre enfant de l'objet HN ? Où et quand définit-on le nom de l'objet actif ? A moins que ce "op" soit justement l'objet actif ? Auquel cas on pourrait dire :

    op.InsertUnder(HyperNurbs) ?

    Voilà mon code (qui peut sans doute être amélioré) :

    Code PHP:
    import c4d 

    def main
    (): 
        
    selec doc.GetActiveObject() 
        
    MonParent selec.GetUp()
        if 
    MonParent :
            
    doc.StartUndo()
            
    HyperNurbs=c4d.BaseObject(c4d.Osds
            
    doc.AddUndo(c4d.UNDOTYPE_NEW,HyperNurbs)
            
    doc.AddUndo(c4d.UNDOTYPE_CHANGE,HyperNurbs)
            
    doc.InsertObject(HyperNurbs)
            
    doc.AddUndo(c4d.UNDOTYPE_CHANGE,HyperNurbs)
            
    HyperNurbs.InsertUnder(MonParent
            
    doc.AddUndo(c4d.UNDOTYPE_CHANGE,selec
            
    selec.InsertUnder(HyperNurbs
            
    doc.EndUndo()
            
    c4d.EventAdd()  
        else :
            if 
    selec 
                
    doc.StartUndo()
                
    HyperNurbs=c4d.BaseObject(c4d.Osds
                
    doc.AddUndo(c4d.UNDOTYPE_NEW,HyperNurbs)
                
    doc.AddUndo(c4d.UNDOTYPE_CHANGE,HyperNurbs)
                
    doc.InsertObject(HyperNurbs)
                
    doc.AddUndo(c4d.UNDOTYPE_CHANGE,selec
                
    selec.InsertUnder(HyperNurbs
                
    doc.EndUndo()
                
    c4d.EventAdd()  
             
    if 
    __name__=='__main__'
        
    main() 

Discussions similaires

  1. Petits Scripts, Python
    Par ksaa dans le forum Programmation
    Réponses: 51
    Dernier message: 29/09/2012, 13h12
  2. Python Scripts phidek
    Par phidek dans le forum Programmation
    Réponses: 8
    Dernier message: 22/06/2011, 18h41
  3. GeRayCollider en python
    Par valkaari dans le forum Programmation
    Réponses: 4
    Dernier message: 20/05/2011, 20h43
  4. Scripts divers python by oli_d
    Par oli_d dans le forum Programmation
    Réponses: 48
    Dernier message: 14/05/2011, 08h37
  5. MDD Reader python
    Par valkaari dans le forum Programmation
    Réponses: 6
    Dernier message: 21/02/2011, 00h41

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