fix "cost_item quantity updates" bug when editing a QTO

This commit is contained in:
Sigma Dimensions
2023-04-19 01:01:10 +00:00
parent 849d6118d0
commit ed4ba4d0d3
6 changed files with 66 additions and 13 deletions
@@ -295,8 +295,8 @@ class EditPset(bpy.types.Operator, Operator):
name=props.active_pset_name, name=props.active_pset_name,
properties=properties, properties=properties,
) )
bpy.ops.bim.load_cost_item_quantities() if tool.Cost.has_schedules():
tool.Cost.update_cost_items(pset=pset)
bpy.ops.bim.disable_pset_editing(obj=self.obj, obj_type=self.obj_type) bpy.ops.bim.disable_pset_editing(obj=self.obj, obj_type=self.obj_type)
tool.Blender.update_viewport() tool.Blender.update_viewport()
@@ -195,5 +195,5 @@ class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator):
return tool.Ifc.get() and context.selected_objects return tool.Ifc.get() and context.selected_objects
def _execute(self, context): def _execute(self, context):
core.calculate_objects_base_quantities(tool.Ifc, tool.Qto, QtoCalculator(), selected_objects = context.selected_objects) core.calculate_objects_base_quantities(tool.Ifc, tool.Cost, tool.Qto, QtoCalculator(), selected_objects = context.selected_objects)
return {"FINISHED"} return {"FINISHED"}
+4 -3
View File
@@ -42,13 +42,13 @@ def assign_object_base_qto(ifc, qto, obj):
) )
def calculate_objects_base_quantities(ifc, qto, calculator, selected_objects): def calculate_objects_base_quantities(ifc, cost, qto, calculator, selected_objects):
if selected_objects: if selected_objects:
for obj in selected_objects: for obj in selected_objects:
calculate_object_base_quantities(ifc, qto, calculator, obj) calculate_object_base_quantities(ifc, cost, qto, calculator, obj)
def calculate_object_base_quantities(ifc, qto, calculator, obj): def calculate_object_base_quantities(ifc, cost, qto, calculator, obj):
product = ifc.get_entity(obj) product = ifc.get_entity(obj)
if not product: if not product:
return return
@@ -65,3 +65,4 @@ def calculate_object_base_quantities(ifc, qto, calculator, obj):
) )
calculated_quantities = qto.get_calculated_object_quantities(calculator, base_quantity_name, obj) calculated_quantities = qto.get_calculated_object_quantities(calculator, base_quantity_name, obj)
ifc.run("pset.edit_qto", qto=base_qto, properties=calculated_quantities) ifc.run("pset.edit_qto", qto=base_qto, properties=calculated_quantities)
cost.update_cost_items(product=product)
+18 -3
View File
@@ -143,11 +143,13 @@ class Context:
@interface @interface
class Cost: class Cost:
def add_cost_column(cls, name): pass def add_cost_column(cls, name): pass
def change_parent_cost_item(cls, cost_item, new_parent): pass
def clean_up_cost_item_tree(cls, cost_item): pass def clean_up_cost_item_tree(cls, cost_item): pass
def contract_cost_item_rate(cls, cost_item): pass def contract_cost_item_rate(cls, cost_item): pass
def contract_cost_item(cls, cost_item): pass def contract_cost_item(cls, cost_item): pass
def contract_cost_items(cls): pass def contract_cost_items(cls): pass
def create_new_cost_item_li(props_collection, cost_item, level_index, type): pass def create_new_cost_item_li(props_collection, cost_item, level_index, type): pass
def disable_editing_cost_item_parent(cls): pass
def disable_editing_cost_item_quantity(cls): pass def disable_editing_cost_item_quantity(cls): pass
def disable_editing_cost_item_value(cls): pass def disable_editing_cost_item_value(cls): pass
def disable_editing_cost_item(cls): pass def disable_editing_cost_item(cls): pass
@@ -164,38 +166,51 @@ class Cost:
def expand_cost_item(cls, cost_item): pass def expand_cost_item(cls, cost_item): pass
def expand_cost_items(cls): pass def expand_cost_items(cls): pass
def export_cost_schedules(cls, format): pass def export_cost_schedules(cls, format): pass
def export_cost_schedules(cls, format): pass
def format_unit(cls, unit): pass
def get_active_cost_item(cls): pass def get_active_cost_item(cls): pass
def get_active_cost_schedule(cls): pass def get_active_cost_schedule(cls): pass
def get_active_cost_schedule(cls): pass
def get_attributes_for_cost_value(cls, cost_type, cost_category): pass def get_attributes_for_cost_value(cls, cost_type, cost_category): pass
def get_cost_item_attributes(cls, cost_item): pass def get_cost_item_attributes(cls, cost_item): pass
def get_cost_item_products(cls): pass def get_cost_item_products(cls): pass
def get_cost_item_quantity_attributes(cls): pass def get_cost_item_quantity_attributes(cls): pass
def get_cost_item_value_formula(cls): pass def get_cost_item_value_formula(cls): pass
def get_cost_items_for_product(cls, product, cost_schedule): pass
def get_cost_schedule_attributes(cls): pass def get_cost_schedule_attributes(cls): pass
def get_cost_schedule_products(cls, cost_schedule): pass def get_cost_schedule_products(cls, cost_schedule): pass
def get_cost_schedule(cls, cost_schedule): pass
def get_cost_value_attributes(cls): pass def get_cost_value_attributes(cls): pass
def get_cost_value_unit_component(cls): pass def get_cost_value_unit_component(cls): pass
def get_direct_cost_item_products(cls): pass def get_direct_cost_item_products(cls): pass
def get_highlighted_cost_item(cls): pass def get_highlighted_cost_item(cls): pass
def get_highlighted_cost_item(cls): pass def get_highlighted_cost_item(cls): pass
def get_nested_cost_items(cls, cost_item): pass
def get_products(cls, related_object_type): pass def get_products(cls, related_object_type): pass
def get_root_cost_items(cls, cost_schedule): pass
def get_schedule_cost_items(cls, cost_schedule): pass def get_schedule_cost_items(cls, cost_schedule): pass
def get_units(cls): pass
def get_units(cls):pass def get_units(cls):pass
def has_cost_assignments(cls, cost_item): pass def has_cost_assignments(cls, cost_item): pass
def has_cost_assignments(cls, product, cost_schedule): pass
def has_schedules(cls): pass
def highlight_cost_item(cls, cost_item): pass
def import_cost_schedule_csv(cls, file_path, is_schedule_of_rates): pass def import_cost_schedule_csv(cls, file_path, is_schedule_of_rates): pass
def is_active_schedule_of_rates(cls): pass def is_active_schedule_of_rates(cls): pass
def is_cost_schedule_active(cls, cost_schedule): pass
def is_root_cost_item(cls, cost_item): pass
def load_cost_item_attributes(cls): pass def load_cost_item_attributes(cls): pass
def load_cost_item_quantities(cls, cost_item): pass def load_cost_item_quantities(cls, cost_item, related_object_type): pass
def load_cost_item_quantity_attributes(cls, physical_quantity): pass def load_cost_item_quantity_attributes(cls, physical_quantity): pass
def load_cost_item_types(cls, cost_item): pass def load_cost_item_types(cls, cost_item): pass
def load_cost_item_value_attributes(cls, cost_value): pass def load_cost_item_value_attributes(cls, cost_value): pass
def load_cost_item_value_formula_attributes(cls, cost_value): pass def load_cost_item_value_formula_attributes(cls, cost_value): pass
def load_cost_schedule_tree(cls): pass def load_cost_schedule_tree(cls): pass
def load_product_cost_items(cls, product): pass
def load_schedule_of_rates_tree(cls, schedule_of_rates): pass def load_schedule_of_rates_tree(cls, schedule_of_rates): pass
def play_chaching_sound(cls): pass def play_chaching_sound(cls): pass
def remove_cost_column(cls, name): pass def remove_cost_column(cls, name): pass
def toggle_cost_item_parent_change(cls, cost_item): pass
def update_cost_items(cls, product, pset): pass
@interface @interface
class Debug: class Debug:
+28 -4
View File
@@ -634,7 +634,31 @@ class Cost(blenderbim.core.tool.Cost):
@classmethod @classmethod
def load_cost_item_quantities(cls, cost_item=None): def load_cost_item_quantities(cls, cost_item=None):
if not cost_item: if not cost_item:
cost_item = tool.Cost.get_highlighted_cost_item() cost_item = cls.get_highlighted_cost_item()
tool.Cost.load_cost_item_quantity_assignments(cost_item, related_object_type="PRODUCT") if not cost_item:
tool.Cost.load_cost_item_quantity_assignments(cost_item, related_object_type="PROCESS") return
tool.Cost.load_cost_item_quantity_assignments(cost_item, related_object_type="RESOURCE") cls.load_cost_item_quantity_assignments(cost_item, related_object_type="PRODUCT")
cls.load_cost_item_quantity_assignments(cost_item, related_object_type="PROCESS")
cls.load_cost_item_quantity_assignments(cost_item, related_object_type="RESOURCE")
@classmethod
def update_cost_items(cls, product=None, pset=None):
cost_items = []
if product:
cost_items = ifcopenshell.util.cost.get_cost_items_for_product(product)
if pset:
def get_products_from_pset(pset):
products = []
for rel in pset.DefinesOccurrence or []:
if rel.is_a("IfcRelDefinesByProperties"):
products.extend(rel.RelatedObjects)
return products
products = get_products_from_pset(pset)
for product in products or []:
cost_items.extend(ifcopenshell.util.cost.get_cost_items_for_product(product))
for cost_item in cost_items:
cls.load_cost_item_quantity_assignments(cost_item, related_object_type="PRODUCT")
@classmethod
def has_schedules(cls):
return bool(tool.Ifc.get().by_type("IfcCostSchedule"))
@@ -212,6 +212,19 @@ Scenario: Edit pset - object
When I press "bim.edit_pset(obj='IfcWall/Cube', obj_type='Object')" When I press "bim.edit_pset(obj='IfcWall/Cube', obj_type='Object')"
Then nothing happens Then nothing happens
Scenario: Edit qto - object
Given an empty IFC project
And I add a cube
And the object "Cube" is selected
And I set "scene.BIMRootProperties.ifc_class" to "IfcWall"
And I press "bim.assign_class"
And the object "IfcWall/Cube" is selected
And I set "active_object.PsetProperties.qto_name" to "Qto_WallBaseQuantities"
When I press "bim.add_qto(obj='IfcWall/Cube', obj_type='Object')"
And I set "active_object.PsetProperties.properties[0].metadata.float_value" to "0.42"
And I press "bim.edit_pset(obj='IfcWall/Cube', obj_type='Object')"
Then nothing happens
Scenario: Edit pset - material Scenario: Edit pset - material
Given an empty IFC project Given an empty IFC project
And I add a cube And I add a cube