diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index 2ba0a44e31..4cf97e2ba0 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -27,6 +27,7 @@ classes = ( operator.EditPset, operator.EnablePsetEditing, operator.GuessQuantity, + operator.CalculateQuantity, operator.GuessAllQuantities, operator.RemovePset, operator.TogglePsetExpansion, diff --git a/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py b/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py new file mode 100644 index 0000000000..75aa45a498 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py @@ -0,0 +1,10 @@ +mapper = { + "Qto_WallBaseQuantities" : { + "Length" : "get_length", + "Width" : "get_width", + "Height" : "get_height", + }, + "Qto_SlabBaseQuantities" : { + "Depth" : "get_height", + }, +} diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 0692e4c4ec..f1f5e256c3 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -344,6 +344,44 @@ class AddQto(bpy.types.Operator, Operator): Data.load(IfcStore.get_file(), ifc_definition_id) +class CalculateQuantity(bpy.types.Operator): + bl_idname = "bim.calculate_quantity" + bl_label = "Calculate Quantity" + bl_options = {"REGISTER", "UNDO"} + prop: bpy.props.StringProperty() + + def execute(self, context): + self.qto_calculator = QtoCalculator() + obj = context.active_object + prop = obj.PsetProperties.properties.get(self.prop) + prop.metadata.float_value = self.calculate_quantity(obj, context) + return {"FINISHED"} + + def calculate_quantity(self, obj, context): + quantity = self.qto_calculator.calculate_quantity(obj.PsetProperties.active_pset_name, self.prop, obj) + prefix, name = self.get_blender_prefix_name(context) + quantity = ifcopenshell.util.unit.convert(quantity, None, "METRE", prefix, name) + return round(quantity, 3) + + def get_prefix_name(self, value): + if "/" in value: + return value.split("/") + return None, value + + def get_blender_prefix_name(self, context): + unit_settings = context.scene.unit_settings + if unit_settings.system == "IMPERIAL": + if unit_settings.length_unit == "INCHES": + return None, "inch" + elif unit_settings.length_unit == "FEET": + return None, "foot" + elif unit_settings.system == "METRIC": + if unit_settings.length_unit == "METERS": + return None, "METRE" + return unit_settings.length_unit[0 : -len("METERS")], "METRE" + + + class GuessQuantity(bpy.types.Operator): bl_idname = "bim.guess_quantity" bl_label = "Guess Quantity" diff --git a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py index a5b67722da..99478f8036 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py @@ -25,9 +25,23 @@ from shapely.geometry import Polygon from shapely.ops import unary_union import blenderbim.tool as tool import ifcopenshell +from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper class QtoCalculator: + + def __init__(self): + self.mapping_dict = {} + for key in mapper.keys(): + self.mapping_dict[key] = dict(mapper[key].items()) + + for key in self.mapping_dict.keys(): + for item in self.mapping_dict[key].keys(): + self.mapping_dict[key][item] = eval("self." + self.mapping_dict[key][item]) + + def calculate_quantity(self, qto_name, quantity_name, obj): + return self.mapping_dict[qto_name][quantity_name](obj) + def guess_quantity(self, prop_name, alternative_prop_names, obj): prop_name = prop_name.lower() alternative_prop_names = [p.lower() for p in alternative_prop_names] diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 70a1a173b7..b1408402dc 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -19,6 +19,7 @@ from bpy.types import Panel from blenderbim.bim.ifc import IfcStore from blenderbim.bim.helper import prop_with_search +from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper from blenderbim.bim.module.pset.data import ( ObjectPsetsData, ObjectQtosData, @@ -139,6 +140,11 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type): def draw_psetqto_editable_ui(box, props, prop): row = box.row(align=True) draw_property(prop, row, copy_operator="bim.copy_property_to_selection") + qto_name = ObjectQtosData.data['qtos'][0]['Name'] + if qto_name in mapper.keys(): + if prop.name in mapper[qto_name]: + op = row.operator("bim.calculate_quantity", icon="MOD_EDGESPLIT", text="") + op.prop = prop.name if ( "length" in prop.name.lower() or "width" in prop.name.lower()