Automatisation de tâches

List | Dispatch

component Dispatch

Comment différencier une polysurface d'une autre ?

En joaillerie, si l'on souhaite créer une nomenclature automatique à partir d'un fichier Rhino, il est nécessaire, dans un premier temps, d'isoler les pierres des autres éléments. Or, dans Rhino et Grasshopper une pierre n'est rien d'autre qu'une polysurface (ou Brep). Il y a plusieurs solutions. La méthodologie de cette première solution s'appliquera à d'autres domaines d'application.

Alors comment identifier les polysurfaces "pierres" des autres polysurfaces ?



Gh Nurbs Curve PolyLigne
liste d'objets incluant des polysurfaces fermées "pierres", des polysurfaces et une surface

Le coeur de notre réfflexion sera d'identifier une ou plusieurs caractéristiques propres aux polysurfaces "pierres". Cela nous permettra d'utiliser le composant Dispatch, composant qui permet de trier une liste d'objets selon un modèle de répartition.

Avant cela, il est important de comprendre comment importer les objets Rhino dans Grasshopper.

Notez, dans l'image ci-dessous, les différences de résultat lorsque l'on utilise respectivement les composants Brep, Geometry et Surface. Un panel est placé au-dessus de chaque pour visualiser ce qu'il contient.

Pour les non initiés, l'import se fait en cliquant doit sur le composant et en choissisant Set Multiple Breps.

Composant Brep. 5 breps sont référencés. Les 5 objets semblent identiques.

Composant Geometry. Ce composant est capable d'identifier les types de géométrie.Ici, 1 surface et 4 breps. S'il y avait eu courbe, il aurait été capable de l'identifier.

Composant Surface. Il importe seulement les surfaces. 1 seule dans notre liste d'objets.



Gh Components Brep Geometry Surface
import avec les composants Brep, Geometry et Surface

Pour une première étape de tri, nous utiliserons le composant Geometry qui nous donne un élément différenciant : le type de l'objet. Comment filtrer nos objets et conserver seulement les Breps? En utilisant le composant Match Text. Il permet de retrouver un texte défini dans une liste de mots.

A l'entrée Pattern nous allons connecté un Panel avec les mots "Referenced Brep". Nous connecterons le composant Geometry dans l'entrée Text. Entrée qui est supposée ne recevoir que du texte. Sa force est de pouvoir lire le texte lié à nos géométries tout comme le fait un panel.

En sortie du composant Match Text nous obtenons une liste de valeurs booléennes (vrai ou faux). Nous pouvons donc utiliser cette liste comme Dispatch Pattern pour filtrer notre liste d'objets.



Gh Match Text
premier filtre pour ne conserver que les Breps

Aperçu du résultat dans l'image ci-dessous.


Gh Nurbs Curve PolyLigne
nouvelle liste d'objets ne contenant que des polysurfaces

2e étape. Une pierre est une polysurface fermée. Y aurait-il une ou plusieurs polysurfaces ouvertes dans cette liste d'objet ? C'est ce que nous allons vérifié maintenant.

Nous utiliserons le composant Brep Edges pour nous aider. Pourquoi ? La sortie Naked de ce compsant permet d'identifier des bords nus ou ouverts. S'il y en a un ou plus alors c'est une polysurface ouverte. Le composant List Length permet de compter le nombre d'objets dans une ou plusieurs listes. Dans notre exemple, il compte le nombre de bords libres par objet.

A cette étape, nous n'avons pas encore de valeurs booléennes. C'est pourquoi nous utilisons le composant Larger than pour déterminer si les valeurs en sortie de List Length sont supérieures à 0. Dans notre exemple, nous avons un seul objet qui possède des bords libres. Les 3 autres, non. Le panel affiche les valeurs booléennes résultantes.

