From fb786bb90c5634e507843e0a51f195d2ae71973e Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 25 Oct 2022 16:26:55 +1100 Subject: [PATCH] Batch reassignments now take advantage of inverse indices for a slight speedup. See #2408. --- .../ifcopenshell/util/schema.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/schema.py b/src/ifcopenshell-python/ifcopenshell/util/schema.py index 9472d149c3..322cc3d760 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/schema.py +++ b/src/ifcopenshell-python/ifcopenshell/util/schema.py @@ -83,17 +83,19 @@ class BatchReassignClass: new_element[new_attributes.index(element.attribute_name(i))] = attribute except: continue - for inverse in self.file.get_inverse(element): - self.replacements.setdefault(inverse, {})[element] = new_element + for inverse_pair in self.file.get_inverse(element, allow_duplicate=True, with_attribute_indices=True): + inverse, index = inverse_pair + self.replacements.setdefault(inverse, {}).setdefault(index, {})[element] = new_element self.to_delete.add(element) return new_element def unbatch(self): - for element, replacements in self.replacements.items(): - for i, attribute in enumerate(element): - new = element.walk(lambda v: v in replacements.keys(), lambda v: replacements[v], attribute) - if attribute != new: - element[i] = new + for inverse, replacements in self.replacements.items(): + for index, element_map in replacements.items(): + value = inverse[index] + new = inverse.walk(lambda x : True, lambda v: element_map.get(v, v), value) + if value != new: + inverse[index] = new for element in self.to_delete: self.file.remove(element)