Experimental usecase serialisation function, in preparation for client-server systems and version control.

This commit is contained in:
Dion Moult
2021-05-31 14:18:24 +10:00
parent 3ded4dff5f
commit 0b6af5f848
@@ -1,3 +1,5 @@
import json
import numpy
import importlib import importlib
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
@@ -20,6 +22,30 @@ def run(usecase_path, ifc_file=None, should_run_listeners=True, **settings):
for listener in pre_listeners.get(".".join([global_key, usecase_path]), []): for listener in pre_listeners.get(".".join([global_key, usecase_path]), []):
listener(usecase_path, ifc_file, **settings) listener(usecase_path, ifc_file, **settings)
def serialise_entity_instance(entity):
return {"cast_type": "entity_instance", "value": entity.id(), "Name": getattr(entity, "Name", None)}
vcs_settings = settings.copy()
for key, value in settings.items():
if isinstance(value, ifcopenshell.entity_instance):
vcs_settings[key] = serialise_entity_instance(value)
elif isinstance(value, numpy.ndarray):
vcs_settings[key] = {"cast_type": "ndarray", "value": value.tolist()}
elif isinstance(value, list) and value and isinstance(value[0], ifcopenshell.entity_instance):
vcs_settings[key] = [serialise_entity_instance(i) for i in value]
if "add_representation" in usecase_path:
pass
# print(ifc_key, usecase_path, "{ ... settings too complex right now ... }")
elif "owner." in usecase_path:
pass
else:
pass
# print(vcs_settings)
# try:
# print(ifc_key, usecase_path, json.dumps(vcs_settings))
# except:
# print(ifc_key, usecase_path, vcs_settings)
importlib.import_module(f"ifcopenshell.api.{usecase_path}") importlib.import_module(f"ifcopenshell.api.{usecase_path}")
module, usecase = usecase_path.split(".") module, usecase = usecase_path.split(".")
usecase_class = getattr(getattr(getattr(ifcopenshell.api, module), usecase), "Usecase") usecase_class = getattr(getattr(getattr(ifcopenshell.api, module), usecase), "Usecase")
@@ -42,7 +68,7 @@ def run(usecase_path, ifc_file=None, should_run_listeners=True, **settings):
def add_pre_listener(usecase_path, ifc_file, callback): def add_pre_listener(usecase_path, ifc_file, callback):
""" Add a pre listener """Add a pre listener
There are 2 kind of listeners: There are 2 kind of listeners:
when ifc file is defined the listener will only run for specified file when ifc file is defined the listener will only run for specified file
when ifc file is None, the listener will run globally only based on usecase when ifc file is None, the listener will run globally only based on usecase
@@ -57,7 +83,7 @@ def add_pre_listener(usecase_path, ifc_file, callback):
def add_post_listener(usecase_path, ifc_file, callback): def add_post_listener(usecase_path, ifc_file, callback):
""" Add a post listener """Add a post listener
There are 2 kind of listeners: There are 2 kind of listeners:
when ifc file is defined the listener will only run for specified file when ifc file is defined the listener will only run for specified file
when ifc file is None, the listener will run globally only based on usecase when ifc file is None, the listener will run globally only based on usecase
@@ -72,7 +98,7 @@ def add_post_listener(usecase_path, ifc_file, callback):
def remove_pre_listener(callback, usecase_path=""): def remove_pre_listener(callback, usecase_path=""):
""" Remove a pre listener """Remove a pre listener
:param callback: callback function to remove :param callback: callback function to remove
:param usecase_path: string, optional, ifcopenshell api usecase path, may be prefixed with ifc_key, dot separated. :param usecase_path: string, optional, ifcopenshell api usecase path, may be prefixed with ifc_key, dot separated.
:return: :return:
@@ -89,7 +115,7 @@ def remove_pre_listener(callback, usecase_path=""):
def remove_post_listener(callback, usecase_path=""): def remove_post_listener(callback, usecase_path=""):
""" Remove a post listener """Remove a post listener
:param callback: callback function to remove :param callback: callback function to remove
:param usecase_path: string, optional ifcopenshell api usecase path, may be prefixed with ifc_key, dot separated. :param usecase_path: string, optional ifcopenshell api usecase path, may be prefixed with ifc_key, dot separated.
:return: :return: