From 4348b9bff9f26aa2cae9e661c1aad029d1c70171 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 15 Aug 2024 17:25:43 +0500 Subject: [PATCH] bonsai - bcf v3 referenced links support #2790 --- src/bonsai/bonsai/bim/module/bcf/operator.py | 26 ++++++-------------- src/bonsai/bonsai/bim/module/bcf/ui.py | 4 +-- src/bonsai/bonsai/tool/bcf.py | 14 +++++++++++ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/bcf/operator.py b/src/bonsai/bonsai/bim/module/bcf/operator.py index a992a09388..7786fbfeb1 100644 --- a/src/bonsai/bonsai/bim/module/bcf/operator.py +++ b/src/bonsai/bonsai/bim/module/bcf/operator.py @@ -691,14 +691,12 @@ class AddBcfReferenceLink(bpy.types.Operator): bcfxml = bcfstore.BcfStore.get_bcfxml() assert bcfxml - if not (version := (bcfxml.version.version_id or "")).startswith("2"): - self.report({"INFO"}, f"BCF {version} is not yet supported.") - return {"FINISHED"} - props = context.scene.BCFProperties blender_topic = props.active_topic topic = bcfxml.topics[blender_topic.name] - topic.topic.reference_link.append(props.reference_link) + reference_links = tool.Bcf.get_topic_reference_links(topic) + reference_links.append(props.reference_link) + tool.Bcf.set_topic_reference_links(topic, reference_links) bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index) props.reference_link = "" return {"FINISHED"} @@ -782,17 +780,11 @@ class EditBcfReferenceLinks(bpy.types.Operator): bcfxml = bcfstore.BcfStore.get_bcfxml() assert bcfxml - if not (version := (bcfxml.version.version_id or "")).startswith("2"): - self.report({"INFO"}, f"BCF {version} is not yet supported.") - return {"FINISHED"} - props = context.scene.BCFProperties blender_topic = props.active_topic topic = bcfxml.topics[blender_topic.name] - for index, reference_link in enumerate(topic.topic.reference_link): - if reference_link == blender_topic.reference_links[index].name: - continue - topic.topic.reference_link[index] = blender_topic.reference_links[index].name + reference_links = [r.name for r in blender_topic.reference_links] + tool.Bcf.set_topic_reference_links(topic, reference_links) return {"FINISHED"} @@ -823,14 +815,12 @@ class RemoveBcfReferenceLink(bpy.types.Operator): bcfxml = bcfstore.BcfStore.get_bcfxml() assert bcfxml - if not (version := (bcfxml.version.version_id or "")).startswith("2"): - self.report({"INFO"}, f"BCF {version} is not yet supported.") - return {"FINISHED"} - props = context.scene.BCFProperties blender_topic = props.active_topic topic = bcfxml.topics[blender_topic.name] - del topic.topic.reference_link[self.index] + reference_links = tool.Bcf.get_topic_reference_links(topic) + del reference_links[self.index] + tool.Bcf.set_topic_reference_links(topic, reference_links) blender_topic.reference_links.remove(self.index) return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/bcf/ui.py b/src/bonsai/bonsai/bim/module/bcf/ui.py index 92e259e443..398a650303 100644 --- a/src/bonsai/bonsai/bim/module/bcf/ui.py +++ b/src/bonsai/bonsai/bim/module/bcf/ui.py @@ -176,11 +176,11 @@ class BIM_PT_bcf_metadata(Panel): layout.label(text="Reference Links:") for index, link in enumerate(topic.reference_links): row = layout.row(align=True) - row.prop(link, "name") + row.prop(link, "name", text="") row.operator("bim.open_uri", icon="URL", text="").uri = link.name row.operator("bim.remove_bcf_reference_link", icon="X", text="").index = index row = layout.row() - row.prop(props, "reference_link") + row.prop(props, "reference_link", text="New Reference Link:") row = layout.row() row.operator("bim.add_bcf_reference_link") diff --git a/src/bonsai/bonsai/tool/bcf.py b/src/bonsai/bonsai/tool/bcf.py index 6bf727bcf7..6508801350 100644 --- a/src/bonsai/bonsai/tool/bcf.py +++ b/src/bonsai/bonsai/tool/bcf.py @@ -93,6 +93,20 @@ class Bcf(bonsai.core.tool.Bcf): reference_links = reference_links.reference_link if reference_links else [] return reference_links + @classmethod + def set_topic_reference_links(cls, topic: bcf.agnostic.topic.TopicHandler, reference_links: list[str]) -> None: + topic_ = topic.topic + if isinstance(topic_, bcf.v2.model.Topic): + topic_.reference_link = reference_links + else: + topic_links = topic_.reference_links + if topic_links is None: + if not reference_links: + return + topic_.reference_links = (topic_links := bcf.v3.model.TopicReferenceLinks()) + return + topic_links.reference_link = reference_links + @classmethod def get_topic_related_topics( cls, topic: bcf.agnostic.topic.TopicHandler