Obtenir la géométrie d'ouverture d'une porte ou d'une fenêtre dans Revit peut-être un défi, surtout lorsque l'on a une multitude de paramètres de dimensions dans la famille.
if this article is not in your language, use the Google Translate
widget ⬈ (bottom of page for Mobile version ⬇)
À défaut d'analyser chaque paramètre afin de trouver les dimensions d'ouverture HxLxP, analysons la géométrie de l'élément, plus particulièrement les géométries non visibles.
Voici un exemple d'extraction de la géométrie d'ouverture d'une porte (ou d'une fenêtre) en analysant uniquement le style des lignes géométriques.
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.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
assemblies = System.AppDomain.CurrentDomain.GetAssemblies()
dynamo_asm = next((a for a in assemblies if a.GetName().Name == 'DynamoCore'),None)
dynamo_version = str(dynamo_asm.GetName().Version)
dynamo_version = tuple(int(x) for x in dynamo_version.split("."))
print('dynamo_version', dynamo_version)
pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
sys.path.append('%sIronPython 2.7Lib' % pf_path)
import itertools
def get_CutLinesOpenning(e):
lines = []
opt = Options()
opt.IncludeNonVisibleObjects = True
geoSet = e.get_Geometry(opt)
for g in geoSet:
if isinstance(g, GeometryInstance):
for gi in g.GetInstanceGeometry():
if isinstance(gi, Line):
if gi.GraphicsStyleId == ElementId.InvalidElementId:
# get horizontal Lines
vect = gi.ComputeDerivatives(0.5, True).BasisX
if abs(vect.Z) < 0.001:
lines.append(gi.ToProtoType())
opt.Dispose()
return lines
e = UnwrapElement(IN[0])
out = []
cutLines = get_CutLinesOpenning(e)
cutLines.sort(key = lambda x : x.StartPoint.Z, reverse = True)
for idx, (key_, group) in enumerate(itertools.groupby(cutLines, key = lambda x : x.StartPoint.Z)):
if idx == 0:
top = key_
if dynamo_version >= (2,16,0):
top_loopCurve = DS.PolyCurve.ByJoinedCurves([x for x in group], 0.001, False, 0)
else:
top_loopCurve = DS.PolyCurve.ByJoinedCurves([x for x in group])
else:
bottom = key_
DSSolid = DS.Curve.ExtrudeAsSolid(top_loopCurve, Vector.ByCoordinates(0,0,-1), abs(top - bottom))
out.append(DSSolid)
OUT = out
Note : On remarquera le changement de la méthode
PolyCurve.ByJoinedCurves()
depuis Dynamo 2.16
0 commentaires:
Enregistrer un commentaire