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®
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é ^^
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®
c'est le no 100004785
Code:c4d.CallCommand(100004785) # Activer/Désactiver l'objet
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.
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.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 en faisant un tag python (appliqué sur le même objet que le Visual Selector) avec ce code
Et que dans ton visual selector tu mets en action python avec ce code ça fonctionne niquel !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)
Voici le fichier sa sera plus simple pour comprendre suffit de clicker sur le carré rougeCode:import c4d CONTAINER_ID = 1037123 doc = c4d.documents.GetActiveDocument() bc = doc.GetDataInstance() bc.SetBool(CONTAINER_ID,True)
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
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®
Salut,
C'est possible de modifier des objets (dont leur BaseContainer) dans un code Python de Visual Selector.
Ce code fonctionne pour un hotspot :
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.Code PHP:
import c4d
def hierarchy(obj, siblings=False):
while obj:
yield obj
for child in hierarchy(obj.GetDown(), True):
yield child
obj = obj.GetNext() if siblings else None
def switch_hn(doc, obj):
if obj.CheckType(c4d.Osds):
doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
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(doc, obj)
c4d.EventAdd()
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.