Besoin d'aide : Trier une liste d'objet par spline

Bonjour à tous, je recherche une méthode pour numéroter rapidement porte et châssis sur Revit. J’ai donc développer un script dynamo où l’on sélectionne une spline préalablement tracé qui nous donne après exécution du script deux liste : une pour les fenêtres et une pour les portes. L’objectif étant de les numéroter ensemble, j’ai donc joint les deux listes pour en créer une nouvelle. Problème, avec List.Join les liste s’additionnent sans tenir compte de l’ordre dans lequel les éléments croisent ma spline. La numérotation est du coup faussée car dynamo numérote d’abord les fenêtres puis les portes au lieu de les numéroter dans l’ordre d’intersection de la spline,…
Je vous laisse mon script pour ceux qui voudrait essayer.
D’avance merci du coup de main
Numérotation auto chassis et porte extérieur.dyn (74,4 Ko)

Bonjour,

J’avais fait il y a quelques temps un script qui faisait la même chose mais avec les pièces et une lignes:

Le script utilise data-shapes pour fournir une interface de sélectionne de pièces et de lignes (il te faudra seulement remplacer les pièces par les fenetres et les portes).
Ensuite il effectue une détection d’intersection entre les éléments et la ligne. On récupère le point d’intersection de chaque élément et on le compare par rapport à sa position sur la ligne (ou polyligne dans ton cas). On trie ensuite la liste par ses valeurs de position sur le courbe et (dans mon cas) on renumérote le numéro des pièces.

Bonne journée

Super merci beaucoup, je vais essayer ça et je vous reviens avec mes observations :slight_smile:

Rebonjour, alors j’ai essayer de comprendre votre principe pour l’appliquer à mon script mais je n’y arrive pas, voici une image de mon script, peut-être pourriez-vous me dire qu’est-ce qui cloche…

D’avance merci

Peux-tu déposer le fichier .dyn au lieu de l’image?

Bonne journée

Bien sur,

le voici : Numérotation auto chassis et porte extérieur.dyn (90,0 Ko)

encore merci pour votre coup de main :slight_smile:

J’ai modifié mon programme pour que ça fonctionne en fonction de tes besoins: Numérotation auto chassis et porte extérieur V2.dyn (78,2 Ko)
Il faut seulement le package Data-shapes pour que le mien fonctionne chez toi!

Bonne journée

Super merci beaucoup!!!
Pourquoi cela ne fonctionner pas avec ma méthode ?

Alors, j’ai essayer mais ça ne fonctionne pas je dois utiliser une spline ou des lignes?

Pour ta méthode, malheureusement je n’ai pas beaucoup de temps pour regarder en détail, j’ai trouvé ça plus simple d’adapter la mienne :slight_smile:

Ma méthode utilise des lignes. Attention d’ailleurs pour les fenetres qui seraient au dessus de la ligne et qui du coup ne « couperaient » pas la ligne.

En fait quand je dessine la polyligne coupant les portes et fenêtres il ne me détecte qu’une ligne et ne renomme que la première fenêtre ou porte sélectionnée

Bonjour,
En plus de l’idée d’Adrien,
Essaye d’utiliser le nœud geometry.DistanceTo
Il te permet de trier les éléments en fonction de leur distance aux points sur la spline;

Pour l’instant mon programme met les numéros dans l’ordre indépendamment entre les fenêtres et les portes en utilisant une série de ligne de modèle :slight_smile: :

1 J'aime

Oui !
Cela dépend de la logique. La logique que j’ai proposée prend en considération l’ordre des intersections entre la spline et les emplacements des éléments.
@Tollimin voir ci-dessous et voici le script : Numérotation auto chassis et porte extérieur_AHA.dyn (110,5 Ko)

1 J'aime

Merci à tous pour votre aide !!!
En plus de trouver une solution, vous m’avez permis d’apprendre de mais erreur.
Cela fonctionne voici mon script au cas où.Numérotation par façade des portes et châssis.dyn (83,8 Ko)
Encore un tout grand merci,

2 J'aime

Top j’essaie merci beaucoup

Merci beaucoup pour l’aide mais j’avoue que data Shappe est encore obscure pour moi,… Mais je vais apprendre :slight_smile:

Méthode en utilisant les paramètres d’une courbe

3 J'aime

J’attendais un code Python :wink:

3 J'aime

le voici :grin:
est utilisé ici la méthode Curve.Project() qui retourne un objet IntersectionResult qui contient directement le paramètre (de la courbe)

import clr
import sys
import System
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

def getLocPt(e):
	if isinstance(e.Location, LocationPoint):
		return e.Location.Point
	elif isinstance(e.Location, LocationCurve):
		return e.Location.Curve.Evaluate(0.5, True)
	else:
		bbx = e.get_BoundingBox(doc.ActiveView)
		return (bbx.Min.Add(bbx.Max)).Multiply(0.5)
		
toList = lambda x : x if hasattr(x, '__iter__') else [x]

curve = UnwrapElement(IN[0])
lstElems = toList(UnwrapElement(IN[1]))

guidCurve = curve.Location.Curve

OUT = sorted(lstElems, key = lambda x : guidCurve.Project(getLocPt(x)).Parameter)

4 J'aime