diff --git a/src/bonsai/bonsai/bim/module/bcf/operator.py b/src/bonsai/bonsai/bim/module/bcf/operator.py index 833c1ad123..955eee1f20 100644 --- a/src/bonsai/bonsai/bim/module/bcf/operator.py +++ b/src/bonsai/bonsai/bim/module/bcf/operator.py @@ -17,6 +17,9 @@ # along with Bonsai. If not, see . import os +import bcf.v3 +import bcf.v3.model +import bcf.v3.topic import bpy import bcf import bcf.bcfxml @@ -154,12 +157,12 @@ class LoadBcfTopic(bpy.types.Operator): setattr(new, key, str(value)) new.reference_links.clear() - for reference_link in topic.topic.reference_link: + for reference_link in tool.Bcf.get_topic_reference_links(topic): new_reference_link = new.reference_links.add() new_reference_link.name = reference_link new.labels.clear() - for label in topic.topic.labels: + for label in tool.Bcf.get_topic_labels(topic): new_label = new.labels.add() new_label.name = label @@ -175,20 +178,28 @@ class LoadBcfTopic(bpy.types.Operator): setattr(new.bim_snippet, key, value) new.document_references.clear() - for doc in topic.topic.document_reference: + for doc in tool.Bcf.get_topic_document_references(topic): new_document_references = new.document_references.add() + + if isinstance(doc, bcf.v2.model.TopicDocumentReference): + reference = doc.referenced_document + is_external = doc.is_external + else: + is_external = doc.document_guid is None + reference = doc.url if is_external else doc.document_guid + data_map = { - "reference": doc.referenced_document, + "reference": reference, "description": doc.description, "guid": doc.guid, - "is_external": doc.is_external, + "is_external": is_external, } for key, value in data_map.items(): if value is not None: setattr(new_document_references, key, value) new.related_topics.clear() - for related_topic in topic.topic.related_topic: + for related_topic in tool.Bcf.get_topic_related_topics(topic): new_related_topic = new.related_topics.add() new_related_topic.name = related_topic.guid diff --git a/src/bonsai/bonsai/tool/bcf.py b/src/bonsai/bonsai/tool/bcf.py index ec1de193a6..e8f1163b68 100644 --- a/src/bonsai/bonsai/tool/bcf.py +++ b/src/bonsai/bonsai/tool/bcf.py @@ -19,6 +19,10 @@ import bonsai.core.tool import bonsai.tool as tool import bpy +import bcf.v2.model +import bcf.v2.topic +import bcf.v3.model +import bcf.v3.topic from typing import Any, Union, Optional @@ -26,3 +30,43 @@ class Bcf(bonsai.core.tool.Bcf): @classmethod def get_path(cls) -> str: return bpy.context.scene.BCFProperties.bcf_file + + @classmethod + def get_topic_document_references( + cls, topic: Union[bcf.v2.topic.TopicHandler, bcf.v3.topic.TopicHandler] + ) -> Union[list[bcf.v2.model.TopicDocumentReference], list[bcf.v3.model.DocumentReference]]: + if isinstance(topic, bcf.v2.topic.TopicHandler): + document_references = topic.topic.document_reference + else: + document_references = topic.topic.document_references + document_references = document_references.document_reference if document_references else [] + return document_references + + @classmethod + def get_topic_labels(cls, topic: Union[bcf.v2.topic.TopicHandler, bcf.v3.topic.TopicHandler]) -> list[str]: + if isinstance(topic, bcf.v2.topic.TopicHandler): + labels = topic.topic.labels + else: + labels = topic.topic.labels + labels = labels.label if labels else [] + return labels + + @classmethod + def get_topic_reference_links(cls, topic: Union[bcf.v2.topic.TopicHandler, bcf.v3.topic.TopicHandler]) -> list[str]: + if isinstance(topic, bcf.v2.topic.TopicHandler): + reference_links = topic.topic.reference_link + else: + reference_links = topic.topic.reference_links + reference_links = reference_links.reference_link if reference_links else [] + return reference_links + + @classmethod + def get_topic_related_topics( + cls, topic: Union[bcf.v2.topic.TopicHandler, bcf.v3.topic.TopicHandler] + ) -> Union[list[bcf.v2.model.TopicRelatedTopic], list[bcf.v3.model.TopicRelatedTopicsRelatedTopic]]: + if isinstance(topic, bcf.v2.topic.TopicHandler): + related_topics = topic.topic.related_topic + else: + related_topics = topic.topic.related_topics + related_topics = related_topics.related_topic if related_topics else [] + return related_topics