Visionner les web-conférences HEXABIM

Nous sommes +16 000 professionnels du BIM !

Rejoignez-nous >
Vous avez une question ?

Besoin de support technique, d'un avis ou un conseil ?


  1. mélanie pecheux
  2. Automatisation et développement
  3. mercredi 15 juillet 2020
  4.  Suivre par E-mail
Bonjour,

Je suis débutante sur Dynamo mais avec quelques recherches, j'ai réussi à trouver et modifier un script pour mettre un identifiant automatique sur mes éléments porteurs.

L'idée est de numéroter par niveau et par coordonnées (x,y comme la lecture d'un livre...). Exemple: 1.1 pour niveau 1, poteau/poutre 1

Le soucis que je rencontre est que la numérotation commence à 0 au lieu de 1.
Ensuite, je ne sais pas comment faire pour que l'identification se fasse en x et y et pas "n'importe comment" (j'ai beaucoup de mal avec les noeuds et l'anglais n'aide pas du tout...).

J'ai mis en pièce jointe mon script, merci pour votre aide :)
Pièces jointes
Réponse acceptée
Réponse acceptée Pending Moderation
Après pas mal de bidouillages et recherches sur internet, j'ai réussi à faire un script qui marche avec un préfixe pour le niveau (ici 1.xxx )

Ce que je fais, c'est que j'isole la catégorie par niveau, je sélectionne tout mes poteaux et je met le numéro/texte souhaité.
J'ai mis la sélection et le numéro d'étage en entrée pour que ça soit plus fluide avec le lecteur.

Si je veux faire un autre étage, je copie le script en dessous et je refais la même manip'

Si ça peut aider d'autres personne =)

Pour répondre à Guillain, quand je supprime un poteau, rien ne change car je ne fais pas le script en automatique mais en manuel. S'il y a des modifications, je change au cas par cas au fur et à mesure mais au moins je gagne du temps dès le début avec une numérotation plus ou moins correct.
Pièces jointes
Réponse acceptée Pending Moderation
Premièrement si tu veux opérer sur tous tes poteaux/poutres tu devrait plutôt utiliser All Elements of Category pour sélectionner tous les éléments d'une catégorie (ici Poteaux / ossatures)

Le soucis que je rencontre est que la numérotation commence à 0 au lieu de 1.

Pour commencer à 1 sur la création de ta séquence au debut de ta définition lieu de laisser par défaut 0, met la valeur 1.

Ensuite, je ne sais pas comment faire pour que l'identification se fasse en x et y et pas "n'importe comment" (j'ai beaucoup de mal avec les noeuds et l'anglais n'aide pas du tout...).


La ça se complique un peu, il va falloir pour chaque poteaux/poutre extraire les coordonnées pour en déduire l'identifiant.

A partir des coordonnées tu peux facilement trier tes éléments en X puis en -Y pour qu'il doit rangé dans le sens de lecture.

N’hésite pas à revenir vers moi
Réponse acceptée Pending Moderation
Effectivement j'avais pensé également à All elements of Category mais je voulais tester sur une partie du plan en ne sélectionnant que quelque éléments (et ne pas faire mouliner le PC).

J'ai réussi à commencer la numérotation à 1 (ce qui n'était pas compliqué au final...)

Pour le sens de numérotation, j'ai un autre script (voir ci-joint).
J'arrive a avoir une liste en X et Y de mes ossatures mais apparemment ça donne une "ligne" plutôt qu'une coordonnée XY.

Peut-être qu'en résolvant ce script, je pourrait le copier dans le premier et faire un mixe pour la numérotation.
Pièces jointes
Réponse acceptée Pending Moderation
Bonjour,

personnellement, j'utilise le centre de gravité pour trier mes éléments. Ensuite je trie simplement sur le Y. Si deux poutres ont le même Y, dynamo semble trier tout seul les éléments sur le X.

Ci-joint un exemple montrant comment le script numérote les poutres.



La ça se complique un peu, il va falloir pour chaque poteaux/poutre extraire les coordonnées pour en déduire l'identifiant.

A partir des coordonnées tu peux facilement trier tes éléments en X puis en -Y pour qu'il doit rangé dans le sens de lecture.

N’hésite pas à revenir vers moi


@Rémy MAURCOT# Comment tu fais pour relier directement l'identifiant aux coordonnées? Je trouverais ça plus "propre" que ma solution et sûrement plus approprié pour faire des manipulations d'objet un peu plus complexe
Pièces jointes
Réponse acceptée Pending Moderation
Salut! Peux-tu mettre une capture d'écran de ton script? Je n'arrive pas a ouvrir le fichier sur dynamo
Réponse acceptée Pending Moderation
Bonjour,
Voici les captures d'écran des 2 scripts, j'espère que l'on voit bien (j'ai dû les mettre sur un fichier word, le site ne prennais pas mes images...)
Pièces jointes
Réponse acceptée Pending Moderation
Génial! Merci beaucoup pour ta réactivité :)
Réponse acceptée Pending Moderation
Guillain Jolivet j'ai pas compris ta question, ta définition marche très bien.
Réponse acceptée Pending Moderation
Voila une capture du script
Pièces jointes
Réponse acceptée Pending Moderation
Guillain Jolivet, j'ai repris ton script pour essayer de "classer" les éléments car de mon coté, ça ne se range pas bien.

