Voir la version complète : 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 ??
sansalvador
03/04/2016, 13h29
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 :icon_mrgreen:
c'est le no 100004785
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.
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_CHIL DREN):
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
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 !
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 :D
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
17525
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 !
Salut,
C'est possible de modifier des objets (dont leur BaseContainer) dans un code Python de Visual Selector.
Ce code fonctionne pour un hotspot :
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()
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 :icon_mrgreen:).
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.
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. Tous droits réservés