import ifcopenshell from ifcopenshell.api import pset_template import pandas as pd import os # === CONFIGURATION === csv_path = r"C:\Users\steve\OneDrive\Desktop\Suomi_pset_template.csv" # ← change this output_folder = r"C:\Users\steve\AppData\Roaming\bonsai\bonsai\data\pset" # ← Bonsai template folder # === LOAD CSV === df = pd.read_csv(csv_path) required_columns = {"PropertySet", "Property", "Description", "TemplateType"} if not required_columns.issubset(df.columns): raise ValueError(f"CSV must contain columns: {required_columns}") # Fill missing descriptions with empty strings df["Description"] = df["Description"].fillna("") # === START IFC FILE === model = ifcopenshell.file(schema="IFC4") # === GROUP BY PROPERTY SET === grouped = df.groupby("PropertySet") for pset_name, group in grouped: # Create the property set template pset = pset_template.add_pset_template( model, name=pset_name, template_type="PSET_OCCURRENCEDRIVEN", applicable_entity="IfcElement" ) # # Add each property template for _, row in group.iterrows(): pset_template.add_prop_template( model, pset_template=pset, name=row["Property"], description=row["Description"], template_type="P_SINGLEVALUE", primary_measure_type=row["TemplateType"] ) # === OUTPUT FILE NAME === filename_no_ext = os.path.splitext(os.path.basename(csv_path))[0] ifc_filename = filename_no_ext + ".ifc" output_path = os.path.join(output_folder, ifc_filename) # === SAVE IFC FILE === model.write(output_path) print(f"✅ IFC template saved to:\n{output_path}")