From 8882c9945503e885f4957c1ba8f65acab3791aa2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 28 May 2021 09:50:55 +1000 Subject: [PATCH] Implement editing IFC header metadata. See #747. --- .../blenderbim/bim/module/project/__init__.py | 3 + .../blenderbim/bim/module/project/operator.py | 57 +++++++++++++++++++ .../blenderbim/bim/module/project/prop.py | 7 +++ .../blenderbim/bim/module/project/ui.py | 32 ++++++++++- 4 files changed, 98 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/__init__.py b/src/blenderbim/blenderbim/bim/module/project/__init__.py index d05306f3ce..f2bca894bc 100644 --- a/src/blenderbim/blenderbim/bim/module/project/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/project/__init__.py @@ -13,6 +13,9 @@ classes = ( operator.UnassignLibraryDeclaration, operator.SaveLibraryFile, operator.AppendLibraryElement, + operator.EnableEditingHeader, + operator.DisableEditingHeader, + operator.EditHeader, prop.LibraryElement, prop.BIMProjectProperties, ui.BIM_PT_project, diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index a1c279c71c..53a7a17236 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -255,3 +255,60 @@ class AppendLibraryElement(bpy.types.Operator): ifc_importer.type_collection = type_collection ifc_importer.create_type_product(element) ifc_importer.place_objects_in_spatial_tree() + + +class EnableEditingHeader(bpy.types.Operator): + bl_idname = "bim.enable_editing_header" + bl_label = "Enable Editing Header" + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProjectProperties + props.is_editing = True + + mvd = "".join(IfcStore.get_file().wrapped_data.header.file_description.description) + if "[" in mvd: + props.mvd = mvd.split("[")[1][0:-1] + else: + props.mvd = "" + + author = self.file.wrapped_data.header.file_name.author + if author: + props.author_name = author[0] + if len(author) > 1: + props.author_email = author[1] + + organisation = self.file.wrapped_data.header.file_name.organization + if organisation: + props.organisation_name = organisation[0] + if len(organisation) > 1: + props.organisation_email = organisation[1] + + props.authorisation = self.file.wrapped_data.header.file_name.authorization + return {"FINISHED"} + + +class EditHeader(bpy.types.Operator): + bl_idname = "bim.edit_header" + bl_label = "Edit Header" + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProjectProperties + props.is_editing = True + + self.file.wrapped_data.header.file_description.description = (f'ViewDefinition[{props.mvd}]',) + self.file.wrapped_data.header.file_name.author = (props.author_name, props.author_email) + self.file.wrapped_data.header.file_name.organization = (props.organisation_name, props.organisation_email) + self.file.wrapped_data.header.file_name.authorization = props.authorisation + bpy.ops.bim.disable_editing_header() + return {"FINISHED"} + + +class DisableEditingHeader(bpy.types.Operator): + bl_idname = "bim.disable_editing_header" + bl_label = "Disable Editing Header" + + def execute(self, context): + context.scene.BIMProjectProperties.is_editing = False + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index 3cb43b6128..a4052984a9 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -21,6 +21,13 @@ class LibraryElement(PropertyGroup): class BIMProjectProperties(PropertyGroup): is_authoring: BoolProperty(name="Enable Authoring Mode", default=True) + is_editing: BoolProperty(name="Is Editing", default=False) + mvd: StringProperty(name="MVD") + author_name: StringProperty(name="Author") + author_email: StringProperty(name="Author Email") + organisation_name: StringProperty(name="Organisation") + organisation_email: StringProperty(name="Organisation Email") + authorisation: StringProperty(name="Authoriser") active_library_element: StringProperty(name="Enable Authoring Mode", default="") library_breadcrumb: CollectionProperty(name="Library Breadcrumb", type=StrProperty) library_elements: CollectionProperty(name="Library Elements", type=LibraryElement) diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index 82006ba3e1..435ff66d9a 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -28,10 +28,40 @@ class BIM_PT_project(Panel): row.label(text=os.path.basename(props.ifc_file) or "No File Found") if IfcStore.get_file(): - row.prop(pprops, "is_authoring", icon="GREASEPENCIL", text="") + row.prop(pprops, "is_authoring", icon="MODIFIER", text="") + if pprops.is_editing: + row.operator("bim.edit_header", icon="CHECKMARK", text="") + row.operator("bim.disable_editing_header", icon="CANCEL", text="") + else: + row.operator("bim.enable_editing_header", icon="GREASEPENCIL", text="") + row = self.layout.row(align=True) row.label(text="IFC Schema", icon="FILE_CACHE") row.label(text=IfcStore.get_file().schema) + + if pprops.is_editing: + row = self.layout.row(align=True) + row.prop(pprops, "mvd") + + row = self.layout.row(align=True) + row.prop(pprops, "author_name") + row = self.layout.row(align=True) + row.prop(pprops, "author_email") + + row = self.layout.row(align=True) + row.prop(pprops, "organisation_name") + row = self.layout.row(align=True) + row.prop(pprops, "organisation_email") + + row = self.layout.row(align=True) + row.prop(pprops, "authorisation") + else: + row = self.layout.row(align=True) + row.label(text="IFC MVD", icon="FILE_HIDDEN") + mvd = "".join(IfcStore.get_file().wrapped_data.header.file_description.description) + if "[" in mvd: + mvd = mvd.split("[")[1][0:-1] + row.label(text=mvd) else: row = self.layout.row(align=True) row.label(text="File Not Loaded", icon="ERROR")