mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 22:50:56 +00:00
Batch reassignments now take advantage of inverse indices for a slight speedup. See #2408.
This commit is contained in:
@@ -83,17 +83,19 @@ class BatchReassignClass:
|
|||||||
new_element[new_attributes.index(element.attribute_name(i))] = attribute
|
new_element[new_attributes.index(element.attribute_name(i))] = attribute
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
for inverse in self.file.get_inverse(element):
|
for inverse_pair in self.file.get_inverse(element, allow_duplicate=True, with_attribute_indices=True):
|
||||||
self.replacements.setdefault(inverse, {})[element] = new_element
|
inverse, index = inverse_pair
|
||||||
|
self.replacements.setdefault(inverse, {}).setdefault(index, {})[element] = new_element
|
||||||
self.to_delete.add(element)
|
self.to_delete.add(element)
|
||||||
return new_element
|
return new_element
|
||||||
|
|
||||||
def unbatch(self):
|
def unbatch(self):
|
||||||
for element, replacements in self.replacements.items():
|
for inverse, replacements in self.replacements.items():
|
||||||
for i, attribute in enumerate(element):
|
for index, element_map in replacements.items():
|
||||||
new = element.walk(lambda v: v in replacements.keys(), lambda v: replacements[v], attribute)
|
value = inverse[index]
|
||||||
if attribute != new:
|
new = inverse.walk(lambda x : True, lambda v: element_map.get(v, v), value)
|
||||||
element[i] = new
|
if value != new:
|
||||||
|
inverse[index] = new
|
||||||
|
|
||||||
for element in self.to_delete:
|
for element in self.to_delete:
|
||||||
self.file.remove(element)
|
self.file.remove(element)
|
||||||
|
|||||||
Reference in New Issue
Block a user