mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-13 06:53:36 +00:00
bcf v3 & bonsai bcf v3 - support adding/removing header files #2790
Also removed unnecessary read in AddBcfDocumentReference.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user