Salut la compagnie,
Existe-t-il un moyen de trier automatiquement la hiérarchie des objets dans le gestionnaire en fonction de différents paramètres ?
Je travaille actuellement avec des grilles de clones mograph assez importantes (aprox. entre 1000 et 10000 clones) avec un seul object source (sphère, cube, parfois spline) dont je fait varier positions et échelles avec différents effecteurs.
J'aurais besoin de trier ces clones (dans mograph ou après édition du cloner) en fonction de leur taille et / ou volume et / ou surface... voir de leur distance par rapport à un point donné.
Me retrouver en sortie avec par exemple un groupe d'objet dont le plus volumineux serait en haut de ma hiérarchie, et le moins volumineux en bas. Ou bien avec l'objet le plus proche de ma caméra en haut, et le plus éloigné en bas...
Une solution potentielle ?
D'avance merci !
Dernière modification par Helium ; 29/10/2018 à 16h24.
J'ai un début de piste qui me fait penser que c'est possible via un script. J'ai trouvé ce morceau de python qui classe les objets du gestionnaire par ordre alphabétique :
Je me dit que ça doit être tout à fait transposable à autre chose qu'un ordre alphabétique non ? J'essaie de bricoler l'une ou l'autre ligne, mais je pense que ce n'est pas aussi simple que ça, et de toute évidence je n'ai pas les connaissances requises...Code:# SORT OBJECTS ALPHABETICALLY IN OM import c4d from c4d import gui def main(): obj = doc.GetFirstObject() if not obj: return True doc.StartUndo() olist = [] while obj: olist.append([obj.GetName(),obj]) obj = obj.GetNext() olist.sort() olist.reverse() for i,o in enumerate(olist): doc.AddUndo(c4d.UNDOTYPE_CHANGE,o[1]) o[1].Remove() doc.InsertObject(o[1],None,None) c4d.EventAdd() doc.EndUndo() if __name__=='__main__': main()
Discussion à déplacer en section programmation peut être ducoup ?
Merci
Dernière modification par Helium ; 31/10/2018 à 10h04.
Interessant comme sujet...
Question bête:
tu n'as pas peur que ça flingue les priorités en cas d'animation.... ??
Je n'y ai pas pensé, mais c'est pour du statique, pas d'animation en vue. La finalité de tout ça est de récupérer un grand nombre de formes sur illustrator.
Pour info j'ai essayé de faire ça coté illustrator, j'ai trouvé un script qui ordonne des tracés en fonction de leur surface, mais au dessus d'une centaine d'objets il est dépassé...
Voici une version modifié de ton code qui classe par "taille".
Taille est entre guillemet car c'est juste une moyenne des valeurs de la boundingBox.
Attention que ce script reordonne tout les objets de l'OM.
il faudrait mettre une gestion de la hierarchie ou au moins une restriction à la selection
Code PHP:
# SORT OBJECTS ALPHABETICALLY IN OM
import c4d
from c4d import gui
def main():
obj = doc.GetFirstObject()
if not obj: return True
doc.StartUndo()
olist = []
while obj:
bb = obj.GetRad()
vol = int( (bb.x + bb.y + bb.z) / 3.0)
print vol
olist.append([vol,obj])
obj = obj.GetNext()
olist.sort()
olist.reverse()
for i,o in enumerate(olist):
doc.AddUndo(c4d.UNDOTYPE_CHANGE,o[1])
o[1].Remove()
doc.InsertObject(o[1],None,None)
c4d.EventAdd()
doc.EndUndo()
if __name__=='__main__':
main()
Dernière modification par Floc ; 31/10/2018 à 19h28.
Excellent merci beaucoup Floc !
Je tricotait au bon endroit mais je suis complètement largué en terme de syntaxe.
Effectivement à optimiser peut être en mettant une restriction, mais là tout de suite ça fait le taf pour ce que je dois faire. Et de là je devrai arriver avec cette base à adapter à d'autres paramètres.
Je posterai ça, si j'y arrive !
Merci encore