J'ai fais le même principe avec les X mais je ne sais pas quel noeud utiliser pour lui faire comprendre qu'il faut nommer en X puis en Y...

Je trouve dommage que dynamo ne soit pas plus intuitif...
Pièces jointes
Réponse acceptée Pending Moderation
Est-ce qu'à tout hasard tu as des bandes noyées? Quand tu lances le script, est-ce que dans les résultats du noeud Element.Geometry, tu as un "Empty List"? Si c'est le cas, lorsque tu applatis ta liste, tu vas décaler tes valeurs de Y. Donc quand tu vas chercher à rattacher cette liste de coordonnée à ta liste de poutre ça va tout se décaler et ta numérotation n'aura plus trop de sens. Il faut donc identifier le problème de pourquoi il y a une empty list.

Autre point, si tu bosses sur plusieurs niveaux, Dynamo s'exécute indépendamment de l'altimétrie, il faudrait trier par niveau avant. Pour ma part, je renseigne manuellement le numéro de niveau dans un paramètre et j'utilise ce paramètre pour trier et nommer mes poutres.

Après je ne sais pas sur quel genre de projet tu travailles, mais je viens d'essayer le script sur un de mes projet (type centre commercial) et la numérotation en X et Y n'a vite plus beaucoup de sens (j'ai des poutres dans tous les sens, en biais, alignés ou non sur les poteaux,...). D'autant qu'à chaque fois que tu vas ajouter/supprimer/modifier une poutre, ta numérotation va changer. Donc au cours d'un projet à chaque modification de ta poutraison, tu auras une nouvelle numérotation.
Réponse acceptée Pending Moderation
Tu peux refaire une capture d'écran de ton dernier script s'il te plait? :) Merci beaucoup!!
Réponse acceptée Pending Moderation
Ci-joint le script en capture d'écran, j'ai légèrement modifier pour ajouter une entrée pour choisir le premier numéro de la liste
Pièces jointes
Réponse acceptée Pending Moderation
J'ai un autre "souci" sur ce script:
J'aimerais mettre une entrée pour le lecteur dynamo afin de choisir le sens de lecture sans ouvrir dynamo lui-même.

Je pense qu'il faut faire 2 lignes du style "vrai = lecture du haut vers le bas (avec reverse)" et "faux= lecture du bas vers le haut (sans reverse). En clair, je veux un sens OU l'autre.

J'ai mis plein de noeuds mais impossible d'avoir le résultat souhaité, je pense que ce point serait pas mal pour d'autres scripts.
Pièces jointes
Réponse acceptée Pending Moderation
Je ne suis pas bien sûr d'avoir compris ce que tu voulais faire... Mais si tu veux choisir "vrai" ou "faux", via le lecteur dynamo dans revit et que ton script s'exécute dans un sens ou dans l'autre selon ce qui est coché, il suffit de créer un noeud Boolean, tu le définit en tant qu'entrée de ton script (clique droit > Est une entrée). Et derrière tu fais ton script avec un if qui te renvoie la liste inversée ou non.
Réponse acceptée Pending Moderation
En fait je ne veux pas que mon script s’exécute dans plusieurs sens. C'est juste que dans mon script, j'ai un noeud "reverse" qui me permet de numéroter dans un sens ou l'autre mon plan et il ne marche que s'il est relié a "list.flatten" sur ma 2e capture...
Seulement, on est obligé d'ouvrir dynamo pour le relier et voir quelle numérotation est la meilleure (suivant la configuration du plan).

J'aimerais faire une entrée ou l'on peux "activer" reverse ou non et voir le resultat directement à partir du lecteur dynamo.
J'ai tenté avec le noeud boolean mais j'ai l'impression que ça ne me donne que des vrai/faux après et des résultats null... par contre je n'ai pas pensé au if car pour moi il n'y a pas de conditions, juste l'un ou l'autre (d'où mon noeud "or";).
Réponse acceptée Pending Moderation
Tu mets un booléen dans ton script : SI true -> liste reverse, SI false -> liste normale. En configurant ce booléen en entrée de script, tu auras juste à exécuter ton script via le lecteur dynamo, et si le sens ne te conviens pas, tu le ré-exécutes en cochant l'autre option.
Pièces jointes
Réponse acceptée Pending Moderation
Merci beaucoup, ça marche!

