mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-16 02:24:30 +00:00
bonsai - fix issues loading bcf v3 #2790
This commit is contained in:
@@ -17,6 +17,9 @@
|
||||
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user