Récupérer l'emplacement des éléments de légende

Bonjour,

Je suis en train d’automatiser la création des éléments de légende et leur étiquetage par un texte qui pointe sur un paramètre qui se trouve dans leurs propriétés.
Je n’arrive pas à détecter la localisation de ces éléments dans la légende. Le noeud « GetLocation » ne marche pas pour les éléments dont la catégorie est Legend Components.
Pourriez-vous m’aider à trouver une solution ?


Si vous avez besoin de plus d’éclaircissements pour comprendre ce que je cherche à faire, n’hésitez pas.

Merci

Le fichier dynamo : https://we.tl/t-OIZG61ZBnE

Hello!

Je dis pas que c’est mon code le plus propre mais j’arrive à mettre mes notes textuelles sur la droite:

Bonne journée

Bonjour,
une variante pour un seul composant (basé également sur la propriété BoundingBox)

bbxDS =Element.BoundingBox(x);
X = 0.5 * (bbxDS.MinPoint.X + bbxDS.MaxPoint.X );
Y = 0.5 * (bbxDS.MinPoint.Y + bbxDS.MaxPoint.Y );
Z = 0.5 * (bbxDS.MinPoint.Z + bbxDS.MaxPoint.Z );
loc = Point.ByCoordinates(X + offset, Y , Z);
1 J'aime

La transformation d’un Element to Geometry ne fonctionne pas sur les éléments que j’utilise :


Auriez-vous une autre solution ?
Je vous mets les familles que j’utilise via ce lien : https://we.tl/t-m6eYv0CCkE

le nœud Element.Geometry ne permet pas à ce jour extraire certains éléments dont leur géométrie est dépendante d’une vue

voici une alternative avec l’API Revit (extraction d’une seule instance géométrique, a améliorer pour plusieurs)

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

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

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument


def getComponLoc(e, opt, offset = 0):
	geoSet = e.get_Geometry(opt)
	for geo in geoSet:
		if isinstance(geo, GeometryInstance):
			geoElem = geo.GetInstanceGeometry()
			bbx = geoElem.GetBoundingBox()
			pt = (bbx.Min + bbx.Max ) * 0.5
			DS_Pt =  pt.ToPoint()
			DS_Pt = DS_Pt.Translate(offset, 0, 0)
			geoSet.Dispose()
			geoElem.Dispose()
			return DS_Pt

toList = lambda x : x if hasattr(x, '__iter__') else [x]
elements = toList(UnwrapElement(IN[0]))
offset = IN[1]

outDSPt = []
opt = Options()
opt.View = doc.ActiveView
for e in elements:
	ptDs = getComponLoc(e, opt, offset)
	if ptDs is not None:
		outDSPt.append(ptDs)

OUT =  outDSPt

Note il est également possible de remplacer le noeud TextNote.ByLocation par la méthode TextNote.Create() directement dans ce script

4 J'aime

Merci beaucoup Cyril. Même si le programme ne fonctionne que pour une seule instance géométrique, il répond parfaitement à ce que je cherche à faire.

1 J'aime