diff --git a/src/bcf/bcf/bcfxml.py b/src/bcf/bcf/bcfxml.py index de31c8fa95..08636b01c1 100644 --- a/src/bcf/bcf/bcfxml.py +++ b/src/bcf/bcf/bcfxml.py @@ -532,6 +532,19 @@ class BcfXml: del topic.document_references[index] self.edit_topic(topic) + def add_document_reference(self, topic, document_reference): + if os.path.exists(document_reference.referenced_document): + topic_filepath = os.path.join(self.filepath, topic.guid) + filename = os.path.basename(document_reference.referenced_document) + copyfile(document_reference.referenced_document, os.path.join(topic_filepath, filename)) + document_reference.is_external = False + else: + document_reference.is_external = True + if not document_reference.guid: + document_reference.guid = str(uuid.uuid4()) + topic.document_references.append(document_reference) + self.edit_topic(topic) + def add_bim_snippet(self, topic, bim_snippet): if topic.bim_snippet: self.delete_bim_snippet(topic) diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index 40bf1aeef9..a162b53161 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -39,6 +39,7 @@ if bpy is not None: operator.AddBcfHeaderFile, operator.AddBcfBimSnippet, operator.AddBcfReferenceLink, + operator.AddBcfDocumentReference, operator.AddBcfLabel, operator.ViewBcfTopic, operator.RemoveBcfComment, @@ -58,6 +59,7 @@ if bpy is not None: operator.OpenBcfReferenceLink, operator.SelectBcfHeaderFile, operator.SelectBcfBimSnippetReference, + operator.SelectBcfDocumentReference, operator.SelectFeaturesDir, operator.SelectDiffJsonFile, operator.SelectDiffNewFile, diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index 810c5a4a4c..f124f29d1d 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -901,6 +901,27 @@ class AddBcfReferenceLink(bpy.types.Operator): return {"FINISHED"} +class AddBcfDocumentReference(bpy.types.Operator): + bl_idname = "bim.add_bcf_document_reference" + bl_label = "Add BCF Document Reference" + + def execute(self, context): + bcfxml = bcfstore.BcfStore.get_bcfxml() + props = bpy.context.scene.BCFProperties + blender_topic = props.topics[props.active_topic_index] + topic = bcfxml.topics[blender_topic.name] + if not blender_topic.document_reference: + return {"FINISHED"} + document_reference = bcf.data.DocumentReference() + document_reference.referenced_document = blender_topic.document_reference + document_reference.description = blender_topic.document_reference_description or None + bcfxml.add_document_reference(topic, document_reference) + bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index) + blender_topic.document_reference = "" + blender_topic.document_reference_description = "" + return {"FINISHED"} + + class AddBcfLabel(bpy.types.Operator): bl_idname = "bim.add_bcf_label" bl_label = "Add BCF Label" @@ -946,8 +967,8 @@ class EditBcfLabels(bpy.types.Operator): props = bpy.context.scene.BCFProperties blender_topic = props.topics[props.active_topic_index] topic = bcfxml.topics[blender_topic.name] - for index, label in enumerate(topic.labels): - if label == blender_topic.labels[index].name: + for index, label in enumerate(blender_topic.labels): + if label.name == topic.labels[index]: continue topic.labels[index] = blender_topic.labels[index].name bcfxml.edit_topic(topic) @@ -2540,6 +2561,23 @@ class SelectBcfBimSnippetReference(bpy.types.Operator): return {"RUNNING_MODAL"} +class SelectBcfDocumentReference(bpy.types.Operator): + bl_idname = "bim.select_bcf_document_reference" + bl_label = "Select BCF Document Reference" + filepath: bpy.props.StringProperty(subtype="FILE_PATH") + + def execute(self, context): + if self.filepath: + props = bpy.context.scene.BCFProperties + topic = props.topics[props.active_topic_index] + topic.document_reference = self.filepath + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.fileselect_add(self) + return {"RUNNING_MODAL"} + + class SelectFeaturesDir(bpy.types.Operator): bl_idname = "bim.select_features_dir" bl_label = "Select Features Directory" diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 3fb972d3c4..038dce637f 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -1041,6 +1041,8 @@ class BcfTopic(PropertyGroup): bim_snippet_reference: StringProperty(default="", name="Reference") bim_snippet_schema: StringProperty(default="", name="Schema") document_references: CollectionProperty(name="Document References", type=BcfDocumentReference) + document_reference: StringProperty(default="", name="Referenced Document") + document_reference_description: StringProperty(default="", name="Description") related_topics: CollectionProperty(name="Related Topics", type=StrProperty) comments: CollectionProperty(name="Comments", type=BcfComment) is_editable: BoolProperty(name="Is Editable", default=False, update=updateBcfTopicIsEditable) diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index 780b185490..a494382011 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -1835,7 +1835,6 @@ class BIM_PT_bcf_metadata(Panel): row.prop(topic, "bim_snippet_type") row = layout.row() row.prop(topic, "bim_snippet_schema") - row = layout.row() row.operator("bim.add_bcf_bim_snippet") @@ -1852,6 +1851,13 @@ class BIM_PT_bcf_metadata(Panel): row.operator("bim.remove_bcf_document_reference", icon="X", text="").index = index row = box.row(align=True) row.prop(doc, "description") + row = layout.row(align=True) + row.prop(topic, "document_reference") + row.operator("bim.select_bcf_document_reference", icon="FILE_FOLDER", text="") + row = layout.row() + row.prop(topic, "document_reference_description") + row = layout.row() + row.operator("bim.add_bcf_document_reference") if topic.related_topics: layout.label(text="Related Topics:")