Grouper et filtrer
Aimeriez-vous parfois disposer d’une plus grande granularité sur les données ou les objets dans Grasshopper ? Par exemple, vous est-il déjà arrivé de vouloir sélectionner des objets ayant un matériau particulier (par exemple, le verre) dans votre modèle ? Ou encore supprimer toutes les surfaces de votre modèle qui se trouvent sur un calque spécifique et dont l’aire est inférieure à une certaine valeur ? Avez-vous réussi à le faire (facilement) ?
Grasshopper 1 pour Rhino 8 possède de nouveaux composants qui vont vous permettre de gérer vos données plus efficacement.
Pour expliquer le fonctionnement de ces nouveaux composants, commençons par un exemple simple. Dans ce modèle de masses, vous verrez qu’il y a des brep qui représentent l’enveloppe extérieure des bâtiments et des surfaces qui représentent les étages. Les objets ont été placés sur différents calques et des couleurs différentes leur ont été attribuées en fonction du type d’usage (bureaux, résidentiel, etc.).

La plupart des objets comportent également des métadonnées sous la forme d’entrées de texte d’utilisateur. Vous pouvez trouver ces données en sélectionnant un objet dans le modèle et en ouvrant le panneau des propriétés de l’objet. Dans la partie supérieure de ce panneau, vous devriez voir plusieurs icônes. Cliquez sur celle qui s’appelle Texte de l’utilisateur pour l’attribut.

Commençons ce tutoriel en calculant l’aire totale de chaque bâtiment dans notre modèle de masses. Notre modèle comporte trois masses de construction. Un identifiant de bâtiment est attribué à chaque plaque d’étage sous la forme d’une entrée de texte d’utilisateur.

Grouper le contenu
Pour commencer, ouvrez l’éditeur de Grasshopper et cliquez sur File -> New document pour commencer une nouvelle définition.
Pour déterminer l’aire de l’ensemble des étages de chaque bâtiment, nous devons d’abord référencer tous les étages de notre modèle de Rhino dans notre définition de Grasshopper.
Ce tutoriel est axé sur le filtrage des données. Puisque nous avons organisé notre modèle en calques, nous pouvons filtrer les étages en utilisant l’entrée Layer (Calque) du composant de requête d’objets du modèle Query Model Objects (situé sous l’onglet Rhino et dans la sous-catégorie Object). En utilisant le caractère générique “*” après le mot Floors (Étages), Grasshopper sélectionnera tous les objets des sous-calques Floors.

Si vous passez le curseur de la souris sur le paramètre de sortie Objects, vous constatez que vous avez 31 surfaces qui représentent chacune des plaques d’étage de notre modèle.
Ensuite, nous allons devoir regrouper ces plaques d’étage en prenant comme critère de regroupement l’identifiant du bâtiment. Pour cela, nous allons utiliser le composant Group Content (sous l’onglet Rhino et la sous-catégorie Content) et connecter la sortie du composant de requête à l’entrée Content.
Ce composant utilise l’entrée Key pour déterminer comment regrouper le contenu dans différentes branches de l’arborescence de données. Lorsque vous cliquez avec le bouton droit de la souris sur l’entrée Key, plusieurs options s’offrent à vous.
Select Type - Dans ce menu déroulant, vous pouvez sélectionner le type de données que vous souhaitez diviser en différents groupes. Dans ce cas, nous voulons grouper toutes les surfaces qui représentent des étages. Nous allons donc sélectionner Model Object dans la liste déroulante puisque ces étages sont des objets de notre modèle de Rhino. Select Property/Key - En fonction du paramètre sélectionné dans le menu déroulant supérieur, le contrôle d’arborescence affichera une liste de propriétés ou de clés disponibles que vous pourrez utiliser comme critères de filtrage. Ici, nous allons chercher le nœud User Text dans le contrôle d’arborescence et cliquer sur l’icône “plus” située à côté pour afficher tous ses nœuds enfants. Comme nous voulons regrouper les surfaces en fonction de leur valeur Building ID, nous allons sélectionner ce nœud enfant dans l’arborescence.Si vous regardez la sortie Content, vous constatez que tous les étages ont été séparés en différentes branches en fonction de l’identifiant du bâtiment. La sortie Values donne une liste de toutes les valeurs clés uniques trouvées dans le contenu. Dans ce cas, nous voyons une liste de trois valeurs (1, 2 et 3) qui correspondent aux valeurs d’identifiant uniques trouvées dans la liste du contenu ainsi que dans les branches de l’arborescence des données du contenu groupé.

