Mercredi 15 Juillet 2020
23 réponses
3.4K vues
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
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
0
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.
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.
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)
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.
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
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
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.
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.
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.
@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
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
Guillain Jolivet j'ai pas compris ta question, ta définition marche très bien.
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...
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...
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.
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.
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.
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.
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.
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.
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.
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".
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".
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.
Je reviens pour avoir de l'aide afin d'améliorer encore mon script
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...
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...
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.
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.
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
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
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!
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!
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
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
There are no replies made for this post yet.
Please login to post a reply
You will need to be logged in to be able to post a reply. Login using the form on the right or register an account if you are new here. Register Here »