diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index e8346c5622..e2e8859f7b 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -25,6 +25,7 @@ if bpy is not None: "geometry": None, "cobie": None, "sequence": None, + "group": None, "material": None, "style": None, "layer": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/__init__.py b/src/ifcblenderexport/blenderbim/bim/module/group/__init__.py new file mode 100644 index 0000000000..27949003fb --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/group/__init__.py @@ -0,0 +1,24 @@ +import bpy +from . import ui, prop, operator + +classes = ( + operator.LoadGroups, + operator.DisableGroupEditingUI, + operator.AddGroup, + operator.EditGroup, + operator.RemoveGroup, + operator.EnableEditingGroup, + operator.DisableEditingGroup, + prop.Group, + prop.BIMGroupProperties, + ui.BIM_PT_groups, + ui.BIM_UL_groups, +) + + +def register(): + bpy.types.Scene.BIMGroupProperties = bpy.props.PointerProperty(type=prop.BIMGroupProperties) + + +def unregister(): + del bpy.types.Scene.BIMGroupProperties diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/add_group.py b/src/ifcblenderexport/blenderbim/bim/module/group/add_group.py new file mode 100644 index 0000000000..7a7559bd91 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/group/add_group.py @@ -0,0 +1,17 @@ +import ifcopenshell +from blenderbim.bim.module.owner.api import create_owner_history + + +class Usecase: + def __init__(self, file, settings={}): + self.file = file + self.settings = {} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + return self.file.create_entity("IfcGroup", **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": create_owner_history(), + "Name": "Unnamed" + }) diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/data.py b/src/ifcblenderexport/blenderbim/bim/module/group/data.py new file mode 100644 index 0000000000..84a2dc7330 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/group/data.py @@ -0,0 +1,20 @@ +from blenderbim.bim.ifc import IfcStore + + +class Data: + is_loaded = False + groups = {} + + @classmethod + def purge(cls): + cls.is_loaded = False + cls.groups = {} + + @classmethod + def load(cls): + cls.groups = {} + for group in IfcStore.get_file().by_type("IfcGroup", include_subtypes=False): + data = group.get_info() + del data["OwnerHistory"] + cls.groups[group.id()] = data + cls.is_loaded=True diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/edit_group.py b/src/ifcblenderexport/blenderbim/bim/module/group/edit_group.py new file mode 100644 index 0000000000..584fb7f091 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/group/edit_group.py @@ -0,0 +1,13 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = { + "group": None, + "attributes": {} + } + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + for name, value in self.settings["attributes"].items(): + setattr(self.settings["group"], name, value) diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/operator.py b/src/ifcblenderexport/blenderbim/bim/module/group/operator.py new file mode 100644 index 0000000000..eecefe7a6d --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/group/operator.py @@ -0,0 +1,113 @@ +import bpy +import blenderbim.bim.module.group.add_group as add_group +import blenderbim.bim.module.group.edit_group as edit_group +import blenderbim.bim.module.group.remove_group as remove_group +from blenderbim.bim.ifc import IfcStore +from blenderbim.bim.module.group.data import Data + + +class LoadGroups(bpy.types.Operator): + bl_idname = "bim.load_groups" + bl_label = "Load Groups" + + def execute(self, context): + props = context.scene.BIMGroupProperties + while len(props.groups) > 0: + props.groups.remove(0) + for ifc_definition_id, group in Data.groups.items(): + new = props.groups.add() + new.ifc_definition_id = ifc_definition_id + new.name = group["Name"] + props.is_editing = True + bpy.ops.bim.disable_editing_group() + return {"FINISHED"} + + +class DisableGroupEditingUI(bpy.types.Operator): + bl_idname = "bim.disable_group_editing_ui" + bl_label = "Disable Group Editing UI" + + def execute(self, context): + context.scene.BIMGroupProperties.is_editing = False + return {"FINISHED"} + + +class AddGroup(bpy.types.Operator): + bl_idname = "bim.add_group" + bl_label = "Add Group" + + def execute(self, context): + result = add_group.Usecase(IfcStore.get_file()).execute() + Data.load() + bpy.ops.bim.load_groups() + bpy.ops.bim.enable_editing_group(group=result.id()) + return {"FINISHED"} + + +class EditGroup(bpy.types.Operator): + bl_idname = "bim.edit_group" + bl_label = "Edit Group" + + def execute(self, context): + props = context.scene.BIMGroupProperties + attributes = {} + for attribute in props.group_attributes: + if attribute.is_null: + attributes[attribute.name] = None + else: + attributes[attribute.name] = attribute.string_value + self.file = IfcStore.get_file() + edit_group.Usecase( + self.file, {"group": self.file.by_id(props.active_group_id), "attributes": attributes} + ).execute() + Data.load() + bpy.ops.bim.load_groups() + return {"FINISHED"} + + +class RemoveGroup(bpy.types.Operator): + bl_idname = "bim.remove_group" + bl_label = "Remove Group" + group: bpy.props.IntProperty() + + def execute(self, context): + props = context.scene.BIMGroupProperties + self.file = IfcStore.get_file() + remove_group.Usecase(self.file, {"group": self.file.by_id(self.group)}).execute() + Data.load() + bpy.ops.bim.load_groups() + return {"FINISHED"} + + +class EnableEditingGroup(bpy.types.Operator): + bl_idname = "bim.enable_editing_group" + bl_label = "Enable Editing Group" + group: bpy.props.IntProperty() + + def execute(self, context): + props = context.scene.BIMGroupProperties + while len(props.group_attributes) > 0: + props.group_attributes.remove(0) + + data = Data.groups[self.group] + + for attribute in IfcStore.get_schema().declaration_by_name("IfcGroup").all_attributes(): + data_type = str(attribute.type_of_attribute) + if "