FR 3049213 A1 20170929 FR 1652497 A 20160323 INRIA189 FRD Dispositif de traitement de données pour la génération de microstructures à élasticité variable par fabrication additive L'invention concerne le domaine de la fabrication additive et en particulier la fabrication d'objets présentant une élasticité variable. De nombreux travaux ont abordé la génération de structures permettant d'obtenir des objets présentant une élasticité variable. Ces travaux utilisent le principe d'une application d'un motif dont l'étude à grande échelle permet de valider les caractéristiques structurelles. Ainsi, un objet présentant une élasticité variable peut être fabriqué en réalisant plusieurs sous objets basés sur des motifs différents. Cependant, ce type d'approche est complexe à mettre en oeuvre dans le contexte de la fabrication additive car cette dernière impose des contraintes de fabrication fortes dépendant de la technologie (continuité verticales dans le cas du dépôt par couche, ou absence de poche dans le cas de l'utilisation de poudres). De plus, ce genre de technique génère des objets informatiques (maillages ou volumes) extrêmement volumineux, ce qui pose des problèmes avec les machines de fabrication additive actuelles. L'invention vient améliorer la situation. À cet effet, l'invention propose un dispositif de traitement de données pour fabrication additive, comprenant une mémoire agencée pour recevoir des données d'emplacement désignant un emplacement et un élément de volume contenant cet emplacement, et un générateur agencé pour déterminer des données de fabrication additive indiquant si un emplacement associé à des données d'emplacement est vide ou plein, dans lequel : - la mémoire est agencée pour recevoir des données de densité et des données de rayon, et en ce que - le générateur est agencé pour calculer, pour un emplacement donné désigné par des données d'emplacement, des données de graines de cellule de Voronoi désignant des emplacements de graines de cellule de Voronoi d'un jeu de graines de cellules de Voronoi associé à l'emplacement donné, 3049213 2 - le générateur est agencé pour déterminer lesdits emplacements de graines de cellules de Voronoi dans une pluralité d'éléments de volumes comprenant l'élément de volume contenant l'emplacement donné et des éléments de volumes sélectionnés dans un voisinage de l'élément de volume contenant l'emplacement donné, en divisant chaque 5 élément de volume de la pluralité d'éléments de volume en un ou plusieurs sous- éléments de volume dont le nombre est calculé à partir des données de densité et du volume de chaque élément de volume, en déterminant de manière pseudo-aléatoire en fonction des données d'emplacement et des données de densité des sous-éléments de volume recevant une graine de cellule de Voronoi, et en déterminant de façon pseudo- 10 aléatoire dans chaque sous- élément de volume recevant une graine de cellule de Voronoi des données de graine de cellule de Voronoi désignant un emplacement dans ce sous-élément de volume, - le générateur est en outre agencé pour définir au moins une branche à partir d'un triplet de graines de cellule de Voronoi choisies dans un jeu de graines de cellules de 15 Voronoi associé à un emplacement donné dont l'une est la plus proche de l'emplacement donné, et pour définir des données de fabrication additive indiquant que l'emplacement donné est plein lorsque la distance entre ledit emplacement donné et sa projection sur une branche est inférieure à une distance tirée des données de rayon, et lorsque ladite graine de cellule de Voronoi la plus proche de l'emplacement donné est la 20 plus proche de ladite projection parmi le jeu de graines de cellules de Voronoi associé à l'emplacement donné. Dans d'autres modes de réalisation, le dispositif pourra présenter une ou plusieurs des caractéristiques supplémentaires suivantes : 25 - le générateur est un modélisateur agencé pour recevoir un couple associant des données de densité et des données de rayon, pour déterminer un jeu de données de fabrication additive pour un objet de forme sensiblement cubique à partir de ce couple, et pour appliquer une méthode d'homogénéisation pour en tirer une donnée d'élasticité, - le modélisateur est agencé, pour un couple donné, pour déterminer plusieurs jeux de 30 données de fabrication additive en faisant varier les déterminations pseudo-aléatoires, et pour réaliser une moyenne des données d'élasticité pour le couple donné, 3049213 3 - le générateur est un constructeur agencé pour recevoir des données d'objet définissant la forme d'un objet à produire par fabrication additive et comprenant des données d'élasticité associées à des emplacements désignés par les données d'objet, et, pour certains au moins des emplacements des données d'objets, pour déterminer des données 5 de rayon et des données de densité à partir des données d'élasticité associées, et déterminer des données de fabrication additive correspondantes, - le générateur détermine de manière procédurale les données de fabrication de chaque emplacement désigné par les données d'objet à partir des seules données d'objet dont sont tirées les données de densité et les données de rayon, 10 - le générateur est agencé pour sélectionner des éléments de volume cubiques ayant un volume égal à celui de l'élément de volume contenant l'emplacement donné, lequel élément de volume est également cubique, .- le générateur est agencé pour diviser chaque élément de volume de la pluralité d'éléments de volumes en des sous-éléments cubiques et de taille identique entre eux , 15 - le générateur est agencé, après avoir déterminé le jeu de graines de cellules de Voronoi pour un emplacement donné, pour déterminer la graine de cellule de Voronoi la plus proche de l'emplacement donné, et calculer un jeu de graines de cellules de Voronoi associé à l'emplacement de cette graine de cellule de Voronoi, - le générateur est agencé pour sélectionner des éléments de volume dans un voisinage 20 de l'élément volume contenant l'emplacement donné qui sont contigus à cet élément de volume, ou qui sont contigus à un élément de volume contigu à cet élément de volume. L'invention concerne également un procédé de traitement de données pour fabrication additive comprenant les opérations suivantes : 25 a. recevoir des données d'emplacement désignant un emplacement et un élément de volume contenant cet emplacement, des données de densité et des données de rayon, b. déterminer, pour un emplacement donné désigné par des données d'emplacement, des données de graines de cellule de Voronoi désignant des 30 emplacements de graines de cellule de Voronoi d'un jeu de graines de cellules de Voronoi associé à l'emplacement donné, dans une pluralité d'éléments de volumes comprenant l'élément de volume contenant l'emplacement donné et des éléments de 3049213 4 volumes sélectionnés dans un voisinage de l'élément de volume contenant l'emplacement donné, en divisant chaque élément de volume de la pluralité d'éléments de volume en un ou plusieurs sous-éléments de volume dont le nombre est calculé à partir des données de densité et du volume de chaque élément de volume, en 5 déterminant de manière pseudo-aléatoire en fonction des données d'emplacement et des données de densité des sous- éléments de volume recevant une graine de cellule de Voronoi, et en déterminant de façon pseudo-aléatoire dans chaque sous- élément de volume recevant une graine de cellule de Voronoi des données de graine de cellule de Voronoi désignant un emplacement dans ce sous-élément de volume, 10 c. définir au moins une branche à partir d'un triplet de graines de cellule de Voronoi choisies dans un jeu de graines de cellules de Voronoi associé à un emplacement donné dont l'une est la plus proche de l'emplacement donné, d. définir des données de fabrication additive indiquant que l'emplacement donné est plein lorsque la distance entre ledit emplacement donné et sa projection sur 15 une branche est inférieure à une distance tirée des données de rayon, et lorsque ladite graine de cellule de Voronoi la plus proche de l'emplacement donné est la plus proche de ladite projection parmi le jeu de graines de cellules de Voronoi associé à l'emplacement donné. 20 Dans d'autres modes de réalisation, le procédé pourra présenter une ou plusieurs des caractéristiques supplémentaires suivantes : - le procédé comprend en outre les opérations suivantes : e. recevoir des données d'objet définissant la forme d'un objet à produire par fabrication additive et des données d'élasticité associées à des emplacements 25 désignés par les données d'objet, f pour certains au moins des emplacements des données d'objets, déterminer des données de rayon et des données de densité à partir des données d'élasticité associées, g. déterminer des données de fabrication additive correspondantes en 30 exécutant les opérations a. à d., - le procédé comprend en outre l'opération suivante : 3049213 5 h. commander une machine de fabrication additive avec les données de fabrication additive, - l'opération g. est réalisée de manière procédurale à partir des seules données d'objet dont sont tirées les données de densité, et données de rayon, 5 - le procédé comprend en outre les opérations suivantes : i. pour un couple associant des données de densité et des données de rayon, exécuter les opérations a. à d. pour déterminer un jeu de données de fabrication additive pour un objet de forme sensiblement cubique à partir de ce couple, j. appliquer une méthode d'homogénéisation pour en tirer une donnée 10 d'élasticité, - le procédé comprend en outre l'opération suivante : k. pour un couple donné, répéter les opérations i. et j. en faisant varier les déterminations pseudo-aléatoires de l'opération b., et réaliser une moyenne des données d'élasticité pour le couple donné. 15 D'autres caractéristiques et avantages de l'invention apparaîtront mieux à la lecture de la description qui suit, tirée d'exemples donnés à titre illustratif et non limitatif, tirés des dessins sur lesquels : - la figure 1 représente un diagramme schématique d'un dispositif selon invention, 20 - la figure 2 représente un exemple de mise en oeuvre d'une fonction par le modélisateur de la figure 1, - la figure 3 représente un exemple d'une fonction mise en oeuvre par le modélisateur et le constructeur de la figure 1 pour calculer des graines de cellules de Voronoi, - la figure 4 représente un exemple d'une fonction mise en oeuvre dans la fonction de la 25 figure 3, - la figure 5 représente une fonction mise en oeuvre par le dispositif de la figure 1 pour imprimer un objet, - la figure 6 représente un exemple de graphe de triplets produit par le modélisateur, et - les figures 7 et 8 représentent un exemple d'un objet fabriqué par le dispositif de 30 l'invention, et ce même objet sous une contrainte. 3049213 6 Les dessins et la description ci-après contiennent, pour l'essentiel, des éléments de caractère certain. Ils pourront donc non seulement servir à mieux faire comprendre la présente invention, mais aussi contribuer à sa définition, le cas échéant. 5 La présente description est de nature à faire intervenir des éléments susceptibles de protection par le droit d'auteur et/ou le copyright. Le titulaire des droits n'a pas d'objection à la reproduction à l'identique par quiconque du présent document de brevet ou de sa description, telle qu'elle apparaît dans les dossiers officiels. Pour le reste, il réserve intégralement ses droits. 10 En outre, la description détaillée est augmentée de l'annexe A, qui donne la formulation de certaines formules mathématiques mises en oeuvre dans le cadre de l'invention. Cette Annexe est mise à part dans un but de clarification, et pour faciliter les renvois. Elle est partie intégrante de la description, et pourra donc non seulement servir à mieux faire 15 comprendre la présente invention, mais aussi contribuer à sa définition, le cas échéant. La figure 1 représente un dispositif 2 selon l'invention dans son environnement. Le dispositif 2 comprend un constructeur 4, une imprimante 6 et une mémoire 8. Dans l'exemple décrit ici, le dispositif 2 comprend également un modélisateur 10 dont le 20 fonctionnement sera décrit ci-après. Dans le cadre de l'invention, la mémoire 8 peut être tout type de stockage de données propre à recevoir des données numériques : disque dur, disque dur à mémoire flash (SSD en anglais), mémoire flash sous toute forme, mémoire vive, disque magnétique, 25 stockage distribué localement ou dans le cloud, etc. Les données calculées par le dispositif peuvent être stockées sur tout type de mémoire similaire à la mémoire 8, ou sur celle-ci. Ces données peuvent être effacées après que le dispositif ait effectué ses tâches ou conservées. 30 Les données stockées dans la mémoire 8 sont des triplets qui associent une valeur d'élasticité, une densité et un rayon. Dans l'exemple décrit ici, ces données sont calculées par le modélisateur 10. En variante, elles pourraient être obtenues 3049213 7 différemment. Les données stockées dans la mémoire 8 pourraient également être agencées sous une autre forme que des triplets. Le constructeur 4 et le modélisateur 10 sont des éléments accédant directement ou 5 indirectement à la mémoire 8. Ils peuvent être réalisés sous la forme d'un code informatique approprié exécuté sur un ou plusieurs processeurs. Par processeurs, il doit être compris tout processeur adapté aux calculs décrits plus bas. Un tel processeur peut être réalisé de toute manière connue, sous la forme d'un microprocesseur pour ordinateur personnel, d'une puce dédiée de type FPGA ou SoC (« system on chip » en 10 anglais), d'une ressource de calcul sur une grille, d'un microcontrôleur, ou de toute autre forme propre à fournir la puissance de calcul nécessaire à la réalisation décrite plus bas. Un ou plusieurs de ces éléments peuvent également être réalisés sous la forme de circuits électroniques spécialisés tel un ASIC. Une combinaison de processeur et de circuits électroniques peut également être envisagée. 15 Le dispositif 2 reçoit des données d'objet 12 Les données d'objet 12 comprennent une description de la forme tridimensionnelle qui est souhaitée pour l'objet à imprimer, ainsi qu'une indication de l'élasticité sous la forme d'un champ de valeurs variant au sein de l'objet, de manière continue ou discontinue. 20 À partir des données d'objet 12, le constructeur 4 accède à la mémoire 8 et détermine un triplet pour chaque partie distincte de l'objet. Ensuite, à partir de la forme tridimensionnelle recherchée et du triplet obtenu, le constructeur 4 détermine de manière procédurale les emplacements de chaque couche devant être imprimés et 25 commande l'imprimante 6 pour produire en sortie un objet 14 qui présente des caractéristiques d'élasticité et la forme tridimensionnelle dictées par les données d'objet 12. Les objets réalisés au moyen du dispositif 2 peuvent être qualifiés de « mousses 30 procédurales de Voronoi ». En effet, l'invention s'inspire des méthodes d'affichage en 3 dimensions dans lesquelles la texture d'un pixel donné est déterminée de manière 3049213 8 procédurale, c'est à dire à partir d'un calcul appliqué de manière indépendante en tout point de l'objet. Pour cela, le constructeur 4 détermine pour chaque couche de l'objet des graines de 5 cellules de Voronoi dont la quantité est dictée par la densité du triplet tiré de la mémoire 8 à partir des données d'objet 12 pour la portion de l'objet en cours d'impression. Ensuite, chaque point de cette portion pouvant être imprimé est considéré comme plein 10 s'il se situe à une distance choisie des arêtes des cellules de Voronoi et vide sinon, la distance choisie correspondant au rayon du triplet tiré de la mémoire 8 à partir des données d'objet 12. La notion de distance doit être ici interprétée au sens large, il est donc possible de modifier la distance pour modifier la géométrie des arêtes de la mousse procédurale. 15 Ainsi, le constructeur 4 construit de proche en proche des branches qui correspondent aux arêtes des cellules de Voronoi, et qui présentent chacune une épaisseur choisie pour conférer à la structure une élasticité choisie. 20 La figure 2 représente un exemple d'une fonction mise en oeuvre par le modélisateur 10 pour établir les triplets valeur d'élasticité, densité et rayon. Pour cela, le modélisateur 10 génère une grande quantité de mousses procédurales de Voronoi pour un grand nombre de couples densité-rayon, et détermine par une méthode d'homogénéisation une valeur d'élasticité associée à ce couple. En variante, et de manière optionnelle, le modélisateur 25 10 peut aussi déterminer un coefficient de Poisson à associer au triplet ainsi formé. Le modélisateur 10 commence ainsi dans une opération 200 par exécuter une fonction Rand(), et stocke le résultat dans un tableau DR[]. La fonction Rand() a pour objectif de générer un très grand nombre de couples densité-rayon, afin de pouvoir offrir une 30 grande variété dans la construction des mousses procédurales de Voronoi qui seront produites par la suite. Cette fonction initialise également un indice i à 1, un indice g à 0, et un tableau ES[] à 0. 3049213 9 Ensuite, le modélisateur 10 exécute une double boucle. Cette double boucle parcourt les couples du tableau DR[], et, pour chaque couple, effectue une boucle dans laquelle un couple donné est utilisé un grand nombre de fois pour produire une mousse procédurale d'essai et pour en tirer une valeur d'élasticité (module de Young, et optionnellement le 5 coefficient de Poisson) correspondante. La double boucle commence donc par une opération 210 dans laquelle une fonction Pop() sort un couple du tableau DR[]. Ensuite la deuxième boucle commence dans une opération 220 avec l'incrémentation d'un indice g. Cet indice est utilisé pour générer de 10 la variété dans les mousses procédurales de Voronoi de la deuxième boucle. Ensuite, dans une opération 230, une fonction Til() est exécutée qui reçoit comme arguments un pointeur vers une fonction GS, la densité d du couple densité-rayon (d,r) courant, et l'indice g. La fonction GS() a pour rôle la génération d'un jeu de N de 15 graines de cellules de Voronoi qui définiront avec le rayon r la mousse procédurale de Voronoi de l'instance courante de la deuxième boucle. La figure 3 représente un exemple de mise en oeuvre de la fonction GS() et sera décrite plus bas. La fonction Til() génère une mousse procédurale de Voronoi en partant de données 20 d'objet décrivant un bloc cubique qui est de dimension suffisante (environ 3cm3 dans l'exemple décrit ici) pour appliquer une méthode d'homogénéisation (voir « Shape optimization by the homogenization method » par Allaire, G. 2012, vol. 146. Springer Science & Business Media). 25 Pour chaque point p de ce cube, la fonction GS() est appelée avec la densité d et un point q obtenu en ajoutant au point p un vecteur égal à g fois un vecteur de déplacement choisi. Le jeu de N graines de cellules de Voronoi résultant et le rayon r sont alors utilisés pour déterminer si le point p est plein ou vide, comme cela sera décrit avec la figure 5. Une fois tous les points p du cube parcourus, il en résulte une mousse V. 30 Dans une opération 240, une fonction Hom(), est alors exécutée afin de déterminer la valeur d'élasticité E (et optionnellement le coefficient de Poisson S) de la mousse 3049213 10 procédurale de Voronoi V reçue comme argument. L'élasticité de la mousse V est calculée en évaluant le tenseur d'élasticité homogénéisé (voir «Microstructures to control elasticity in 3D printing » par Schumacher, C., Bickel, B., Rys, J., Marschner, S., Daraio, C., and Gross, M., 2015, ACM Trans. Graph. 34, 4, 136:1-136:13). De la 5 même manière, le coefficient de Poisson peut également être calculé et stocké à cette étape. Ce résultat est stocké dans un tableau ES[] à l'indice i. Le tableau ES[] reçoit ainsi la liste des élasticités déterminées pour toutes les mousses associées à un couple (d,r) 10 donné pour un indice i donné d'exécution de la première boucle. Afin de déterminer si toutes les deuxièmes boucles ont été explorées, l'indice g est comparé à un seuil avgsd dans une opération 250. Si g est inférieur, alors la deuxième boucle est répétée à nouveau pour le même indice i de première boucle, avec 15 l'incrémentation de l'indice g dans l'opération 220. Sinon, alors la première boucle se termine pour l'indice i, avec l'exécution d'une fonction Avg() dans une opération 260. La fonction Avg() reçoit comme arguments la liste des élasticités ES[i], ainsi que la densité d et le rayon r. La fonction Avg() 20 détermine l'élasticité moyenne des mousses qui ont été réalisées sur la base de toutes les deuxièmes boucles pour l'indice i. Il en résulte un triplet (E,d,r) qui est stocké dans une matrice EDR[]. Le coefficient de Poisson peut également être moyenné lors de cette étape. Afin de déterminer une mesure de précision, il peut être avantageux de calculer également la déviation standard des élasticités pour un indice i donné. 25 Enfin, l'indice i de première boucle est incrémenté dans une opération 270, l'indice g est réinitialisé à 0 dans une opération 280, et la première boucle reprend avec l'opération 210. 30 Lorsque l'opération 210 détermine que tous les couples (d,r) du tableau DR[] ont été traités, la fonction se termine dans une opération 299. 3049213 11 La figure 3 va maintenant être décrite afin de mieux comprendre la fonction GS() de l'opération 230. Comme on le verra avec la figure 5, la mousse procédurale de Voronoi est construite sur 5 la base des arrêtes reliant les cellules de Voronoi calculées pour un emplacement donné en fonction de la densité choisie. Il s'agit donc ici de déterminer, pour un emplacement donné et la densité recherchée, quelles sont les cellules qui entourent l'emplacement donné et qui sont susceptibles de générer une arête de cellule de Voronoi contenant l'emplacement donné. 10 La fonction GS utilise une grille implicite en trois dimensions ayant au moins une graine de Voronoi dans chaque case. Ainsi, seules les cellules de Voronoi les plus proches de la case comprenant l'emplacement donné sont potentiellement pertinentes. Par grille implicite, on entend un prédécoupage cubique en cases de dimension fixe de 15 l'espace, qui dans l'exemple décrit ici présente une dimension comprise entre 2mm et 5mm, et est défini de manière implicite, c'est-à-dire que seul l'indice d'une case est retenu, et que toutes les données y étant relatives sont calculées à la volée. En variante, l'espace pourrait être découpé de manière différente (e.g. grille rhombus, grille en nid d'abeille), et/ou avec des dimensions différentes, et/ou avec une définition explicite. 20 La fonction GS() commence dans une opération 300 avec la réception d'une densité d et d'un emplacement q comme arguments, ainsi qu'avec l'initialisation à 0 de vecteurs N et V. Comme on le verra, l'emplacement q joue un rôle important sur l'aléas dans la production des graines de cellules de Voronoi par la fonction GS(), et la variation de g 25 permet donc de générer des mousses procédurales très variées pour une densité d fixée. Après l'initialisation, une fonction TRN() est exécutée dans une opération 310. La fonction TRN() reçoit q comme argument, et va déterminer toutes les cases qui entourent la case comprenant l'emplacement q et qui sont susceptibles de contenir une 30 graine de Voronoi qui pourrait influencer la cellule de Voronoi contenant l'emplacement q. La représentation de la situation sur une figure montre que la sélection de deux anneaux de cases autour de la case correspondant à l'emplacement q contient 3049213 12 toutes ces cases. La fonction TRNO sélectionne donc toutes les cases qui entourent sur deux anneaux la case autour de q, ainsi que cette case. Le résultat est stocké dans un tableau T[] de cases à visiter. En variante, pour améliorer les performances au prix de défauts de géométrie mineurs, un sous-ensemble des cases formant un seul anneau de 5 cases autour de q ainsi que la case contenant q peut être sélectionné, ou une combinaison de cases voisines directement ou indirectement de la case contenant q ainsi que cette case. Ensuite, une première boucle est lancée afin de déterminer, pour chaque case du tableau 10 T[] l'emplacement des graines de cellules de Voronoi pour ces cases pour la densité d. Ainsi, la première boucle commence dans une opération 320 avec l'extraction d'une case c à visiter dans le tableau T[] au moyen d'une fonction Pope. La case c est d'abord ajoutée au vecteur V dans une opération 330, puis une fonction SC() est exécutée dans 15 une opération 340 avec comme arguments la densité d et la case c pour déterminer des graines de cellules de Voronoi pour la case c et la densité d. Ensuite, la première boucle reprend avec l'opération 320, jusqu'à ce que toutes les cases du tableau T[] aient été visitées pour déterminer les graines de cellules de Voronoi 20 correspondantes, et que celles-ci aient été entrées dans le vecteur N[]. Une deuxième boucle optionnelle mais préférée est alors initiée dans une opération 350, afin de déterminer toutes les graines de Voronoi dans un rayon de deux cases autour de la graine la plus proche de l'emplacement q. Ceci est nécessaire pour garantir que toutes 25 les graines dont les cellules de Voronoi peuvent influencer l'emplacement q sont déterminées. Ainsi, dans une opération 350, une fonction Cl() parcourt toutes les graines du vecteur N et détermine la graine s qui est la plus proche de l'emplacement donné q. 30 3049213 13 Ensuite, dans une opération 360, la fonction TRN() est répétée sur cette graine s, et le tableau T[] se voit retirer les cases du vecteur V, car ces dernières ont déjà été visitées pour générer des graines de cellule de Voronoi avec les opérations 320 à 340. 5 La deuxième boucle détermine ensuite les graines de cellules de Voronoi du tableau T[] résultant, qui contient donc toutes les cases entourant à deux anneaux la graine s, moins les cases qui entourent à deux anneaux l'emplacement q. Cela est réalisé par dans des opérations 370 et 380 identiques aux opérations 320 et 340. Les opérations 350 à 380 permettent d'obtenir de meilleurs résultats, mais elles pourraient être omises. 10 Enfin, la fonction GSO se termine avec l'opération 399. La figure 4 représente un exemple de réalisation de la fonction SC(). Cette fonction a pour rôle, à partir d'une case c et d'une densité reçues en arguments, de générer les 15 graines de cellules de Voronoi correspondant à la densité recherchée. Pour cela, la case c va être divisée de manière répétée en sous-cases, jusqu'à ce que la taille des sous-cases soit telle que chaque sous-case contienne environ une graine. Il est important de noter que différents appels de la fonction SC(d;c) vont toujours générer exactement le même ensemble de graines pour une même case c. 20 Pour cela, dans une opération 400, la case c et la densité d sont reçues comme argument, et un indice de profondeur h ainsi qu'un vecteur N recevant les graines de cellules de Voronoi sont initialisés à 0. 25 Ensuite, dans une opération 405, une fonction Cl() est exécutée pour déterminer les coordonnées de la case c. Cette détermination est importante pour la parallélisation de la fonction SC() comme on le verra plus bas. La case c est alors divisée en sous-cases dans une boucle impliquant des opérations 410, 30 415 et 420. Dans l'opération 410, un nombre de graines théorique t est calculé en multipliant la densité d par une constante ccl correspondant à la taille des cases au plus haut niveau, laquelle constante est multipliée par deux à la puissance moins h, ce 3049213 14 produit étant élevé au cube. En effet, dans l'exemple décrit ici, comme l'espace est découpé de manière cubique, chaque profondeur supplémentaire (quand h croit) divise le volume de la case par huit. Dans l'opération 415, t est comparé à 8. En effet, si t est inférieur à 8, alors il n'est plus nécessaire de découper la case en sous-cases, puisque 5 chaque sous-case aura au maximum une graine de cellule de Voronoi. Sinon, dans une opération 420, une fonction Dwn() augmente les dimensions ijk afin de sous-diviser la case en huit sous-cases, puis l'opération 410 est répétée. Dans l'exemple décrit ici, les cases sont cubiques et sont découpées de manière 10 identique en sous-cases de volume identique, et toutes les cases de niveau le plus élevé ont un volume égal à celui de la case de niveau le plus élevé contenant l'emplacement q. En variante, les volumes des cases pourraient varier, les formes des cases et des sous-cases également, et le nombre de graines dans les sous-cases serait alors évalué en conséquence, de sorte que la somme du nombre de graines de Voronoi générées dans les 15 sous-cases corresponde au nombre de graines de Voronoi calculé pour leur case parente, comme les sous-cases forment une partition du volume de cette dernière. Lorsque la profondeur la plus basse utile pour la densité recherchée a été atteinte, une fonction Rand(ijk) est exécutée dans une opération 425. Cette fonction rentre dans un 20 vecteur I[] huit indices dans un ordre pseudo-aléatoire, chaque indice désignant une sous-case. La fonction étant pseudo-aléatoire, le même tableau I[] est produit pour une même valeur de ijk. Ensuite, un indice i est initialisé à 0 dans une opération 430. L'indice i est utilisé pour 25 parcourir les sous-cases du vecteur I[] et leur attribuer une graine de cellule de Voronoi si nécessaire. Une boucle est ainsi exécutée, dans laquelle une opération 435 détermine si suffisamment de graines ont été générées. En effet, t sera généralement une valeur non 30 entière. L'indice i est donc comparé à t-1. Si i est inférieur à t-1, alors il faut encore produire une graine de cellule de Voronoi dans la case désignée par I[i]. 3049213 15 Pour cela, une fonction RandS() est exécutée dans une opération 440. Cette fonction reçoit comme argument I[i] et détermine de manière pseudo-aléatoire un emplacement dans la case désignée par l'indice I[i], et le place dans le vecteur N de sorte qu'il occupe l'indice 0 s'il est plus proche de l'emplacement q que la graine de cellule de Voronoi 5 occupant l'indice 0. L'aléa de cette fonction dépend au moins en partie de l'indice de la sous-case, ce qui signifie qu'à chaque fois que la fonction est exécutée avec cet indice, c'est la même graine de cellule de Voronoi qui est générée. Et lorsque l'indice change, une autre 10 graine aléatoire est générée, etc. Ainsi, l'indice g de l'opération 230 fait varier les motifs de mousse procédurale produit, puisqu'il fait varier l'indice de la case pour laquelle les graines sont cherchées en décalant les points p concernés. La graine de cellule de Voronoi correspondante est stockée dans le vecteur N, puis 15 l'indice i est incrémenté dans une opération 445, puis le test de l'opération 435 est répété. Lorsque ce test est négatif, il faut générer une graine de cellule de Voronoi dans la prochaine sous-case, selon une probabilité correspondant à la partie décimale de t. Pour cela, une fonction RandLS() est exécutée dans une opération 450 et reçoit comme 20 argument I[i] et t. La fonction RandLS() est très similaire à la fonction RandS(), sauf qu'elle ne crée dans la sous-case restante (c'est-à-dire celles désignée par l' indice I[i]) qu'avec une probabilité égale à la partie décimale de t (c'est-à-dire t moins partie entière de t). Si une graine est ainsi générée, elle est également reçue dans le vecteur N. 25 Ensuite, dans une opération 455, une fonction Up() qui reçoit ijk comme argument est exécutée. Cette fonction détermine si la case ijk actuelle est la dernière case fille de la case parente de niveau supérieur, c'est-à-dire dans l'exemple ici décrit si ijk modulo (2,2,2) vaut (1,1,1). Si c'est le cas, alors les huit sous-cases de la case parente de niveau supérieur ont été traitées, et la fonction décrémente l'indice de profondeur h. La valeur 30 ijk est alors mise à jour en gardant la partie entière d'une division par (2,2,2), obtenant ainsi l'indice de la case parente de niveau supérieur. Par exemple, si la profondeur h était égale à 3 et l'indice ijk égal à (3,7,7), le nouvel indice h est égal à 2, et l'indice ijk 3049213 16 égal à (1,3,3), qui correspond à la case parente. Ce nouvel indice est lui-même testé pour déterminer si la case ijk actuelle est la dernière du niveau donné. L'opération est répétée jusqu'à déterminer une case ijk qui n'est pas la dernière case fille de son parent de niveau supérieur, ou qui est au niveau le plus élevé. Ainsi, lorsque la dernière sous- 5 case du niveau le plus profond est traitée, la fonction Up() remonte jusqu'au niveau 0. Ensuite, un test dans une opération 460 détermine si toutes les cases ont été traitées (c'est-à-dire si h a été décrémenté jusqu'à 0). S'il reste des sous-cases à parcourir, une fonction Nxt() qui reçoit ijk comme argument est exécutée dans une opération 465, et 10 sinon la fonction SC() s'arrête dans une opération 499. La fonction Nxt() est agencée pour organiser le parcours des sous-cases ayant une même case parente. En effet, comme à chaque niveau une case donnée se sous-divise en huit sous-cases, la case ijk de niveau h est une parmi huit sous-cases de sa case parente. La fonction Nxt() ajuste ijk pour parcourir les sous-cases d'une même case parente selon un ordre garantissant que 15 toutes les cases sont explorées, la dernière sous-case visitée ayant un indice ijk modulo (2,2,2) égal a (1,1,1). La boucle reprend alors avec l'opération 410, pour redescendre aussi profond que nécessaire dans la nouvelle case, etc. Cet agencement est particulièrement avantageux, car il permet de paralléliser 20 massivement les opérations de la fonction SC(), par exemple pour les exécuter sur un processeur graphique. En variante, la fonction SC() pourrait être programmée de manière récursive, ce qui est plus simple en termes de programmation, mais pose des problèmes pour un traitement parallélisé sur un GPU ou une architecture sans pile de données à l' exécution. 25 La figure 5 représente un exemple d'une fonction mise en oeuvre par le constructeur 4 pour fabriquer l'objet 14 à partir des données d'objet 12. La fabrication est une boucle dans laquelle les données d'objet 12, qui décrivent la 30 forme de l'objet en trois dimensions, ainsi que l'élasticité recherchée pour chaque portion, sont progressivement dépilées pour construire chaque couche de l'objet 14. 3049213 17 Une première opération est exécutée pour récupérer toutes les informations relatives à une couche donnée. Ainsi dans une opération 500, les données d'objet 12 sont dépilées par une fonction Pope, et stockées dans une variable Rg. Cette variable reçoit toutes les données d'élasticité de la couche courante à imprimer, ordonnées par position spatiale 5 dans le plan correspondant. Ensuite, dans une opération 505, une fonction Elast() extrait toutes les données d'élasticité et les range dans un vecteur e[]. Cette fonction peut être une simple copie ou comprendre une opération de normalisation ou d'homogénéisation pour tenir compte 10 d'un contexte lié à un objet particulier. Le vecteur e[] est exploité dans une opération 510 par une fonction Str() qui le reçoit comme argument, ainsi qu'un rayon rmin qui représente le rayon minimal d'impression de l'imprimante 6. 15 La fonction Str() est importante car son résultat est un champ de vecteurs r[] et d[] qui vont déterminer totalement la mousse procédurale de Voronoi qui sera imprimée comme cela a été expliqué précédemment. Pour cela, la fonction Str() accède à la mémoire 8 pour déterminer, pour chaque valeur d'élasticité du vecteur e[] un couple 20 rayon r et densité d correspondant. Comme on l'a vu, ce triplet a été calculé précédemment par le modélisateur 10. La figure 6 représente un exemple de diagramme tridimensionnel reliant tous les triplets pour un type de matériau additif choisi, comme une résine photosensible commercialisée sous le nom « B9R-1-Cherry » par la société B9Creators (marque déposée). 25 Dans l'exemple décrit ici, les triplets ont été déterminés en appliquant la théorie de l'homogénéisation à un motif de mousse procédurale de Voronoi répliqué. La théorie de l'homogénéisation a été validée pour des objets réguliers, c'est-à-dire composés uniquement d'un seul motif répété. Cependant, le but recherché est précisément une 30 hétérogénéité d'élasticité, et donc la mousse procédurale formant l'objet 14 ne sera par nature pas d'un seul motif répété. 3049213 18 Les travaux de la Demanderesse ont néanmoins montré que l'hypothèse d'homogénéité restait néanmoins valable dans le cas des mousses procédurales, avec une correspondance d'autant meilleure que la densité est élevée. Pour cette raison, la fonction Str() est prévue pour choisir en priorité un triplet dans lequel le rayon r vaut 5 rmin, afin de maximiser la densité d. Lorsqu'une valeur n'est pas explicitement présente, elle peut-être extrapolée. Les données représentées sur la figure 6 peuvent aussi être approximées par un polynôme, afin d'impliciter encore plus les données. Lorsque que, pour une élasticité donnée, le rayon rmin nécessiterait une densité trop importante, c'est la prochaine épaisseur réalisable après rmin qui est retenue, etc. 10 Ensuite, une boucle est commencée, qui va parcourir chaque point de la couche courante correspondant à Rg, et déterminer de manière procédurale si l'imprimante 6 doit ajouter de la matière, ou pas. Dans une opération 515, un point q est extrait de Rg, et dans une opération 520, les graines de cellules de Voronoi correspondantes sont 15 calculées au moyen de la fonction GSO, avec la densité d qui correspond au point q dans le tableau d[]. Une deuxième boucle est alors lancée qui parcourt chacune des graines de cellules de Voronoi, et il est cherché si l'emplacement q se situe à l'intérieur d'un espace situé 20 autour d'une arrête de cellule de Voronoi ayant l'épaisseur du rayon r associé à q dans le tableau r[]. Pour cela, dans une opération 525, un marqueur d'impression pl est initialisé à 0 et un indice i est initialisé à 1 pour parcourir le vecteur N, en tant que référence, N[0] 25 désignant la graine de la cellule de Voronoi la plus proche de l'emplacement q. Puis l'indice j est initialisé à la valeur i+1 dans une opération 530, et une fonction BLED est exécutée dans une opération 535. La fonction BLED a pour fonction de déterminer l'équation de l'arrête bl joignant les cellules de Voronoi de la cellule de la graine de cellule de Voronoi du vecteur N la plus proche de l'emplacement q (N[0]), de la cellule 30 d'indice i dans N (N[i]) et de la cellule d'indice j dans N (N[j]). 3049213 19 Une fois cette arête déterminée, une fonction Dist() détermine la distance entre cette dernière et le point q dans une opération 540. Si cette distance est plus grande que le rayon r, alors pl est inchangé et reste à 0, et la 5 boucle se poursuit avec l'opération 545. Dans l'opération 545, l'indice j est testé pour déterminer s'il faut l'incrémenter. S'il reste encore des indices j à parcourir dans N, alors j est incrémenté dans une opération 550 et la boucle répétée avec l'opération 535. Sinon, alors c'est l'indice i qui est testé pour déterminer s'il faut l'incrémenter dans une opération 555. S'il reste encore des indices i à parcourir dans N, alors i est incrémenté 10 dans une opération 560 et la boucle répétée avec l'opération 530. Sinon, alors pl est resté à 0 tout le long de la répétition des boucles, et l'emplacement q ne doit pas être recevoir de matière, donc l'opération 515 reprend pour traiter l'emplacement q suivant. Si la distance calculée par la fonction Dist() est inférieure à r, alors pl est mis à 1. De 15 manière optionnelle, la distance entre la projection de q sur l'arête bl et chacune des graines de N est calculée. Si une graine est plus proche de cette projection que la graine de la cellule de q, alors pl est remis à 0, sinon pl reste à 1. Dans ces deux cas, la boucle se poursuit dans une opération 565, dans laquelle une fonction Pnt() détermine si l'emplacement q doit être imprimé selon la valeur de pl, et commande l'imprimante 6 20 en conséquence. Ensuite, l'opération 515 reprend pour l'emplacement q suivant. Une fois que toutes les couches Rg ont été traitées, l'objet 14 a été imprimé et la fonction s'arrête avec une opération 599. 25 Au vu de ce qui précède, les mousses procédurales de Voronoi sont donc construites : - de manière procédurale, puisque chaque emplacement est évalué, au moment de son impression, pour déterminer s'il est vide ou plein, - correspondent, dans l'objet final, aux arêtes des cellules de Voronoi, avec une densité d et une épaisseur qui correspond au rayon r particulier à chaque emplacement. 30 Les fonctions GS() et SC() sont donc particulièrement avantageuses car elles permettent de réduire fortement la quantité d'informations à stocker d'un bout à l'autre de la 3049213 20 chaîne. En effet, les mousses procédurales sont intégralement définies par la densité et le rayon. Ainsi, de la production des triplets à leur consommation pour fabriquer les objets, trois paramètres suffisent à définir les mousses procédurales de Voronoi de l'invention. Cela permet d'économiser une quantité de données précédemment 5 ingérable dans l'état de l'art, avec un coût de calcul raisonnable. De plus, il apparaît que le constructeur 4 comme le modélisateur 10 sont chacun un générateur de graines de cellules de Voronoi utilisées pour définir si un emplacement est plein ou vide dans un objet final, qu'il serve à une qualification d'élasticité ou dans un objet à fabriquer. 10 De nombreuses variantes peuvent être envisagées. En effet, concernant les emplacements correspondant à une surface de l'objet, le traitement peut être complété pour apporter une « peau » ou du moins offrir une surface régulière (nonobstant les trous). Pour cela, il est possible de rajouter une couche supplémentaire de matière le long de la surface de l'objet, d'épaisseur choisie, donnant ainsi un aspect lisse à celui-ci. 15 Optionnellement cette couche peut être partiellement ajourée, selon un principe selon lequel un emplacement dans la couche est plein s'il est à une distance inférieure au rayon r d'une face du diagramme de Voronoi autour de cet emplacement. C'est cette option qui a été retenue pour l'objet des figures 7 et 8. 20 De même, lorsqu'il est détecté qu'un emplacement q est proche de deux arêtes sans être suffisamment proche compte tenu de leur rayon, il peut néanmoins être prévu d'imprimer l'emplacement correspondant, afin d'améliorer la tenue aux embranchements des arêtes entre elles. Il est également possible de produire une version filtrée (anti-crénelage) de la structure, qui considère un petit volume autour de 25 l'emplacement q, et détermine quel pourcentage de ce volume est interne à la structure (par exemple par sur-échantillonnage). La création des triplets peut être modifiée pour tenir compte d'analyses de conformité de l'élasticité. Le coefficient de Poisson pourrait également être utilisé. De plus, dans certains endroits, des calculs pourraient être réutilisés. Par exemple, pour la fonction de la figure 5, pour les emplacements q d'une 30 même cellule, les calculs des graines pourraient être réutilisés. Les mousses procédurales pourraient également être construites de manière différente qu'en déterminant la distance à chaque branche (ce qui revient à identifier l'appartenance à un 3049213 21 cylindre), par exemple en définissant d'autres géométries pour les branches. Certains blocs de graines de cellules de Voronoi pourraient également être précalculés sous la forme de triplets (bloc de graines, densité, emplacement). Enfin, pour des raisons esthétiques il est possible d'utiliser une densité plus faible et un rayon plus fort pour une 5 élasticité donnée, ou tout autre choix pour faire correspondre un rayon et une densité à l'élasticité choisie. REVENDICATIONS1. Dispositif de traitement de données pour fabrication additive, comprenant une mémoire (8) agencée pour recevoir des données d'emplacement désignant un emplacement et un élément de volume contenant cet emplacement, et un générateur (4) agencé pour déterminer des données de fabrication additive indiquant si un emplacement associé à des données d'emplacement est vide ou plein, caractérisé en ce que : - la mémoire (8) est agencée pour recevoir des données de densité et des données de rayon, et en ce que - le générateur (4, 10) est agencé pour calculer, pour un emplacement donné désigné par des données d'emplacement, des données de graines de cellule de Voronoi désignant des emplacements de graines de cellule de Voronoi d'un jeu de graines de cellules de Voronoi associé à l'emplacement donné, - le générateur est agencé pour déterminer lesdits emplacements de graines de cellules de Voronoi dans une pluralité d'éléments de volumes comprenant l'élément de volume contenant l'emplacement donné et des éléments de volumes sélectionnés dans un voisinage de l'élément de volume contenant l'emplacement donné, en divisant chaque élément de volume de la pluralité d'éléments de volume en un ou plusieurs sous-éléments de volume dont le nombre est calculé à partir des données de densité et du volume de chaque élément de volume, en déterminant de manière pseudo-aléatoire en fonction des données d'emplacement et des données de densité des sous-éléments de volume recevant une graine de cellule de Voronoi, et en déterminant de façon pseudo- aléatoire dans chaque sous- élément de volume recevant une graine de cellule de Voronoi des données de graine de cellule de Voronoi désignant un emplacement dans ce sous-élément de volume, - le générateur (4, 10) est en outre agencé pour définir au moins une branche à partir d'un triplet de graines de cellule de Voronoi choisies dans un jeu de graines de cellules de Voronoi associé à un emplacement donné dont l'une est la plus proche de l'emplacement donné, et pour définir des données de fabrication additive indiquant que l'emplacement donné est plein lorsque la distance entre 3049213 23 ledit emplacement donné et sa projection sur une branche est inférieure à une distance tirée des données de rayon, et lorsque ladite graine de cellule de Voronoi la plus proche de l'emplacement donné est la plus proche de ladite projection parmi le jeu de graines de cellules de Voronoi associé à 5 l'emplacement donné. 2. Dispositif selon la revendication 1, dans lequel le générateur (4, 10) est un modélisateur (10) agencé pour recevoir un couple associant des données de densité et des données de rayon, pour déterminer un jeu de données de 10 fabrication additive pour un objet de forme sensiblement cubique à partir de ce couple, et pour appliquer une méthode d'homogénéisation pour en tirer une donnée d'élasticité. 3. Dispositif selon la revendication 2, dans lequel le modélisateur (10) est agencé, 15 pour un couple donné, pour déterminer plusieurs jeux de données de fabrication additive en faisant varier les déterminations pseudo-aléatoires, et pour réaliser une moyenne des données d'élasticité pour le couple donné. 4. Dispositif selon l'une des revendications 1 à 3, dans lequel le générateur (4,10) 20 est un constructeur (4) agencé pour recevoir des données d'objet (12) définissant la forme d'un objet à produire par fabrication additive et comprenant des données d'élasticité associées à des emplacements désignés par les données d'objet, et, pour certains au moins des emplacements des données d'objets, pour déterminer des données de rayon et des données de densité à partir des données 25 d'élasticité associées, et déterminer des données de fabrication additive correspondantes. 5. Dispositif selon la revendication 4, dans lequel le générateur (4, 10) détermine de manière procédurale les données de fabrication de chaque emplacement 30 désigné par les données d'objet à partir des seules données d'objet dont sont tirées les données de densité et les données de rayon. 3049213 24 6. Dispositif selon l'une des revendications précédentes, dans lequel le générateur (4, 10) est agencé pour sélectionner des éléments de volume cubiques ayant un volume égal à celui de l'élément de volume contenant l'emplacement donné, lequel élément de volume est également cubique. 5 7. Dispositif selon l'une des revendications précédentes, dans lequel générateur (4, 10) est agencé pour diviser chaque élément de volume de la pluralité d'éléments de volumes en des sous-éléments cubiques et de taille identique entre eux. 10 8. Dispositif selon l'une des revendications précédentes, dans lequel le générateur (4, 10) est agencé, après avoir déterminé le jeu de graines de cellules de Voronoi pour un emplacement donné, pour déterminer la graine de cellule de Voronoi la plus proche de l'emplacement donné, et calculer un jeu de graines de cellules de Voronoi associé à l'emplacement de cette graine de cellule de 15 Voronoi. 9. Dispositif selon l'une des revendications précédentes, dans lequel le générateur (4, 10) est agencé pour sélectionner des éléments de volume dans un voisinage de l'élément volume contenant l'emplacement donné qui sont contigus 20 à cet élément de volume, ou qui sont contigus à un élément de volume contigu à cet élément de volume. 10. Procédé de traitement de données pour fabrication additive comprenant les opérations suivantes : 25 a. recevoir des données d'emplacement désignant un emplacement et un élément de volume contenant cet emplacement, des données de densité et des données de rayon, b. déterminer, pour un emplacement donné désigné par des données d'emplacement, des données de graines de cellule de Voronoi désignant des 30 emplacements de graines de cellule de Voronoi d'un jeu de graines de cellules de Voronoi associé à l'emplacement donné, dans une pluralité d'éléments de volumes comprenant l'élément de volume contenant l'emplacement donné et des 3049213 25 éléments de volumes sélectionnés dans un voisinage de l'élément de volume contenant l'emplacement donné, en divisant chaque élément de volume de la pluralité d'éléments de volume en un ou plusieurs sous-éléments de volume dont le nombre est calculé à partir des données de densité et du volume de chaque 5 élément de volume, en déterminant de manière pseudo-aléatoire en fonction des données d'emplacement et des données de densité des sous- éléments de volume recevant une graine de cellule de Voronoi, et en déterminant de façon pseudoaléatoire dans chaque sous- élément de volume recevant une graine de cellule de Voronoi des données de graine de cellule de Voronoi désignant un emplacement 10 dans ce sous-élément de volume, c. définir au moins une branche à partir d'un triplet de graines de cellule de Voronoi choisies dans un jeu de graines de cellules de Voronoi associé à un emplacement donné dont l'une est la plus proche de l'emplacement donné, d. définir des données de fabrication additive indiquant que l'emplacement donné 15 est plein lorsque la distance entre ledit emplacement donné et sa projection sur une branche est inférieure à une distance tirée des données de rayon, et lorsque ladite graine de cellule de Voronoi la plus proche de l'emplacement donné est la plus proche de ladite projection parmi le jeu de graines de cellules de Voronoi associé à l'emplacement donné. 20 11. Procédé selon la revendication 10, comprenant en outre les opérations suivantes : e. recevoir des données d'objet (12) définissant la forme d'un objet à produire par fabrication additive et des données d'élasticité associées à des emplacements 25 désignés par les données d'objet, f pour certains au moins des emplacements des données d'objets, déterminer des données de rayon et des données de densité à partir des données d'élasticité associées, g. déterminer des données de fabrication additive correspondantes en exécutant les 30 opérations a. à d.. 12. Procédé selon la revendication 11, comprenant en outre l'opération suivante : 3049213 26 h. commander une machine de fabrication additive avec les données de fabrication additive. 13. Procédé selon l'une des revendications 11 à 12, dans lequel l'opération g. est 5 réalisée de manière procédurale à partir des seules données d'objet dont sont tirées les données de densité, et données de rayon. 14. Procédé selon la revendication 10, comprenant en outre les opérations suivantes : 10 i. pour un couple associant des données de densité et des données de rayon, exécuter les opérations a. à d. pour déterminer un jeu de données de fabrication additive pour un objet de forme sensiblement cubique à partir de ce couple, j. appliquer une méthode d'homogénéisation pour en tirer une donnée d'élasticité. 15 15. Procédé selon la revendication 14, comprenant en outre l'opération suivante : k. pour un couple donné, répéter les opérations i. et j. en faisant varier les déterminations pseudo-aléatoires de l'opération b., et réaliser une moyenne des données d'élasticité pour le couple donné.