PDA

Voir la version complète : Menu déroulant et sous-menus



César Vonc
30/05/2012, 22h59
Bonjour,

Je projette de regrouper plusieurs petits scripts de sélections en un module à part entière.


Est-il possible de créer un sous menu déroulant dans l'onglet Modules Externes, permettant de choisir quelle fonction de mon module exécuter ?


J'ai ajouté Sélections Supplétives avec plugins.RegisterCommandPlugin(), faut-il le faire pour chaque commande pour obtenir le montage ci-dessous, ou y a-t-il une autre méthode ?

valkaari
31/05/2012, 00h01
Si j'ai bien compris, la méthode est assez technique mais te je la post quand même des fois que tu es la patience de le faire.

Dans le répertoire plugin, tu crées un sous répertoire "Sélections Supplétives" (les accents sont déconseillés évidement) et tu mets dedans tout tes plugins (dans des sous répertoires de préférences)

Le problème c'est que si tu as des plug c++ et python, il vas créer deux entrées de ton menu modules externe du même nom.

Pour une fois un truc simple avec le dev xD

edit : ha oui, j'ai oublié de dire évidemment, le sous menu n'est crée que si tu as au moins deux plugins dans le sous répertoire.

César Vonc
31/05/2012, 10h45
Ah d'accord, en fait ça marche aussi en utilisant plusieurs RegisterCommandPlugin() pour ne garder qu'un seul fichier pyp.

Donc j'ai l'impression qu'on est obligé d'avoir un numéro d'identification pour chaque commande ?

valkaari
31/05/2012, 15h05
Tout ce qui doit aller au milieu des autres commandes / objets /trucs bidules de cinema4D doit posséder un ID unique pour éviter les conflits. Si du moins tu dois l'identifier par un ID (ce qui n'est parfois pas le cas).

Par exemple, si tu veux stocker une variable dans le basecontainer du document c4d, il est plus sage pour éviter les conflits de prendre un ID sur c4dCafé. Donc il en faudrait un par variable. Par contre tu peux avoir un ID pour un BaseContainer pour éviter le conflit avec d'autre éléments et dans ce BaseContainer perso, tu peux gérer les ID comme tu veux.


Dans les exemples du sdk c++ il y a un fichier main qui appelle les fonctions d'enregistrement des autres plugins.
Je ne sais pas si tu peux faire la même chose avec python avec des import tout en gardant la possibilité de crypter les fichiers sources.
Mais j'essayerais en faisant un fichier main.pyp (qui sera chargé par c4d) et d'autre fichier .py (les fichiers des plugins) en utilisant un import dans le fichier main.

César Vonc
31/05/2012, 15h37
Oui, cependant je voulais utiliser une seule ID pour tout le module et n'avoir que des sous-menus relatifs.

J'ai trouvé la fonction CommandData.GetSubContainer() qui permet à priori de créer des sous-menus ayant chacun une ID relative au module (ID du module prise sur plugincafe, et sous-menus 1000, 1001...), qu'on exécute avec ExecuteSubID() mais je n 'arrive pas à la faire marcher avec leur exemple :



def GetSubContainer(self, doc, submenu) :
bc = BaseContainer()
bc.SetString(1, "Menu")
bc.SetString(1000, "Sous-menu 1")
bc.SetString(1001, "Sous-menu 2")
submenu.InsData(0, bc)
Mais rien, pas de sous-menus...

xs_yann
31/05/2012, 21h52
Salut,

A priori ça n'a pas du bouger depuis, ça ne fonctionne pas chez moi non plus : http://www.plugincafe.com/forum/forum_posts.asp?TID=5447

Je pense que la solution de Val reste la meilleure.
Bon courage César. ;)

César Vonc
31/05/2012, 23h14
Merci. En effet, cela semble être la meilleure solution.


J'obtiens un résultat plutôt sympa, ça a toujours plus de gueule avec des icônes. ^^

À ce sujet, est-il possible d'en ajouter une au menu déroulant qui n'est qu'autre qu'un dossier dans lequel se trouvent mes modules ?


Je m'absente une semaine à compter de demain, avec sans doute d'autres idées de sélection à mon retour !