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,
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)
tool.Blender.update_viewport()
@@ -195,5 +195,5 @@ class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator):
return tool.Ifc.get() and context.selected_objects
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"}
+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:
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)
if not product:
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)
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
class Cost:
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 contract_cost_item_rate(cls, cost_item): pass
def contract_cost_item(cls, cost_item): pass
def contract_cost_items(cls): 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_value(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_items(cls): 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_schedule(cls): pass
def get_active_cost_schedule(cls): 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_products(cls): pass
def get_cost_item_quantity_attributes(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_products(cls, cost_schedule): pass
def get_cost_schedule(cls, cost_schedule): pass
def get_cost_value_attributes(cls): pass
def get_cost_value_unit_component(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_nested_cost_items(cls, cost_item): 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_units(cls): pass
def get_units(cls):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 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_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_types(cls, cost_item): 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_schedule_tree(cls): pass
def load_product_cost_items(cls, product): pass
def load_schedule_of_rates_tree(cls, schedule_of_rates): pass
def play_chaching_sound(cls): 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
class Debug:
+28 -4
View File
@@ -634,7 +634,31 @@ class Cost(blenderbim.core.tool.Cost):
@classmethod
def load_cost_item_quantities(cls, cost_item=None):
if not cost_item:
cost_item = tool.Cost.get_highlighted_cost_item()
tool.Cost.load_cost_item_quantity_assignments(cost_item, related_object_type="PRODUCT")
tool.Cost.load_cost_item_quantity_assignments(cost_item, related_object_type="PROCESS")
tool.Cost.load_cost_item_quantity_assignments(cost_item, related_object_type="RESOURCE")
cost_item = cls.get_highlighted_cost_item()
if not cost_item:
return
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')"
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
Given an empty IFC project
And I add a cube