bcf v3 & bonsai bcf v3 - support adding/removing header files #2790

Also removed unnecessary read in AddBcfDocumentReference.
This commit is contained in:
Andrej730
2024-08-20 14:49:34 +05:00
parent 71ddc6384a
commit 7539404c27
4 changed files with 112 additions and 26 deletions
+35 -26
View File
@@ -475,31 +475,46 @@ class AddBcfHeaderFile(bpy.types.Operator):
def execute(self, context):
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: {self.bl_rna.bl_idname}.")
return {"FINISHED"}
bcf_v2 = (bcfxml.version.version_id or "").startswith("2")
props = context.scene.BCFProperties
blender_topic = props.active_topic
topic = bcfxml.topics[blender_topic.name]
is_external = "://" in props.file_reference
filename = Path(props.file_reference).name if os.path.exists(props.file_reference) else None
filepath = Path(props.file_reference)
file_bytes, filename = None, None
if filepath.is_file():
filename = filepath.name
file_bytes = filepath.read_bytes()
if filename:
with open(props.file_reference, "r") as f:
topic.reference_files[filename] = f.read()
header_files = tool.Bcf.get_topic_header_files(topic)
if filename and file_bytes:
topic.reference_files[filename] = file_bytes
if bcf_v2:
header_file = bcf.v2.model.HeaderFile(
filename=filename,
date=XmlDateTime.now(),
reference=props.file_reference if is_external else filename,
ifc_project=props.file_ifc_project,
ifc_spatial_structure_element=props.file_ifc_spatial_structure_element,
is_external=is_external,
)
assert tool.Bcf.is_list_of(header_files, bcf.v2.model.HeaderFile)
header_files.append(header_file)
else:
header_file = bcf.v3.model.File(
filename=filename,
date=XmlDateTime.now(),
reference=props.file_reference if is_external else filename,
ifc_project=props.file_ifc_project,
ifc_spatial_structure_element=props.file_ifc_spatial_structure_element,
is_external=is_external,
)
assert tool.Bcf.is_list_of(header_files, bcf.v3.model.File)
header_files.append(header_file)
header_file = bcf.v2.model.HeaderFile(
filename=filename,
date=XmlDateTime.now(),
reference=props.file_reference if is_external else Path(props.file_reference).name,
ifc_project=props.file_ifc_project,
ifc_spatial_structure_element=props.file_ifc_spatial_structure_element,
is_external=is_external,
)
topic.header.file.append(header_file)
tool.Bcf.set_topic_header_files(topic, header_files)
props.refresh_topic(context)
return {"FINISHED"}
@@ -652,14 +667,12 @@ class RemoveBcfFile(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: {self.bl_rna.bl_idname}.")
return {"FINISHED"}
props = context.scene.BCFProperties
blender_topic = props.active_topic
topic = bcfxml.topics[blender_topic.name]
del topic.header.file[self.index]
header_files = tool.Bcf.get_topic_header_files(topic)
del header_files[self.index]
tool.Bcf.set_topic_header_files(topic, header_files)
props.refresh_topic(context)
return {"FINISHED"}
@@ -734,10 +747,6 @@ class AddBcfDocumentReference(bpy.types.Operator):
filename = document_path.name
document_bytes = document_path.read_bytes()
if filename:
with open(props.document_reference, "rb") as f:
document_bytes = f.read()
document_references = tool.Bcf.get_topic_document_references(topic)
if bcf_v2:
assert isinstance(topic, bcf.v2.topic.TopicHandler)
+31
View File
@@ -112,6 +112,37 @@ class Bcf(bonsai.core.tool.Bcf):
header_files = header_files.file if header_files else []
return header_files
@classmethod
def set_topic_header_files(
cls,
topic: bcf.agnostic.topic.TopicHandler,
files: Union[list[bcf.v2.model.HeaderFile], list[bcf.v3.model.File]],
) -> None:
if isinstance(topic, bcf.v2.topic.TopicHandler):
header = topic.header
if not header:
if not files:
return
topic.header = (header := bcf.v2.model.Header())
if not header.file:
if not files:
return
assert cls.is_list_of(files, bcf.v2.model.HeaderFile)
header.file = files
else:
header = topic.header
if not header:
if not files:
return
header = bcf.v3.model.Header()
header_files = header.files
if not header_files:
if not files:
return
header.files = (header_files := bcf.v3.model.HeaderFiles())
assert cls.is_list_of(files, bcf.v3.model.File)
header_files.file = files
@classmethod
def get_topic_labels(cls, topic: bcf.agnostic.topic.TopicHandler) -> list[str]:
if isinstance(topic, bcf.v2.topic.TopicHandler):