La dernière étape de ce processus consiste à additionner toutes les aires pour chaque branche de notre arborescence de données. Puisque toutes nos surfaces d’étages sont maintenant séparées en différentes branches, il est assez facile de passer la sortie du composant Group Content dans un composant Area, puis d’additionner toutes ces valeurs à l’aide d’un composant Mass Addition.

D’après la définition de Grasshopper ci-dessus, nous pouvons déterminer que :
- Bâtiment 1 = 43 622 pi²
- Bâtiment 2 = 36 626 pi²
- Bâtiment 3 = 5 736 pi²
L’intérêt de cette méthode de travail réside dans la facilité avec laquelle il est possible de modifier les critères de regroupement. Par exemple, supposons que vous souhaitiez déterminer la superficie totale correspondant aux différents types d’usage (résidentiel, bureaux, commercial, etc.) plutôt que l’aire totale de chaque bâtiment. Dans ce scénario, il suffit de modifier la propriété Key par “Use Type”. Tout le reste peut rester identique.

Si l’on change le critère de regroupement par “Use Type”, la somme totale des aires est la suivante :
- Commercial = 21 740 pi²
- Éducatif = 5 736 pi²
- Usage mixte = 11 326 pi²
- Bureaux 23 972 pi²
- Résidentiel = 23 210 pi²
Filtrer le contenu
En plus de regrouper, nous pouvons aussi filtrer le contenu en fonction d’une certaine condition. En règle générale, une condition de filtrage compare une propriété d’objet à une autre et donne une valeur booléenne (Vrai ou Faux). Par exemple, x est-il égal à y ? Ou encore x est-il supérieur ou égal à y ? Il est également possible de combiner ces règles dans des expressions plus complexes à l’aide d’opérateurs.
Reprenons donc notre modèle et créons une série de filtres qui sépareront les plaques d’étage selon les critères suivants :
- Le type d’usage (Use Type) doit correspondre à des bureaux (“Office”) ET
- L’aire des étages doit être supérieure à 2 250 pi² ET
- L’aire des étages doit aussi être inférieure à 2 500 pi².
Commençons par créer une nouvelle définition de Grasshopper. Dans le menu de Grasshopper, cliquez sur File -> New Document. Comme dans l’exemple précédent, nous allons utiliser le composant Query Model Objects avec le filtre Layer défini sur “Floors” pour référencer toutes les surfaces représentant les étages dans notre document de Grasshopper. La sortie doit contenir 31 surfaces qui représentent chacune des plaques d’étage de notre modèle.
Ensuite, nous allons créer un filtre qui définit notre première condition, à savoir filtrer toutes les plaques d’étage dont le type d’usage est égal à “Office”. Sous l’onglet Rhino et la sous-catégorie Content, vous disposez d’un certain nombre de filtres différents, dont plusieurs permettent de vérifier l’égalité. Cependant, pour ce tutoriel, nous allons commencer par ajouter un composant Match Text Filter sur notre toile.
Match Text Filter est un composant incroyablement puissant et flexible pour les comparaisons de texte. Dans ce filtre, nous voulons examiner chaque plaque d’étage et extraire la valeur attribuée à l’entrée de texte d’utilisateur “User Type”. Nous comparerons ensuite cette valeur pour vérifier si elle correspond au mot “Office” et nous filtrerons les objets en conséquence.
Le composant Match Text Filter peut fonctionner selon trois modes. Si vous cliquez avec le bouton droit de la souris au milieu du composant Match Text Filter, vous verrez une liste contenant les trois modes :

Dans cet exemple, nous ne nous intéressons qu’aux valeurs de texte qui équivalent (Equals) au mot “Office”. Nous allons donc sélectionner le mode Equals dans le menu du bouton de droite du composant MatchText Filter.
Ensuite, nous devons spécifier l’entrée Key pour déterminer comment filtrer le contenu. Comme dans l’exemple précédent, nous pouvons cliquer avec le bouton droit de la souris sur l’entrée Key et sélectionner “Model Object” dans le menu déroulant, puis “User Text” et “Use Type” dans le contrôle de l’arborescence.
La dernière étape consiste à définir l’entrée Pattern du composant Match Text Filter afin d’indiquer la valeur du texte à comparer. Dans cet exemple, nous voulons vérifier si la valeur Use Type est égale au mot “Office”. Nous allons donc ajouter un panneau de texte contenant ce mot et le connecter à l’entrée Pattern.
Maintenant que nous avons créé un filtre, nous devons ajouter un composant Filter Content sur notre toile pour effectuer l’action de filtrage à proprement parler. Nous voulons filtrer les 31 brep que renvoie le composant Query Model Objects. Le filtre que nous allons utiliser est celui que nous venons de créer à l’aide du composant Match Text Filter.

