Revit-Géométrie des zones

Bonjour à tous,
Les zones HVAC possèdent une géométrie. Es il possible d’extraire les lignes qui en forment le contour (périmètre) et non pas une BondingBox qui ne pourra être le périmètre réel.
Daniel OLIVÈS

Un noeud python + le code suivant devrait faire ton bonheur

# Charger les bibliothèques DesignScript et Standard Python
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Les entrées effectuées dans ce noeud sont stockées sous forme de liste dans les variables IN.
Zone = UnwrapElement(IN[0])

# Placer votre code au-dessous de cette ligne

# Affectez la sortie à la variable OUT.
OUT = Zone.Boundary
3 « J'aime »

Bonjour Jean-Marc,
Voici le message d’erreur avec le code donné:
<Avertissement:IronPythonEvaluator.EvaluateIronPythonScript l’opération a échoué.
Traceback (most recent call last):
File «  », line 13, in
AttributeError: ‹ List[object] › object has no attribute ‹ Boundary ›>

Par contre le code suivant donne bien la boundingbox mais je souhaite récupérer les lignes associées au contour.
Daniel OLIVÈS

import clr
clr.AddReference("ProtoGeometry")
from Autodesk.DesignScript.Geometry import *
# Import RevitAPI
clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *
clr.AddReference("RevitAPIUI")
from Autodesk.Revit.UI import TaskDialog
# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# Import ToProtoType, ToRevitType geometry conversion extension methods
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)


doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

Zhvac = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_HVAC_Zones).WhereElementIsNotElementType().ToElements()
for z in Zhvac:
	Zbb = z.BoundingBox

#Preparing input from dynamo to revit
#element = UnwrapElement(IN[0])
#Zones = FilteredElementCollector(doc).OfClass(Wall).ToElements()
#OUT = Zones, dir(Zones[0])
OUT = [Zhvac, Zbb, ]	#dir(Zhvac[1])]>
for z in Zhvac:
	Zbb = z.Boundary

in lieu

for z in Zhvac:
	Zbb = z.BoundingBox

ça te donnera la liste des lignes qui constitue la bordure de ta zone

Bonjour Jean-Marc,
En retour J’ai :
« IronPython.Runtime.Types.ReflectedIndexer »
dans ma watch box
Daniel OLIVÈS

Re,
Voici la liste des méthodes associées:

Bonsoir,
Un peu de repos et de réflexion, j’ai bien les lignes avec .Boundary
Merci pour ton aide.
Daniel OLIVÈS

1 « J'aime »

Bonjour Jean-Marc,
z.Boundary donne bien une liste de lignes mais sous forme :
Autodesk.Revit.DB.Line
Comment obtenir les points « StartPoint » par exemple ?
Daniel OLIVÈS

Re bonjour,
Dur de démarrer ce matin:

for gl in geo:
	egl.append(gl.ToProtoType())

donne bien la liste des diverses informations
Daniel OLIVÈS

for line in z.Boundary:
    start_point = line.StartPoint
    end_point = line.EndPoint
    # pour obtenir les coordonnées des points: start_point.X (//Y//Z)

Re bonjour,
Encore merci pour ton aide.
Ma déception est de retrouver les lignes des espaces et non pas le contour de le zone HVAC.
Mon but était d’obtenir les lignes équivalentes au périmètre de la zone.
Mais cela m’a bien aidé à comprendre les ficelles associées au Python.
Daniel OLIVÈS

Voici une alternative en récupérant la géométrie des espaces de la zone, puis en fusionnant les surfaces lorsque c’est possible (murs communs).

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

#import Revit API
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)

	
def groupCurves(lstCurve, i = 0, max_iter = 10000):
	if len(lstCurve) > 0 and i < max_iter:
		loopCurve = [lstCurve.pop(0)]
		lst_idx = []
		while i < max_iter: 
			i += 1
			lenStart = len(lst_idx)
			for idx, c in enumerate(lstCurve):
				if any(c.DistanceTo(j) < 0.1 for j in loopCurve) and idx not in lst_idx:
					lst_idx.append(idx)
					loopCurve.append(c)
			if len(lst_idx) == lenStart:
				break

		otherCurves = [c for i, c in enumerate(lstCurve) if i not in lst_idx]
		return [DS.PolyCurve.ByJoinedCurves(loopCurve)] + groupCurves(otherCurves, i)
	else:
		return []

zone = UnwrapElement(IN[0])

optSpace = SpatialElementBoundaryOptions()
optSpace.SpatialElementBoundaryLocation  = SpatialElementBoundaryLocation.CoreCenter
surfacesSpace = []
for space in zone.Spaces:
	ArrArrSegments = space.GetBoundarySegments(optSpace)
	for segments in ArrArrSegments:
		proto_segments = [x.GetCurve().ToProtoType() for x in segments]
		polyCurve = DS.PolyCurve.ByJoinedCurves(proto_segments)
		surfacesSpace.append(polyCurve.Patch())

groupSurface = DS.Surface.ByUnion(surfacesSpace)
allcurves = groupCurves(list(groupSurface.PerimeterCurves()))

OUT = allcurves
2 « J'aime »

Bonsoir Cyril,
Un grand merci pour ce bout de code. Qui mérite d’être analysé plus en profondeur.
Une fois cela fait, mettrais à disposition le résultat de mes recherches pour la création de mes zones imbriquées.
Par contre il est vrai que j’ai une pièce réalisée avec des lignes d’espace et dans ce cas comme indiqué, cela ne fonctionne pas. Mais comme c’est un cas peu fréquent, ce n’est pas un problème.
Très bon week-end
Daniel OLIVÈS
Anse-Rhône

Bonsoir à tous,
Sur le forum US j’ai eu ce retour, pour les « Zones-Systèmes »

:

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
from System.Collections.Generic import List
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

zone = UnwrapElement(IN[0])

cLoop = zone.GetBoundaries()

OUT = [[revitLine.ToProtoType() for revitLine in loop] for loop in cLoop]

Cela fonctionne bien au 1er lancement du script, mais plus au suivants.
Dans le cas ou j’ai une liste de zones, certaines sont correctes 1 sur 3 ???
Daniel OLIVÈS
Anse-Rhône

2 « J'aime »