import sys import os import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.selector from ifcopenshell.api import run def load_model(filepath): print("loading " + filepath) model = ifcopenshell.open(filepath) return model def get_container(obj): if obj is not None: container = ifcopenshell.util.element.get_container(obj) if container is not None: return container.Name def get_walls(model): i=1 lst = [] for wall in model.by_type("IfcWall"): print(f"{i}:{wall.Name},container:{get_container(wall)}") lst.append(wall) i+=1 return lst def wall_type(model): walls = model.by_type("IfcWall") if len(walls) > 0: wall = walls[0] if wall is not None: print(wall) wall_type = ifcopenshell.util.element.get_type(wall) if wall_type is not None: print(f"The wall type of {wall.Name} is {wall_type.Name}") def select(model,what): print(f"{what}") lst = ifcopenshell.util.selector.filter_elements(model, what) for elem in lst: print(elem.Name) def create(name,objects): print("creating") model = ifcopenshell.file() project = run("root.create_entity", model, ifc_class="IfcProject", name="My Project") run("unit.assign_unit", model) context = run("context.add_context", model, context_type="Model") body = run("context.add_context", model, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=context) site = run("root.create_entity", model, ifc_class="IfcSite", name="My Site") building = run("root.create_entity", model, ifc_class="IfcBuilding", name="Building A") storey = run("root.create_entity", model, ifc_class="IfcBuildingStorey", name="Ground Floor") run("aggregate.assign_object", model, relating_object=project, product=site) run("aggregate.assign_object", model, relating_object=site, product=building) run("aggregate.assign_object", model, relating_object=building, product=storey) if False: wall = run("root.create_entity", model, ifc_class="IfcWall") run("geometry.edit_object_placement", model, product=wall) representation = run("geometry.add_wall_representation", model, context=body, length=5, height=3, thickness=0.2) run("geometry.assign_representation", model, product=wall, representation=representation) run("spatial.assign_container", model, relating_structure=storey, product=wall) for item in objects: print("adding",item) run("spatial.assign_container", model, relating_structure=storey, product=item) model.write(name) def compute(p): model = load_model(p) lst = get_walls(model) select(model,"IfcBuildingStorey") print("writing test.ifc") create("../output/test.ifc",lst) if len(sys.argv) == 1: arg = "duplex" #p = "../ifc/" + arg + ".ifc" p = "/home/fordjx/SOURCES/FORDJ/fordjx/hackathon-zurich/ifc/" + arg + ".ifc" compute(p) elif len(sys.argv) > 1: arg = sys.argv[1] print(f">> filename:{arg}") if (arg == "list"): print(os.listdir("../ifc")) p = "../ifc/" + arg + ".ifc" if os.path.exists(p): compute(p) else: print(os.listdir("../ifc")) else: print("extract [filepath]") # .