7 nov. 2021

[Dynamo+=Python] Contours des hachures DWG (liées)

 



À partir d'un dwg importé sous Revit, comment obtenir polylignes de contours des hachures ?.

if this article is not in your language, use the Google Translate widget (bottom of page for Mobile version)

Voici une astuce pour les récupérer sans passer par l'analyse de toutes les polylignes, de plus certaines hachures peuvent être démunies de leurs contours.

Sous Revit une fois le DWG importé (insertion ou liaison) la géométrie des hachures est représenté par des Solides aplanis, l'analyse de ces derniers permet de retrouver certaines informations liées aux hachures (dont les contours).



voici un exemple


import clr
import sys
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
doc = DocumentManager.Instance.CurrentDBDocument

importinstance = UnwrapElement(IN[0])
out = []
opt = Options()
geoSet = importinstance.get_Geometry(opt)
for geo in geoSet:
    if isinstance(geo, GeometryInstance):
        for g in  geo.GetInstanceGeometry():
            # alternative -> 'if isinstance(g, Solid) and g.Volume == 0:'
            if isinstance(g, Solid):
                for f in g.Faces:
                    if isinstance(f, PlanarFace) and f.FaceNormal.IsAlmostEqualTo(XYZ(0,0,1)):
                        # get Layer Name
                        gStyle = doc.GetElement(f.GraphicsStyleId)
                        gstyleName = gStyle.GraphicsStyleCategory.Name
                        for loopCurve in f.GetEdgesAsCurveLoops():
                            try:
                                ds_polycurv = DS.PolyCurve.ByJoinedCurves(x.ToProtoType() for x in loopCurve)
                                out.append([ds_polycurv, "Calque/Categorie : " + gstyleName])
                            except StandardError:
                                # Cannot create a Line. Points are probably coincident
                                # Impossible de créer une Line. Les Points sont probablement coïncidents 
                                pass

OUT = out

Note 1: 
Vous pouvez filtrer les contours par nom de calque en rajoutant une condition




Note 2 :
Dans cet exemple il n'est pas traité les éventuelles transformations à réaliser si l'import DWG a été déplacé au sein de Revit (Transform)

0 commentaires:

Enregistrer un commentaire