From f208713b02a3251be2463dfda9e833da5cb42ccd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Apr 2022 11:42:44 +1000 Subject: UI: use a faster method of finding colliding layer names Access the keys of the collection instead of the layers names and use a set to detect collisions. There is no need to access the duplicate layers themselves. Roughly twice as fast. --- .../scripts/startup/bl_ui/properties_data_mesh.py | 40 +++++++++------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index 1a3f19eaba8..97519e55b48 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -4,7 +4,6 @@ import bpy from bpy.types import Menu, Panel, UIList from rna_prop_ui import PropertyPanel -from collections import defaultdict class MESH_MT_vertex_group_context_menu(Menu): @@ -542,35 +541,28 @@ class DATA_PT_mesh_attributes(MeshButtonsPanel, Panel): self.draw_attribute_warnings(context, layout) def draw_attribute_warnings(self, context, layout): - attributes_by_name = defaultdict(list) - ob = context.object mesh = ob.data - builtin_attribute = object() - - def add_builtin(name): - attributes_by_name[name].append(builtin_attribute) - - def add_attributes(layers): - for layer in layers: - attributes_by_name[layer.name].append(layer) - - add_builtin("position") - add_builtin("material_index") - add_builtin("shade_smooth") - add_builtin("normal") - add_builtin("crease") - - add_attributes(mesh.attributes) - add_attributes(mesh.uv_layers) - add_attributes(ob.vertex_groups) + unique_names = set() + colliding_names = [] + for collection in ( + # Built-in names. + {"position": None, "material_index": None, "shade_smooth": None, "normal": None, "crease": None}, + mesh.attributes, + mesh.uv_layers, + ob.vertex_groups, + ): + for name in collection.keys(): + unique_names_len = len(unique_names) + unique_names.add(name) + if len(unique_names) == unique_names_len: + colliding_names.append(name) - colliding_names = [name for name, layers in attributes_by_name.items() if len(layers) >= 2] - if len(colliding_names) == 0: + if not colliding_names: return - layout.label(text="Name collisions: {}".format(", ".join(colliding_names)), icon='ERROR') + layout.label(text="Name collisions: " + ", ".join(set(colliding_names)), icon='ERROR') class MESH_UL_color_attributes(UIList): -- cgit v1.2.3