diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index d2e98a667d..609499bab7 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -24,7 +24,7 @@ def calculate_circle_radius(qto, obj=None): def assign_pset_qto(qto, selected_objects): for obj in selected_objects: - qto.assign_pset_qto_to_selected_object(obj) + qto.assign_base_qto_to_object(obj) def calculate_all_qtos(qto, selected_objects): for obj in selected_objects: @@ -32,9 +32,9 @@ def calculate_all_qtos(qto, selected_objects): print(f"There is no pset qto instance associated to object {obj.name}") continue - pset_qto_properties = qto.get_pset_qto_properties(obj) + applicable_quantity_names = qto.get_applicable_quantity_names(obj) - calculated_quantities = qto.get_calculated_quantities(obj, pset_qto_properties) + calculated_quantities = qto.get_calculated_quantities(obj, applicable_quantity_names) qto.edit_qto(obj, calculated_quantities) @@ -44,8 +44,8 @@ def guess_all_qtos(qto, selected_objects): print(f"There is no pset qto instance associated to object {obj.name}") continue - pset_qto_properties = qto.get_pset_qto_properties(obj) + applicable_quantity_names = qto.get_base_quantities_name(obj) - calculated_quantities = qto.get_calculated_quantities(obj, pset_qto_properties) + calculated_quantities = qto.get_calculated_quantities(obj, applicable_quantity_names) qto.edit_qto(obj, calculated_quantities) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index df161c3606..5c5aa657aa 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -403,17 +403,15 @@ class Pset: class Qto: def get_radius_of_selected_vertices(cls, obj): pass def set_qto_result(cls, result): pass + def assign_base_qto_to_object(cls, object): pass def get_pset_qto_object_ifc_info(cls, object): pass - def get_pset_qto_properties(cls, object): pass - def get_pset_qto_name(cls, object): pass - def get_applicable_pset_names(cls, object): pass + def get_applicable_quantity_names(cls, object): pass + def get_qto_applicable_name(cls, object): pass def edit_qto(cls, object, calculated_quantities): pass - def get_pset_qto_id(cls, object): pass - def get_pset_qto_name(cls, object): pass + def get_qto_entity(cls, object): pass def get_new_quantity(cls, object, quantity_name, alternative_prop_names): pass def get_rounded_value(cls, new_quantity): pass def get_calculated_quantities(cls, object, pset_qto_properties): pass - def assign_pset_qto_to_selected_object(cls, object): pass @interface class Resource: diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 8f8dad7d8d..7abc235834 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -41,6 +41,20 @@ class Qto(blenderbim.core.tool.Qto): def set_qto_result(cls, result): bpy.context.scene.BIMQtoProperties.qto_result = str(round(result, 3)) + @classmethod + def assign_base_qto_to_object(cls, obj): + file = tool.Ifc.get() + entity = tool.Ifc.get_entity(obj) + pset_qto_name = cls.get_qto_applicable_name(obj) + ifcopenshell.api.run( + "pset.add_qto", + file, + **{ + "product": entity, + "name": pset_qto_name, + }, + ) + @classmethod def get_pset_qto_object_ifc_info(cls, obj): element = tool.Ifc.get_entity(obj) @@ -48,65 +62,40 @@ class Qto(blenderbim.core.tool.Qto): return pset_qto_ifc_info @classmethod - def get_pset_qto_properties(cls, obj): + def get_applicable_quantity_names(cls, obj): file = tool.Ifc.get() schema = file.schema pset_qto = util.pset.PsetQto(schema) -# pset_qto_name = cls.get_pset_qto_name(obj) - pset_qto_name = cls.get_assigned_pset_qto_name(obj) - pset_qto_properties = pset_qto.get_by_name(pset_qto_name).get_info()['HasPropertyTemplates'] - return pset_qto_properties + qto_name = cls.get_qto_applicable_name(obj) + properties_templates = pset_qto.get_by_name(qto_name).get_info()['HasPropertyTemplates'] + applicable_quantity_names = [a.get_info()['Name'] for a in properties_templates] + return applicable_quantity_names @classmethod - def get_pset_qto_name(cls, obj): - applicable_pset_names = cls.get_applicable_pset_names(obj) - for applicable_pset_name in applicable_pset_names: - if 'Qto_' in applicable_pset_name: - pset_qto_name = applicable_pset_name - return pset_qto_name - - @classmethod - def get_assigned_pset_qto_name(cls, obj): + def get_qto_applicable_name(cls, obj): entity = tool.Ifc.get_entity(obj) - assigned_pset_qto_name = ifcopenshell.util.element.get_psets(entity, qtos_only = True) - assigned_pset_qto_name = list(assigned_pset_qto_name.keys())[0] - return assigned_pset_qto_name - - @classmethod - def get_applicable_pset_names(cls, obj): - file = tool.Ifc.get() - schema = file.schema - pset_qto = util.pset.PsetQto(schema) - entity = tool.Ifc.get_entity(obj) - ifc_object_type = entity.get_info()['type'] - applicable_pset_names = pset_qto.get_applicable_names(ifc_object_type) - return applicable_pset_names + ifc_class = entity.get_info()['type'] + qto_applicable_names = blenderbim.bim.schema.ifc.psetqto.get_applicable_names(ifc_class, qto_only=True) + qto_applicable_name = [q for q in qto_applicable_names if "Qto_" in q and "Base" in q][0] + return qto_applicable_name @classmethod def edit_qto(cls, obj, calculated_quantities): file = tool.Ifc.get() - pset_qto_name = cls.get_pset_qto_name(obj) - pset_qto_id = cls.get_pset_qto_id(obj, pset_qto_name) + pset_qto_applicable_name = cls.get_qto_applicable_name(obj) + qto_entity = cls.get_qto_entity(obj, pset_qto_applicable_name) ifcopenshell.api.run("pset.edit_qto", file, - **{"qto" : pset_qto_id, "name" : pset_qto_name, "properties": calculated_quantities} + qto = qto_entity, properties = calculated_quantities, ) @classmethod - def get_pset_qto_id(cls, obj, pset_qto_name): + def get_qto_entity(cls, obj, pset_qto_applicable_name): file = tool.Ifc.get() pset_qto_object_ifc_info = cls.get_pset_qto_object_ifc_info(obj) - pset_qto_id = file.by_id(pset_qto_object_ifc_info[pset_qto_name]['id']) - return pset_qto_id - - @classmethod - def get_pset_qto_name(cls, obj): - applicable_pset_names = cls.get_applicable_pset_names(obj) - for applicable_pset_name in applicable_pset_names: - if 'Qto_' in applicable_pset_name: - pset_qto_name = applicable_pset_name - return pset_qto_name + qto_entity = file.by_id(pset_qto_object_ifc_info[pset_qto_applicable_name]['id']) + return qto_entity @classmethod def get_new_calculated_quantity(cls, qto_name, quantity_name, obj): @@ -124,13 +113,12 @@ class Qto(blenderbim.core.tool.Qto): return round(new_quantity, 3) @classmethod - def get_calculated_quantities(cls, obj, pset_qto_properties): + def get_calculated_quantities(cls, obj, applicable_quantity_names): calculated_quantities = {} - qto_name = cls.get_pset_qto_name(obj) + qto_name = cls.get_qto_applicable_name(obj) calculator = QtoCalculator() - for pset_qto_property in pset_qto_properties: - quantity_name = pset_qto_property.get_info()['Name'] + for quantity_name in applicable_quantity_names: if not cls.has_calculator(qto_name, quantity_name): continue else: @@ -163,17 +151,3 @@ class Qto(blenderbim.core.tool.Qto): return calculated_quantities - - @classmethod - def assign_pset_qto_to_selected_object(cls, obj): - file = tool.Ifc.get() - entity = tool.Ifc.get_entity(obj) - pset_qto_name = cls.get_pset_qto_name(obj) - ifcopenshell.api.run( - "pset.add_qto", - file, - **{ - "product": entity, - "name": pset_qto_name, - }, - )