diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index e01f2d21fb..1afaf3ad09 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -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() diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index d74492041e..951b541df2 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -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"} diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index 83d38fe59c..16ae9719dc 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -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) \ No newline at end of file diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 984a8d87fd..ddfd640039 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -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: diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index e7bcb864ca..8ccddefbcc 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -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") \ No newline at end of file + 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")) \ No newline at end of file diff --git a/src/blenderbim/test/bim/feature/pset.feature b/src/blenderbim/test/bim/feature/pset.feature index a587b2d43b..0eaaf034f7 100644 --- a/src/blenderbim/test/bim/feature/pset.feature +++ b/src/blenderbim/test/bim/feature/pset.feature @@ -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