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

Discussion: switch commande HN dans VS ?

  1. #1
    Vieux Croûton Avatar de Aurety
    Date d'inscription
    juillet 2002
    C4D version
    R17 Studio
    OS
    Mac
    Messages
    14 357
    Billets dans le blog
    3

    switch commande HN dans VS ?

    Vu qu'on peut entrer une commande dans le visual selector sur un hotspot, je voudrais savoir si quelqu'un connait la commande Python ou Coffee pour switcher un HN en mode on/off au clic sur le hotspot. Une idée ??
    kenavo !! // Pinterest KAMIGAZ®

  2. #2
    Pilier Avatar de sansalvador
    Date d'inscription
    décembre 2012
    C4D version
    R13 Studio
    OS
    windows 7 ultimate 64
    Messages
    1 695
    Je vais surement dire une bêtise mais le raccourci clavier "Q" ne suffit pas ? J'imagine que non , alors pour ma culture personnelle , si tu pouvais m'expliquer comment ça fonctionne steuplé ^^

  3. #3
    Vieux Croûton Avatar de Aurety
    Date d'inscription
    juillet 2002
    C4D version
    R17 Studio
    OS
    Mac
    Messages
    14 357
    Billets dans le blog
    3
    Si bien sur le raccourci Q fonctionne mais quitte à utiliser le Visual Selector et comme mon cours s'articule sur les fonctionnalités de l'auto-rig ( que j'améliore un peu ) en le customisant au besoin.. Je voulais introduire les moyens d'utiliser certaines fonctions "cachées" ou méconnues. Lorsqu'on affecte un hotspot sur le VS, on peut demander si à la sélection se transforme en rotation ou déplacement en fonction des contraintes ( ex: tete = rotation, pied = déplacement ).. Bref il y a la fonction "command" qui m'interpelait alors je me suis dit que j'allais illustrer ça avec un simple switch mais je n'y arrive pas.
    Au pire j'en parlerais pas
    kenavo !! // Pinterest KAMIGAZ®

  4. #4
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    R19 Studio
    OS
    MacOS X
    Messages
    681
    c'est le no 100004785

    Code:
    c4d.CallCommand(100004785) # Activer/Désactiver l'objet

  5. #5
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    913
    Malheureusement il semblerais qu'on est pas accès aux objets :

    Un premier test avec le code suivant dans la fenêtre de script ça fonctionne parfaitement.
    Code:
    import c4d
    
    
    def selchildren(obj,next,buffer):
        while obj and obj != next:
            buffer.append(obj)
            selchildren(obj.GetDown(),next,buffer)
            obj = obj.GetNext()
        return True
    
    
    def removeHN(listObj):
        for obj in listObj:
            if obj.GetType() == c4d.Osds:
                if obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG]:
                    obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = False
                    print 'salut'
                else:
                    obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = True
    
    
    def main():
        doc = c4d.documents.GetActiveDocument()
        listAllObj = []
    
    
        try: obj = doc.GetActiveObjects(False)[0]
        except: return True # Nothing Selected
    
    
        for obj in doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN):
            selchildren(obj, obj.GetNext(),listAllObj)
                    
        doc.StartUndo()
        removeHN(listAllObj)
        doc.EndUndo()
        c4d.EventAdd()
    
    
    
    
    main()
    Mais si on le met dans un visual Selector alors rien ne se passe comme si il n'avais pas accès au objets pourtant le mot salut apparais bien lorsqu'il rencontre des HN. Ce qui est logique vu que les tag sont exécuté après.

    Mais en faisant un tag python (appliqué sur le même objet que le Visual Selector) avec ce code
    Code:
    import c4d
    CONTAINER_ID = 1037123
    
    
    def selchildren(obj,next,buffer):
        while obj and obj != next:
            buffer.append(obj)
            selchildren(obj.GetDown(),next,buffer)
            obj = obj.GetNext()
        return True
    
    
    def removeHN(listObj):
        for obj in listObj:
            if obj.GetType() == c4d.Osds:
                if obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG]:
                    obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = False
                else:
                    obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = True
    
    
    def doSomething():
        listAllObj = []
        try: obj = op.GetObject()
        except: return False
    
    
        selchildren(obj, obj.GetNext(),listAllObj)
                    
        doc.StartUndo()
        removeHN(listAllObj)
        doc.EndUndo()
        c4d.EventAdd()
        return True
    
    
    def main():
        bc = doc.GetDataInstance()
        doAction = bc.GetBool(CONTAINER_ID)
        if doAction:
            doSomething()
            bc = doc.GetDataInstance()
            bc.SetBool(CONTAINER_ID,False)
        else:
            bc.SetBool(CONTAINER_ID,False)
    Et que dans ton visual selector tu mets en action python avec ce code ça fonctionne niquel !
    Code:
    import c4d
    CONTAINER_ID = 1037123
    
    
    doc = c4d.documents.GetActiveDocument()
    bc = doc.GetDataInstance()
    bc.SetBool(CONTAINER_ID,True)
    Voici le fichier sa sera plus simple pour comprendre suffit de clicker sur le carré rouge
    La j'ai fait en sorte que ça sois tout ce qui est en enfant de la où tu as mis le tag python. mais si tu préfères que sa s'effectue sur la sélection en cours dis le !

    Mais bon si c'est pour un cours je crois que la classe va être pommé et que je vais devoir passé 2h a expliquer du pourquoi du comment :p

    switch_HN.c4d
    Dernière modification par gr4ph0s ; 03/04/2016 à 17h27.
    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 357
    Billets dans le blog
    3
    aha T'es un mabouul ! Je voulais juste un switch, pas les moyens de déployer la prochaine guerre cybermondiale.. "Q" c'est bien aussi :-)
    Je vais mater ça, merci les gars !
    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
    Salut,

    C'est possible de modifier des objets (dont leur BaseContainer) dans un code Python de Visual Selector.
    Ce code fonctionne pour un hotspot :

    Code PHP:
    import c4d

    def hierarchy
    (objsiblings=False):
        while 
    obj:
            
    yield obj
            
    for child in hierarchy(obj.GetDown(), True):
                
    yield child
            obj 
    obj.GetNext() if siblings else None
            
    def switch_hn
    (docobj):
        if 
    obj.CheckType(c4d.Osds):
            
    doc.AddUndo(c4d.UNDOTYPE_CHANGEobj)
            
    obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = not obj[c4d.ID_BASEOBJECT_GENERATOR_FLAG]

    def main():
        
    active_objects doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0)
        if 
    not active_objects:
            return
        for 
    obj in hierarchy(active_objects[0]):
            
    switch_hn(docobj)
        
    c4d.EventAdd() 
    Le problème c'est que l'exécution du code Python du visual selector n'est pas implémentée tout à fait pareil que dans un tag.
    Contrairement à un script, dans un tag, tu n'es pas censé appeler la fonction 'main' mais seulement la définir.
    Dans un tag, peu importe le nombre de fois auxquelles tu fais appel à la fonction main dans le scope global, elle ne sera exécutée qu'une seule fois.
    Dans le Visual Selector, elle sera exécutée à chaque fois que tu y fais appel, plus une fois par défaut.

    Dans ton cas, vu que tu appelles la fonction main, ton code sera exécuté deux fois (et étant donné que tu programmes un switch, ben ton code s'auto annule ).

    Dans tout les cas ta méthode est bonne puisque dans le Visual Selector la seule globale à laquelle tu aies accès est 'doc', il n'y a pas de 'op'. Ça implique que si tu veux faire référence à un objet, t'es obligé de le trouver avec doc.SearchObject(object_name) par exemple, ce qui est pas top.

Discussions similaires

  1. [Vidéo] Lancaster - Adèle Switch
    Par Sam's dans le forum Galerie
    Réponses: 13
    Dernier message: 14/02/2015, 09h10
  2. ou est passé la commande enveloppe spline dans Mograph
    Par zapette dans le forum Général Cinema 4D
    Réponses: 1
    Dernier message: 27/01/2011, 20h48
  3. Fk ik switch autosnap
    Par macadamxbanks dans le forum Nouveaux membres
    Réponses: 30
    Dernier message: 18/01/2011, 18h45
  4. Switch de textures via expresso
    Par fabian dans le forum Xpresso
    Réponses: 9
    Dernier message: 04/03/2010, 19h36
  5. Switch Node ??
    Par Aurety dans le forum Xpresso
    Réponses: 22
    Dernier message: 12/10/2003, 11h10

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