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

Discussion: Gérer le focus en python

  1. #1
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964

    Gérer le focus en python

    Salut tout le monde, je rencontre un petit problème bien bête.

    Comment gère t'on le focus sur les différents éléments de notre UI?

    Mon but étant de changer l'image lors du passage de la souris dessus.

    Voila mon code pour le moment qui ne fonctionne pas bien sur ^^

    Code PHP:
    import c4d

    MY_BITMAP_BUTTON 
    1004


    class MyDialog(c4d.gui.GeDialog):


        
    def CreateLayout(self):
            
            
    self.SetTitle("Ye test des choses")


            
    self.GroupBegin(0c4d.BFH_SCALEFIT|c4d.BFH_SCALEFIT11"bitmap Button",0)


            
    bc c4d.BaseContainer()
            
    bc.SetLong(c4d.BITMAPBUTTON_BORDER,c4d.BORDER_NONE)
            
    self.myBitButton=self.AddCustomGui(MY_BITMAP_BUTTONc4d.CUSTOMGUI_BITMAPBUTTON"Button"c4d.BFH_CENTER c4d.BFV_CENTER5050bc)
            
    self.myBitButton.SetImage('C:/Users/gr4ph0s/Desktop/image1.jpg')
             
             
            
    self.GroupEnd()
            
            return 
    True

        def Command
    (selfidmsg):
            if 
    id==MY_BITMAP_BUTTON:
               print 
    "Hello"  
                       
            
    elif msg==c4d.BFM_INPUT and id==MY_BITMAP_BUTTON
                
    if msg[c4d.BFM_INPUT_DEVICE]==BFM_INPUT_MOUSE: & id ==MY_BITMAP_BUTTON 
                    
    print "test"
                    
            
    return True


    if __name__=='__main__':
        
    dlg MyDialog()
        
    dlg.Open(c4d.DLG_TYPE_ASYNCdefaultw=100defaulth=100
    Merci d'avance
    Dernière modification par gr4ph0s ; 02/07/2015 à 14h44.
    SDK Specialist
    MAXON Computer GmbH

  2. #2
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Je suis pas certain que ça soit possible aussi directement et je vois pas d'exemple dans cinema4D.
    Les boutons sont tous réactif au mouseOver mais je crois pas qu'on y ai accès.

    Tu voulais faire quoi au juste ?

  3. #3
    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,

    Tu peux avoir accès au mouseOver sur une GeUserArea (GeUserArea.Message). Le problème étant que tu n'as pas accès au mouseOut.
    Il faut lancer un Timer lors du mouseOver et vérifier régulièrement (toutes les x millisecondes) si la souris n'a pas quittée la zone (et désactiver le Timer si c'est le cas).

    Un exemple :

    Code PHP:
    import c4d
    from c4d import gui
    bitmaps

    MY_BITMAP_BUTTON 
    1004

    class BitmapGui(gui.GeUserArea):

        
    def __init__(selfimage_outimage_over):
            
    super(BitmapGuiself).__init__()
            
    self.__bitmap_out bitmaps.BaseBitmap()
            
    self.__bitmap_out.InitWith(image_out)
            
    self.__bitmap_over bitmaps.BaseBitmap()
            
    self.__bitmap_over.InitWith(image_over)
            
    self.__hover False

        
    @staticmethod
        def create
    (dialoggadget_idimage_outimage_over):
            
    bitmap BitmapGui(image_outimage_over)
            
    dialog.AddUserArea(gadget_idc4d.BFH_SCALEFIT)
            
    dialog.AttachUserArea(bitmapgadget_id)
            return 
    bitmap

        def InputEvent
    (selfmsg):
            
    device msg.GetLong(c4d.BFM_INPUT_DEVICE)
            
    channel msg.GetLong(c4d.BFM_INPUT_CHANNEL)
            if (
    device == c4d.BFM_INPUT_MOUSE and
                    
    channel == c4d.BFM_INPUT_MOUSELEFT):
               print 
    "clicked"
            
    return True

        def Message
    (selfmsgresult):
            if 
    msg.GetId() == c4d.BFM_GETCURSORINFO:
                if 
    not self.__hover:
                    print 
    "over"
                    
    self.__hover True
                    self
    .Redraw()
                    
    self.SetTimer(100)
            return 
    super(BitmapGuiself).Message(msgresult)

        
    def Timer(selfmsg):
            
    base self.Local2Global()
            
    bc c4d.BaseContainer()
            
    res self.GetInputState(c4d.BFM_INPUT_MOUSEc4d.BFM_INPUT_MOUSELEFTbc)
            
    bc.GetLong(c4d.BFM_INPUT_X) - base['x']
            
    bc.GetLong(c4d.BFM_INPUT_Y) - base['y']
            if 
    self.GetWidth() or or self.GetHeight() or 0:
                print 
    "out"
                
    self.__hover False
                self
    .SetTimer(0)
                
    self.Redraw()

        
    def GetMinSize(self):
            
    x1y1 self.__bitmap_out.GetSize()
            
    x2y2 self.__bitmap_over.GetSize()
            return (
    max(x1x2), max(y1y2))

        
    def DrawMsg(selfx1y1x2y2msg):
            
    bitmap self.__bitmap_over if self.__hover else self.__bitmap_out
            self
    .DrawBitmap(bitmap00x2y200x2y2c4d.BMP_NORMAL)



    class 
    MyDialog(c4d.gui.GeDialog):

        
    def CreateLayout(self):
            
    self.SetTitle("Ye test des choses")
            
    self.GroupBegin(0c4d.BFH_SCALEFIT c4d.BFH_SCALEFIT)
            
    self.bitmap BitmapGui.create(selfMY_BITMAP_BUTTON,
                                           
    '/Users/xs_yann/Desktop/out.jpg',
                                           
    '/Users/xs_yann/Desktop/over.png')
            
    self.GroupEnd()
            return 
    True
        
        
    if __name__ == '__main__':
        
    dlg MyDialog()
        
    dlg.Open(c4d.DLG_TYPE_ASYNCdefaultw=100defaulth=100

  4. #4
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    ha ben j'ai essayé hier de passer par un userarea et j'ai pas réussi :p

    j'avais l'idée c'est déjà pas mal T.T

  5. #5
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Citation Envoyé par valkaari Voir le message
    Je suis pas certain que ça soit possible aussi directement et je vois pas d'exemple dans cinema4D.
    Les boutons sont tous réactif au mouseOver mais je crois pas qu'on y ai accès.

    Tu voulais faire quoi au juste ?
    Afin d'apprendre la lib c4d j'ai voulu commencé par un projet simple, un outil pour gérer le point de pivot des objets.
    Bon le main du programme est déjà codé et ce fut assez simple mais je pense que je vais galérer un peu plus sur l'UI car je compte faire un truc comme l'image si dessous et de cliquer sur les différentes bouboules pour changer simplement le point de pivot.
    (Une fois fini il sera open source )

    Cliquez sur l'image pour la voir en taille réelle 

Nom : 		basic_scenece.jpg 
Affichages :	5 
Taille :		55,1 Ko 
ID : 			15720

    D'ailleurs je n'ai pas fait de recherche,ni même lu la doc encore donc vraiment si vous avez du temps de libre. Mais y'a moyen de superposer 2 images dans une UI? Ou alors d'afficher différents layer d'un fichier photoshop/tif et de créer des zone clickable?

    Mais a vrai dire je ne suis pas sur qu'il s'agisse de la bonne option si sa ne serait pas plus simple de dessiner l'ui directement mais je n'es pas trouver de lib dans C4d proposant ça.
    C4d supporterai un appel PyGDI ou PyQt(ayant déjà fait du Qt en C++ sa pourrais être cool) :3
    Dernière modification par gr4ph0s ; 01/07/2015 à 22h37.
    SDK Specialist
    MAXON Computer GmbH

  6. #6
    Vieux Croûton Avatar de Aurety
    Date d'inscription
    juillet 2002
    C4D version
    R17 Studio
    OS
    Mac
    Messages
    14 477
    Billets dans le blog
    3
    waw, tu m'impressionnes Maxime, accompagné par les zouzous du dessus, tu risques de vite progresser et j'envie ton binôme qui t'aura près de lui sur le projet d'animation à l'école
    kenavo !! // Pinterest KAMIGAZ®

  7. #7
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Y'a deux solutions qui me viennent en tête, toujours avec les GeUserArea :

    1. Tu créés des zones cliquables en forme de cercle au niveau de tes boules : tu te créer un tableau avec la position de chacune de tes boules sur ton image, et un rayon correspondant à leur taille. A chaque clic, si la distance entre le point cliqué et le centre d'un cercle est inférieure au rayon de ce cercle alors tu es dans la zone.

    2. Tu copies ton image pour créer une sorte de masque, tu mets un fond uni et à la place de chaque boule, un rond d'une couleur ou d'un niveau de gris bien précis. Ensuite tu associes chaque couleur ou niveau de gris à la boule correspondante et à chaque clic tu reportes la position sur ton image masque pour récupérer la couleur.

  8. #8
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Bon après recherche j'ai rien trouvé de bien concluant sur la superposition d'image mais je pense et surtout si tu le dit aussi qu'avec les UserArea y'a moyen de faire ce que je veux. Merci en tout cas

    Après test c'est parfait xs_yann exactement ce que je demandais ^^.

    Cependant vu que copier coller un code n'as pas vraiment de but pour moi.

    Pourquoi tu définis create en static? et de ne pas passer par un appel standard? Juste pour un confort ou y'a une réelle utilitée?
    Un truc dont je ne suis pas trop sur mais qui me semble logique msg et result sont des variables global set par C4D un peu comme self dans une classe ?
    super(BitmapGui, self).__init__() Ceci ne créé pas une boucle infini? ^^'


    Hahaha merci Aurety, je ne sais pas si c'est un cadeau de m'avoir, mais en tout cas merci, mais c'est pas dût à notre prof de C4D qui a vraiment été minable toute l'année, en plus il nous poussait jamais à découvrir des choses et à s'amuser en 3D, vraiment pas un type bien
    Dernière modification par gr4ph0s ; 01/07/2015 à 23h09.
    SDK Specialist
    MAXON Computer GmbH

  9. #9
    Vieux Croûton Avatar de Aurety
    Date d'inscription
    juillet 2002
    C4D version
    R17 Studio
    OS
    Mac
    Messages
    14 477
    Billets dans le blog
    3
    Arfff, retourne au code, au lieu de dire des des conneries
    kenavo !! // Pinterest KAMIGAZ®

  10. #10
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Tiens, tu codes toujours pour C4D, Yann ? ^^

    J'aime bien la dernière mise à jour sur ton site qui indique une compatibilité à la toute nouvelle R15.

  11. #11
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Citation Envoyé par gr4ph0s Voir le message
    Pourquoi tu définis create en static? et de ne pas passer par un appel standard? Juste pour un confort ou y'a une réelle utilitée?
    Un truc dont je ne suis pas trop sur mais qui me semble logique msg et result sont des variables global set par C4D un peu comme self dans une classe ?
    super(BitmapGui, self).__init__() Ceci ne créé pas une boucle infini? ^^'

    pourquoi static alors aucune idée ^^

    msg et result sont juste des arguments des fonctions (en général des BaseContainer pour ces deux noms)

    Si j'ai bien compris, pour l'appel à la fonction super, c'est la fonction de la classe parente pas celle que tu crées.

    Quand maxon a construit la class GeDialog par exemple, ils ont peut être inclus la gestion de certains messages.
    Donc dans ta nouvelle class, tu surcharges la fonction Message pour gérer ce que tu veux, il faut appeler la fonction "original" pour gérer le reste.
    Dans la documentation les fonctions sont notées "ne pas oublier d'appeler la fonction super"



    Je fais confiance à Yann pour me reprendre si j'ai dis une connerie.

  12. #12
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Citation Envoyé par César Vonc Voir le message
    Tiens, tu codes toujours pour C4D, Yann ? ^^

    J'aime bien la dernière mise à jour sur ton site qui indique une compatibilité à la toute nouvelle R15.
    Gnagnagna, qu'est-ce que tu fais sur mon site toi, tu sais pas coder tes plugins tout seul ?

    Je travaille sur la compatibilité R17, vu qu'elle est pas sortie ça prend du temps, c'est pour ça.

    Plus sérieusement, avec mon école (que j'ai bientôt finie) et depuis qu'on a instancié une classe fille avec Madame xs, j'ai un peu lâché les plugins c4d mais je suis bientôt de retour (à plein temps sur C4D si tout se passe bien).

    @gr4ph0s :

    Une UserArea se créer comme ceci dans un dialogue :

    Code PHP:
    def CreateLayout(self):
        
    user_area BitmapGui('img1.jpg''img2.png'
        
    self.AddUserArea(1001c4d.BFH_SCALEFIT
        
    self.AttachUserArea(user_area1001
    Ca m'ennuie un peu de devoir écrire trois lignes identiques à chaque fois que je veux créer un BitmapGui. Ce code doit être encapsulé quelque part afin d'être en mesure de l'appeler plusieurs fois sans le répéter (principe DRY).
    C'est possible de mettre ce bout de code dans le constructeur de BitmapGui et de faire :

    Code PHP:
    self.bitmap BitmapGui(selfMY_BITMAP_BUTTON'img1.jpg''img2.png'
    Mais, à mon sens, ce code n'a rien à faire dans le constructeur de la classe. Devoir passer le dialogue en argument du constructeur c'est un peu comme si pour construire une voiture il fallait connaître le conducteur, c'est pas logique.

    De plus, tu peux avoir besoin de dissocier l'initialisation de la création dans le dialogue si tu veux utiliser la même instance, même après ouverture / fermeture du dialogue.

    Citation Envoyé par SDK
    Note Just take care about the lifetime of your GeUserArea instance. If you pass an instance of this class to a dialog, a reference is hold by the dialog and released when the dialog is freed. That also means that each instance of your GeUserArea class is still alive until the host-dialog is freed, even you dont hold a reference to it. If you want to use the same instance of your GeUserArea class on the next time you open the dialog, you have to store the instance in the class scope. See the following example.
    Tu peux donc faire comme ceci (en créant une méthode attach dans la classe BitmapGui) :

    Code PHP:
    def CreateLayout(self):
        
    self.bitmap BitmapGui('img1.jpg''img2.png')
        
    self.bitmap.attach(selfMY_BITMAP_BUTTON
    La méthode attach n'étant pas statique, elle a besoin d'une instance de la classe (un objet) pour être appelée. Pour s'affranchir de cette contrainte, on créé une méthode statique qui se charge de l'instanciation (appel au constructeur) et de la création (attachement au dialogue).

    Code PHP:
    def CreateLayout(self):
        
    self.bitmap BitmapGui.create(selfMY_BITMAP_BUTTON'img1.jpg''img2.png'
    D'une manière générale, les méthode statiques sont utilisées pour grouper des fonctions qui ont une connexion logique avec la classe, dans la classe.


    Pour msg et result, comme l'a dit val, ce sont des arguments.
    Quand tu as fais dialog.AttachUserArea(bitmap, MY_BITMAP_BUTTON), tu as fourni une référence de ton UserArea (l'objet 'bitmap') à ton dialogue. Ton dialogue stocke ça dans une liste interne.
    A chaque clic, ton dialogue itère à travers la liste et pour chaque UserArea appelle la méthode Message.
    Quelque chose du genre :

    Code PHP:
    bc BaseContainer(c4d.BFM_GETCURSORINFO)
    bc.SetLong(c4d.BFM_INPUT_DEVICEc4d.BFM_INPUT_MOUSE)
    for 
    user_area in self.ua_list:
        
    user_area.Message(bcBaseContainer()) 
    Ta classe hérite de GeUserArea, ton dialogue sais donc que ta classe aura forcément les méthodes Message, Init, GetMinSize, Timer, etc.
    Ton dialogue ne sais pas ce qu'il y a dans la méthode Message de ta classe BitmapGui mais il sais qu'elle existe et quels type d'arguments elle prend en paramètre.

    Tu sais donc que à chaque clic, la méthode Message de ta classe sera appelée par le dialogue.
    A toi de mettre le code que tu veux dedans (sans oublier d'appeler le code de la méthode Message du parent à la fin), c'est ce que l'on appelle surcharger (override).

    self n'est pas une variable globale, c'est l'instance avec laquelle tu appelles la méthode qui est passée en premier paramètre. Un exemple qui aide à comprendre :

    Code PHP:
    class Toto:
        
        
    def foo(self):
            print 
    "bar"

    def main():
        
    instance Toto()
        
    instance.foo()   # equivalent
        
    Toto.foo(instance# equivalent

    if __name__=='__main__':
        
    main() 
    Lorsque tu appelles instance.foo() c'est traduit par Toto.foo(instance) (la méthode foo de la classe Toto appelée avec instance en premier argument).

    Pour compléter ce qu'a dis val sur la fonction super voilà un exemple :

    Code PHP:
    class Toto(object):
        
        
    def __init__(self):
            print 
    "Je construis des choses"
            
    self.value 10
            
    class Tata(Toto):
        
        
    def __init__(self):
            
    super(Tataself).__init__()
            print 
    "Je construis d'autres choses"
            
    print self.value


    def main
    ():
       
    tata Tata() 
    en sortie :

    Je construis des chose
    Je construis d'autres choses
    10
    Si tu retire la ligne "super(Tata, self).__init__()", le constructeur de Toto n'est plus appelé (étant donné qu'il est surchargé), tu as donc en sortie :

    Je construis d'autres choses
    AttributeError: 'Tata' object has no attribute 'value'
    En espérant que ça t'aide, bon courage.

  13. #13
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Fiouuuu merci pour toutes ces explications tres precises je ne pouvais attendre mieux

    Une autre question de débutant et surtout vu que sa sera open source histoire davoir le truc le plus propre possible. Y'a t'il une convention a propos des ID des differents controle?
    Car dans tout les exemples que jai regardé les id commence a 1000.
    SDK Specialist
    MAXON Computer GmbH

  14. #14
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Par sécurité on commence à 1000 car les id inférieur peuvent être déjà utilisés (je ne saurais dire par quoi exactement).

    https://developers.maxon.net/docs/Ci..._resource.html

  15. #15
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Et bien merci et rendez vous a la sortie du plugin
    SDK Specialist
    MAXON Computer GmbH

  16. #16
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    et j'ai pas dis de trop grosses conneries

  17. #17
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Citation Envoyé par xs_yann
    depuis qu'on a instancié une classe fille avec Madame xs
    Félicitations, si elle hérite de la classe père ça risque de faire mal d'ici deux ou trois ans, vu le niveau de précocité génétique ! Vous êtes tous du groupe sanguin C++ dans la famille ?

    C'est toujours un bonheur de te lire, j’apprends toujours des trucs ! Ça commence à faire tes études, on a besoin de toi ici !

  18. #18
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Citation Envoyé par oli_d Voir le message
    Vous êtes tous du groupe sanguin C++ dans la famille ?
    Haha, merci oli_d ça fait plaisir ce que tu dis.

    Content de voir que les codeurs sont toujours dans le coin.

  19. #19
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Bon vient un autre problème, je ne sais pas si j'ouvre un nouveau post ou pas...

    Mais une fois convertie en plugin, je n'ai pu accès à la class op au sein de mon code, ça faisait pareil pour la class doc, mais celle-ci pouvais passer en argument de Execute du coup je récup son instance et la passe à mes différentes class qui en ont besoin. Cependant aucun moyen de faire la même chose pour la classe op.

    Voila mon code qui pose problème
    Code PHP:
    class LunchUI(c4d.plugins.CommandData):
        
    PLUGIN_ID   10000090 # TEST ID
        
    op          None
        dlg         
    None
        ua          
    None
        document    
    None
        ICON        
    None

        def Init
    (selfop) :
            print 
    "salut"
            
    print op
            
    return True

        def Execute
    (selfdoc):
            if 
    not self.dlgself.dlg MyDialog()
            
    self.dlg.setData(doc)
            
    self.dlg.Open(c4d.DLG_TYPE_ASYNCself.PLUGIN_ID, -1, -1220310)
            return 
    True

        def RestoreLayout
    (selfsubid):
            if 
    not self.dlg:
                
    self.dlg  MyDialog()
            return 
    self.dlg.Restore(self.PLUGIN_IDsubid)


        @
    classmethod
        def Register
    (AxisMaster):
            
    data = {
                
    "id":     AxisMaster.PLUGIN_ID,
                
    "icon":   AxisMaster.ICON,
                
    "str":    "AxisMaster",
                
    "help":   "Click on the circle",
                
    "info":   c4d.PLUGINFLAG_COMMAND_HOTKEY,
                
    "dat":    AxisMaster(),
            }
            
    c4d.plugins.RegisterCommandPlugin(**data)

    if 
    __name__ == "__main__":
        
    LunchUI.Register() 
    le plus troublant c'est que j'ai regardé dans un plugin de cesar vonc et lui il se sert justement de Init mais moi impossible de faire appeler cette méthode ^^'
    Code PHP:
        def Init(selfop) :
            
    donnees op.GetDataInstance()
            
    self.InitAttr(opint, [VONC_SUBDINV_TYPE])
            
    self.InitAttr(opint, [VONC_SUBDINV_SUBD])
            
    self.InitAttr(opint, [VONC_SUBDINV_DEPA])
            
    self.InitAttr(opbool, [VONC_SUBDINV_SELP])
            
    self.InitAttr(opbool, [VONC_SUBDINV_INVN])
            
    op[VONC_SUBDINV_TYPE] = self.type
            op
    [VONC_SUBDINV_SUBD] = self.subd
            op
    [VONC_SUBDINV_DEPA] = self.depa
            op
    [VONC_SUBDINV_SELP] = self.selp
            op
    [VONC_SUBDINV_INVN] = self.invn
            
    return True 
    PS: voila mon code complet https://github.com/gr4ph0s/C4D-PivotMaster je sais que c'est pas clean notamment au niveau updateAxi ou je créé des variables inutiles, c'est juste que je n'ai pas fini d’adapter mon script python que j'ai fait sans class.
    Dernière modification par gr4ph0s ; 04/07/2015 à 22h33.
    SDK Specialist
    MAXON Computer GmbH

  20. #20
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    En regardant ton code, vite fait, il y a quelques erreurs, comme à la ligne 356 :

    Code PHP:
        def InitValues(self):
            
    doc None
            ua 
    None
            
    return True 
    Ça ne peut pas de marcher sans mettre le self derrière :
    sef.doc = None
    self.ua = None


    Pareil ton LunchUI, tu ne peux définir le op de ta classe uniquement si tu lui mets un self derrière dans ta fonction :


    Du genre :

    Code PHP:
    def Init(selfop) :
            print 
    "salut"
            
    self.op op 

    Init est exécuté à chaque initialisation de l'outil, soit une seule fois quand tu le sélectionnes après avoir lancé C4D, si je ne me goure pas.


    PS : op, doc sont des variables, pas des classes. ^^
    Dernière modification par César Vonc ; 05/07/2015 à 00h15.

  21. #21
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Citation Envoyé par César Vonc Voir le message
    PS : op, doc sont des variables, pas des classes. ^^
    Hoooooo ça change tout :o mais du coup elles correspondent quand même à des instances de class?
    Doc = c4d.documents non?

    En tout cas merci j'y vois un peu plus clair.

    Pourquoi des fois le constructeur est __init__ une autre Init et une autre InitValue?
    Dernière modification par gr4ph0s ; 05/07/2015 à 00h23.
    SDK Specialist
    MAXON Computer GmbH

  22. #22
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Bah c'est juste une question de nomenclature, je veux pas dire de bêtise mais je dirais que doc est une variable qui a pour classe c4d.documents.BaseDocument.

    Pour créer un doc de cette classe, il faudrait faire doc = c4d.documents.BaseDocument(), avec les parenthèses, qui appelle automatiquement le __init__ de la classe, c'est propre au Python.


    Init et InitValues sont inventées par Maxon, on les appelle (ou sont appelées) quand on le veut pour initialiser certaines fonctionnalités qui demandent certains paramètres.

    Par exemple, quand tu créés un Neighbor, tu fais un :


    n = c4d.utils.Neighbor()

    Puis tu l'initialises avec Init qui demande, dans ce cas là, un PolygonObjet :

    n.Init(op)


    Après, suffit de lire la doc pour savoir quand la fonction est appelée par C4D :

    GeDialog.InitValues(self)


    Called when the dialog is initialized by the GUI.

    Ici, quand le menu est initialisé, il appelle InitValues qui détermine les valeurs par défaut des paramètres. C'est ici qu'on va définir ces valeurs par défaut.

  23. #23
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Merci beaucoup effectivement je n'avais pas penser a regarder la doc pour GeDialog et donc InitValue.


    J'ai fait ce projet pour comprendre comment python fonctionnait avec C4D et bien je suis pas déçu ! un ENORME merci à vous !
    SDK Specialist
    MAXON Computer GmbH

Discussions similaires

  1. [Problème] Gérer les calques via un noeud python dans Xpresso
    Par istef dans le forum Xpresso
    Réponses: 3
    Dernier message: 12/10/2012, 15h31
  2. Gerer ses fenetres C4d
    Par carlo57 dans le forum Nouveaux membres
    Réponses: 11
    Dernier message: 17/12/2008, 16h11
  3. 2x production focus @ cgtalk
    Par shtl dans le forum Le saloon
    Réponses: 0
    Dernier message: 08/06/2007, 09h46
  4. gérer la transparence
    Par zak dans le forum Nouveaux membres
    Réponses: 4
    Dernier message: 04/01/2007, 17h36
  5. Gérer des caméras
    Par TheCha dans le forum Général Cinema 4D
    Réponses: 7
    Dernier message: 28/11/2004, 23h46

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