From 6e290d585e77acefd2e1feeefba6e4a4d1c4531b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 11 May 2023 14:18:51 +0500 Subject: [PATCH] Ifc CSV Export template now also saves the expression #3034 Previously saved templates wouldn't work now, they need to be either recreated or modified to make them work. Example of old template format: `["Name", "class", "type.Name"]` Example of new template format: `{"expression": ".IfcDoor", "attributes": ["Name", "class", "type.Name"]}` Note that this would work too: `{"attributes": ["Name", "class", "type.Name"]}` --- .../blenderbim/bim/module/csv/operator.py | 46 +++++++++++++------ .../blenderbim/bim/module/csv/ui.py | 23 +++------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index 7d115c6eae..07a2206795 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -31,6 +31,7 @@ from blenderbim.bim.handler import purge_module_data class AddCsvAttribute(bpy.types.Operator): bl_idname = "bim.add_csv_attribute" bl_label = "Add CSV Attribute" + bl_description = "Add a new IFC Attribute to the CSV export" bl_options = {"REGISTER", "UNDO"} def execute(self, context): @@ -52,6 +53,7 @@ class RemoveCsvAttribute(bpy.types.Operator): class RemoveAllCsvAttributes(bpy.types.Operator): bl_idname = "bim.remove_all_csv_attributes" bl_label = "Remove all CSV Attributes" + bl_description = "Remove all IFC Attributes from the CSV export" bl_options = {"REGISTER", "UNDO"} def execute(self, context): @@ -61,20 +63,25 @@ class RemoveAllCsvAttributes(bpy.types.Operator): class ImportCsvAttributes(bpy.types.Operator): bl_idname = "bim.import_csv_attributes" - bl_label = "Import CSV Attributes" + bl_label = "Import CSV Template" + bl_description = "Import a json template for CSV export" bl_options = {"REGISTER", "UNDO"} filter_glob: bpy.props.StringProperty(default="*.json", options={"HIDDEN"}) filepath: bpy.props.StringProperty(subtype="FILE_PATH") def execute(self, context): - csv_attributes = context.scene.CsvProperties.csv_attributes - csv_attributes.clear() + csv_props = context.scene.CsvProperties csv_json = json.load(open(self.filepath)) - i = 0 - for attribute in csv_json: - csv_attributes.add() - csv_attributes[i].name = attribute - i += 1 + + expression = csv_json.get("expression", "") + if expression: + csv_props.ifc_selector = expression + + attributes = csv_json.get("attributes", []) + if attributes: + csv_props.csv_attributes.clear() + for attribute in attributes: + csv_props.csv_attributes.add().name = attribute return {"FINISHED"} @@ -85,19 +92,30 @@ class ImportCsvAttributes(bpy.types.Operator): class ExportCsvAttributes(bpy.types.Operator): bl_idname = "bim.export_csv_attributes" - bl_label = "Export CSV Attributes" + bl_label = "Export CSV Template" bl_options = {"REGISTER", "UNDO"} + bl_description = "Save a json template for CSV export" filename_ext = ".json" filter_glob: bpy.props.StringProperty(default="*.json", options={"HIDDEN"}) filepath: bpy.props.StringProperty(subtype="FILE_PATH") def execute(self, context): - csv_attributes = [] - with open(self.filepath, "w") as outfile: - for attribute in context.scene.CsvProperties.csv_attributes: - csv_attributes.append(attribute.name) + csv_props = context.scene.CsvProperties - json.dump(csv_attributes, outfile) + csv_template = {} + expression = csv_props.ifc_selector + if expression: + csv_template["expression"] = expression + + csv_attributes = [] + for attribute in csv_props.csv_attributes: + attribute_name = attribute.name + csv_attributes.append(attribute_name) + if csv_attributes: + csv_template["attributes"] = csv_attributes + + with open(self.filepath, "w") as outfile: + json.dump(csv_template, outfile) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/csv/ui.py b/src/blenderbim/blenderbim/bim/module/csv/ui.py index 301189cfe9..cdae4f8ab7 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/ui.py +++ b/src/blenderbim/blenderbim/bim/module/csv/ui.py @@ -49,27 +49,18 @@ class BIM_PT_ifccsv(Panel): row.operator("bim.eyedrop_ifccsv", icon="EYEDROPPER", text="") layout.separator() - row = layout.row() - split = row.split(factor=0.7) - c = split.column() - c.operator("bim.add_csv_attribute") - c = split.column() - c.operator("bim.import_csv_attributes", icon="IMPORT", text="Load Template") + row = layout.row(align=True) + row.operator("bim.add_csv_attribute", icon="ADD") + row.operator("bim.remove_all_csv_attributes", icon="CANCEL") + row = layout.row(align=True) + row.operator("bim.import_csv_attributes", icon="IMPORT") + row.operator("bim.export_csv_attributes", icon="EXPORT") for index, attribute in enumerate(props.csv_attributes): row = layout.row(align=True) row.prop(attribute, "name", text="") row.operator("bim.remove_csv_attribute", icon="X", text="").index = index - if props.csv_attributes: - row = layout.row() - row.label() - row.operator("bim.remove_all_csv_attributes", icon="CANCEL", text="") - row = layout.row() - row.operator("bim.export_csv_attributes", icon="EXPORT", text="Create Template") - - layout.separator() - row = layout.row(align=True) row.prop(props, "csv_delimiter") @@ -78,7 +69,7 @@ class BIM_PT_ifccsv(Panel): row.prop(props, "csv_custom_delimiter") row = layout.row() - split = row.split(factor=0.7) + split = row.split(factor=0.5) c = split.column() c.operator("bim.export_ifccsv", icon="EXPORT") c = split.column()