Copier les valeurs d'un paramètre d'une famille dans une autre famille à proximité

Bonjour à tous ,

C’est mon premier post ici.
Soyez indulgents, je découvre encore Dynamo, bien que je sois plus calé sur Revit. J’espère juste avoir un petit coup de pouce sur un sujet.

J’aimerais faire des bordereaux de menuiseries depuis Revit (nomenclature), mais je me retrouve bloqué sur un point :
Parfois, lorsque le projet possède des châssis tous différents et complexes, nous utilisons une famille « Fenêtre » ne possédant pas de châssis (juste un trou avec la battée, la tablette, seuil…) et nous plaçons ensuite une famille « Mur-rideau » dont les « panneaux de mur-rideau » reprennent les différentes divisions (porte, simple ouvrant, fixe, panneau plein…). Toutefois, dans les nomenclatures Revit, il s’agit d’éléments différents avec leur propre identifiant et sans lien possible entre eux.

Je me demande donc si vous connaissez une solution Dynamo pour « copier » la valeur de l’identifiant Revit d’une fenêtre (ou autre catégorie) vers un panneau de mur-rideau se trouvant à l’intérieur de celle-ci ou à proximité.
Je pourrais faire un volume particulier dans lequel doit se trouver les panneaux de mur-rideau si nécessaire, mais je ne trouve aucun nœud Dynamo permettant de créer un lien entre deux familles proches l’une dans l’autre.

Dans un second temps, je compte intégrer un paramètre numérique à chaque panneau de mur-rideau (a, b, c, d, e… en recommençant à chaque nouveau mur-rideau). Je n’ai pas encore trouvé, mais ça semble plus simple toutefois.

Merci.

Bonjour,

Ma première remarque, à la lecture de ce post, est pourquoi ne pas utiliser les assemblages ?
En faisant un assemblage directement dans Revit, il doit être plus facile de regrouper les objets dans les nomenclatures.

Sinon, dans Dynamo, je m’orienterais vers les BoundingBox et le nœud Geometry.DoesIntersect pour les regrouper. L’idée est de comparer les BoundingBox de la fenêtre vide et ceux des murs rideaux pour voir lesquels se touchent et le regrouper ainsi.

Edit : Une autre possibilité serait d’utiliser le nœud Geometry.DistanceTo, et de trier/grouper selon une distance max. Je te conseil également d’utiliser la géométrie des BoundingBox, car elle est plus simple de la géométrie de l’objets et fera moins ramer la simulation (si je ne me trompe pas).

Jean

1 « J'aime »

Merci Jean,

Je vais tenter les deux nœuds dont tu parles. Je n’ai pas encore assez l’habitude de dynamo pour trouver les bons nœuds, mais avec le temps, j’espère…

Sinon, les assemblages n’offrent pas beaucoup de possibilités dans les nomenclatures (paramètres des familles ne peuvent être repris…) et dans les cas des murs-rideau, seules leur panneaux peuvent être assemblé, pas le mur en entier, ce qui fait perdre l’intéret. enfin, faire une assemblage afin de les retrouver plus simplement dans dynamo est une idée aussi. J’ai juste peur que mes collèges ne le fassent pas systématiquement et que ce soit peu utilisable au final.

Voici un exemple de script pour illustrer mon propos :

J’ai ces éléments à grouper :

Première partie de script afin d’identifier les éléments « proches » les uns des autres (selon la distance max) :

Seconde partie du script pour créer et remplir les identifiants :

Il reste à adapter la sélection des éléments de base

2 « J'aime »

merci beaucoup Jean,

Je vais regarder tout cela en détail. Ce weekend peut-être afin d’avoir le temps. C’est le début pour moi, donc je pense que cela prendra du temps.

Je ne sais pas trop comment te remercier, mais c’est déjà une grande aide pour moi … afin de comprendre Dynamo et sur ce projet aussi

J’ai regardé rapidement, mais je me retrouve assez rapidement bloqué : Je préfère faire une sélection dans tout le projet par catégorie « fenêtre » et « panneau de mur-rideau », par contre, dynamo ne semble pas trouver la « Location » pour les panneaux de mur-rideau (Pourquoi ???).
J’ai donc pensé sélectionner tous les mur-rideau du projet (et ensuite sélectionner les panneaux dans les mur-rideau) et c’est déjà compliqué pour moi.