Si vous observez le résultat, vous remarquez que vous n’avez plus que 10 surfaces qui satisfont à nos critères de filtrage (à savoir les plaques d’étage dont l’usage correspond au type “Office”). Mais nous n’avons pas tout à fait terminé. Nous voulions également filtrer les plaques d’étages pour obtenir celles dont l’aire était supérieure à 2 250 pieds carrés mais inférieure à 2 500 pieds carrés.
Ajoutons un composant Greater Than Filter et plaçons-le sous notre composant Match Text Filter. Comme précédemment, nous devons définir l’entrée Key pour préciser la valeur que nous voulons comparer dans ce filtre. Dans ce cas, nous voulons que Key cherche la valeur de texte de l’utilisateur Area (Aire). Pour cela, cliquez avec le bouton droit de la souris sur l’entrée Key et sélectionnez “User Text”, puis “Area” dans l’arborescence.

Ensuite, nous devons définir une valeur numérique à laquelle comparer notre valeur d’aire. Ajoutez un Numeric Slider (glisseur numérique, que l’on trouve sous l’onglet Params dans la sous-catégorie Input) et définissez la valeur sur 2 250. Vous pouvez définir le minimum et le maximum de ce curseur comme vous le souhaitez ; ici nous avons choisi des valeurs de 2 000 et 2 500, respectivement.
Nous avons maintenant créé un filtre qui recherche les plaques d’étage de plus de 2 250 pieds carrés. Il nous faut à présent en créer un autre qui recherche les surfaces inférieures à 2 500 pieds carrés.
Ajoutez un composant Smaller Than Filter sous le composant Greater Than Filter que nous venons de créer. Définissez l’entrée Key sur la valeur de texte d’utilisateur Area. Sélectionnez le curseur que nous venons de créer et faites un copier/coller pour en ajouter un autre sur la toile. Définissez la valeur de ce nouveau curseur sur 2 500 et connectez sa sortie à l’entrée Value du composant Smaller Than Filter.
Nous avons maintenant trois filtres dans notre définition qui correspondent aux critères que nous avons définis ci-dessus. Cependant, nous devons les combiner de manière à ce que les trois filtres soient TRUE pour que le contenu soit filtré correctement. Pour ce faire, nous allons utiliser le composant Intersection Filter.
Ce composant vous permet de combiner plusieurs filtres ensemble et ne donne TRUE que si tous les filtres d’entrée sont TRUE. En maintenant la touche MAJ enfoncée, connectez la sortie de nos trois filtres à l’entrée Filters du composant Intersection Filter.
Enfin, remplacez le composant Match Text Filter connecté à l’entrée Filter du composant Filter Content par la sortie du composant Intersection Filter. Votre définition devrait ressembler à celle de l’image ci-dessous.

Vous remarquerez que le composant Filter Content ne renvoie plus que 5 brep. Ce sont les 5 plaques d’étage qui correspondent au type d’usage “Office” et dont l’aire est supérieure à 2 250 pi² et inférieure à 2 500 pi².

Essayez-les !
- Téléchargez et ouvrez le fichier de Rhino GroupingAndFiltering.3dm et la définition de Grasshopper GroupingAndFiltering.gh.
- Pour plus d’informations sur ces composants, consultez notre article sur Discourse.
Plus d’informations
Regardez notre vidéo Découvrez les types de données de Grasshopper ou visitez notre page Nouveautés dans Rhino 8 pour un aperçu de ces fonctionnalités.
Apprenez à utiliser d’autres composants de types de données dans les guides suivants :

Attributs d'objets dans Grasshopper
Apprenez à importer et/ou conformer des attributs d'objets, comme le nom le calque ou la couleur d'un objet, avec Grasshopper.

Utiliser le composant Script
Apprenez à utiliser le composant Script dans Grasshopper. Conçu pour fonctionner avec tous les langages pris en charge, il regroupe le comportement des anciens composants GHPython et C#.