En fait il n'y avait pas besoin d'autant de noeud ^^ mais l'idée était là :)
Réponse acceptée Pending Moderation
Je reviens pour avoir de l'aide afin d'améliorer encore mon script :D

Comme tu l'a suggéré Guillain, je prend tout les poteaux de mon projet et je tente de trier par niveau avant le reste.
J'ai donc fais 2 lignes: une pour le RDC et l'autre pour le R+1

J'ai réussi à prendre le niveau de mes poteaux mais quand je demande juste le nom, il m'indique une erreur (bien que ça ai l'air de marcher...) et ensuite, je ne vois pas comment faire pour que le bon niveau aille sur la bonne ligne (et donc trie mes poteaux par la suite)

J'ai tenté boolean mais je n'ai que des erreurs...
Pièces jointes
Réponse acceptée Pending Moderation
C'est quoi le paramètre "Niveau" que tu utilises? C'est toi qui l'a créé? Ce qui est bizarre c'est que sur ta capture d'écran, ça te renvoie bien un objet revit de type Niveau, et que derrière il t'envoie une erreur. J'ai essayé ton script avec "Niveau de base" comme paramètre, et je n'ai pas d'erreur.

Ensuite pour le tri et le nommage de tes poteaux, tu fais la même chose que pour ton tri en Y et en X, avec une couche de tri supplémentaire. Un List.GroupByKey de ta liste de poteaux avec tes étages en clefs, puis ton tri en Y puis en X.

Après si tu veux appeler tes poteaux P.2.11 plutôt que P.R+2 44.36.11, il faut trouver un moyen de transformer "R+2 44.36" en "2". Soit c'est un paramétrage avant où tu renseignes un numéro d'étage (à la main ou avec un script dynamo), soit tu dis directement dans ton script que "R+1 41.57" = "1", "R+2 44.36" = "2",... mais ça veut dire adapter ton script à chaque projet.
Réponse acceptée Pending Moderation
En fait au début, j'avais mis niveau de base et ça me met le même résultat... En cherchant ce matin, j'ai vu que dans ma liste, il y a des index de niveau non renseigné (un index avec du vide à côté) d'ou le fait qu'il ne puisse pas le convertir.

J'essaie un list.clean mais ça ne nettoie rien ^^ donc je dois trouver un noeud qui enlève les valeurs vide ou nul (et non null).

Concernant le non du niveau, c'est déjà réglé à la fin du script, j'ai mis un groupe "pour numéroter par niveau" et je l'ai mis en entrée.

En clair je souhaiterais faire une ligne par niveau en filtrant avec "R+0", "R+1", "R+2"... car ce sont des noms que l'on retrouvera dans plusieurs projet. Je pensais utiliser un String.contains par ligne et ne prendre que les True pour trier ensuite en X et Y avec le reste de mon script

Merci de ton aide en tout cas :)
Pièces jointes
Réponse acceptée Pending Moderation
Des index non renseignés? Si tu prends le niveau de base, c'est bizarre qu'il renvoie des valeurs vides (sauf si c'est un paramètre que tu remplies toi même). Et attention, pcq si tu vires des index de ta liste de niveau, après tu manipuleras des listes de coordonnées, et de poteaux qui seront de tailles différentes de ta liste de niveau, et ça va foirer à un moment. Mieux vaut voir pourquoi il renvoie des valeurs vides.

Si tu veux fonctionner par niveau, alors effectivement tu fais un tri par niveau, et à partir de ta liste de booléen, tu vas chercher dans ta liste de poteaux tous les indices correspondants. Ce qui revient à faire un List.GroupByKey!
Réponse acceptée Pending Moderation
En cherchant j'ai trouvé d'où venait les index non renseignés: ce sont des poteaux porteurs mais crée in situ (car forme particulière), je les numéroterais donc à la main pour ceux là.

Pour le reste, j'ai réussi à faire ce que je pensais, j'ai testé sur 3 niveaux et ça marche!
Par contre je n'ai pas utilisé de List.GroupByKey.... mais ça fonctionne après plusieurs FilterByBoolMask.

Je t'ai mis le fichier ci-joint si ça peut te servir ;)
Pièces jointes


Cette discussion ne contient encore aucune réponse.
Soyez le premier à y répondre !
Vous avez une question ?

Besoin de support technique, d'un avis ou un conseil ?


REJOIGNEZ +10.000 ADHERENTS !

Pas encore adhérent au réseau HEXABIM ? Plus de 10 000 professionnels ont rejoint la plateforme pour s'informer, apprendre et échanger autour du BIM et de la transition numérique.

L'adhésion est totalement gratuite, il suffit de demander votre invitation ci-après pour vous inscrire et accéder par la suite à toutes les ressources de la plateforme !

Découvrez les services Hexabim

recrutement

Recrutement

En savoir plus

Publicité

Publicité

En savoir plus

communication

Communication

En savoir plus

Hexabim

Se connecter