mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-11 22:31:55 +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,
|
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"}
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user