From 36a0119f40ace06c46fb815f8b47b208f5793cac Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 28 Dec 2020 16:03:34 +1100 Subject: [PATCH] Implement add BIM Snippet --- src/bcf/bcf/bcfxml.py | 14 ++ .../blenderbim/bim/__init__.py | 3 + .../blenderbim/bim/operator.py | 155 ++++++++++++------ src/ifcblenderexport/blenderbim/bim/prop.py | 3 + src/ifcblenderexport/blenderbim/bim/ui.py | 11 ++ 5 files changed, 137 insertions(+), 49 deletions(-) diff --git a/src/bcf/bcf/bcfxml.py b/src/bcf/bcf/bcfxml.py index 31aca111ef..c059917e2e 100644 --- a/src/bcf/bcf/bcfxml.py +++ b/src/bcf/bcf/bcfxml.py @@ -523,6 +523,20 @@ class BcfXml: topic.bim_snippet = None self.edit_topic(topic) + def add_bim_snippet(self, topic, bim_snippet): + if topic.bim_snippet: + self.delete_bim_snippet(topic) + if os.path.exists(bim_snippet.reference): + topic_filepath = os.path.join(self.filepath, topic.guid) + filename = os.path.basename(bim_snippet.reference) + copyfile(bim_snippet.reference, os.path.join(topic_filepath, filename)) + bim_snippet.reference = filename + bim_snippet.is_external = False + else: + bim_snippet.is_external = True + topic.bim_snippet = bim_snippet + self.edit_topic(topic) + def add_file(self, topic, header_file): if os.path.exists(header_file.reference): topic_filepath = os.path.join(self.filepath, topic.guid) diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index 2bd55bc823..c8cfc85b86 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -28,6 +28,7 @@ if bpy is not None: operator.NewBcfProject, operator.LoadBcfProject, operator.LoadBcfTopics, + operator.LoadBcfTopic, operator.LoadBcfComments, operator.EditBcfProjectName, operator.EditBcfAuthor, @@ -36,6 +37,7 @@ if bpy is not None: operator.SaveBcfProject, operator.AddBcfTopic, operator.AddBcfHeaderFile, + operator.AddBcfBimSnippet, operator.AddBcfReferenceLink, operator.AddBcfLabel, operator.ViewBcfTopic, @@ -54,6 +56,7 @@ if bpy is not None: operator.OpenUri, operator.OpenBcfReferenceLink, operator.SelectBcfHeaderFile, + operator.SelectBcfBimSnippetReference, operator.SelectFeaturesDir, operator.SelectDiffJsonFile, operator.SelectDiffNewFile, diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index 6c94cf4a9a..e7941b2773 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -561,57 +561,81 @@ class LoadBcfTopics(bpy.types.Operator): bcfxml.get_topics() while len(bpy.context.scene.BCFProperties.topics) > 0: bpy.context.scene.BCFProperties.topics.remove(0) - for topic in bcfxml.topics.values(): + index = 0 + for topic_guid in bcfxml.topics.keys(): new = bpy.context.scene.BCFProperties.topics.add() + bpy.ops.bim.load_bcf_topic(topic_guid = topic_guid, topic_index = index) + index += 1 + return {"FINISHED"} + + +class LoadBcfTopic(bpy.types.Operator): + bl_idname = "bim.load_bcf_topic" + bl_label = "Load BCF Topics" + topic_guid: bpy.props.StringProperty() + topic_index: bpy.props.IntProperty() + + def execute(self, context): + bcfxml = bcfstore.BcfStore.get_bcfxml() + topic = bcfxml.get_topic(self.topic_guid) + new = bpy.context.scene.BCFProperties.topics[self.topic_index] + data_map = { + "name": topic.guid, + "title": topic.title, + "type": topic.topic_type, + "status": topic.topic_status, + "priority": topic.priority, + "stage": topic.stage, + "creation_date": topic.creation_date, + "creation_author": topic.creation_author, + "modified_date": topic.modified_date, + "modified_author": topic.modified_author, + "assigned_to": topic.assigned_to, + "due_date": topic.due_date, + "description": topic.description + } + for key, value in data_map.items(): + if value is not None: + setattr(new, key, str(value)) + while len(new.reference_links) > 0: + new.reference_links.remove(0) + for reference_link in topic.reference_links: + new2 = new.reference_links.add() + new2.name = reference_link + while len(new.labels) > 0: + new.labels.remove(0) + for label in topic.labels: + new2 = new.labels.add() + new2.name = label + if topic.bim_snippet: data_map = { - "name": topic.guid, - "title": topic.title, - "type": topic.topic_type, - "status": topic.topic_status, - "priority": topic.priority, - "stage": topic.stage, - "creation_date": topic.creation_date, - "creation_author": topic.creation_author, - "modified_date": topic.modified_date, - "modified_author": topic.modified_author, - "assigned_to": topic.assigned_to, - "due_date": topic.due_date, - "description": topic.description + "type": topic.bim_snippet.snippet_type, + "is_external": topic.bim_snippet.is_external, + "reference": topic.bim_snippet.reference, + "schema": topic.bim_snippet.reference_schema } for key, value in data_map.items(): if value is not None: - setattr(new, key, str(value)) - for reference_link in topic.reference_links: - new2 = new.reference_links.add() - new2.name = reference_link - for label in topic.labels: - new2 = new.labels.add() - new2.name = label - if topic.bim_snippet: - data_map = { - "type": topic.bim_snippet.snippet_type, - "is_external": topic.bim_snippet.is_external, - "reference": topic.bim_snippet.reference, - "schema": topic.bim_snippet.reference_schema - } - for key, value in data_map.items(): - if value is not None: - setattr(new.bim_snippet, key, value) - for doc in topic.document_references: - new2 = new.document_references.add() - data_map = { - "reference": doc.referenced_document, - "description": doc.description, - "guid": doc.guid, - "is_external": doc.is_external - } - for key, value in data_map.items(): - if value is not None: - setattr(new2, key, value) - for related_topic in topic.related_topics: - new2 = new.related_topics.add() - new2.name = related_topic.guid - bpy.ops.bim.load_bcf_comments(topic_guid = topic.guid) + setattr(new.bim_snippet, key, value) + while len(new.document_references) > 0: + new.document_references.remove(0) + for doc in topic.document_references: + new2 = new.document_references.add() + data_map = { + "reference": doc.referenced_document, + "description": doc.description, + "guid": doc.guid, + "is_external": doc.is_external + } + for key, value in data_map.items(): + if value is not None: + setattr(new2, key, value) + while len(new.related_topics) > 0: + new.related_topics.remove(0) + for related_topic in topic.related_topics: + new2 = new.related_topics.add() + new2.name = related_topic.guid + bpy.ops.bim.load_bcf_comments(topic_guid = topic.guid) return {"FINISHED"} @@ -730,6 +754,24 @@ class AddBcfTopic(bpy.types.Operator): return {"FINISHED"} +class AddBcfBimSnippet(bpy.types.Operator): + bl_idname = "bim.add_bcf_bim_snippet" + bl_label = "Add BCF BIM Snippet" + + 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] + bim_snippet = bcf.data.BimSnippet() + bim_snippet.reference = blender_topic.bim_snippet_reference + bim_snippet.reference_schema = blender_topic.bim_snippet_schema + bim_snippet.snippet_type = blender_topic.bim_snippet_type + bcfxml.add_bim_snippet(topic, bim_snippet) + bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index) + return {"FINISHED"} + + class AddBcfHeaderFile(bpy.types.Operator): bl_idname = "bim.add_bcf_header_file" bl_label = "Add BCF Header File" @@ -852,10 +894,9 @@ class AddBcfReferenceLink(bpy.types.Operator): topic = bcfxml.topics[blender_topic.name] if not blender_topic.reference_link: return {"FINISHED"} - new = blender_topic.reference_links.add() - new.name = blender_topic.reference_link topic.reference_links.append(blender_topic.reference_link) bcfxml.edit_topic(topic) + bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index) blender_topic.reference_link = "" return {"FINISHED"} @@ -2454,7 +2495,6 @@ class SelectBcfHeaderFile(bpy.types.Operator): bl_idname = "bim.select_bcf_header_file" bl_label = "Select BCF Header File" filepath: bpy.props.StringProperty(subtype="FILE_PATH") - target: bpy.props.StringProperty() def execute(self, context): if self.filepath: @@ -2468,6 +2508,23 @@ class SelectBcfHeaderFile(bpy.types.Operator): return {"RUNNING_MODAL"} +class SelectBcfBimSnippetReference(bpy.types.Operator): + bl_idname = "bim.select_bcf_bim_snippet_reference" + bl_label = "Select BCF BIM Snippet 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.bim_snippet_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 ab6520bdd1..3fb972d3c4 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -1037,6 +1037,9 @@ class BcfTopic(PropertyGroup): labels: CollectionProperty(name="Labels", type=BcfLabel) label: StringProperty(default="", name="Label") bim_snippet: PointerProperty(type=BcfBimSnippet) + bim_snippet_type: StringProperty(default="", name="Type") + bim_snippet_reference: StringProperty(default="", name="Reference") + bim_snippet_schema: StringProperty(default="", name="Schema") document_references: CollectionProperty(name="Document References", type=BcfDocumentReference) related_topics: CollectionProperty(name="Related Topics", type=StrProperty) comments: CollectionProperty(name="Comments", type=BcfComment) diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index 7eeef9fbfd..33438b6fbd 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -1827,6 +1827,17 @@ class BIM_PT_bcf_metadata(Panel): op = row.operator("bim.open_uri", icon="FILE_FOLDER", text="") op.uri = os.path.join(bcfxml.filepath, topic.name, topic.bim_snippet.reference) row.operator("bim.remove_bcf_bim_snippet", icon="X", text="") + else: + row = layout.row(align=True) + row.prop(topic, "bim_snippet_reference") + row.operator("bim.select_bcf_bim_snippet_reference", icon="FILE_FOLDER", text="") + row = layout.row() + 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") if topic.document_references: layout.label(text="Document References:")