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
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
Bonsoir,
Un peu de repos et de réflexion, j’ai bien les lignes avec .Boundary
Merci pour ton aide.
Daniel OLIVÈS
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
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