Files
IfcOpenShell/src/bonsai/scripts/classifications/xml_classification.py
T
2024-08-13 23:09:50 +10:00

99 lines
4.8 KiB
Python

# coding=utf-8
"""This script converts Graphisoft XML into an IFC file"""
import xml.etree.ElementTree as ET
import ifcopenshell
import ifcopenshell.guid
import os
class IFC4Extractor:
def __init__(self, xml_file):
self.xml_file = xml_file
self.tree = ET.parse(self.xml_file)
self.root = self.tree.getroot()
self.ns = {"xs": "http://www.w3.org/2001/XMLSchema"}
self.file = ifcopenshell.file()
self.data = {
"BB/SfB (3/4 cijfers)": {"source": "Regie der Gebouwen", "tokens": ["."]},
"BIMTypeCode": {"source": "BIMStockholm", "tokens": None},
"Common Arrangement of Work Sections (CAWS)": {"source": "NBS", "tokens": ["/"]},
"CBI Classification - Level 2": {"source": "Masterspec", "tokens": None},
"CBI Classification - Level 4": {"source": "Masterspec", "tokens": None},
"Rumsfunktionskoder CC001 - 001": {"source": "BIMAlliance", "tokens": ["-"]},
"CCS": {"source": "Molio", "tokens": None},
"CCTB": {"source": "CCT-Bâtiments", "tokens": ["."]},
"Funktionskoder Regionservice CD001 - 001": {"source": "BIMAlliance", "tokens": None},
"Rumsfunktion Blekinge CD002 - 001": {"source": "BIMAlliance", "tokens": None},
"EcoQuaestor Codetabel": {"source": "EcoQuaestor", "tokens": [".", "-"]},
"GuBIMclass CA": {"source": "GuBIMClass", "tokens": ["."]},
"GuBIMclass ES": {"source": "GuBIMClass", "tokens": ["."]},
"MasterFormat": {"source": "CSI", "tokens": [" ", "."]},
"NATSPEC Worksections": {"source": "NATSPEC", "tokens": None},
"NBS Create": {"source": "NBS", "tokens": ["_", "/"]},
"NL/SfB (4 cijfers)": {"source": "BIMLoket", "tokens": ["."]},
"NS 3451 - Bygningsdelstabell": {"source": "Standard Norge", "tokens": None},
"OmniClass": {"source": "OmniClass", "tokens": ["-", " "]},
"ÖNORM 6241-2": {"source": "freeBIM 2", "tokens": None},
"RICS NRM1": {"source": "RICS", "tokens": ["."]},
"RICS NRM3": {"source": "RICS", "tokens": ["."]},
"SFG20": {"source": "SFG20", "tokens": ["-"]},
"SINAPI": {"source": "Caixa", "tokens": ["/"]},
"STABU-Element": {"source": "STABU", "tokens": ["."]},
"TALO 2000 Building Component Classification": {"source": "Rakennustieto", "tokens": ["."]},
"TALO 2000 Hankenimikkeistö": {"source": "Rakennustieto", "tokens": ["."]},
"Uniclass": {"source": "RIBA Enterprises Ltd", "tokens": ["_"]},
"Uniclass 2015": {"source": "RIBA Enterprises Ltd", "tokens": ["_"]},
"UniFormat": {"source": "UniFormat", "tokens": ["."]},
"Uniformat": {"source": "UniFormat", "tokens": ["."]},
"VMSW": {"source": "VMSW", "tokens": ["."]},
}
def extract(self):
for system in self.tree.findall("Classification/System"):
project = self.file.create_entity("IfcProjectLibrary", Name=system.find("Name").text)
parent = self.file.create_entity(
"IfcClassification",
**{
"Source": self.data[system.find("Name").text]["source"],
"Edition": system.find("EditionVersion").text,
"EditionDate": self.get_edition_date(system),
"Name": system.find("Name").text,
"Description": system.find("Description").text,
"Location": system.find("Source").text,
"ReferenceTokens": self.data[system.find("Name").text]["tokens"],
},
)
self.file.createIfcRelAssociatesClassification(ifcopenshell.guid.new(), None, None, None, [project], parent)
children = system.findall("Items/Item")
self.get_children(children, parent)
def get_children(self, children, parent):
for child in children:
reference = self.file.create_entity(
"IfcClassificationReference",
**{
"Identification": child.find("ID").text,
"Name": child.find("Name").text,
"ReferencedSource": parent,
"Description": child.find("Description").text,
},
)
children = child.find("Children")
if children:
self.get_children(children, reference)
def get_edition_date(self, system):
d = system.find("EditionDate")
return "{}-{:02}-{:02}".format(d.find("Year").text, int(d.find("Month").text), int(d.find("Day").text))
def export(self, filename):
self.file.write(filename)
for filename in os.listdir("xml/"):
extractor = IFC4Extractor(f"xml/{filename}")
extractor.extract()
extractor.export(f"ifc/{filename[0:-3]}ifc")