Remarque. En sortie de List Length, j'ai utilisé la fonction Flatten pour écraser les listes en une seule. L'objectif est de faire correspondre la liste de 4 objets avec une liste de 4 valeurs booléennes (plus d'informations dans la vidéo).



Gh Brep Edges
deuxième filtre pour déterminer si les polysurfaces sont ouvertes ou fermées

Maintenant que nous avons une liste de valeurs booléennes nous pouvons utiliser le composant Dispatch de la même manière qu'à l'étape précédente.



Gh Dispatch
3 polysurfaces sont fermées

Aperçu du résultat dans l'image ci-dessous.



Gh Nurbs Curve PolyLigne
nouvelle liste d'objets ne contenant que des polysurfaces fermées

3e étape. Pour le moment, nous sommes restés sur une réflexion très générale puisque nous avons filtrer notre liste d'objets en nous intéréssant aux types de géométrie et à la qualité de la géométrie. Cela est valable pour beaucoup d'autres problématiques. La nôtre concerne la joaillerie. Intéressons-nous maintenant à ce qui caractérise une polysurface "pierre".

Vous avez, peut-être, naturellement pensé aux nombres de facettes qui caractérise une pierre taillée. Cela est possible, on peut quantifier le nombre de faces grâce aux composants Deconstruct Edges et List Length (image ci-dessous). Ce sera d'ailleurs facilité si vous utilisez en référence une bibliothèque de pierre qui fixera le nombre de faces pour chaque polysurface "pierre". Mais si vous utilisez un fichier CAO d'un prestataire extérieur cela peut compliquer la tâche.



Gh Dispatch
nombre de faces par objets

Je vous propose une autre idée. Regardez l'image ci-dessous. La table de chaque pierre apparaît en orange. La table est la facette plane supérieure la plus large et la plus visible de la pierre. Nous utiliserons ces deux caractéristiques : la taille de sa surface et sa planéité.



Gh Nurbs Curve PolyLigne
sélection de la table de chaque pierre

Nous allons isoler cette facette. Pour cela, nous commençons par décomposer notre polysurface grâce au composant Deconstruct Brep. Nous mesurons ensuite la taille de toutes les surfaces avec le composant Area. Puis, nous utilisons le composant Sort List pour ranger les surfaces du plus petit au plus grand. Comment fonctionne-t-il ? La liste que l'on veut ranger est connectée à l'entrée Values A. L'entrée Keys est le critère de rangement, dans notre exemple, l'aire de chaque surface.

Remarque. En sortie de Sort List, l'option Reverse est activée (clic droit). Dans quel but ? Inverser le rangement et nous permettre de placer la surface la plus grande à la première place de la liste. Cela permet de la sélectionner plus facilement avec le composant List Item Index 0 (valeur par défaut).



Gh Nurbs Curve PolyLigne
isoler la plus grande surface de chaque objet

Nous allons maintenant vérifier si ces surfaces sont planes avec le composant Is Planar. Cela nous permet d'obtenir une liste de valeurs booléennes (vrai ou faux) que l'on utilise pour le composant Dispatch. De cette façon, nous avons identifié et isolé les tables des polysurfaces "pierre".



Gh Nurbs Curve PolyLigne
vérifier la planéité des plus grandes surfaces

Maintenant il nous faut sélectionner les polysurfaces correspondantes à ces surfaces. Comment faire ? Nous souhaitons utiliser le composant Tree Branch. Il permet de sélectionner les branches d'un arbre de données selon leurs adresses. Il nous faut donc un arbre de données (entrée Tree) et les chemins ou adresses (Path) pour sélectionner les branches dans lesquelles il y a nos pierres.

En entrée de cette sous partie, nous avons la liste de 3 breps sur lesquels nous avons travaillé précédemment et les surfaces isolées.

Nous utilisons le composant Graft Tree sur notre liste de breps pour donner un chemin spécifique à chaque objet (voir panel au dessus du composant). Pourquoi faire cela? Pour créer un arbre de données.

Le composant Deconstruct Brep, utilisé précédemment, avait créé des chemins similaires. Et nous avons travaillé uniquement avec des listes de données (ou des arbres de données) depuis cette étape. Les surfaces isolées sont rangées par liste (ou branche) avec une adresse spécifique pour chaque branche de cet arbre de données. Nous souhaitons récupérer les chemins ou se trouvent les surfaces isolées pour retrouver les polysurfaces correspondantes et ainsi identifier nos pierres.

Les composants Clean Tree et Tree Statistics permettent respectivement d'élaguer notre arbre en supprimant les branches vides et récupérer les adresses de chaque branche. {0;1} et {0;2} dans notre exemple.

Remarque. Un sigle Invert apparaît sur l'entrée Remove Empty du composant Clean Tree pour l'activer.



Gh Component Tree Branch
les pierres sont sélectionnés



Gh Nurbs Curve PolyLigne
les pierres sont sélectionnés

Il ne reste plus qu'à créer une nomenclature automatique...

vidéo disponible prochainement

vidéo Grasshopper 2 bêta disponible prochainement






Y aurait-il une autre manière de faire ?

Une autre solution plus rapide est possible à condition qu'un travail de référencement ait été effectué en amont dans Rhino, celui de donner un nom aux polysurfaces. Dans notre exemple de joaillerie, donner un nom spécifique aux polysurfaces "pierre" permettra de les retrouver facilement. Comment ?

Nous allons utiliser le composant Content Information pour lire le nom qui a été attribué aux polysurfaces (voir script ci-dessous). Comme vous pouvez le constater certaines polysurfaces ont un nom d'autres non (ligne empty).



Gh Component Content Information
lecture des noms des objets enregistrés dans Rhino

Nous savons que nos pierres ont pour nom le mot "Gem" suivi d'une référence. Nous pouvons donc utiliser le composant Match Text que nous avons déjà utilisé dans le script précédent. La liste de noms est connecté à l'entrée Text. A l'entrée Pattern, nous avons connecté un Panel dans lequel est écrit le mot qui nous intéresse "Gem" ainsi qu'un astérisque. Pourquoi ajouter ce sigle? Cela permet d'ajouter tout caractère de texte après le mot Gem. De cette façon, tous les noms comment par "Gem" seront sélectionnés.



Gh Component Content Information
filtre pour trier les polysurfaces selon un mot clé