Comme le titre l'indique, IfcOpenShell est une bibliothèque open source qui peut analyser IFC, écrit à l'origine en C ++, mais a également des liaisons Python. Je vais. Parmi les outils IfcOpenShell, il y a IfcConvert, qui permet l'extraction de géométrie IFC. Diverses conversions de format telles que OBJ, IGES, DAE et STL sont possibles, et seules des formes spécifiques peuvent être extraites par GUID ou par nom. C'est généralement suffisant, mais lorsque vous essayez de faire beaucoup avec les informations d'attributs et les formes d'IFC, vous voudrez certainement jouer avec des données 3D telles que la géométrie et la topologie (bien que ce ne soit généralement pas le cas).
Dans ce cas, il est courant d'utiliser une bibliothèque (noyau CAD) appelée OpenCASCADE, qui est en fait incluse dans la bibliothèque. Cette bibliothèque est une bibliothèque open source établie de longue date utilisée pour FreeCAD etc., et semble fournir une fonction de modélisation 3D paramétrique.
À propos, les bibliothèques d'analyse IFC sont IFC ++ et xBIM Toolkit pour l'open source et [IFC Engine] pour les paiements. ](Http://www.ifcbrowser.com/) et apstex IFC Framework (certains sont gratuits).
En raison de la bibliothèque, nous préparerons un environnement Python 3.5. Dans mon cas, j'ai installé Anaconda et utilisé conda pour installer les bibliothèques requises. Il semble que le Python pris en charge soit jusqu'à 3,5, alors utilisez-le comme environnement et installez la version correspondante de la liaison Python d'OpenCASCADE pythonocc
. Cela peut être un facteur de l'environnement réseau, cela échouera un peu, il peut donc être préférable de construire à partir du code source.
conda install -c conda-forge -c oce -c dlr-sc -c ifcopenshell ifcopenshell
conda install -c conda-forge -c dlr-sc -c pythonocc -c oce pythonocc-core==0.17.3
Préparez également un fichier IFC approprié. ifcOpenHouse est un bon choix.
La géométrie IFC est décomposée en [ʻIfcRepresentationItem`] complexe (http://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifcgeometryresource/lexical/ifcrepresentationitem.htm). Plus précisément, il comprend des expressions de forme, des styles et des expressions de texture tels que le modèle de surface (Tessellatiob, etc.) et le modèle solide (CGS, B-reps, balayage, etc.). IfcOpenShell cache cette complexité et la traduit dans toutes les représentations de frontières unifiées (B-reps). De plus, il génère également MESH pour le rendu.
À propos, la modélisation de forme réelle en BIM semble dépendre de ce qu'on appelle le «noyau», comme ASIC et Paradsolid. Des expressions complexes telles que des découpes et des ouvertures peuvent être facilement modélisées.
Voici l'exemple le plus simple.
import ifcopenshell
from ifcopenshell import geom
def read_geom(ifc_path):
ifc_file = ifcopenshell.open(ifc_path)
settings = geom.settings()
for ifc_entity in ifc_file.by_type("IfcWall"):
shape = geom.create_shape(settings, ifc_entity)
#Obtenez le maillage
ios_vertices = shape.geometry.verts
ios_edges = shape.geometry.edges
ios_faces = shape.geometry.faces
#Essayez d'imprimer normalement
print(ios_vertices)
print(ios_edges)
print(ios_faces)
geom.setting ()
est une option de conversion qui, par défaut, produit un maillage de sommets, d'arêtes et de faces. Vous pouvez obtenir la forme de l'élément IFC indiqué par ifc_entry avec geom.create_shape (settings, ifc_entry)
. Les sommets sont des triplets composés de x, y, z, les arêtes les relient et la face se compose de trois sommets et arêtes.
Dans ce qui précède, nous avons obtenu la représentation de maillage qui peut être rendue directement, mais nous pouvons également obtenir la représentation de frontière B-reps (représentation de frontière) directement. Spécifiez les paramètres suivants dans geom.setting ()
. Dans ce qui suit, j'essaye de l'enregistrer dans un fichier.
settings = geom.settings()
settings.set(settings.USE_BREP_DATA, True)
occ_shape = shape.geometry.brep_data
# IfcOpenShell generate an Open Cascade BREP
with open("IfcOpenShellSamples/brep_data", "w") as file:
file.write(occ_shape)
Le format de sortie semble être Open Cascade BREP Format.
Dessinez en utilisant pythonOCC comme suit. Je trouve que la couleur est étrange, mais d'abord, c'est comme ça.
import ifcopenshell
from ifcopenshell import geom
# Specify to return pythonOCC shapes from ifcopenshell.geom.create_shape()
settings = geom.settings()
settings.set(settings.USE_PYTHON_OPENCASCADE, True)
# Initialize a graphical display window
occ_display = geom.utils.initialize_display()
ifc_file = ifcopenshell.open("ifcOpenHouse.ifc")
products = ifc_file.by_type("IfcProduct")
for product in products:
if product.is_a("IfcOpeningElement"): continue
if product.Representation:
shape = geom.create_shape(settings, product).geometry
display_shape = geom.utils.display_shape(shape)
if product.is_a("IfcPlate"):
# Plates are the transparent parts of the window assembly
# in the IfcOpenHouse model
geom.utils.set_shape_transparency(display_shape, 0.8)
#Il disparaîtra bientôt, alors bouclons ici
ifcopenshell.geom.utils.main_loop()
Recommended Posts