diff --git a/src/bonsai/bonsai/bim/module/qto/operator.py b/src/bonsai/bonsai/bim/module/qto/operator.py index 63d16335a1..8a996fc383 100644 --- a/src/bonsai/bonsai/bim/module/qto/operator.py +++ b/src/bonsai/bonsai/bim/module/qto/operator.py @@ -128,7 +128,7 @@ class CalculateSingleQuantity(bpy.types.Operator, tool.Ifc.Operator): props = context.scene.BIMQtoProperties elements = set() - for obj in context.selected_objects: + for obj in tool.Blender.get_selected_objects(include_active=False): element = tool.Ifc.get_entity(obj) if element: elements.add(element) diff --git a/src/bonsai/test/bim/test_feature.py b/src/bonsai/test/bim/test_feature.py index 34484fa018..4f263f93c9 100644 --- a/src/bonsai/test/bim/test_feature.py +++ b/src/bonsai/test/bim/test_feature.py @@ -1097,7 +1097,7 @@ def prop_is_roughly_value(prop, value): def the_object_name_has_a_cartesian_point_offset_of_offset(name: str, offset: str) -> None: offset = replace_variables(offset) obj = the_object_name_exists(name) - props = tool.Blender.get_object_props(obj) + props = tool.Blender.get_object_bim_props(obj) assert props.blender_offset_type == "CARTESIAN_POINT" obj_offset = np.array(tuple(map(float, props.cartesian_point_offset.split(",")))) offset = np.array(tuple(map(float, offset.split(",")))) diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index 1c99cccc74..2206fe6a1a 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -47,10 +47,12 @@ for name in get_args(RULE_SET): def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], rules: dict) -> ResultsDict: - """ + """Quantify elements from a rules using preset quantification rules + + Rules placed as a JSON configuration file in the ``ifc5d`` folder will be + autodetected and loaded with the module for convenience. :param rules: Set of rules from `ifc5d.qto.rules`. - """ results: ResultsDict = {} elements_by_classes: defaultdict[str, set[ifcopenshell.entity_instance]] = defaultdict(set) @@ -59,13 +61,8 @@ def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_inst for calculator, queries in rules["calculators"].items(): calculator = calculators[calculator] - for ifc_class, qtos in queries.items(): - filtered_elements = set() - ifc_classes = [ifc_class] + ifcopenshell.util.type.get_applicable_types(ifc_class, ifc_file.schema) - for ifc_class in ifc_classes: - if ifc_class not in elements_by_classes: - continue - filtered_elements.update(elements_by_classes[ifc_class]) + for query, qtos in queries.items(): + filtered_elements = ifcopenshell.util.selector.filter_elements(ifc_file, query, elements) if filtered_elements: calculator.calculate(ifc_file, filtered_elements, qtos, results) return results