From a1acdc0977f1684a67efb670d1224f95739972ef Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 4 Apr 2023 09:58:23 +1000 Subject: [PATCH] See #2881. Allow indices in the selector instead of relying on external evaluations. --- .../ifcopenshell/util/selector.py | 19 +++++++++++-------- .../test/util/test_selector.py | 2 ++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index d7861d3f90..020f5a3b50 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -298,14 +298,17 @@ class Selector: else: value = value.get(key, None) elif isinstance(value, (list, tuple)): # If we use regex - results = [] - for v in value: - subvalue = cls.get_element_value(v, [key], is_regex=is_regex) - if isinstance(subvalue, list): - results.extend(subvalue) - else: - results.append(subvalue) - value = results + if key.isnumeric(): + value = value[int(key)] + else: + results = [] + for v in value: + subvalue = cls.get_element_value(v, [key], is_regex=is_regex) + if isinstance(subvalue, list): + results.extend(subvalue) + else: + results.append(subvalue) + value = results return value @classmethod diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index b1e6470196..e61eba3ea4 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -49,6 +49,8 @@ class TestGetElementValue(test.bootstrap.IFC4): assert subject.get_element_value(element, "material.MaterialLayers.Name") == ["L1", "L2"] # Allow to use "item" to generically select an item in a material set assert subject.get_element_value(element, "material.item.Name") == ["L1", "L2"] + assert subject.get_element_value(element, "material.item.Name.0") == "L1" + assert subject.get_element_value(element, "material.item.Name.1") == "L2" assert subject.get_element_value(element, '"material"."item"."Name"') == ["L1", "L2"] assert subject.get_element_value(element, 'r"material"."item"."Name"') == ["L1", "L2"] # Provide shortform for convenience