diff --git a/src/bonsai/bonsai/bim/module/bsdd/ui.py b/src/bonsai/bonsai/bim/module/bsdd/ui.py index c6966c01d8..f49f48abb9 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/ui.py +++ b/src/bonsai/bonsai/bim/module/bsdd/ui.py @@ -83,7 +83,6 @@ class BIM_PT_bsdd(Panel): row = self.layout.row() row.operator("bim.load_bsdd_dictionaries") - class BIM_UL_bsdd_dictionaries(UIList): def draw_item( self, diff --git a/src/bonsai/bonsai/bim/module/pset/ui.py b/src/bonsai/bonsai/bim/module/pset/ui.py index 03d6f8bb36..addd03a504 100644 --- a/src/bonsai/bonsai/bim/module/pset/ui.py +++ b/src/bonsai/bonsai/bim/module/pset/ui.py @@ -262,7 +262,7 @@ class BIM_PT_object_psets(Panel): row = self.layout.row(align=True) prop_with_search(row, props, "pset_name", text="") - if props.pset_name != "BBIM_BSDD" and not props.pset_name.startswith(tool.Bsdd.identifier_url): + if props.pset_name != "BBIM_BSDD" and not props.pset_name.startswith(tool.Bsdd.identifier_url()): op = row.operator("bim.add_pset", icon="ADD", text="") op.obj = obj.name op.obj_type = "Object" diff --git a/src/bonsai/bonsai/tool/bsdd.py b/src/bonsai/bonsai/tool/bsdd.py index 47c948abcc..74d9926f15 100644 --- a/src/bonsai/bonsai/tool/bsdd.py +++ b/src/bonsai/bonsai/tool/bsdd.py @@ -36,11 +36,23 @@ if TYPE_CHECKING: class Bsdd(bonsai.core.tool.Bsdd): - identifier_url = "https://identifier.buildingsmart.org" + default_identifier_url = "https://identifier.buildingsmart.org" + default_api_url = "https://api.bsdd.buildingsmart.org/api/" client = bsdd.Client() bsdd_classes: dict[str, dict] = {} bsdd_properties: dict[str, dict] = {} + @classmethod + def identifier_url(cls) -> str: + """Derives the identifier base URL from the current client baseurl. + Falls back to the standard bSDD identifier URL when using the default API.""" + if cls.client.baseurl == cls.default_api_url: + return cls.default_identifier_url + from urllib.parse import urlparse + + parsed = urlparse(cls.client.baseurl) + return f"{parsed.scheme}://{parsed.netloc}" + @classmethod def get_bsdd_props(cls) -> BIMBSDDProperties: assert (scene := bpy.context.scene) @@ -269,7 +281,7 @@ class Bsdd(bonsai.core.tool.Bsdd): for obj in tool.Blender.get_selected_objects(include_active=True): if element := tool.Ifc.get_entity(obj): for reference in ifcopenshell.util.classification.get_references(element): - if (uri := reference.Location) and uri.startswith(cls.identifier_url): + if (uri := reference.Location) and uri.startswith(cls.identifier_url()): classes.add((reference[1] or reference[2] or "Unnamed", uri)) dictionary_uris = ( @@ -383,7 +395,7 @@ class Bsdd(bonsai.core.tool.Bsdd): def get_applicable_psets(cls, element: ifcopenshell.entity_instance): uris = set() for reference in ifcopenshell.util.classification.get_references(element): - if (uri := reference.Location) and uri.startswith(cls.identifier_url): + if (uri := reference.Location) and uri.startswith(cls.identifier_url()): uris.add(uri) psets = set() for uri in uris: @@ -399,7 +411,7 @@ class Bsdd(bonsai.core.tool.Bsdd): def is_applicable(cls, pset_uri: str, element: ifcopenshell.entity_instance) -> bool: uris = set() for reference in ifcopenshell.util.classification.get_references(element): - if (uri := reference.Location) and uri.startswith(cls.identifier_url): + if (uri := reference.Location) and uri.startswith(cls.identifier_url()): uris.add(uri) class_uri, pset_name = pset_uri.rsplit("#", 1) return class_uri in uris