From 558aff72a0ce2d62d581f7c0887352d2430682de Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 19 Mar 2023 14:49:31 +1100 Subject: [PATCH] Psets and qtos are now only created when properties exist to prevent invalid IFCs. --- .../blenderbim/bim/module/pset/operator.py | 85 +++++++++++-------- .../blenderbim/bim/module/pset/prop.py | 8 ++ .../blenderbim/bim/module/pset/ui.py | 49 ++++++++--- src/blenderbim/test/bim/feature/pset.feature | 58 +++++-------- src/blenderbim/test/bim/test_feature.py | 4 +- 5 files changed, 118 insertions(+), 86 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 69a8c6177b..bb60f9273c 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -76,6 +76,8 @@ class EnablePsetEditing(bpy.types.Operator): bl_label = "Enable Pset Editing" bl_options = {"REGISTER", "UNDO"} pset_id: bpy.props.IntProperty() + pset_name: bpy.props.StringProperty() + pset_type: bpy.props.StringProperty() obj: bpy.props.StringProperty() obj_type: bpy.props.StringProperty() @@ -83,10 +85,17 @@ class EnablePsetEditing(bpy.types.Operator): self.props = get_pset_props(context, self.obj, self.obj_type) self.props.properties.clear() ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type) - pset = tool.Ifc.get().by_id(self.pset_id) - self.props.active_pset_name = pset.Name - pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(pset.Name) + if self.pset_id: + pset = tool.Ifc.get().by_id(self.pset_id) + self.props.active_pset_name = pset.Name + self.props.active_pset_type = "" + pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(pset.Name) + else: + pset = None + self.props.active_pset_name = self.pset_name + self.props.active_pset_type = self.pset_type + pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(self.pset_name) if pset_template: self.load_from_pset_template(pset_template, pset) @@ -97,8 +106,11 @@ class EnablePsetEditing(bpy.types.Operator): return {"FINISHED"} def load_from_pset_template(self, pset_template, pset): - data = ifcopenshell.util.element.get_property_definition(pset) - del data["id"] + if pset: + data = ifcopenshell.util.element.get_property_definition(pset) + del data["id"] + else: + data = {} for prop_template in pset_template.HasPropertyTemplates: if not prop_template.is_a("IfcSimplePropertyTemplate"): continue # Other types not yet supported @@ -138,15 +150,9 @@ class EnablePsetEditing(bpy.types.Operator): return "float" elif prop_template.TemplateType == "Q_COUNT": return "integer" - try: - return ifcopenshell.util.attribute.get_primitive_type( - IfcStore.get_schema().declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") - ) - except: - # TODO: Occurs if the data type is something that exists in - # IFC4 and not in IFC2X3. To fully fix this we need to - # generate the IFC2X3 pset template definitions. - pass + return ifcopenshell.util.attribute.get_primitive_type( + IfcStore.get_schema().declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") + ) def load_enumerated_value(self, prop_template, data): enum_items = [v.wrappedValue for v in prop_template.Enumerators.EnumerationValues] @@ -219,13 +225,16 @@ class DisablePsetEditing(bpy.types.Operator, Operator): def _execute(self, context): props = get_pset_props(context, self.obj, self.obj_type) - pset = tool.Ifc.get().by_id(props.active_pset_id) - ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type) - if tool.Pset.is_pset_empty(pset): - ifcopenshell.api.run( - "pset.remove_pset", tool.Ifc.get(), product=tool.Ifc.get().by_id(ifc_definition_id), pset=pset - ) + if props.active_pset_id: + pset = tool.Ifc.get().by_id(props.active_pset_id) + ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type) + if tool.Pset.is_pset_empty(pset): + ifcopenshell.api.run( + "pset.remove_pset", tool.Ifc.get(), product=tool.Ifc.get().by_id(ifc_definition_id), pset=pset + ) props.active_pset_id = 0 + props.active_pset_name = "" + props.active_pset_type = "" class EditPset(bpy.types.Operator, Operator): @@ -241,9 +250,19 @@ class EditPset(bpy.types.Operator, Operator): self.file = IfcStore.get_file() props = get_pset_props(context, self.obj, self.obj_type) ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type) + element = tool.Ifc.get().by_id(ifc_definition_id) properties = {} pset_id = self.pset_id or props.active_pset_id + if pset_id: + pset = self.file.by_id(pset_id) + elif props.active_pset_type == "PSET": + pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name=props.active_pset_name) + props.active_pset_id = pset.id() + elif props.active_pset_type == "QTO": + pset = ifcopenshell.api.run("pset.add_qto", self.file, product=element, name=props.active_pset_name) + props.active_pset_id = pset.id() + if self.properties: properties = json.loads(self.properties) else: @@ -256,8 +275,7 @@ class EditPset(bpy.types.Operator, Operator): e[value_name] for e in prop.enumerated_value.enumerated_values if e.is_selected ] - pset = self.file.by_id(pset_id) - if tool.Ifc.get().by_id(pset_id).is_a() in ("IfcPropertySet", "IfcMaterialProperties", "IfcProfileProperties"): + if pset.is_a() in ("IfcPropertySet", "IfcMaterialProperties", "IfcProfileProperties"): ifcopenshell.api.run( "pset.edit_pset", self.file, @@ -279,11 +297,6 @@ class EditPset(bpy.types.Operator, Operator): ) bpy.ops.bim.load_cost_item_quantities() - if tool.Pset.is_pset_empty(pset): - ifcopenshell.api.run( - "pset.remove_pset", tool.Ifc.get(), product=tool.Ifc.get().by_id(ifc_definition_id), pset=pset - ) - bpy.ops.bim.disable_pset_editing(obj=self.obj, obj_type=self.obj_type) @@ -338,7 +351,7 @@ class AddPset(bpy.types.Operator, Operator): continue element = tool.Ifc.get().by_id(ifc_definition_id) if pset_name in blenderbim.bim.schema.ifc.psetqto.get_applicable_names(element.is_a(), pset_only=True): - ifcopenshell.api.run("pset.add_pset", self.file, product=element, name=pset_name) + bpy.ops.bim.enable_pset_editing(pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj, obj_type=self.obj_type) class AddQto(bpy.types.Operator, Operator): @@ -353,14 +366,8 @@ class AddQto(bpy.types.Operator, Operator): self.file = IfcStore.get_file() props = get_pset_props(context, self.obj, self.obj_type) ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type) - ifcopenshell.api.run( - "pset.add_qto", - self.file, - **{ - "product": self.file.by_id(ifc_definition_id), - "name": props.qto_name, - }, - ) + element = tool.Ifc.get().by_id(ifc_definition_id) + bpy.ops.bim.enable_pset_editing(pset_id=0, pset_name=props.qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type) class CalculateQuantity(bpy.types.Operator): @@ -452,7 +459,11 @@ class CopyPropertyToSelection(bpy.types.Operator, Operator): name: bpy.props.StringProperty() def _execute(self, context): - is_pset = tool.Ifc.get().by_id(context.active_object.PsetProperties.active_pset_id).is_a("IfcPropertySet") + pset_id = context.active_object.PsetProperties.active_pset_id + if pset_id: + is_pset = tool.Ifc.get().by_id(pset_id).is_a("IfcPropertySet") + else: + is_pset = context.active_object.PsetProperties.active_pset_type == "PSET" pset_name = context.active_object.PsetProperties.active_pset_name prop_value = context.active_object.PsetProperties.properties.get(self.name).metadata.get_value() for obj in tool.Blender.get_selected_objects(): diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index 5621330e0e..e3a97e466b 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -195,6 +195,7 @@ class IfcProperty(PropertyGroup): class PsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_pset_names, name="Pset Name") qto_name: EnumProperty(items=get_qto_names, name="Qto Name") @@ -203,6 +204,7 @@ class PsetProperties(PropertyGroup): class MaterialPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_material_pset_names, name="Pset Name") @@ -210,6 +212,7 @@ class MaterialPsetProperties(PropertyGroup): class MaterialSetPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_material_set_pset_names, name="Pset Name") @@ -217,6 +220,7 @@ class MaterialSetPsetProperties(PropertyGroup): class MaterialSetItemPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_material_set_item_pset_names, name="Pset Name") @@ -224,6 +228,7 @@ class MaterialSetItemPsetProperties(PropertyGroup): class TaskPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) qto_name: EnumProperty(items=get_task_qto_names, name="Qto Name") @@ -231,6 +236,7 @@ class TaskPsetProperties(PropertyGroup): class ResourcePsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_resource_pset_names, name="Pset Name") qto_name: EnumProperty(items=get_resource_qto_names, name="Qto Name") @@ -239,6 +245,7 @@ class ResourcePsetProperties(PropertyGroup): class ProfilePsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_profile_pset_names, name="Pset Name") @@ -246,6 +253,7 @@ class ProfilePsetProperties(PropertyGroup): class WorkSchedulePsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") active_pset_name: StringProperty(name="Pset Name") + active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_work_schedule_pset_names, name="Pset Name") diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index eb844f288e..09a70c6e95 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -93,7 +93,15 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type): icon = "TRIA_DOWN" if pset["is_expanded"] else "TRIA_RIGHT" row.operator("bim.toggle_pset_expansion", icon=icon, text="", emboss=False).pset_id = pset_id obj_name = get_active_pset_obj_name(context, obj_type) - if not props.active_pset_id: + if props.active_pset_id == pset_id: + row.prop(props, "active_pset_name", icon="COPY_ID", text="") + op = row.operator("bim.edit_pset", icon="CHECKMARK", text="") + op.obj = obj_name + op.obj_type = obj_type + op = row.operator("bim.disable_pset_editing", icon="CANCEL", text="") + op.obj = obj_name + op.obj_type = obj_type + elif not props.active_pset_id: row.label(text=pset["Name"], icon="COPY_ID") if "Qto" in pset["Name"] and "Base" in pset["Name"]: op = row.operator("bim.calculate_all_quantities", icon="MOD_EDGESPLIT", text="") @@ -111,14 +119,6 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type): op.pset_id = pset_id op.obj = obj_name op.obj_type = obj_type - elif props.active_pset_id == pset_id: - row.prop(props, "active_pset_name", icon="COPY_ID", text="") - op = row.operator("bim.edit_pset", icon="CHECKMARK", text="") - op.obj = obj_name - op.obj_type = obj_type - op = row.operator("bim.disable_pset_editing", icon="CANCEL", text="") - op.obj = obj_name - op.obj_type = obj_type if pset["is_expanded"]: if props.active_pset_id == pset_id: for prop in props.properties: @@ -196,6 +196,9 @@ class BIM_PT_object_psets(Panel): op.obj = context.active_object.name op.obj_type = "Object" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Object") + for pset in ObjectPsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Object") @@ -236,6 +239,9 @@ class BIM_PT_object_qtos(Panel): op.obj = context.active_object.name op.obj_type = "Object" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "QTO": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Object") + for qto in ObjectQtosData.data["qtos"]: draw_psetqto_ui(context, qto["id"], qto, props, self.layout, "Object") @@ -272,6 +278,9 @@ class BIM_PT_material_psets(Panel): op.obj = context.active_object.active_material.name op.obj_type = "Material" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Material") + for pset in MaterialPsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Material") @@ -307,6 +316,9 @@ class BIM_PT_material_set_psets(Panel): op.obj = context.active_object.name op.obj_type = "MaterialSet" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "MaterialSet") + for pset in MaterialSetPsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSet") @@ -342,11 +354,13 @@ class BIM_PT_material_set_item_psets(Panel): op.obj = context.active_object.name op.obj_type = "MaterialSetItem" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "MaterialSetItem") + for pset in MaterialSetItemPsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSetItem") - class BIM_PT_task_qtos(Panel): bl_label = "IFC Task Quantity Sets" bl_idname = "BIM_PT_task_qtos" @@ -376,6 +390,9 @@ class BIM_PT_task_qtos(Panel): op = row.operator("bim.add_qto", icon="ADD", text="") op.obj_type = "Task" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "QTO": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Task") + for qto in TaskQtosData.data["qtos"]: draw_psetqto_ui(context, qto["id"], qto, props, self.layout, "Task") @@ -407,6 +424,9 @@ class BIM_PT_resource_qtos(Panel): op = row.operator("bim.add_qto", icon="ADD", text="") op.obj_type = "Resource" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "QTO": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Resource") + for qto in ResourceQtosData.data["qtos"]: draw_psetqto_ui(context, qto["id"], qto, props, self.layout, "Resource") @@ -438,6 +458,9 @@ class BIM_PT_resource_psets(Panel): op = row.operator("bim.add_pset", icon="ADD", text="") op.obj_type = "Resource" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Resource") + for pset in ResourcePsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Resource") @@ -471,6 +494,9 @@ class BIM_PT_profile_psets(Panel): op = row.operator("bim.add_pset", icon="ADD", text="") op.obj_type = "Profile" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "Profile") + for pset in ProfilePsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Profile") @@ -500,6 +526,9 @@ class BIM_PT_work_schedule_psets(Panel): op = row.operator("bim.add_pset", icon="ADD", text="") op.obj_type = "WorkSchedule" + if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": + draw_psetqto_ui(context, 0, {}, props, self.layout, "WorkSchedule") + for pset in WorkSchedulePsetsData.data["psets"]: draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "WorkSchedule") diff --git a/src/blenderbim/test/bim/feature/pset.feature b/src/blenderbim/test/bim/feature/pset.feature index dcf9cb296d..a587b2d43b 100644 --- a/src/blenderbim/test/bim/feature/pset.feature +++ b/src/blenderbim/test/bim/feature/pset.feature @@ -38,6 +38,8 @@ Scenario: Enable pset editing - object And the object "IfcWall/Cube" is selected And I set "active_object.PsetProperties.pset_name" to "Pset_WallCommon" And I press "bim.add_pset(obj='IfcWall/Cube', obj_type='Object')" + And I set "active_object.PsetProperties.properties[0].metadata.string_value" to "Foobar" + And I press "bim.edit_pset(obj='IfcWall/Cube', obj_type='Object')" And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" When I press "bim.enable_pset_editing(pset_id={pset}, obj='IfcWall/Cube', obj_type='Object')" Then nothing happens @@ -53,6 +55,8 @@ Scenario: Enable pset editing - material And I press "bim.assign_material" And the object "IfcWall/Cube" is selected And I press "bim.add_pset(obj='Default', obj_type='Material')" + And I set "active_object.active_material.PsetProperties.properties[0].metadata.float_value" to "0.42" + And I press "bim.edit_pset(obj='Default', obj_type='Material')" And the variable "pset" is "{ifc}.by_type('IfcMaterialProperties')[-1].id()" When I press "bim.enable_pset_editing(pset_id={pset}, obj='Default', obj_type='Material')" Then nothing happens @@ -63,6 +67,8 @@ Scenario: Enable pset editing - profile And I press "bim.add_profile_def" And I set "scene.ProfilePsetProperties.pset_name" to "Pset_ProfileMechanical" And I press "bim.add_pset(obj_type='Profile')" + And I set "scene.ProfilePsetProperties.properties[0].metadata.float_value" to "0.42" + And I press "bim.edit_pset(obj='', obj_type='Profile')" And the variable "pset" is "{ifc}.by_type('IfcProfileProperties')[-1].id()" When I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Profile')" Then nothing happens @@ -74,6 +80,8 @@ Scenario: Enable pset editing - work schedule And I press "bim.enable_editing_work_schedule_tasks(work_schedule={work_schedule})" And I set "scene.WorkSchedulePsetProperties.pset_name" to "Pset_WorkControlCommon" And I press "bim.add_pset(obj_type='WorkSchedule')" + And I set "scene.WorkSchedulePsetProperties.properties[0].metadata.string_value" to "Foobar" + And I press "bim.edit_pset(obj='', obj_type='WorkSchedule')" And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" When I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='WorkSchedule')" Then nothing happens @@ -83,9 +91,7 @@ Scenario: Enable pset editing - resource with time series properties And I press "bim.load_resources" And I press "bim.add_resource(ifc_class='IfcSubContractResource', parent_resource=0)" And I set "scene.ResourcePsetProperties.pset_name" to "Pset_ConstructionResource" - And I press "bim.add_pset(obj_type='Resource')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - When I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Resource')" + When I press "bim.add_pset(obj_type='Resource')" Then nothing happens Scenario: Enable pset editing - resource with regular single properties @@ -97,6 +103,8 @@ Scenario: Enable pset editing - resource with regular single properties And I set "scene.BIMResourceProperties.active_resource_index" to "1" And I set "scene.ResourcePsetProperties.pset_name" to "EPset_Productivity" And I press "bim.add_pset(obj_type='Resource')" + And I set "scene.ResourcePsetProperties.properties[0].metadata.string_value" to "Foobar" + And I press "bim.edit_pset(obj='', obj_type='Resource')" And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" When I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Resource')" Then nothing happens @@ -109,6 +117,8 @@ Scenario: Enable pset editing - task And I press "bim.add_summary_task(work_schedule={work_schedule})" And I set "scene.TaskPsetProperties.qto_name" to "Qto_TaskBaseQuantities" And I press "bim.add_qto(obj_type='Task')" + And I set "scene.TaskPsetProperties.properties[0].metadata.float_value" to "0.42" + And I press "bim.edit_pset(obj='', obj_type='Task')" And the variable "pset" is "{ifc}.by_type('IfcElementQuantity')[-1].id()" When I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Task')" Then nothing happens @@ -122,8 +132,6 @@ Scenario: Disable pset editing - object And the object "IfcWall/Cube" is selected And I set "active_object.PsetProperties.pset_name" to "Pset_WallCommon" And I press "bim.add_pset(obj='IfcWall/Cube', obj_type='Object')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='IfcWall/Cube', obj_type='Object')" When I press "bim.disable_pset_editing(obj='IfcWall/Cube', obj_type='Object')" Then nothing happens @@ -138,8 +146,6 @@ Scenario: Disable pset editing - material And I press "bim.assign_material" And the object "IfcWall/Cube" is selected And I press "bim.add_pset(obj='Default', obj_type='Material')" - And the variable "pset" is "{ifc}.by_type('IfcMaterialProperties')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='Default', obj_type='Material')" When I press "bim.disable_pset_editing(obj='Default', obj_type='Material')" Then nothing happens @@ -149,8 +155,6 @@ Scenario: Disable pset editing - profile And I press "bim.add_profile_def" And I set "scene.ProfilePsetProperties.pset_name" to "Pset_ProfileMechanical" And I press "bim.add_pset(obj_type='Profile')" - And the variable "pset" is "{ifc}.by_type('IfcProfileProperties')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Profile')" When I press "bim.disable_pset_editing(obj='', obj_type='Profile')" Then nothing happens @@ -161,8 +165,6 @@ Scenario: Disable pset editing - work schedule And I press "bim.enable_editing_work_schedule_tasks(work_schedule={work_schedule})" And I set "scene.WorkSchedulePsetProperties.pset_name" to "Pset_WorkControlCommon" And I press "bim.add_pset(obj_type='WorkSchedule')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='WorkSchedule')" When I press "bim.disable_pset_editing(obj='', obj_type='WorkSchedule')" Then nothing happens @@ -172,8 +174,6 @@ Scenario: Disable pset editing - resource with time series properties And I press "bim.add_resource(ifc_class='IfcSubContractResource', parent_resource=0)" And I set "scene.ResourcePsetProperties.pset_name" to "Pset_ConstructionResource" And I press "bim.add_pset(obj_type='Resource')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Resource')" When I press "bim.disable_pset_editing(obj='', obj_type='Resource')" Then nothing happens @@ -186,8 +186,6 @@ Scenario: Disable pset editing - resource with regular single properties And I set "scene.BIMResourceProperties.active_resource_index" to "1" And I set "scene.ResourcePsetProperties.pset_name" to "EPset_Productivity" And I press "bim.add_pset(obj_type='Resource')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Resource')" When I press "bim.disable_pset_editing(obj='', obj_type='Resource')" Then nothing happens @@ -199,8 +197,6 @@ Scenario: Disable pset editing - task And I press "bim.add_summary_task(work_schedule={work_schedule})" And I set "scene.TaskPsetProperties.qto_name" to "Qto_TaskBaseQuantities" And I press "bim.add_qto(obj_type='Task')" - And the variable "pset" is "{ifc}.by_type('IfcElementQuantity')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Task')" When I press "bim.disable_pset_editing(obj='', obj_type='Task')" Then nothing happens @@ -213,8 +209,6 @@ Scenario: Edit pset - object And the object "IfcWall/Cube" is selected And I set "active_object.PsetProperties.pset_name" to "Pset_WallCommon" And I press "bim.add_pset(obj='IfcWall/Cube', obj_type='Object')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='IfcWall/Cube', obj_type='Object')" When I press "bim.edit_pset(obj='IfcWall/Cube', obj_type='Object')" Then nothing happens @@ -229,8 +223,6 @@ Scenario: Edit pset - material And I press "bim.assign_material" And the object "IfcWall/Cube" is selected And I press "bim.add_pset(obj='Default', obj_type='Material')" - And the variable "pset" is "{ifc}.by_type('IfcMaterialProperties')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='Default', obj_type='Material')" When I press "bim.edit_pset(obj='Default', obj_type='Material')" Then nothing happens @@ -240,8 +232,6 @@ Scenario: Edit pset - profile And I press "bim.add_profile_def" And I set "scene.ProfilePsetProperties.pset_name" to "Pset_ProfileMechanical" And I press "bim.add_pset(obj_type='Profile')" - And the variable "pset" is "{ifc}.by_type('IfcProfileProperties')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Profile')" When I press "bim.edit_pset(obj='', obj_type='Profile')" Then nothing happens @@ -252,23 +242,19 @@ Scenario: Edit pset - work schedule And I press "bim.enable_editing_work_schedule_tasks(work_schedule={work_schedule})" And I set "scene.WorkSchedulePsetProperties.pset_name" to "Pset_WorkControlCommon" And I press "bim.add_pset(obj_type='WorkSchedule')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='WorkSchedule')" When I press "bim.edit_pset(obj='', obj_type='WorkSchedule')" Then nothing happens -Scenario: Enable pset editing - resource with time series properties +Scenario: Edit pset - resource with time series properties Given an empty IFC project And I press "bim.load_resources" And I press "bim.add_resource(ifc_class='IfcSubContractResource', parent_resource=0)" And I set "scene.ResourcePsetProperties.pset_name" to "Pset_ConstructionResource" And I press "bim.add_pset(obj_type='Resource')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Resource')" When I press "bim.edit_pset(obj='', obj_type='Resource')" Then nothing happens -Scenario: Enable pset editing - resource with regular single properties +Scenario: Edit pset - resource with regular single properties Given an empty IFC project And I press "bim.load_resources" And I press "bim.add_resource(ifc_class='IfcCrewResource', parent_resource=0)" @@ -277,12 +263,10 @@ Scenario: Enable pset editing - resource with regular single properties And I set "scene.BIMResourceProperties.active_resource_index" to "1" And I set "scene.ResourcePsetProperties.pset_name" to "EPset_Productivity" And I press "bim.add_pset(obj_type='Resource')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Resource')" When I press "bim.edit_pset(obj='', obj_type='Resource')" Then nothing happens -Scenario: Enable pset editing - task +Scenario: Edit pset - task Given an empty IFC project And I press "bim.add_work_schedule" And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" @@ -290,8 +274,6 @@ Scenario: Enable pset editing - task And I press "bim.add_summary_task(work_schedule={work_schedule})" And I set "scene.TaskPsetProperties.qto_name" to "Qto_TaskBaseQuantities" And I press "bim.add_qto(obj_type='Task')" - And the variable "pset" is "{ifc}.by_type('IfcElementQuantity')[-1].id()" - And I press "bim.enable_pset_editing(pset_id={pset}, obj='', obj_type='Task')" When I press "bim.edit_pset(obj='', obj_type='Task')" Then nothing happens @@ -309,8 +291,6 @@ Scenario: Copy property to selected - copy property And additionally the object "IfcWall/Cube.001" is selected And I set "active_object.PsetProperties.pset_name" to "Pset_WallCommon" And I press "bim.add_pset(obj='IfcWall/Cube.001', obj_type='Object')" - And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" - And I press "bim.enable_pset_editing(obj='IfcWall/Cube.001', obj_type='Object', pset_id={pset})" And I set "active_object.PsetProperties.properties[2].metadata.string_value" to "Foo" When I press "bim.copy_property_to_selection(name='FireRating')" Then nothing happens @@ -324,6 +304,8 @@ Scenario: Remove pset - object And the object "IfcWall/Cube" is selected And I set "active_object.PsetProperties.pset_name" to "Pset_WallCommon" And I press "bim.add_pset(obj='IfcWall/Cube', obj_type='Object')" + And I set "active_object.PsetProperties.properties[0].metadata.string_value" to "Foobar" + And I press "bim.edit_pset(obj='IfcWall/Cube', obj_type='Object')" And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" When I press "bim.remove_pset(pset_id={pset}, obj='IfcWall/Cube', obj_type='Object')" Then nothing happens @@ -342,7 +324,9 @@ Scenario: Remove pset - multiple objects And the object "IfcWall/Cube" is selected And additionally the object "IfcWall/Cube.001" is selected And I set "active_object.PsetProperties.pset_name" to "Pset_WallCommon" - And I press "bim.add_pset(obj='IfcWall/Cube', obj_type='Object')" + And I press "bim.add_pset(obj='IfcWall/Cube.001', obj_type='Object')" + And I set "active_object.PsetProperties.properties[0].metadata.string_value" to "Foobar" + And I press "bim.edit_pset(obj='IfcWall/Cube.001', obj_type='Object')" And the variable "pset" is "{ifc}.by_type('IfcPropertySet')[-1].id()" When I press "bim.remove_pset(pset_id={pset}, obj='IfcWall/Cube', obj_type='Object')" Then nothing happens diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index 9a5bb6f2a4..78a3c098ad 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -251,7 +251,7 @@ def i_set_prop_to_value(prop, value): try: eval(f"bpy.context.{prop}") except: - assert False, "Property does not exist" + assert False, f"Property {prop} does not exist when trying to set to value {value}" try: exec(f'bpy.context.{prop} = r"{value}"') except: @@ -264,7 +264,7 @@ def i_set_prop_to_value(prop): try: eval(f"bpy.context.{prop}") except: - assert False, "Property does not exist" + assert False, f"Property {prop} does not exist" try: exec(f'bpy.context.{prop} = r""') except: