You can now edit resource base quantity

This commit is contained in:
Dion Moult
2021-08-28 14:38:10 +10:00
parent 126bac462d
commit faaeef92de
8 changed files with 214 additions and 2 deletions
@@ -26,21 +26,27 @@ classes = (
operator.EnableEditingResource,
operator.LoadResources,
operator.AddResource,
operator.AddResourceQuantity,
operator.EditResource,
operator.RemoveResource,
operator.RemoveResourceQuantity,
operator.LoadResourceProperties,
operator.ExpandResource,
operator.ContractResource,
operator.AssignResource,
operator.UnassignResource,
operator.EnableEditingResourceTime,
operator.EnableEditingResourceQuantity,
operator.EnableEditingResourceBaseQuantity,
operator.EnableEditingResourceCosts,
operator.EnableEditingResourceCostValueFormula,
operator.EnableEditingResourceCostValue,
operator.EditResourceTime,
operator.EditResourceQuantity,
operator.EditResourceCostValue,
operator.EditResourceCostValueFormula,
operator.DisableEditingResourceTime,
operator.DisableEditingResourceQuantity,
operator.DisableEditingResourceCostValue,
operator.CalculateResourceWork,
prop.Resource,
@@ -573,3 +573,107 @@ class EditResourceCostValue(bpy.types.Operator):
return True
if prop.name == "UnitBasisUnit":
return True
class EnableEditingResourceBaseQuantity(bpy.types.Operator):
bl_idname = "bim.enable_editing_resource_base_quantity"
bl_label = "Enable Editing Resource Quantity"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
def execute(self, context):
props = context.scene.BIMResourceProperties
props.active_resource_id = self.resource
props.editing_resource_type = "QUANTITY"
return {"FINISHED"}
class AddResourceQuantity(bpy.types.Operator):
bl_idname = "bim.add_resource_quantity"
bl_label = "Add Resource Quantity"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
ifc_class: bpy.props.StringProperty()
def execute(self, context):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
self.file = IfcStore.get_file()
ifcopenshell.api.run(
"resource.add_resource_quantity",
self.file,
resource=self.file.by_id(self.resource),
ifc_class=self.ifc_class,
)
Data.load(self.file)
return {"FINISHED"}
class RemoveResourceQuantity(bpy.types.Operator):
bl_idname = "bim.remove_resource_quantity"
bl_label = "Remove Resource Quantity"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
def execute(self, context):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
self.file = IfcStore.get_file()
ifcopenshell.api.run(
"resource.remove_resource_quantity",
self.file,
resource=self.file.by_id(self.resource),
)
Data.load(self.file)
return {"FINISHED"}
class EnableEditingResourceQuantity(bpy.types.Operator):
bl_idname = "bim.enable_editing_resource_quantity"
bl_label = "Enable Editing Resource Quantity"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
def execute(self, context):
self.props = context.scene.BIMResourceProperties
self.props.quantity_attributes.clear()
self.props.is_editing_quantity = True
data = Data.resources[self.resource]["BaseQuantity"]
blenderbim.bim.helper.import_attributes(data["type"], self.props.quantity_attributes, data)
return {"FINISHED"}
class DisableEditingResourceQuantity(bpy.types.Operator):
bl_idname = "bim.disable_editing_resource_quantity"
bl_label = "Disable Editing Resource Quantity"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
props = context.scene.BIMResourceProperties
props.is_editing_quantity = False
return {"FINISHED"}
class EditResourceQuantity(bpy.types.Operator):
bl_idname = "bim.edit_resource_quantity"
bl_label = "Edit Resource Quantity"
bl_options = {"REGISTER", "UNDO"}
physical_quantity: bpy.props.IntProperty()
def execute(self, context):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
props = context.scene.BIMResourceProperties
attributes = blenderbim.bim.helper.export_attributes(props.quantity_attributes)
self.file = IfcStore.get_file()
ifcopenshell.api.run(
"resource.edit_resource_quantity",
self.file,
**{"physical_quantity": self.file.by_id(self.physical_quantity), "attributes": attributes},
)
Data.load(IfcStore.get_file())
bpy.ops.bim.disable_editing_resource_quantity()
return {"FINISHED"}
@@ -1,4 +1,3 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
#
@@ -35,6 +34,14 @@ from bpy.props import (
)
quantitytypes_enum = []
def purge():
global quantitytypes_enum
quantitytypes_enum = []
def updateResourceName(self, context):
props = context.scene.BIMResourceProperties
if not props.is_resource_update_enabled or self.name == "Unnamed":
@@ -51,6 +58,18 @@ def updateResourceName(self, context):
attribute.string_value = self.name
def get_quantity_types(self, context):
global quantitytypes_enum
if len(quantitytypes_enum) == 0 and IfcStore.get_schema():
quantitytypes_enum.extend(
[
(t.name(), t.name(), "")
for t in IfcStore.get_schema().declaration_by_name("IfcPhysicalSimpleQuantity").subtypes()
]
)
return quantitytypes_enum
class Resource(PropertyGroup):
name: StringProperty(name="Name", update=updateResourceName)
ifc_definition_id: IntProperty(name="IFC Definition ID")
@@ -87,3 +106,6 @@ class BIMResourceProperties(PropertyGroup):
cost_value_editing_type: StringProperty(name="Cost Value Editing Type")
cost_value_attributes: CollectionProperty(name="Cost Value Attributes", type=Attribute)
cost_value_formula: StringProperty(name="Cost Value Formula")
quantity_types: EnumProperty(items=get_quantity_types, name="Quantity Types")
is_editing_quantity: BoolProperty(name="Is Editing Quantity")
quantity_attributes: CollectionProperty(name="Quantity Attributes", type=Attribute)
@@ -64,6 +64,8 @@ class BIM_PT_resources(Panel):
if self.props.active_resource_id and self.props.editing_resource_type == "ATTRIBUTES":
self.draw_editable_resource_attributes_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "QUANTITY":
self.draw_editable_resource_quantity_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "COSTS":
self.draw_editable_resource_costs_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "USAGE":
@@ -111,6 +113,8 @@ class BIM_PT_resources(Panel):
row.operator("bim.disable_editing_resource_time", text="", icon="CANCEL")
elif self.props.active_resource_id == ifc_definition_id and self.props.editing_resource_type == "COSTS":
row.operator("bim.disable_editing_resource", text="", icon="CANCEL")
elif self.props.active_resource_id == ifc_definition_id and self.props.editing_resource_type == "QUANTITY":
row.operator("bim.disable_editing_resource", text="", icon="CANCEL")
elif self.props.active_resource_id:
row.operator("bim.add_resource", text="", icon="ADD").resource = ifc_definition_id
row.operator("bim.remove_resource", text="", icon="X").resource = ifc_definition_id
@@ -119,6 +123,8 @@ class BIM_PT_resources(Panel):
op = row.operator("bim.calculate_resource_work", text="", icon="TEMP")
op.resource = ifc_definition_id
row.operator("bim.enable_editing_resource_time", text="", icon="TIME").resource = ifc_definition_id
op = row.operator("bim.enable_editing_resource_base_quantity", text="", icon="PROPERTIES")
op.resource = ifc_definition_id
op = row.operator("bim.enable_editing_resource_costs", text="", icon="DISC")
op.resource = ifc_definition_id
row.operator("bim.enable_editing_resource", text="", icon="GREASEPENCIL").resource = ifc_definition_id
@@ -130,6 +136,36 @@ class BIM_PT_resources(Panel):
def draw_editable_resource_time_attributes_ui(self):
blenderbim.bim.helper.draw_attributes(self.props.resource_time_attributes, self.layout)
def draw_editable_resource_quantity_ui(self):
resource = Data.resources[self.props.active_resource_id]
if resource["BaseQuantity"]:
quantity = resource["BaseQuantity"]
value = quantity[[k for k in quantity.keys() if "Value" in k][0]]
row = self.layout.row(align=True)
row.label(text=quantity["Name"])
row.label(text="{0:.2f}".format(value))
if self.props.is_editing_quantity:
op = row.operator("bim.edit_resource_quantity", text="", icon="CHECKMARK")
op.physical_quantity = quantity["id"]
row.operator("bim.disable_editing_resource_quantity", text="", icon="CANCEL")
else:
op = row.operator("bim.enable_editing_resource_quantity", text="", icon="GREASEPENCIL")
op.resource = self.props.active_resource_id
op = row.operator("bim.remove_resource_quantity", text="", icon="X")
op.resource = self.props.active_resource_id
if self.props.is_editing_quantity:
box = self.layout.box()
blenderbim.bim.helper.draw_attributes(self.props.quantity_attributes, box)
else:
row = self.layout.row(align=True)
row.prop(self.props, "quantity_types", text="")
op = row.operator("bim.add_resource_quantity", text="", icon="ADD")
op.resource = self.props.active_resource_id
op.ifc_class = self.props.quantity_types
def draw_editable_resource_costs_ui(self):
row = self.layout.row(align=True)
row.prop(self.props, "cost_types", text="")
@@ -0,0 +1,18 @@
import ifcopenshell.util.element
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"resource": None, "ifc_class": "IfcQuantityCount"}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
quantity = self.file.create_entity(self.settings["ifc_class"], Name="Unnamed")
quantity[3] = 0.0
old_quantity = self.settings["resource"].BaseQuantity
self.settings["resource"].BaseQuantity = quantity
if old_quantity:
ifcopenshell.util.element.remove_deep(self.file, old_quantity)
return quantity
@@ -46,7 +46,8 @@ class Data(CostValueTrait):
data["Usage"] = data["Usage"].id()
data["TotalCostQuantity"] = cls.get_total_quantity(resource)
if resource.BaseQuantity:
data["BaseQuantity"] = resource.BaseQuantity.id()
data["BaseQuantity"] = resource.BaseQuantity.get_info()
del data["BaseQuantity"]["Unit"]
if resource.BaseCosts:
data["BaseCosts"] = [e.id() for e in resource.BaseCosts]
cls.load_cost_values(resource, data)
@@ -0,0 +1,10 @@
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"physical_quantity": None, "attributes": {}}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
for name, value in self.settings["attributes"].items():
setattr(self.settings["physical_quantity"], name, value)
@@ -0,0 +1,15 @@
import ifcopenshell.util.element
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"resource": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
old_quantity = self.settings["resource"].BaseQuantity
self.settings["resource"].BaseQuantity = None
if old_quantity:
ifcopenshell.util.element.remove_deep(self.file, old_quantity)