hackathon-zurich/python/extract.py
2024-02-03 13:14:13 +01:00

88 lines
3 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 lst:
print("adding",item)
run("spatial.assign_container", model, relating_structure=storey, product=item)
model.write(name)
if len(sys.argv) > 1:
arg = sys.argv[1]
print(f">> filename:{arg}")
if (arg == "list"):
print(os.listdir("./files"))
p = "./files/" + arg + ".ifc"
if os.path.exists(p):
model = load_model(p)
lst = get_walls(model)
select(model,"IfcBuildingStorey")
create("test.ifc",lst)
else:
print(os.listdir("./files"))
else:
print("extract [filepath]")