Pour le reste, ça semble fonctionner, sauf que je suis bloqué au bloc « List.GetItemAtIndex ». J’utilise donc deux catégories (fenêtres et murs pour tester), mais je n’arrive pas à les combiner dans l’input « List ». J’ai tenté le nœud « List.Combine », sans succès.

Je n’ai pas assez d’expérience et je recherche les nœuds avec beaucoup de difficulté !

N’hésites pas à mettre des captures d’écran de ton Dynamo pour nous aider à comprendre ton script.

Il semblerait qu’on ne puisse pas récupérer directement la localisation d’un panneau de mur rideau. Il faut procéder autrement.

Si tu veux « lier » les panneaux à la fenêtre de vide, ci-dessous un autre script.


Petites explications :

  • Tu veux faire le lien entre un nombre N de fenêtres et un nombre M de panneaux, sachant que M=f(N). Il faut donc que tu arrives à comprendre comment fonctionne les listes et sous-listes dans Dynamo. Il y a plein d’aide sur internet à ce sujet.

  • La partie Identification des éléments proches se sert des BoundingBox, en testant les fenêtres avec chaque panneaux. Nous avons donc une liste de panneaux qui se superposent par fenêtre. C’est pour cela que certains nœuds ont un petit « @L2 » en entrée, car ça permet de se référer aux sous-liste d’une liste. Voici à quoi correspond la liste en sortie du BoundingBox.Intersects :
    image
    Il faut après connaître les n° des lignes qui contiennent un oui (ou true) (d’où le AllIndicesOf), pour aller chercher une liste des panneaux par fenêtre qui se superposent :
    image

  • Certains nœuds seront capable d’aller chercher directement les sous-liste (comme GetItemAtIndex), d’autres auront besoins qu’on leur disent d’aller chercher les sous-listes (comme AllIndicesOf), et d’autres auront différents comportement selon ce qu’on leur demande. C’est l’expérience qui t’apprendra ça.

  • La partie Création des identifiants est juste une manipulation de listes et sous-liste pour créer des listes de taille dépendantes de ce que l’on aura trouvé à l’étape précédente.

  • Dans un Code Block, on peut écrire directement des lignes de codes. J’utilise le code 0…n pour créer une liste de 0 à n, ça marche de même avec les lettres. Cela me sert à créer autant d’identifiants que les listes sont longues. J’utilise aussi un dictionnaire pour transformer des chiffres (longueur des listes) en lettre.

  • Une fois mes listes d’identifiants créées, j’aplatie (elle repassent sur un seul niveau) les listes de sous-liste pour les injecter dans le nœud SetParameterByName. Ce n’est pas obligatoire mais ça peut simplifier leur utilisations dans le nœud.

2 « J'aime »

Salut,

Oui, j’ai plus ou moins compris pour les listes et sous listes (L2…), maintenant, tes infos éclaircissent certaines choses, effectivement.
Voici quelques printscreen… un projet Revit test basique avec différents cas de figure et le Dynamo que j’ai commencé.

En fait, il n’arrive à détecter qu’un seul panneau parmi tous ceux modélisés (en bas au centre de l’ensemble vitré). Les autres ne sont pas détectés.
Je me demande s’il ne serait pas plus utile d’identifier les éléments proches entre les « fenêtres » et les « murs-rideaux » et ensuite de prendre les panneaux compris dans le mur-rideau, mais là je cale. Je n’arrive même pas à sélectionner les murs-rideaux, donc je tente de prendre d’identifier les intersections entre les fenêtres et les murs, et il n’y a qu’un seul match également.
Du coup, j’ai tenté avec d’autres sortes de boundingbox, mais sans trop de succès non plus.

Par contre, je n’ai pas trop compris comment faire le Code block avec un input ListFenetre et l’autre ListePanneauParFenetre. Enfin, je pense que c’est plus pour simplifier la suite que réellement utile.

bon, le dynamo car je ne peux insérer qu’une image

autre test

Il y a un détail qui était affiché dans mes premières captures d’écrans que je n’ai pas précisé par écrit : Il faut que tu utilises une combinaison en Produit Vectoriel sur le bloc BoundingBox.Intersects. C’est le petit texte en bas à droite d’un nœud.
En mode Auto, le nœud vas combiner les éléments 1à1 jusqu’à épuisement de la liste la plus courte. Pour ce cas, on veut tester toutes les fenêtres avec tous les panneaux. Il faut faire Clique droit → Combinaison → Produit vectoriel

Petit exemple :

Le Code Block me sert juste à simplifier la visualisation du script, en regroupant les listes que je travail et en les nommant.

