diff --git a/src/blenderbim/blenderbim/bim/module/cost/__init__.py b/src/blenderbim/blenderbim/bim/module/cost/__init__.py index e11a6ef850..8a9ef49798 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/cost/__init__.py @@ -77,6 +77,7 @@ classes = ( operator.LoadCostItemResourceQuantities, operator.ChangeParentCostItem, operator.CopyCostItem, + operator.AddCurrency, prop.CostItem, prop.CostItemQuantity, prop.CostItemType, diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index a3152e87e1..50b42bd672 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -740,3 +740,12 @@ class ChangeParentCostItem(bpy.types.Operator, tool.Ifc.Operator): if isinstance(r, str): self.report({"WARNING"}, r) return {"FINISHED"} + + +class AddCurrency(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.add_currency" + bl_label = "Add Currency" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + core.add_currency(tool.Ifc, tool.Cost) diff --git a/src/blenderbim/blenderbim/bim/module/cost/prop.py b/src/blenderbim/blenderbim/bim/module/cost/prop.py index 2976f45b89..f0ea31fd8c 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/prop.py +++ b/src/blenderbim/blenderbim/bim/module/cost/prop.py @@ -115,6 +115,27 @@ def get_schedule_predefined_types(self, context): return CostSchedulesData.data["predefined_types"] +def get_currencies(self, context): + return [ + ("USD", "USD", "Dollar"), + ("EUR", "EUR", "Euro"), + ("GBP", "GBP", "Pound"), + ("AUD", "AUD", "Australian Dollar"), + ("CAD", "CAD", "Canadian Dollar"), + ("CHF", "CHF", "Swiss Franc"), + ("CNY", "CNY", "Chinese Yuan"), + ("HKD", "HKD", "Hong Kong Dollar"), + ("JPY", "JPY", "Japanese Yen"), + ("NZD", "NZD", "New Zealand Dollar"), + ("SEK", "SEK", "Swedish Krona"), + ("KRW", "KRW", "South Korean Won"), + ("SGD", "SGD", "Singapore Dollar"), + ("NOK", "NOK", "Norwegian Krone"), + ("MAD", "MAD", "Moroccan Dirham"), + ("CUSTOM", "Custom currency", "Custom"), + ] + + class CostItem(PropertyGroup): name: StringProperty(name="Name", update=update_cost_item_name) identification: StringProperty(name="Identification", update=update_cost_item_identification) @@ -190,6 +211,7 @@ class BIMCostProperties(PropertyGroup): cost_value_formula: StringProperty(name="Cost Value Formula") cost_column: StringProperty(name="Cost Column") should_show_column_ui: BoolProperty(name="Should Show Column UI", default=False) + should_show_currency_ui: BoolProperty(name="Should Show Currency UI", default=False) columns: CollectionProperty(name="Columns", type=StrProperty) active_column_index: IntProperty(name="Active Column Index") cost_item_products: CollectionProperty(name="Cost Item Products", type=CostItemQuantity) @@ -216,3 +238,7 @@ class BIMCostProperties(PropertyGroup): ) change_cost_item_parent: BoolProperty(name="Change Cost Item Parent", default=False, update=update_cost_item_parent) show_cost_item_operators: BoolProperty(name="Show Cost Item Operators", default=False) + currency: EnumProperty(items=get_currencies, name="Currencies") + custom_currency: StringProperty( + name="Custom Currency", default="USD", description="Custom Currency in ISO 4217 format" + ) diff --git a/src/blenderbim/blenderbim/bim/module/cost/ui.py b/src/blenderbim/blenderbim/bim/module/cost/ui.py index 285499969c..3e92163157 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/ui.py +++ b/src/blenderbim/blenderbim/bim/module/cost/ui.py @@ -83,6 +83,7 @@ class BIM_PT_cost_schedules(Panel): row1.label(text="Settings") row1 = col.row(align=True) row1.alignment = "RIGHT" + row1.prop(self.props, "should_show_currency_ui", text="Project Currency", icon="COPY_ID") row1.prop(self.props, "should_show_column_ui", text="Schedule Columns", icon="SHORTDISPLAY") if self.props.is_editing == "COST_SCHEDULE_ATTRIBUTES": row.operator("bim.edit_cost_schedule", text="", icon="CHECKMARK") @@ -102,6 +103,8 @@ class BIM_PT_cost_schedules(Panel): elif self.props.is_editing == "COST_ITEMS": if self.props.should_show_column_ui: self.draw_column_ui() + if self.props.should_show_currency_ui: + self.draw_currency_ui() self.draw_editable_cost_item_ui() def draw_column_ui(self): @@ -110,6 +113,20 @@ class BIM_PT_cost_schedules(Panel): row.operator("bim.add_cost_column", text="", icon="ADD").name = self.props.cost_column self.layout.template_list("BIM_UL_cost_columns", "", self.props, "columns", self.props, "active_column_index") + def draw_currency_ui(self): + row = self.layout.row(align=True) + if CostSchedulesData.data["currency"]: + text = "Currency used: {}".format(CostSchedulesData.data["currency"]["name"]) + row.label(text=text) + row.operator("bim.remove_unit", text="", icon="X").unit = CostSchedulesData.data["currency"]["id"] + else: + row.label(text="No currency set") + row.prop(self.props, "currency", text="") + if self.props.currency == "CUSTOM": + row.alignment = "RIGHT" + row.prop(self.props, "custom_currency", text="") + row.operator("bim.add_currency", text="", icon="ADD") + def draw_editable_cost_schedule_ui(self): blenderbim.bim.helper.draw_attributes(self.props.cost_schedule_attributes, self.layout) @@ -620,9 +637,9 @@ class BIM_UL_cost_items_trait: text = "{0:,.2f}".format(cost_item["TotalAppliedValue"]).replace(",", " ") if cost_item["UnitBasisValueComponent"] not in [None, 1]: text = "{} / {}".format(text, round(cost_item["UnitBasisValueComponent"], 2)) - text = "{} {}".format(text, cost_item["Currency"]) if cost_item["Currency"] else text currency = CostSchedulesData.data["currency"] - layout.label(text="{} {}".format(text, currency["name"]) if currency else text) + text = "{} {}".format(text, currency["name"]) if currency else text + layout.label(text=text) else: layout.label(text="-") @@ -645,6 +662,7 @@ class BIM_UL_cost_items_trait: label = "{0:.2f}".format(cost_item["TotalCostQuantity"]) + f" {cost_item['UnitSymbol'] or '-'}" layout.label(text=label) else: + layout.label(text="-") # if cost_item["DerivedTotalCostQuantity"] not in [None, 0]: # layout.label(text="{0:.2f}".format(cost_item["DerivedTotalCostQuantity"]) + f" {cost_item['DerivedUnitSymbol'] or '-'}") # else: diff --git a/src/blenderbim/blenderbim/core/cost.py b/src/blenderbim/blenderbim/core/cost.py index f22ad4dce4..6d1d2e9cd6 100644 --- a/src/blenderbim/blenderbim/core/cost.py +++ b/src/blenderbim/blenderbim/core/cost.py @@ -285,3 +285,10 @@ def copy_cost_item(ifc, cost): cost_item = ifc.run("cost.copy_cost_item", cost_item=cost_item) cost.disable_editing_cost_item_parent() cost.load_cost_schedule_tree() + +def add_currency(ifc, cost): + unit = ifc.run("unit.add_monetary_unit") + attributes = cost.get_currency_attributes() + ifc.run("unit.edit_monetary_unit", unit=unit, attributes=attributes) + ifc.run("unit.assign_unit", units=[unit]) + return unit \ No newline at end of file diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 83e7036079..7a0588c431 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -867,6 +867,8 @@ class Unit: def is_scene_unit_metric(cls): pass def is_unit_class(cls, unit, ifc_class): pass def set_active_unit(cls, unit): pass + def get_project_currency_unit(cls): pass + def get_currency_name(cls): pass @interface diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index e5d6139d4b..328d41575f 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -692,3 +692,13 @@ class Cost(blenderbim.core.tool.Cost): @classmethod def has_schedules(cls): return bool(tool.Ifc.get().by_type("IfcCostSchedule")) + + @classmethod + def get_currency_attributes(cls): + props = bpy.context.scene.BIMCostProperties + currency = props.currency + if currency == "CUSTOM": + currency = props.custom_currency + return { + "Currency": currency, + } \ No newline at end of file diff --git a/src/blenderbim/blenderbim/tool/unit.py b/src/blenderbim/blenderbim/tool/unit.py index 8855d397e7..8d39f9fab1 100644 --- a/src/blenderbim/blenderbim/tool/unit.py +++ b/src/blenderbim/blenderbim/tool/unit.py @@ -149,3 +149,17 @@ class Unit(blenderbim.core.tool.Unit): @classmethod def set_active_unit(cls, unit): bpy.context.scene.BIMUnitProperties.active_unit_id = unit.id() + + @classmethod + def get_project_currency_unit(cls): + unit_assignments = tool.Ifc.get().by_type("IfcUnitAssignment") + for assignment in unit_assignments: + for unit in assignment.Units: + if unit.is_a("IfcMonetaryUnit"): + return unit + + @classmethod + def get_currency_name(cls): + unit = cls.get_project_currency_unit() + if unit: + return unit.Currency