PDA

Voir la version complète : switch commande HN dans VS ?



Aurety
03/04/2016, 13h05
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é ^^

Aurety
03/04/2016, 14h46
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:

oli_d
03/04/2016, 16h21
c'est le no 100004785


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

gr4ph0s
03/04/2016, 17h00
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

Aurety
03/04/2016, 18h21
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 !

xs_yann
04/04/2016, 14h57
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.