Run black

This commit is contained in:
Dion Moult
2022-08-01 19:45:36 +10:00
parent d2083b9a3d
commit ffe9ac6614
18 changed files with 116 additions and 97 deletions
@@ -882,7 +882,7 @@ class ActivateBcfViewpoint(bpy.types.Operator):
# Operators with context overrides are used because they are # Operators with context overrides are used because they are
# significantly faster than looping through all objects # 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: if viewpoint.components.visibility.default_visibility:
old = context.area.type old = context.area.type
@@ -39,7 +39,7 @@ class LoadGroups(bpy.types.Operator):
self.ifc = IfcStore.get_file() self.ifc = IfcStore.get_file()
if not self.is_refresh: if not self.is_refresh:
context.scene.ExpandedGroups.json_string = "{}" context.scene.ExpandedGroups.json_string = "{}"
for ifc_definition_id, group in Data.groups.items(): for ifc_definition_id, group in Data.groups.items():
if not group["HasAssignments"]: if not group["HasAssignments"]:
new = self.props.groups.add() 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.selection_query = group["Description"].split("*selector*")[1] if group["Description"] else ""
new.has_children = True if len(group["IsGroupedBy"]) != 0 else False new.has_children = True if len(group["IsGroupedBy"]) != 0 else False
new.tree_depth = 0 new.tree_depth = 0
if self.is_refresh: if self.is_refresh:
self.recursively_load_sub_groups(ifc_definition_id, new) self.recursively_load_sub_groups(ifc_definition_id, new)
self.props.is_editing = True self.props.is_editing = True
bpy.ops.bim.disable_editing_group() bpy.ops.bim.disable_editing_group()
Data.load(IfcStore.get_file()) Data.load(IfcStore.get_file())
return {"FINISHED"} return {"FINISHED"}
def recursively_load_sub_groups(self, ifc_definition_id, parent): 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 == []: if str(ifc_definition_id) not in self.expanded_groups or sub_groups == []:
return return
else: else:
@@ -67,7 +69,11 @@ class LoadGroups(bpy.types.Operator):
new = self.props.groups.add() new = self.props.groups.add()
new.ifc_definition_id = group new.ifc_definition_id = group
new.name = Data.groups[group]["Name"] 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.has_children = True if len(Data.groups[group]["IsGroupedBy"]) != 0 else False
new.tree_depth = parent.tree_depth + 1 new.tree_depth = parent.tree_depth + 1
self.recursively_load_sub_groups(new.ifc_definition_id, new) self.recursively_load_sub_groups(new.ifc_definition_id, new)
@@ -115,11 +121,11 @@ class AddGroup(bpy.types.Operator):
def _execute(self, context): def _execute(self, context):
result = ifcopenshell.api.run("group.add_group", IfcStore.get_file()) result = ifcopenshell.api.run("group.add_group", IfcStore.get_file())
Data.load(IfcStore.get_file()) Data.load(IfcStore.get_file())
bpy.ops.bim.load_groups(is_refresh=True) bpy.ops.bim.load_groups(is_refresh=True)
bpy.ops.bim.enable_editing_group(group=result.id()) bpy.ops.bim.enable_editing_group(group=result.id())
return {"FINISHED"} return {"FINISHED"}
class AddGroupToGroup(bpy.types.Operator): class AddGroupToGroup(bpy.types.Operator):
bl_idname = "bim.add_group_to_group" bl_idname = "bim.add_group_to_group"
@@ -134,12 +140,7 @@ class AddGroupToGroup(bpy.types.Operator):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
result = ifcopenshell.api.run("group.add_group", self.file) result = ifcopenshell.api.run("group.add_group", self.file)
ifcopenshell.api.run( ifcopenshell.api.run(
"group.assign_group", "group.assign_group", IfcStore.get_file(), **{"product": [result], "group": self.file.by_id(self.group)}
IfcStore.get_file(),
**{
"product": [result],
"group" : self.file.by_id(self.group)
}
) )
Data.load(IfcStore.get_file()) Data.load(IfcStore.get_file())
bpy.ops.bim.load_groups(is_refresh=True) bpy.ops.bim.load_groups(is_refresh=True)
@@ -163,10 +164,10 @@ class EditGroup(bpy.types.Operator):
attributes[attribute.name] = None attributes[attribute.name] = None
else: else:
attributes[attribute.name] = attribute.string_value attributes[attribute.name] = attribute.string_value
if self.copy_from_selector: if self.copy_from_selector:
attributes["Description"] = context.scene.IFCSelector.selection_query attributes["Description"] = context.scene.IFCSelector.selection_query
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
ifcopenshell.api.run( ifcopenshell.api.run(
"group.edit_group", self.file, **{"group": self.file.by_id(props.active_group_id), "attributes": attributes} "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) obj.select_set(True)
return {"FINISHED"} return {"FINISHED"}
class UpdateGroup(bpy.types.Operator): class UpdateGroup(bpy.types.Operator):
bl_idname = "bim.update_group" bl_idname = "bim.update_group"
bl_label = "Update Group" bl_label = "Update Group"
@@ -37,6 +37,7 @@ from bpy.props import (
class ExpandedGroups(StrProperty): class ExpandedGroups(StrProperty):
json_string: StringProperty(name="JSON String", default="{}") json_string: StringProperty(name="JSON String", default="{}")
class Group(PropertyGroup): class Group(PropertyGroup):
name: StringProperty(name="Name") name: StringProperty(name="Name")
ifc_definition_id: IntProperty(name="IFC Definition ID") ifc_definition_id: IntProperty(name="IFC Definition ID")
@@ -44,7 +45,8 @@ class Group(PropertyGroup):
is_expanded: BoolProperty(name="Is Expanded", default=False) is_expanded: BoolProperty(name="Is Expanded", default=False)
has_children: BoolProperty(name="Has Children") has_children: BoolProperty(name="Has Children")
tree_depth: IntProperty(name="Tree Depth") tree_depth: IntProperty(name="Tree Depth")
class BIMGroupProperties(PropertyGroup): class BIMGroupProperties(PropertyGroup):
group_attributes: CollectionProperty(name="Group Attributes", type=Attribute) group_attributes: CollectionProperty(name="Group Attributes", type=Attribute)
is_editing: BoolProperty(name="Is Editing", default=False) is_editing: BoolProperty(name="Is Editing", default=False)
@@ -52,4 +54,3 @@ class BIMGroupProperties(PropertyGroup):
groups: CollectionProperty(name="Groups", type=Group) groups: CollectionProperty(name="Groups", type=Group)
active_group_index: IntProperty(name="Active Group Index") active_group_index: IntProperty(name="Active Group Index")
active_group_id: IntProperty(name="Active Group Id") active_group_id: IntProperty(name="Active Group Id")
@@ -122,10 +122,8 @@ class BIM_UL_groups(UIList):
row.label(text="", icon="BLANK1") row.label(text="", icon="BLANK1")
if item.has_children: if item.has_children:
op = row.operator( op = row.operator(
"bim.toggle_group", "bim.toggle_group", icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", text="", emboss=False
icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", )
text="",
emboss=False)
op.ifc_definition_id = item.ifc_definition_id op.ifc_definition_id = item.ifc_definition_id
op.index = index op.index = index
op.option = "Collapse" if item.is_expanded else "Expand" op.option = "Collapse" if item.is_expanded else "Expand"
@@ -173,10 +171,8 @@ class BIM_UL_object_groups(UIList):
row.label(text="", icon="BLANK1") row.label(text="", icon="BLANK1")
if item.has_children: if item.has_children:
op = row.operator( op = row.operator(
"bim.toggle_group", "bim.toggle_group", icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", text="", emboss=False
icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", )
text="",
emboss=False)
op.ifc_definition_id = item.ifc_definition_id op.ifc_definition_id = item.ifc_definition_id
op.index = index op.index = index
op.option = "Collapse" if item.is_expanded else "Expand" op.option = "Collapse" if item.is_expanded else "Expand"
@@ -91,9 +91,7 @@ class AuthoringData:
@classmethod @classmethod
def relating_types(cls, ifc_class=None): def relating_types(cls, ifc_class=None):
return [ return [(str(e.id()), e.Name, e.Description or "") for e in cls.constr_class_entities(ifc_class=ifc_class)]
(str(e.id()), e.Name, e.Description or "") for e in cls.constr_class_entities(ifc_class=ifc_class)
]
@classmethod @classmethod
def relating_types_browser(cls): def relating_types_browser(cls):
@@ -116,8 +114,10 @@ class AuthoringData:
for constr_class_entity in constr_class_occurrences: for constr_class_entity in constr_class_occurrences:
### handle asset regeneration when library entity is updated ¿? ### handle asset regeneration when library entity is updated ¿?
if (ifc_class not in preview_constr_types if (
or str(constr_class_entity.id()) not in preview_constr_types[ifc_class]): 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) obj = tool.Ifc.get_object(constr_class_entity)
cls.assetize_object(obj, ifc_class, constr_class_entity) cls.assetize_object(obj, ifc_class, constr_class_entity)
relating_type_info = cls.relating_type_info(ifc_class) 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): def assetize_object(cls, obj, ifc_class, ifc_class_entity, from_selection=False):
relating_type_id = ifc_class_entity.id() relating_type_id = ifc_class_entity.id()
to_be_deleted = False to_be_deleted = False
if obj.type == 'EMPTY': if obj.type == "EMPTY":
kwargs = {} kwargs = {}
if not from_selection: 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) new_obj = cls.new_relating_type(**kwargs)
if new_obj is not None: if new_obj is not None:
to_be_deleted = True to_be_deleted = True
@@ -165,6 +165,7 @@ class DumbProfileGenerator:
try: try:
obj.select_set(True) obj.select_set(True)
except RuntimeError: except RuntimeError:
def msg(self, context): def msg(self, context):
txt = "The created object could not be assigned to a collection. " txt = "The created object could not be assigned to a collection. "
txt += "Has any IfcSpatialElement been deleted?" txt += "Has any IfcSpatialElement been deleted?"
@@ -43,9 +43,10 @@ def update_icon_id(self, context):
ifc_class_browser = self.ifc_class_browser ifc_class_browser = self.ifc_class_browser
relating_type_id_browser = self.relating_type_id_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) 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"] if (
or relating_type_id_browser not in AuthoringData.data["preview_constr_types"][ifc_class_browser]) ifc_class_browser not in AuthoringData.data["preview_constr_types"]
and relating_type_browser is not None): 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(): if not AuthoringData.assetize_relating_type_from_selection():
return return
self.icon_id = AuthoringData.data["preview_constr_types"][ifc_class_browser][relating_type_id_browser]["icon_id"] 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): def update_relating_type_browser_by_name(self, context):
AuthoringData.load_relating_types_browser() 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: if relating_type_id_browser is not None:
self.relating_type_id_browser = relating_type_id_browser self.relating_type_id_browser = relating_type_id_browser
@@ -119,10 +122,7 @@ class BIMModelProperties(PropertyGroup):
name="Occurrence Name Style", name="Occurrence Name Style",
) )
occurrence_name_function: bpy.props.StringProperty(name="Occurrence Name Function") occurrence_name_function: bpy.props.StringProperty(name="Occurrence Name Function")
getter_enum = { getter_enum = {"ifc_class_browser": get_ifc_class, "relating_type_browser": get_relating_type_browser}
"ifc_class_browser": get_ifc_class,
"relating_type_browser": get_relating_type_browser
}
def get_relating_type_info(self, context): def get_relating_type_info(self, context):
@@ -131,9 +131,5 @@ def get_relating_type_info(self, context):
class ConstrTypeInfo(PropertyGroup): class ConstrTypeInfo(PropertyGroup):
name: bpy.props.StringProperty(name="Construction class") name: bpy.props.StringProperty(name="Construction class")
relating_type: bpy.props.EnumProperty( relating_type: bpy.props.EnumProperty(name="Construction type", items=get_relating_type_info)
name="Construction type", items=get_relating_type_info
)
fully_loaded: bpy.props.BoolProperty(default=False) fully_loaded: bpy.props.BoolProperty(default=False)
@@ -309,6 +309,7 @@ class DumbSlabGenerator:
try: try:
obj.select_set(True) obj.select_set(True)
except RuntimeError: except RuntimeError:
def msg(self, context): def msg(self, context):
txt = "The created object could not be assigned to a collection. " txt = "The created object could not be assigned to a collection. "
txt += "Has any IfcSpatialElement been deleted?" txt += "Has any IfcSpatialElement been deleted?"
@@ -820,6 +820,7 @@ class DumbWallGenerator:
try: try:
obj.select_set(True) obj.select_set(True)
except RuntimeError: except RuntimeError:
def msg(self, context): def msg(self, context):
txt = "The created object could not be assigned to a collection. " txt = "The created object could not be assigned to a collection. "
txt += "Has any IfcSpatialElement been deleted?" txt += "Has any IfcSpatialElement been deleted?"
@@ -93,6 +93,7 @@ def get_ifc_classes_suggestions():
IfcClassData.load() IfcClassData.load()
return IfcClassData.data["ifc_classes_suggestions"] return IfcClassData.data["ifc_classes_suggestions"]
def get_contexts(self, context): def get_contexts(self, context):
if not IfcClassData.is_loaded: if not IfcClassData.is_loaded:
IfcClassData.load() IfcClassData.load()
@@ -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="Select All").action = "SELECT"
row.operator("bim.toggle_filter_selection", text="Deselect All").action = "DESELECT" row.operator("bim.toggle_filter_selection", text="Deselect All").action = "DESELECT"
class UnhideAllElements(Operator): class UnhideAllElements(Operator):
"""Filter model elements based on selection""" """Filter model elements based on selection"""
@@ -481,6 +482,7 @@ class UnhideAllElements(Operator):
class FilterModelElements(Operator): class FilterModelElements(Operator):
"""Filter model elements based on selection""" """Filter model elements based on selection"""
bl_idname = "bim.filter_model_elements" bl_idname = "bim.filter_model_elements"
bl_label = "Filter Model Elements" bl_label = "Filter Model Elements"
option: StringProperty("select|isolate|hide") option: StringProperty("select|isolate|hide")
@@ -563,6 +565,7 @@ class FilterModelElements(Operator):
class IfcSelector(Operator): class IfcSelector(Operator):
"""Select elements in model with IFC Selector""" """Select elements in model with IFC Selector"""
bl_idname = "bim.ifc_selector" bl_idname = "bim.ifc_selector"
bl_label = "Select elements with IFC Selector" bl_label = "Select elements with IFC Selector"
@@ -578,6 +581,7 @@ class IfcSelector(Operator):
def draw(self, context): def draw(self, context):
from . import ui from . import ui
ui.IfcSelectorUI.draw(context, self.layout) ui.IfcSelectorUI.draw(context, self.layout)
@@ -603,6 +607,7 @@ class SaveSelectorQuery(Operator):
class OpenQueryLibrary(Operator): class OpenQueryLibrary(Operator):
"""Open Query Library""" """Open Query Library"""
bl_idname = "bim.open_query_library" bl_idname = "bim.open_query_library"
bl_label = "Open Query Library" bl_label = "Open Query Library"
@@ -633,53 +638,54 @@ class LoadQuery(Operator):
bl_idname = "bim.load_query" bl_idname = "bim.load_query"
bl_label = "Load Query" bl_label = "Load Query"
index: IntProperty() index: IntProperty()
def invoke(self, context, event): def invoke(self, context, event):
close_operator_panel(event) close_operator_panel(event)
return self.execute(context) return self.execute(context)
def execute(self, context): def execute(self, context):
ifc_selector = context.scene.IfcSelectorProperties ifc_selector = context.scene.IfcSelectorProperties
ifc_selector.selector_query_syntax = ifc_selector.query_library[self.index].query ifc_selector.selector_query_syntax = ifc_selector.query_library[self.index].query
return {"FINISHED"} return {"FINISHED"}
class AddToIfcGroup(Operator): class AddToIfcGroup(Operator):
bl_idname = "bim.add_to_ifc_group" bl_idname = "bim.add_to_ifc_group"
bl_label = "Add to IFC Group" bl_label = "Add to IFC Group"
group_name: StringProperty(name="Group Name") group_name: StringProperty(name="Group Name")
def invoke(self, context, event): def invoke(self, context, event):
bpy.ops.bim.load_groups() bpy.ops.bim.load_groups()
return context.window_manager.invoke_props_dialog(self, width=400) return context.window_manager.invoke_props_dialog(self, width=400)
def draw(self, context): def draw(self, context):
self.props = context.scene.BIMGroupProperties self.props = context.scene.BIMGroupProperties
row = self.layout.row() row = self.layout.row()
row.operator("bim.add_group") row.operator("bim.add_group")
self.layout.template_list( self.layout.template_list(
"BIM_UL_groups", "BIM_UL_groups",
"", "",
self.props, self.props,
"groups", "groups",
self.props, self.props,
"active_group_index", "active_group_index",
) )
if self.props.active_group_id: if self.props.active_group_id:
for attribute in self.props.group_attributes: for attribute in self.props.group_attributes:
if attribute.name in ["Name", "Description"]: if attribute.name in ["Name", "Description"]:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.prop(attribute, "string_value", text=attribute.name) row.prop(attribute, "string_value", text=attribute.name)
def execute(self, context): def execute(self, context):
active_group_index = self.props.active_group_index active_group_index = self.props.active_group_index
ifc_definition_id = self.props.groups[active_group_index].ifc_definition_id 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 selector_query_syntax = context.scene.IfcSelectorProperties.selector_query_syntax
for attribute in self.props.group_attributes: for attribute in self.props.group_attributes:
if attribute.name == "Description": if attribute.name == "Description":
if "*selector*" not in attribute.string_value: if "*selector*" not in attribute.string_value:
@@ -688,7 +694,7 @@ class AddToIfcGroup(Operator):
new_description = attribute.string_value.split("*selector*") new_description = attribute.string_value.split("*selector*")
new_description[1] = selector_query_syntax new_description[1] = selector_query_syntax
attribute.string_value = "*selector*".join(new_description) attribute.string_value = "*selector*".join(new_description)
bpy.ops.bim.edit_group() bpy.ops.bim.edit_group()
bpy.ops.bim.disable_group_editing_ui() bpy.ops.bim.disable_group_editing_ui()
return {"FINISHED"} return {"FINISHED"}
@@ -175,6 +175,7 @@ class SearchCollection(PropertyGroup):
global_id: StringProperty() global_id: StringProperty()
query: StringProperty() query: StringProperty()
class IfcSelector: class IfcSelector:
and_or: EnumProperty( and_or: EnumProperty(
items=[(i, i, i) for i in ["and", "or"]], items=[(i, i, i) for i in ["and", "or"]],
@@ -231,9 +232,9 @@ class SearchQueryGroup(PropertyGroup, IfcSelector):
class IfcSelectorProperties(PropertyGroup, IfcSelector): class IfcSelectorProperties(PropertyGroup, IfcSelector):
groups: CollectionProperty(type=SearchQueryGroup) groups: CollectionProperty(type=SearchQueryGroup)
selector_query_syntax: StringProperty() selector_query_syntax: StringProperty()
query_library: CollectionProperty(type=SearchCollection) query_library: CollectionProperty(type=SearchCollection)
active_query: StringProperty() active_query: StringProperty()
active_query: StringProperty() active_query: StringProperty()
manual_override: BoolProperty(default=False, description="Toggle to allow manual typing of query-syntax") manual_override: BoolProperty(default=False, description="Toggle to allow manual typing of query-syntax")
@@ -1850,7 +1850,6 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator):
self.total_frames = self.calculate_total_frames(context) self.total_frames = self.calculate_total_frames(context)
self.preprocess_tasks() self.preprocess_tasks()
for obj in bpy.data.objects: for obj in bpy.data.objects:
if not obj.BIMObjectProperties.ifc_definition_id: if not obj.BIMObjectProperties.ifc_definition_id:
continue continue
@@ -1862,7 +1861,6 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator):
self.animate_output(obj, product_frame) self.animate_output(obj, product_frame)
self.add_text_animation_handler() self.add_text_animation_handler()
area = next(area for area in context.screen.areas if area.type == "VIEW_3D") area = next(area for area in context.screen.areas if area.type == "VIEW_3D")
area.spaces[0].shading.color_type = "OBJECT" area.spaces[0].shading.color_type = "OBJECT"
context.scene.frame_start = self.start_frame context.scene.frame_start = self.start_frame
@@ -49,8 +49,8 @@ class BIM_PT_work_plans(Panel):
row = self.layout.row() row = self.layout.row()
row.label( row.label(
text="{} Work Plans Found".format(SequenceData.number_of_work_plans_loaded), text="{} Work Plans Found".format(SequenceData.number_of_work_plans_loaded),
icon="TEXT", icon="TEXT",
) )
row.operator("bim.add_work_plan", icon="ADD") row.operator("bim.add_work_plan", icon="ADD")
@@ -662,7 +662,9 @@ class AddStructuralLoadGroup(bpy.types.Operator):
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
load_group = ifcopenshell.api.run("structural.add_structural_load_group", self.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()) Data.load(IfcStore.get_file())
return {"FINISHED"} return {"FINISHED"}
+9 -4
View File
@@ -1,6 +1,6 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on # BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>, 2022 Yassine Oualid <yassine@sigmadimensions.com> # Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>, 2022 Yassine Oualid <yassine@sigmadimensions.com>
# #
# This file is part of BlenderBIM Add-on. # This file is part of BlenderBIM Add-on.
# #
# BlenderBIM Add-on is free software: you can redistribute it and/or modify # 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") ifc.run("sequence.add_work_plan")
sequence.load_work_plans() sequence.load_work_plans()
def remove_work_plan(ifc, sequence, work_plan=None): 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() sequence.load_work_plans()
def load_work_plan_attributes(sequence, work_plan=None): def load_work_plan_attributes(sequence, work_plan=None):
data = sequence.get_ifc_work_plan_attributes(work_plan) data = sequence.get_ifc_work_plan_attributes(work_plan)
sequence.load_work_plan_attributes(data) sequence.load_work_plan_attributes(data)
def enable_editing_work_plan(sequence, work_plan=None): def enable_editing_work_plan(sequence, work_plan=None):
load_work_plan_attributes(sequence, work_plan) load_work_plan_attributes(sequence, work_plan)
sequence.enable_editing_work_plan(work_plan) sequence.enable_editing_work_plan(work_plan)
def disable_editing_work_plan(sequence): def disable_editing_work_plan(sequence):
sequence.disable_editing_work_plan() sequence.disable_editing_work_plan()
def edit_work_plan(ifc, sequence): def edit_work_plan(ifc, sequence):
work_plan = sequence.get_current_ifc_work_plan() work_plan = sequence.get_current_ifc_work_plan()
attributes = sequence.get_work_plan_attributes() 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.disable_editing_work_plan()
sequence.load_work_plans() sequence.load_work_plans()
+10 -4
View File
@@ -80,19 +80,25 @@ class Sequence(blenderbim.core.tool.Sequence):
def load_work_plan_attributes(cls, data): def load_work_plan_attributes(cls, data):
props = bpy.context.scene.BIMWorkPlanProperties props = bpy.context.scene.BIMWorkPlanProperties
props.work_plan_attributes.clear() 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): def import_attributes(name, prop, data):
if name in ["CreationDate", "StartTime", "FinishTime"]: if name in ["CreationDate", "StartTime", "FinishTime"]:
prop.string_value = "" if prop.is_null else data[name].isoformat() prop.string_value = "" if prop.is_null else data[name].isoformat()
return True return True
@classmethod @classmethod
def get_work_plan_attributes(cls): def get_work_plan_attributes(cls):
props = bpy.context.scene.BIMWorkPlanProperties 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 return attributes
@classmethod
def export_attributes(attributes, prop): def export_attributes(attributes, prop):
if "Date" in prop.name or "Time" in prop.name: if "Date" in prop.name or "Time" in prop.name:
if prop.is_null: if prop.is_null:
@@ -105,4 +111,4 @@ class Sequence(blenderbim.core.tool.Sequence):
attributes[prop.name] = None attributes[prop.name] = None
return True return True
attributes[prop.name] = helper.parse_duration(prop.string_value) attributes[prop.name] = helper.parse_duration(prop.string_value)
return True return True
+17 -15
View File
@@ -109,7 +109,6 @@ def i_add_a_new_collection_item(collection):
assert False, "Collection does not exist" assert False, "Collection does not exist"
@given(parsers.parse('the material "{name}" colour is set to "{colour}"')) @given(parsers.parse('the material "{name}" colour is set to "{colour}"'))
@when(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): 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')) @then(parsers.parse('the construction type "{ifc_class}"/"{relating_type}" has a preview'))
def the_construction_type_has_a_preview(ifc_class, relating_type): def the_construction_type_has_a_preview(ifc_class, relating_type):
if "preview_constr_types" not in AuthoringData.data: 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"] preview_constr_types = AuthoringData.data["preview_constr_types"]
if ifc_class not in 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) relating_type_id = AuthoringData.relating_type_id_by_name(ifc_class, relating_type)
if relating_type_id is None: 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]: 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] preview_data = preview_constr_types[ifc_class][relating_type_id]
if 'icon_id' not in preview_data: if "icon_id" not in preview_data:
assert False, f'Construction type {ifc_class}/{relating_type} has a preview, but no assigned icon_id' assert False, f"Construction type {ifc_class}/{relating_type} has a preview, but no assigned icon_id"
icon_id = preview_data["icon_id"] icon_id = preview_data["icon_id"]
if not isinstance(icon_id, int): 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 # Note: icon_id must be > 0 in UI mode, but asset_generate_preview() doesn't work headlessly -> skipping for now
# if icon_id == 0: # if icon_id == 0:
# assert False, f'Construction type {ifc_class}/{relating_type} has the default null value for icon_id' # 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')) @then(parsers.parse('all construction types for "{ifc_class}" have a preview'))
def all_construction_types_have_a_preview(ifc_class): def all_construction_types_have_a_preview(ifc_class):
if "preview_constr_types" not in AuthoringData.data: 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"] preview_constr_types = AuthoringData.data["preview_constr_types"]
if ifc_class not in 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) constr_class_occurrences = AuthoringData.constr_class_entities(ifc_class)
for constr_class_entity in constr_class_occurrences: for constr_class_entity in constr_class_occurrences:
the_construction_type_has_a_preview(ifc_class, constr_class_entity.Name) 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") @given("I load the demo construction library")
@when("I load the demo construction library") @when("I load the demo construction library")
def i_add_a_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) bpy.ops.bim.select_library_file(filepath=lib_path, append_all=True)
@given("I display the construction type browser") @given("I display the construction type browser")
@when("I display the construction type browser") @when("I display the construction type browser")
def 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") @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}")) @then(parsers.parse("browser construction type is {relating_type_name}"))
def browser_construction_type(relating_type_name): def browser_construction_type(relating_type_name):
props = bpy.context.scene.BIMModelProperties props = bpy.context.scene.BIMModelProperties
relating_type_browser = AuthoringData.relating_type_name_by_id(props.ifc_class_browser, props.relating_type_id_browser) relating_type_browser = AuthoringData.relating_type_name_by_id(
assert relating_type_browser == relating_type_name, (f"Construction Type is a {relating_type_browser}, not " + props.ifc_class_browser, props.relating_type_id_browser
f"a {relating_type_name}") )
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}")) @then(parsers.parse("construction type is {relating_type_name}"))