Wie der Titel schon sagt, ist IfcOpenShell eine Open-Source-Bibliothek, die IFC analysieren kann, ursprünglich in C ++ geschrieben, aber auch über Python-Bindungen verfügt. Ich werde. Unter den IfcOpenShell-Werkzeugen befindet sich IfcConvert, das die Extraktion der IFC-Geometrie ermöglicht. Verschiedene Formatkonvertierungen wie OBJ, IGES, DAE und STL sind möglich, und nur bestimmte Formen können nach GUID oder Name extrahiert werden. Dies ist im Allgemeinen ausreichend, aber wenn Sie versuchen, viel mit den Attributinformationen und -formen von IFC zu tun, sollten Sie auf jeden Fall mit 3D-Daten wie Geometrie und Topologie herumspielen (obwohl dies normalerweise nicht der Fall ist).
In diesem Fall wird häufig eine Bibliothek (CAD-Kernel) namens OpenCASCADE verwendet, die tatsächlich in der Bibliothek enthalten ist. Diese Bibliothek ist eine seit langem etablierte Open-Source-Bibliothek, die für FreeCAD usw. verwendet wird, und scheint eine parametrische 3D-Modellierungsfunktion bereitzustellen.
IFC-Analysebibliotheken sind übrigens IFC ++ und xBIM Toolkit für Open Source und [IFC Engine] für kostenpflichtige. ](Http://www.ifcbrowser.com/) und apstex IFC Framework (einige sind kostenlos).
Aufgrund der Bibliothek werden wir eine Python 3.5-Umgebung vorbereiten. In meinem Fall habe ich Anaconda installiert und mit conda die erforderlichen Bibliotheken installiert. Es scheint, dass das unterstützte Python bis zu 3.5 ist. Verwenden Sie es also als Umgebung und installieren Sie die entsprechende Version von OpenCASCADEs Python-Bindung pythonocc
. Es kann ein Faktor der Netzwerkumgebung sein, es wird ziemlich oft fehlschlagen, daher ist es möglicherweise besser, aus dem Quellcode zu erstellen.
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
Bereiten Sie außerdem eine entsprechende IFC-Datei vor. ifcOpenHouse ist eine gute Wahl.
Die IFC-Geometrie ist in komplexe [IfcRepresentationItem
] unterteilt (http://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifcgeometryresource/lexical/ifcrepresentationitem.htm). Insbesondere Formausdrücke, Stile, Texturausdrücke usw. wie Oberflächenmodell (Tessellatiob usw.) und Volumenmodell (CGS, B-Wiederholungen, Sweep usw.). IfcOpenShell verbirgt diese Komplexität und übersetzt sie in alle einheitlichen Grenzdarstellungen (B-Wiederholungen). Darüber hinaus wird MESH zum Rendern generiert.
Übrigens scheint die tatsächliche Formmodellierung in BIM von dem sogenannten "Kernel" wie ASIC und Paradsolid abzuhängen. Komplexe Ausdrücke wie Ausschnitte und Öffnungen können einfach modelliert werden.
Unten finden Sie das einfachste Beispiel.
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)
#Holen Sie sich das Netz
ios_vertices = shape.geometry.verts
ios_edges = shape.geometry.edges
ios_faces = shape.geometry.faces
#Versuchen Sie, normal zu drucken
print(ios_vertices)
print(ios_edges)
print(ios_faces)
geom.setting ()
ist eine Konvertierungsoption, die standardmäßig ein Netz aus Scheitelpunkten, Kanten und Flächen erzeugt. Sie können die Form des durch ifc_entry angegebenen IFC-Elements mit geom.create_shape (settings, ifc_entry)
abrufen. Die Eckpunkte sind Drillinge, die aus x, y, z bestehen, die Grate verbinden sie, und die Fläche besteht aus drei Eckpunkten und Graten.
Oben haben wir die Netzdarstellung erhalten, die direkt gerendert werden kann, aber wir können auch die Grenzdarstellung B-Wiederholungen (Grenzdarstellung) direkt erhalten. Geben Sie die folgenden Parameter in geom.setting ()
an. Im Folgenden versuche ich, es in einer Datei zu speichern.
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)
Das Ausgabeformat scheint [Open Cascade BREP Format] zu sein (https://www.opencascade.com/doc/occt-6.7.0/overview/html/occt_brep_format.html).
Zeichnen Sie mit pythonOCC wie folgt. Ich finde die Farbe seltsam, aber vor allem ist es so.
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)
#Es wird bald verschwinden, also lasst uns hier eine Schleife machen
ifcopenshell.geom.utils.main_loop()
Recommended Posts