diff --git a/src/blenderbim/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py index 0cfacf9fa1..eaa5f9bb74 100644 --- a/src/blenderbim/blenderbim/bim/module/bcf/operator.py +++ b/src/blenderbim/blenderbim/bim/module/bcf/operator.py @@ -882,7 +882,7 @@ class ActivateBcfViewpoint(bpy.types.Operator): # Operators with context overrides are used because they are # significantly faster than looping through all objects - exception_global_ids = [v.ifc_guid for v in viewpoint.components.visibility.exceptions] + exception_global_ids = {v.ifc_guid for v in viewpoint.components.visibility.exceptions} if viewpoint.components.visibility.default_visibility: old = context.area.type diff --git a/src/blenderbim/blenderbim/bim/module/group/operator.py b/src/blenderbim/blenderbim/bim/module/group/operator.py index 516717b9f1..b2fc62e3fc 100644 --- a/src/blenderbim/blenderbim/bim/module/group/operator.py +++ b/src/blenderbim/blenderbim/bim/module/group/operator.py @@ -39,7 +39,7 @@ class LoadGroups(bpy.types.Operator): self.ifc = IfcStore.get_file() if not self.is_refresh: context.scene.ExpandedGroups.json_string = "{}" - + for ifc_definition_id, group in Data.groups.items(): if not group["HasAssignments"]: new = self.props.groups.add() @@ -48,17 +48,19 @@ class LoadGroups(bpy.types.Operator): new.selection_query = group["Description"].split("*selector*")[1] if group["Description"] else "" new.has_children = True if len(group["IsGroupedBy"]) != 0 else False new.tree_depth = 0 - + if self.is_refresh: self.recursively_load_sub_groups(ifc_definition_id, new) - + self.props.is_editing = True bpy.ops.bim.disable_editing_group() Data.load(IfcStore.get_file()) return {"FINISHED"} - + def recursively_load_sub_groups(self, ifc_definition_id, parent): - sub_groups = ([k for k,v in Data.products.items() if self.ifc.by_id(k).is_a("IfcGroup") and ifc_definition_id in v]) + sub_groups = [ + k for k, v in Data.products.items() if self.ifc.by_id(k).is_a("IfcGroup") and ifc_definition_id in v + ] if str(ifc_definition_id) not in self.expanded_groups or sub_groups == []: return else: @@ -67,7 +69,11 @@ class LoadGroups(bpy.types.Operator): new = self.props.groups.add() new.ifc_definition_id = group new.name = Data.groups[group]["Name"] - new.selection_query = Data.groups[group]["Description"].split("*selector*")[1] if Data.groups[group]["Description"] else "" + new.selection_query = ( + Data.groups[group]["Description"].split("*selector*")[1] + if Data.groups[group]["Description"] + else "" + ) new.has_children = True if len(Data.groups[group]["IsGroupedBy"]) != 0 else False new.tree_depth = parent.tree_depth + 1 self.recursively_load_sub_groups(new.ifc_definition_id, new) @@ -115,11 +121,11 @@ class AddGroup(bpy.types.Operator): def _execute(self, context): result = ifcopenshell.api.run("group.add_group", IfcStore.get_file()) Data.load(IfcStore.get_file()) - + bpy.ops.bim.load_groups(is_refresh=True) bpy.ops.bim.enable_editing_group(group=result.id()) return {"FINISHED"} - + class AddGroupToGroup(bpy.types.Operator): bl_idname = "bim.add_group_to_group" @@ -134,12 +140,7 @@ class AddGroupToGroup(bpy.types.Operator): self.file = IfcStore.get_file() result = ifcopenshell.api.run("group.add_group", self.file) ifcopenshell.api.run( - "group.assign_group", - IfcStore.get_file(), - **{ - "product": [result], - "group" : self.file.by_id(self.group) - } + "group.assign_group", IfcStore.get_file(), **{"product": [result], "group": self.file.by_id(self.group)} ) Data.load(IfcStore.get_file()) bpy.ops.bim.load_groups(is_refresh=True) @@ -163,10 +164,10 @@ class EditGroup(bpy.types.Operator): attributes[attribute.name] = None else: attributes[attribute.name] = attribute.string_value - + if self.copy_from_selector: attributes["Description"] = context.scene.IFCSelector.selection_query - + self.file = IfcStore.get_file() ifcopenshell.api.run( "group.edit_group", self.file, **{"group": self.file.by_id(props.active_group_id), "attributes": attributes} @@ -301,6 +302,7 @@ class SelectGroupProducts(bpy.types.Operator): obj.select_set(True) return {"FINISHED"} + class UpdateGroup(bpy.types.Operator): bl_idname = "bim.update_group" bl_label = "Update Group" diff --git a/src/blenderbim/blenderbim/bim/module/group/prop.py b/src/blenderbim/blenderbim/bim/module/group/prop.py index 0f00a985a8..b326c5336b 100644 --- a/src/blenderbim/blenderbim/bim/module/group/prop.py +++ b/src/blenderbim/blenderbim/bim/module/group/prop.py @@ -37,6 +37,7 @@ from bpy.props import ( class ExpandedGroups(StrProperty): json_string: StringProperty(name="JSON String", default="{}") + class Group(PropertyGroup): name: StringProperty(name="Name") ifc_definition_id: IntProperty(name="IFC Definition ID") @@ -44,7 +45,8 @@ class Group(PropertyGroup): is_expanded: BoolProperty(name="Is Expanded", default=False) has_children: BoolProperty(name="Has Children") tree_depth: IntProperty(name="Tree Depth") - + + class BIMGroupProperties(PropertyGroup): group_attributes: CollectionProperty(name="Group Attributes", type=Attribute) is_editing: BoolProperty(name="Is Editing", default=False) @@ -52,4 +54,3 @@ class BIMGroupProperties(PropertyGroup): groups: CollectionProperty(name="Groups", type=Group) active_group_index: IntProperty(name="Active Group Index") active_group_id: IntProperty(name="Active Group Id") - \ No newline at end of file diff --git a/src/blenderbim/blenderbim/bim/module/group/ui.py b/src/blenderbim/blenderbim/bim/module/group/ui.py index 4f747e0867..0f75e09097 100644 --- a/src/blenderbim/blenderbim/bim/module/group/ui.py +++ b/src/blenderbim/blenderbim/bim/module/group/ui.py @@ -122,10 +122,8 @@ class BIM_UL_groups(UIList): row.label(text="", icon="BLANK1") if item.has_children: op = row.operator( - "bim.toggle_group", - icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", - text="", - emboss=False) + "bim.toggle_group", icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", text="", emboss=False + ) op.ifc_definition_id = item.ifc_definition_id op.index = index op.option = "Collapse" if item.is_expanded else "Expand" @@ -173,10 +171,8 @@ class BIM_UL_object_groups(UIList): row.label(text="", icon="BLANK1") if item.has_children: op = row.operator( - "bim.toggle_group", - icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", - text="", - emboss=False) + "bim.toggle_group", icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", text="", emboss=False + ) op.ifc_definition_id = item.ifc_definition_id op.index = index op.option = "Collapse" if item.is_expanded else "Expand" diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index c5ba73182c..4496522f4b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -91,9 +91,7 @@ class AuthoringData: @classmethod def relating_types(cls, ifc_class=None): - return [ - (str(e.id()), e.Name, e.Description or "") for e in cls.constr_class_entities(ifc_class=ifc_class) - ] + return [(str(e.id()), e.Name, e.Description or "") for e in cls.constr_class_entities(ifc_class=ifc_class)] @classmethod def relating_types_browser(cls): @@ -116,8 +114,10 @@ class AuthoringData: for constr_class_entity in constr_class_occurrences: ### handle asset regeneration when library entity is updated ¿? - if (ifc_class not in preview_constr_types - or str(constr_class_entity.id()) not in preview_constr_types[ifc_class]): + if ( + ifc_class not in preview_constr_types + or str(constr_class_entity.id()) not in preview_constr_types[ifc_class] + ): obj = tool.Ifc.get_object(constr_class_entity) cls.assetize_object(obj, ifc_class, constr_class_entity) relating_type_info = cls.relating_type_info(ifc_class) @@ -127,10 +127,10 @@ class AuthoringData: def assetize_object(cls, obj, ifc_class, ifc_class_entity, from_selection=False): relating_type_id = ifc_class_entity.id() to_be_deleted = False - if obj.type == 'EMPTY': + if obj.type == "EMPTY": kwargs = {} if not from_selection: - kwargs.update({'ifc_class': ifc_class, 'relating_type_id': relating_type_id}) + kwargs.update({"ifc_class": ifc_class, "relating_type_id": relating_type_id}) new_obj = cls.new_relating_type(**kwargs) if new_obj is not None: to_be_deleted = True diff --git a/src/blenderbim/blenderbim/bim/module/model/profile.py b/src/blenderbim/blenderbim/bim/module/model/profile.py index b074ef6dac..6b81e28cf3 100644 --- a/src/blenderbim/blenderbim/bim/module/model/profile.py +++ b/src/blenderbim/blenderbim/bim/module/model/profile.py @@ -165,6 +165,7 @@ class DumbProfileGenerator: try: obj.select_set(True) except RuntimeError: + def msg(self, context): txt = "The created object could not be assigned to a collection. " txt += "Has any IfcSpatialElement been deleted?" diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index 9d6b7b3794..f0e8773917 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -43,9 +43,10 @@ def update_icon_id(self, context): ifc_class_browser = self.ifc_class_browser relating_type_id_browser = self.relating_type_id_browser relating_type_browser = AuthoringData.relating_type_name_by_id(ifc_class_browser, relating_type_id_browser) - if ((ifc_class_browser not in AuthoringData.data["preview_constr_types"] - or relating_type_id_browser not in AuthoringData.data["preview_constr_types"][ifc_class_browser]) - and relating_type_browser is not None): + if ( + ifc_class_browser not in AuthoringData.data["preview_constr_types"] + or relating_type_id_browser not in AuthoringData.data["preview_constr_types"][ifc_class_browser] + ) and relating_type_browser is not None: if not AuthoringData.assetize_relating_type_from_selection(): return self.icon_id = AuthoringData.data["preview_constr_types"][ifc_class_browser][relating_type_id_browser]["icon_id"] @@ -85,7 +86,9 @@ def update_relating_type_by_name(self, context): def update_relating_type_browser_by_name(self, context): AuthoringData.load_relating_types_browser() - relating_type_id_browser = AuthoringData.relating_type_id_by_name(self.ifc_class_browser, self.relating_type_browser) + relating_type_id_browser = AuthoringData.relating_type_id_by_name( + self.ifc_class_browser, self.relating_type_browser + ) if relating_type_id_browser is not None: self.relating_type_id_browser = relating_type_id_browser @@ -119,10 +122,7 @@ class BIMModelProperties(PropertyGroup): name="Occurrence Name Style", ) occurrence_name_function: bpy.props.StringProperty(name="Occurrence Name Function") - getter_enum = { - "ifc_class_browser": get_ifc_class, - "relating_type_browser": get_relating_type_browser - } + getter_enum = {"ifc_class_browser": get_ifc_class, "relating_type_browser": get_relating_type_browser} def get_relating_type_info(self, context): @@ -131,9 +131,5 @@ def get_relating_type_info(self, context): class ConstrTypeInfo(PropertyGroup): name: bpy.props.StringProperty(name="Construction class") - relating_type: bpy.props.EnumProperty( - name="Construction type", items=get_relating_type_info - ) + relating_type: bpy.props.EnumProperty(name="Construction type", items=get_relating_type_info) fully_loaded: bpy.props.BoolProperty(default=False) - - diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py index 6a96490d18..e0c02c47ff 100644 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ b/src/blenderbim/blenderbim/bim/module/model/slab.py @@ -309,6 +309,7 @@ class DumbSlabGenerator: try: obj.select_set(True) except RuntimeError: + def msg(self, context): txt = "The created object could not be assigned to a collection. " txt += "Has any IfcSpatialElement been deleted?" diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index b3662208c1..e6b55fc211 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -820,6 +820,7 @@ class DumbWallGenerator: try: obj.select_set(True) except RuntimeError: + def msg(self, context): txt = "The created object could not be assigned to a collection. " txt += "Has any IfcSpatialElement been deleted?" diff --git a/src/blenderbim/blenderbim/bim/module/root/prop.py b/src/blenderbim/blenderbim/bim/module/root/prop.py index 39f1729876..53548a7829 100644 --- a/src/blenderbim/blenderbim/bim/module/root/prop.py +++ b/src/blenderbim/blenderbim/bim/module/root/prop.py @@ -93,6 +93,7 @@ def get_ifc_classes_suggestions(): IfcClassData.load() return IfcClassData.data["ifc_classes_suggestions"] + def get_contexts(self, context): if not IfcClassData.is_loaded: IfcClassData.load() diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 76c87499fe..629c7524db 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -465,6 +465,7 @@ class ActivateIfcBuildingStoreyFilter(Operator): row.operator("bim.toggle_filter_selection", text="Select All").action = "SELECT" row.operator("bim.toggle_filter_selection", text="Deselect All").action = "DESELECT" + class UnhideAllElements(Operator): """Filter model elements based on selection""" @@ -481,6 +482,7 @@ class UnhideAllElements(Operator): class FilterModelElements(Operator): """Filter model elements based on selection""" + bl_idname = "bim.filter_model_elements" bl_label = "Filter Model Elements" option: StringProperty("select|isolate|hide") @@ -563,6 +565,7 @@ class FilterModelElements(Operator): class IfcSelector(Operator): """Select elements in model with IFC Selector""" + bl_idname = "bim.ifc_selector" bl_label = "Select elements with IFC Selector" @@ -578,6 +581,7 @@ class IfcSelector(Operator): def draw(self, context): from . import ui + ui.IfcSelectorUI.draw(context, self.layout) @@ -603,6 +607,7 @@ class SaveSelectorQuery(Operator): class OpenQueryLibrary(Operator): """Open Query Library""" + bl_idname = "bim.open_query_library" bl_label = "Open Query Library" @@ -633,53 +638,54 @@ class LoadQuery(Operator): bl_idname = "bim.load_query" bl_label = "Load Query" index: IntProperty() - + def invoke(self, context, event): close_operator_panel(event) return self.execute(context) - + def execute(self, context): ifc_selector = context.scene.IfcSelectorProperties ifc_selector.selector_query_syntax = ifc_selector.query_library[self.index].query return {"FINISHED"} - + + class AddToIfcGroup(Operator): bl_idname = "bim.add_to_ifc_group" bl_label = "Add to IFC Group" group_name: StringProperty(name="Group Name") - + def invoke(self, context, event): bpy.ops.bim.load_groups() return context.window_manager.invoke_props_dialog(self, width=400) - + def draw(self, context): self.props = context.scene.BIMGroupProperties row = self.layout.row() row.operator("bim.add_group") - + self.layout.template_list( - "BIM_UL_groups", - "", - self.props, - "groups", - self.props, - "active_group_index", - ) - + "BIM_UL_groups", + "", + self.props, + "groups", + self.props, + "active_group_index", + ) + if self.props.active_group_id: for attribute in self.props.group_attributes: if attribute.name in ["Name", "Description"]: row = self.layout.row(align=True) row.prop(attribute, "string_value", text=attribute.name) - + def execute(self, context): active_group_index = self.props.active_group_index ifc_definition_id = self.props.groups[active_group_index].ifc_definition_id - - bpy.ops.bim.enable_editing_group(group=ifc_definition_id) - + + bpy.ops.bim.enable_editing_group(group=ifc_definition_id) + selector_query_syntax = context.scene.IfcSelectorProperties.selector_query_syntax - + for attribute in self.props.group_attributes: if attribute.name == "Description": if "*selector*" not in attribute.string_value: @@ -688,7 +694,7 @@ class AddToIfcGroup(Operator): new_description = attribute.string_value.split("*selector*") new_description[1] = selector_query_syntax attribute.string_value = "*selector*".join(new_description) - + bpy.ops.bim.edit_group() bpy.ops.bim.disable_group_editing_ui() return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/search/prop.py b/src/blenderbim/blenderbim/bim/module/search/prop.py index 37042db490..c1c7826ffe 100644 --- a/src/blenderbim/blenderbim/bim/module/search/prop.py +++ b/src/blenderbim/blenderbim/bim/module/search/prop.py @@ -175,6 +175,7 @@ class SearchCollection(PropertyGroup): global_id: StringProperty() query: StringProperty() + class IfcSelector: and_or: EnumProperty( items=[(i, i, i) for i in ["and", "or"]], @@ -231,9 +232,9 @@ class SearchQueryGroup(PropertyGroup, IfcSelector): class IfcSelectorProperties(PropertyGroup, IfcSelector): groups: CollectionProperty(type=SearchQueryGroup) selector_query_syntax: StringProperty() - + query_library: CollectionProperty(type=SearchCollection) active_query: StringProperty() - + active_query: StringProperty() manual_override: BoolProperty(default=False, description="Toggle to allow manual typing of query-syntax") diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index 84496df9f8..67dcff7381 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -1850,7 +1850,6 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator): self.total_frames = self.calculate_total_frames(context) self.preprocess_tasks() - for obj in bpy.data.objects: if not obj.BIMObjectProperties.ifc_definition_id: continue @@ -1862,7 +1861,6 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator): self.animate_output(obj, product_frame) self.add_text_animation_handler() - area = next(area for area in context.screen.areas if area.type == "VIEW_3D") area.spaces[0].shading.color_type = "OBJECT" context.scene.frame_start = self.start_frame diff --git a/src/blenderbim/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py index 8a79ce29e5..71aa6a24cb 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -49,8 +49,8 @@ class BIM_PT_work_plans(Panel): row = self.layout.row() row.label( - text="{} Work Plans Found".format(SequenceData.number_of_work_plans_loaded), - icon="TEXT", + text="{} Work Plans Found".format(SequenceData.number_of_work_plans_loaded), + icon="TEXT", ) row.operator("bim.add_work_plan", icon="ADD") diff --git a/src/blenderbim/blenderbim/bim/module/structural/operator.py b/src/blenderbim/blenderbim/bim/module/structural/operator.py index bbe1a4a016..afcdf04072 100644 --- a/src/blenderbim/blenderbim/bim/module/structural/operator.py +++ b/src/blenderbim/blenderbim/bim/module/structural/operator.py @@ -662,7 +662,9 @@ class AddStructuralLoadGroup(bpy.types.Operator): def _execute(self, context): self.file = IfcStore.get_file() load_group = ifcopenshell.api.run("structural.add_structural_load_group", self.file) - ifcopenshell.api.run("group.assign_group", self.file, product=[load_group], group=self.file.by_id(self.load_case)) + ifcopenshell.api.run( + "group.assign_group", self.file, product=[load_group], group=self.file.by_id(self.load_case) + ) Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/core/sequence.py b/src/blenderbim/blenderbim/core/sequence.py index 3c7458c6df..eedc0965ce 100644 --- a/src/blenderbim/blenderbim/core/sequence.py +++ b/src/blenderbim/blenderbim/core/sequence.py @@ -1,6 +1,6 @@ # BlenderBIM Add-on - OpenBIM Blender Add-on # Copyright (C) 2021 Dion Moult , 2022 Yassine Oualid -# +# # This file is part of BlenderBIM Add-on. # # BlenderBIM Add-on is free software: you can redistribute it and/or modify @@ -21,24 +21,29 @@ def add_work_plan(ifc, sequence): ifc.run("sequence.add_work_plan") sequence.load_work_plans() + def remove_work_plan(ifc, sequence, work_plan=None): - ifc.run("sequence.remove_work_plan",**{"work_plan": ifc.get().by_id(work_plan)}) + ifc.run("sequence.remove_work_plan", **{"work_plan": ifc.get().by_id(work_plan)}) sequence.load_work_plans() + def load_work_plan_attributes(sequence, work_plan=None): data = sequence.get_ifc_work_plan_attributes(work_plan) sequence.load_work_plan_attributes(data) + def enable_editing_work_plan(sequence, work_plan=None): load_work_plan_attributes(sequence, work_plan) sequence.enable_editing_work_plan(work_plan) + def disable_editing_work_plan(sequence): sequence.disable_editing_work_plan() + def edit_work_plan(ifc, sequence): work_plan = sequence.get_current_ifc_work_plan() attributes = sequence.get_work_plan_attributes() - ifc.run("sequence.edit_work_plan",**{"work_plan": work_plan, "attributes": attributes}) + ifc.run("sequence.edit_work_plan", **{"work_plan": work_plan, "attributes": attributes}) sequence.disable_editing_work_plan() - sequence.load_work_plans() \ No newline at end of file + sequence.load_work_plans() diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index ad68895a56..55e2bd7867 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -80,19 +80,25 @@ class Sequence(blenderbim.core.tool.Sequence): def load_work_plan_attributes(cls, data): props = bpy.context.scene.BIMWorkPlanProperties props.work_plan_attributes.clear() - blenderbim.bim.helper.import_attributes("IfcWorkPlan", props.work_plan_attributes, data, tool.Sequence.import_attributes) + blenderbim.bim.helper.import_attributes( + "IfcWorkPlan", props.work_plan_attributes, data, tool.Sequence.import_attributes + ) + @classmethod def import_attributes(name, prop, data): if name in ["CreationDate", "StartTime", "FinishTime"]: prop.string_value = "" if prop.is_null else data[name].isoformat() return True - + @classmethod def get_work_plan_attributes(cls): props = bpy.context.scene.BIMWorkPlanProperties - attributes = blenderbim.bim.helper.export_attributes(props.work_plan_attributes, tool.Sequence.export_attributes) + attributes = blenderbim.bim.helper.export_attributes( + props.work_plan_attributes, tool.Sequence.export_attributes + ) return attributes + @classmethod def export_attributes(attributes, prop): if "Date" in prop.name or "Time" in prop.name: if prop.is_null: @@ -105,4 +111,4 @@ class Sequence(blenderbim.core.tool.Sequence): attributes[prop.name] = None return True attributes[prop.name] = helper.parse_duration(prop.string_value) - return True \ No newline at end of file + return True diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index d964e883b9..3d05203e5a 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -109,7 +109,6 @@ def i_add_a_new_collection_item(collection): assert False, "Collection does not exist" - @given(parsers.parse('the material "{name}" colour is set to "{colour}"')) @when(parsers.parse('the material "{name}" colour is set to "{colour}"')) def the_material_name_colour_is_set_to_colour(name, colour): @@ -578,21 +577,21 @@ def the_object_name_has_no_modifiers(name): @then(parsers.parse('the construction type "{ifc_class}"/"{relating_type}" has a preview')) def the_construction_type_has_a_preview(ifc_class, relating_type): if "preview_constr_types" not in AuthoringData.data: - assert False, 'There are no previews loaded' + assert False, "There are no previews loaded" preview_constr_types = AuthoringData.data["preview_constr_types"] if ifc_class not in preview_constr_types: - assert False, f'Construction class {ifc_class} has no available previews' + assert False, f"Construction class {ifc_class} has no available previews" relating_type_id = AuthoringData.relating_type_id_by_name(ifc_class, relating_type) if relating_type_id is None: - assert False, f'No construction type {ifc_class}/{relating_type} was found' + assert False, f"No construction type {ifc_class}/{relating_type} was found" if relating_type_id not in preview_constr_types[ifc_class]: - assert False, f'Construction type {ifc_class}/{relating_type} has no available previews' + assert False, f"Construction type {ifc_class}/{relating_type} has no available previews" preview_data = preview_constr_types[ifc_class][relating_type_id] - if 'icon_id' not in preview_data: - assert False, f'Construction type {ifc_class}/{relating_type} has a preview, but no assigned icon_id' + if "icon_id" not in preview_data: + assert False, f"Construction type {ifc_class}/{relating_type} has a preview, but no assigned icon_id" icon_id = preview_data["icon_id"] if not isinstance(icon_id, int): - assert False, f'Construction type {ifc_class}/{relating_type} has an invalid icon_id {icon_id}' + assert False, f"Construction type {ifc_class}/{relating_type} has an invalid icon_id {icon_id}" # Note: icon_id must be > 0 in UI mode, but asset_generate_preview() doesn't work headlessly -> skipping for now # if icon_id == 0: # assert False, f'Construction type {ifc_class}/{relating_type} has the default null value for icon_id' @@ -608,10 +607,10 @@ def there_is_a_construction_type_preview(): @then(parsers.parse('all construction types for "{ifc_class}" have a preview')) def all_construction_types_have_a_preview(ifc_class): if "preview_constr_types" not in AuthoringData.data: - assert False, 'There are no previews loaded' + assert False, "There are no previews loaded" preview_constr_types = AuthoringData.data["preview_constr_types"] if ifc_class not in preview_constr_types: - assert False, f'Construction class {ifc_class} has no available previews' + assert False, f"Construction class {ifc_class} has no available previews" constr_class_occurrences = AuthoringData.constr_class_entities(ifc_class) for constr_class_entity in constr_class_occurrences: the_construction_type_has_a_preview(ifc_class, constr_class_entity.Name) @@ -620,14 +619,14 @@ def all_construction_types_have_a_preview(ifc_class): @given("I load the demo construction library") @when("I load the demo construction library") def i_add_a_construction_library(): - lib_path = './blenderbim/bim/data/libraries/IFC4 Demo Library.ifc' + lib_path = "./blenderbim/bim/data/libraries/IFC4 Demo Library.ifc" bpy.ops.bim.select_library_file(filepath=lib_path, append_all=True) @given("I display the construction type browser") @when("I display the construction type browser") def i_display_the_construction_type_browser(): - bpy.ops.bim.display_relating_types('INVOKE_DEFAULT') + bpy.ops.bim.display_relating_types("INVOKE_DEFAULT") @given("I preview only one asset on the construction type browser") @@ -663,9 +662,12 @@ def i_add_the_active_construction_type(): @then(parsers.parse("browser construction type is {relating_type_name}")) def browser_construction_type(relating_type_name): props = bpy.context.scene.BIMModelProperties - relating_type_browser = AuthoringData.relating_type_name_by_id(props.ifc_class_browser, props.relating_type_id_browser) - assert relating_type_browser == relating_type_name, (f"Construction Type is a {relating_type_browser}, not " + - f"a {relating_type_name}") + relating_type_browser = AuthoringData.relating_type_name_by_id( + props.ifc_class_browser, props.relating_type_id_browser + ) + assert relating_type_browser == relating_type_name, ( + f"Construction Type is a {relating_type_browser}, not " + f"a {relating_type_name}" + ) @then(parsers.parse("construction type is {relating_type_name}"))