Enfin les autres bloc de BoundingBox que tu utilises n’ont pas la même fonctionnalité. L’un ressort la géométrie commune, et l’autre vérifie si un point y est contenue (Tu ne peux pas rentrer une BoundindBox en 3D dans une entrée qui demande un point, en 0D)

Merci beaucoup pour toutes ces infos !
J’avais suivi une petite formation Dynamo il y a quelques mois, et effectivement, je me rappelle désormais du produit vectoriel … Je suis encore vraiment loin de ton expérience ! et merci en tout cas pour tes explications très complètes.

Mais oui, ça fonctionne désormais dans la plupart des cas, il y a juste un problème lorsque je subdivise le mur-rideau en « supprimant un segment » (selon l’appellation de Revit). Cela crée des identifiants que la boundingbox ne retrouve pas, ce qui crée des « Nul » dans la liste dynamo.

Je vais tenter d’adapter légèrement la fin du script, car je préfère que l’on copie les identifiants des fenêtres vers ceux des panneaux plutôt que de tout recréer, mais j’espère m’en sortir seul sur ce point.

J’ai une dernière question : le remplissage a, b, c, d… des panneaux de mur-rideau se fait suivant l’ordre original des ID de Revit (donc selon l’ordre de création dans Revit, a priori). Penses-tu qu’il serait possible de les remplir selon un ordre « géométrique », du genre de droite à gauche et de haut en bas … ?

Je te remercie en tout cas pour le temps passé. Je ne suis pas certain de pouvoir te remercie autrement en retour, mais si tu as des questions sur Revit, je pourrais tenter d’y répondre. (Et si un jour tu désire tenter de fabriquer des arcs ou arbalètes en bois, alors là je pourrais t’aider en retour, mais c’est peu probable !)

1 « J'aime »

Je n’avais pas anticipé les panneaux fantôme, en effet.
Tu ne peux pas utiliser un List.Clean pour ce cas, car il faut préserver les indices. Le mieux est de nettoyer la liste des panneaux en début de script :

Oui, il doit être possible de trier selon la position. Je me servirais des nœuds BoundingBox.MaxPoint, puis List.SortByFunction ou List.SortIndexByValue/List.Reorder

Oui, le script semble fonctionner, par contre, j’ai l’impression que le fait d’avoir un noeud « orange » ne permet pas de l’exécuter correctement. Il est noté « Exécution terminée avec des avertissements », et du coup il ne modifie pas les identifiants au final.

Je pensais juste améliorer la sélection de départ avec une solution plus « Revit » que « Dynamo », car mes toutes mes familles de panneaux ont « ME » en tant que valeur du paramètre « Note d’identification ». Ça éviterait d’avoir le BoundingBox orange. Par contre, je tente de trouver un moyen avec ParameterFilterelement.byRules ou filterRule.byruleType… mais bon, ca ne fonctionne pas.

Un nœud avec un avertissement n’implique pas forcément un non-fonctionnement du script, car certains nœuds s’appliquent 1à1 sur les entrées, d’autre sous toutes les entrées d’un coup.

Pour ce cas le script a quand même le résultat escompté.

Tu peux en effet filtrer selon un autre paramètre. Mais tu auras du mal avec FilterRule, c’est un nœud pour les filtres de vue. Les nœuds sont regroupés selon ce sur quoi ils s’appliquent dans la liste des nœuds, pour t’aider à choisir les bons nœuds :

Oui, je tente de trouver depuis 2 heures, mais je ne vois vraiment pas comment filtrer les panneaux selon les note d’identification (trier uniquement ceux avec valeur « ME »)

Tu peux te servir comme exemple de ce que j’ai utilisé pour filtrer les Boundingbox vide.
Le principe est :

  • Vérifier un paramètre (Element.GetParameterValueByName, Equals)
  • Trouver les index des éléments qui nous intéresse (List.AllIndiciesOf)
  • Récupérer les éléments à ces index (List.GetItemAtIndex)

Tu peux aussi remplacer les étapes 2 et 3 par le nœud List.FilterByBoolMask, c’est plus court :

Merci beaucoup,

Cela fonctionne aussi avec les paramètres de « type »? Car j’ai tenté des heures ce genre de chose avec le paramètre « Note d’identification », et je n’ai pas de résultat, par contre, en voyant ton script avec « identifiant », je teste de mon côté également, et là, oui, ça fonctionne… La seule différence que je voit c’est les paramètres de « Type » et « Occurence » !