mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
fix "cost_item quantity updates" bug when editing a QTO
This commit is contained in:
@@ -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"}
|
||||
|
||||
@@ -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)
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user