2021-03-27 22:52:52 +11:00
|
|
|
import importlib
|
2021-05-19 14:45:36 +10:00
|
|
|
import ifcopenshell
|
2021-03-27 22:52:52 +11:00
|
|
|
import ifcopenshell.api
|
|
|
|
|
|
|
|
|
|
|
2021-05-19 14:45:36 +10:00
|
|
|
registered_ifcs = {}
|
|
|
|
|
pre_listeners = {}
|
|
|
|
|
post_listeners = {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run(usecase_path, ifc_file=None, should_run_listeners=True, **settings):
|
|
|
|
|
ifc_key = registered_ifcs.setdefault(ifc_file, ifcopenshell.guid.new())
|
|
|
|
|
|
|
|
|
|
if should_run_listeners:
|
|
|
|
|
for listener in pre_listeners.get(".".join([ifc_key, usecase_path]), []):
|
|
|
|
|
listener(usecase_path, ifc_file, **settings)
|
2021-05-29 01:06:38 +02:00
|
|
|
|
|
|
|
|
if None in registered_ifcs and ifc_key != registered_ifcs[None]:
|
|
|
|
|
global_key = registered_ifcs[None]
|
|
|
|
|
for listener in pre_listeners.get(".".join([global_key, usecase_path]), []):
|
|
|
|
|
listener(usecase_path, ifc_file, **settings)
|
|
|
|
|
|
2021-03-27 22:52:52 +11:00
|
|
|
importlib.import_module(f"ifcopenshell.api.{usecase_path}")
|
|
|
|
|
module, usecase = usecase_path.split(".")
|
|
|
|
|
usecase_class = getattr(getattr(getattr(ifcopenshell.api, module), usecase), "Usecase")
|
2021-05-19 14:45:36 +10:00
|
|
|
|
2021-03-27 22:52:52 +11:00
|
|
|
if ifc_file:
|
2021-05-19 14:45:36 +10:00
|
|
|
result = usecase_class(ifc_file, **settings).execute()
|
|
|
|
|
else:
|
|
|
|
|
result = usecase_class(**settings).execute()
|
|
|
|
|
|
|
|
|
|
if should_run_listeners:
|
|
|
|
|
for listener in post_listeners.get(".".join([ifc_key, usecase_path]), []):
|
|
|
|
|
listener(usecase_path, ifc_file, **settings)
|
2021-05-29 01:06:38 +02:00
|
|
|
|
|
|
|
|
if None in registered_ifcs and ifc_key != registered_ifcs[None]:
|
|
|
|
|
global_key = registered_ifcs[None]
|
|
|
|
|
for listener in post_listeners.get(".".join([global_key, usecase_path]), []):
|
|
|
|
|
listener(usecase_path, ifc_file, **settings)
|
|
|
|
|
|
2021-05-19 14:45:36 +10:00
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def add_pre_listener(usecase_path, ifc_file, callback):
|
|
|
|
|
ifc_key = registered_ifcs.setdefault(ifc_file, ifcopenshell.guid.new())
|
|
|
|
|
pre_listeners.setdefault(".".join([ifc_key, usecase_path]), set()).add(callback)
|
2021-05-29 01:06:38 +02:00
|
|
|
return ifc_key
|
|
|
|
|
|
2021-05-19 14:45:36 +10:00
|
|
|
|
|
|
|
|
def add_post_listener(usecase_path, ifc_file, callback):
|
|
|
|
|
ifc_key = registered_ifcs.setdefault(ifc_file, ifcopenshell.guid.new())
|
|
|
|
|
post_listeners.setdefault(".".join([ifc_key, usecase_path]), set()).add(callback)
|
2021-05-29 01:06:38 +02:00
|
|
|
return ifc_key
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def remove_pre_listener(callback, usecase_path=""):
|
|
|
|
|
for listener_key, callbacks in pre_listeners.items():
|
|
|
|
|
if not listener_key.endswith(usecase_path):
|
|
|
|
|
continue
|
2021-05-28 02:07:56 +02:00
|
|
|
for fun in callbacks:
|
|
|
|
|
if fun == callback:
|
2021-05-29 01:06:38 +02:00
|
|
|
pre_listeners[listener_key].remove(callback)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def remove_post_listener(callback, usecase_path=""):
|
|
|
|
|
for listener_key, callbacks in post_listeners.items():
|
|
|
|
|
if not listener_key.endswith(usecase_path):
|
|
|
|
|
continue
|
2021-05-28 02:07:56 +02:00
|
|
|
for fun in callbacks:
|
|
|
|
|
if fun == callback:
|
2021-05-29 01:06:38 +02:00
|
|
|
post_listeners[listener_key].remove(callback)
|
|
|
|
|
|
|
|
|
|
|
2021-05-28 02:07:56 +02:00
|
|
|
def remove_all_listeners():
|
|
|
|
|
registered_ifcs.clear()
|
|
|
|
|
pre_listeners.clear()
|
|
|
|
|
post_listeners.clear()
|