Je viens de me rendre compte que cela fait deux ans que je n'ai pas posté sur le forum nom de nom !
Donc déjà, Salutations aux Anciens et bonjour aux nouveaux!
Bon forcément le déclencheur de ce comeback est un problème technique... un truc tout bête mais sur lequel je tombe de temps en temps et comme toujours en speed, je me dépatouille manuellement sans prendre le temps de poster sur le forum alors qu'il existe forcément une astuce toute bête, ou 3 lignes de code pour automatiser le truc (toujours aussi nul en programmation, je préviens )
J'ai cherché un peu partout sur le net, mais rien.. ou je n'ai pas posé la bonne question à Maître G.
Bref... j'ai 750 objets dans une hiérarchie. Ils sont positionnés précisément sur une grille, ils ont tous la même taille et tous une texture différente (pour ceux a qui on demande de faire un mograph avec 750 noms en mouvement, astuce : à partir de votre liste de noms, faite un tableau avec le nombre de colonnes et de lignes nécessaires, coller le dans Illustrator par exemple, exporter ça dans une super grande texture, coller ça sur un objet plan avec le même nombre de colonnes et de lignes, tag Texture Adaptative, convertissez en objet éditable, déconnexion des polygones, puis Maillage->conversion->groupe de polygones en objets.. vous avez vos 750 étiquettes avec vos noms).
Bref(2)... ma question : toutes mes étiquettes Noms sont bien rangées par ordre alphabétique = ID d'objet, est ce que quelqu'un aurait une astuce pour foutre le barda aléatoirement dans cette belle hiérarchie ?
Le but, c'est de pouvoir utiliser certains effets mograph qui se basent sur l'ordre de la hiérarchie systématiquement mais sans être contraint à ce fichu ordre et sans risquer d'avoir des doublons...
une astuce, un plug ? quelques lignes de programmation?
Merci d'avance !!!
Ogier
Ola , Avé Ogier
ceci pourrait-il t'aider ? matmix.c4d
C'est çui qui dit qui l'est ! ...non, peut-être ?! Le Bric©neum est ouvert : à vos risques et périls !
Salut Ogier,
Si j'ai bien compris, tu veux mélanger les enfants d'un objet. Ce code devrait le faire (à coller dans le gestionnaire de scripts, attention, j'ai pas mis de undo)
Le principe (si tu veux te mettre au python):
- on importe la biblio random -> import random
- on récupère la liste des enfants ->lst = op.GetChildren()
- on mélange avec shuffle de la biblio random -> random.shuffle(lst)
- on fait une boucle et on met les objets en enfant dans l'ordre du désordre -> for o in lst: o.InsertUnder(op)
- on rafraichit -> c4d.EventAdd()
EDIT : j'ai oublié de dire qu'il faut sélectionner l'objet parent avant de lancer le script !Code:import c4d import random def main(): lst = op.GetChildren() random.shuffle(lst) for o in lst: o.InsertUnder(op) c4d.EventAdd() if __name__=='__main__': main()
Dernière modification par oli_d ; 29/09/2014 à 13h27.
Merci pour vos réponses ! Et merci aussi pour les explications Oli_D, je ne te promet pas de faire des scripts dans les jours à venir, mais ça me permettra au moins d'avoir un début de compréhension..
Alors après test... avec vos deux scripts, j'ai exactement les outils dont j'ai besoin, c'est parfait !
Avec ton script Bricoman, je peux casser la régularité alphabétique de ma liste de nom en mélangeant les textures sur les objets enfants, et avec le tien Oli_D, et bien je peux mélanger toute la hiérarchie dans un cloneur "en place" pour faire apparaitre mes 750 éléments aléatoirement en animant le nombre d'objets générés
Donc, et bien, 750 fois merci parce que mon exemple est bien réel et qu'il aurait fallut que je me mélange tout ça à la louche, et j'ajouterai encore 280 merci car j'ai une seconde liste du genre à faire après !
Ogier
Salut,
Tu n'as jamais eu de soucis en re-insérant des objets non supprimés oli_d ?
Il n'y a pas beaucoup de précision dans le SDK, si ce n'est une note dans la doc de GeListNode.InsertUnderLast(obj).
Je sais qu'en COFFEE par exemple, si tu fais ça (genre "op->InsertUnder(op->GetNext());" ), C4D plante.Note: You must make sure that the insertion is sane, for example you cannot insert a key into the object list. It is also necessary to call Remove() first if the object is already inserted into another list.
En python, ça a l'air de fonctionner (depuis la R15 il y a même une exception lancée si tu fais op->InsertUnder(op)), mais ça me parait assez incertain quand même.
Reste à savoir si la note du SDK est là juste par copie du SDK C++ et qu'en python "Remove()" est appelé automatiquement ou s'il y a vraiment un risque...
C'est vrai que suite au COFFEE je faisais systématiquement un Remove(), mais depuis que j'ai constaté que ça marchait sans je ne le fais plus et je n'ai jamais eu de soucis. Ça simplifie les chose, mais peut-être que c'est très mal ?