mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 01:41:57 +00:00
Simple support for API listeners for parametric IFC authoring - editing any parameter can now trigger events from a "parametric engine" which synchronises other related geometry and attributes in the IFC dataset. Implement auto box generation as a first demo.
This commit is contained in:
@@ -1,11 +1,38 @@
|
||||
import importlib
|
||||
import ifcopenshell
|
||||
import ifcopenshell.api
|
||||
|
||||
|
||||
def run(usecase_path, ifc_file=None, **settings):
|
||||
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)
|
||||
importlib.import_module(f"ifcopenshell.api.{usecase_path}")
|
||||
module, usecase = usecase_path.split(".")
|
||||
usecase_class = getattr(getattr(getattr(ifcopenshell.api, module), usecase), "Usecase")
|
||||
|
||||
if ifc_file:
|
||||
return usecase_class(ifc_file, **settings).execute()
|
||||
return usecase_class(**settings).execute()
|
||||
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)
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user