From 84de1f1b09758d66b04857c42948befe6a37b35a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 8 Jan 2021 20:53:51 +1100 Subject: [PATCH] WIP port address and role editing to owner module. See #1222. --- .../blenderbim/bim/__init__.py | 8 +- .../blenderbim/bim/module/owner/__init__.py | 29 ++ .../bim/module/owner/add_address.py | 11 + .../module/{person => owner}/add_person.py | 0 .../blenderbim/bim/module/owner/add_role.py | 11 + .../bim/module/{person => owner}/data.py | 14 +- .../bim/module/owner/edit_address.py | 13 + .../module/{person => owner}/edit_person.py | 0 .../blenderbim/bim/module/owner/edit_role.py | 13 + .../blenderbim/bim/module/owner/operator.py | 281 ++++++++++++++++++ .../bim/module/owner/remove_address.py | 9 + .../module/{person => owner}/remove_person.py | 0 .../bim/module/owner/remove_role.py | 9 + .../blenderbim/bim/module/owner/ui.py | 141 +++++++++ .../blenderbim/bim/module/person/__init__.py | 19 -- .../blenderbim/bim/module/person/operator.py | 84 ------ .../blenderbim/bim/module/person/ui.py | 69 ----- src/ifcblenderexport/blenderbim/bim/prop.py | 15 +- 18 files changed, 541 insertions(+), 185 deletions(-) create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/__init__.py create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py rename src/ifcblenderexport/blenderbim/bim/module/{person => owner}/add_person.py (100%) create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py rename src/ifcblenderexport/blenderbim/bim/module/{person => owner}/data.py (65%) create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py rename src/ifcblenderexport/blenderbim/bim/module/{person => owner}/edit_person.py (100%) create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/operator.py create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py rename src/ifcblenderexport/blenderbim/bim/module/{person => owner}/remove_person.py (100%) create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py create mode 100644 src/ifcblenderexport/blenderbim/bim/module/owner/ui.py delete mode 100644 src/ifcblenderexport/blenderbim/bim/module/person/__init__.py delete mode 100644 src/ifcblenderexport/blenderbim/bim/module/person/operator.py delete mode 100644 src/ifcblenderexport/blenderbim/bim/module/person/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index c1dadd46c9..7a7b7b54e2 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -14,7 +14,7 @@ if bpy is not None: import blenderbim.bim.module.debug as module_debug import blenderbim.bim.module.geometry as module_geometry import blenderbim.bim.module.model as module_model - import blenderbim.bim.module.person as module_person + import blenderbim.bim.module.owner as module_owner import blenderbim.bim.module.project as module_project import blenderbim.bim.module.pset as module_pset import blenderbim.bim.module.spatial as module_spatial @@ -309,7 +309,7 @@ if bpy is not None: classes.extend(module_debug.classes) classes.extend(module_geometry.classes) classes.extend(module_model.classes) - classes.extend(module_person.classes) + classes.extend(module_owner.classes) classes.extend(module_project.classes) classes.extend(module_pset.classes) classes.extend(module_spatial.classes) @@ -355,7 +355,7 @@ if bpy is not None: module_debug.register() module_geometry.register() module_model.register() - module_person.register() + module_owner.register() module_project.register() module_pset.register() module_spatial.register() @@ -388,7 +388,7 @@ if bpy is not None: module_spatial.unregister() module_pset.unregister() module_project.unregister() - module_person.unregister() + module_owner.unregister() module_model.unregister() module_geometry.unregister() module_debug.unregister() diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/__init__.py b/src/ifcblenderexport/blenderbim/bim/module/owner/__init__.py new file mode 100644 index 0000000000..6a92264136 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/__init__.py @@ -0,0 +1,29 @@ +import bpy +from . import ui, operator + +classes = ( + operator.EnableEditingPerson, + operator.DisableEditingPerson, + operator.AddPerson, + operator.EditPerson, + operator.RemovePerson, + operator.EnableEditingRole, + operator.DisableEditingRole, + operator.AddRole, + operator.EditRole, + operator.RemoveRole, + operator.EnableEditingAddress, + operator.DisableEditingAddress, + operator.AddAddress, + operator.EditAddress, + operator.RemoveAddress, + ui.BIM_PT_people, +) + + +def register(): + pass + + +def unregister(): + pass diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py b/src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py new file mode 100644 index 0000000000..26beaeb9cb --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py @@ -0,0 +1,11 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = {"assigned_object": None, "ifc_class": "IfcPostalAddress"} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + addresses = list(self.settings["assigned_object"].Addresses) if self.settings["assigned_object"].Addresses else [] + addresses.append(self.file.create_entity(self.settings["ifc_class"], "OFFICE")) + self.settings["assigned_object"].Addresses = addresses diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/add_person.py b/src/ifcblenderexport/blenderbim/bim/module/owner/add_person.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/person/add_person.py rename to src/ifcblenderexport/blenderbim/bim/module/owner/add_person.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py b/src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py new file mode 100644 index 0000000000..dfbe523db9 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py @@ -0,0 +1,11 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = {"assigned_object": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + roles = list(self.settings["assigned_object"].Roles) if self.settings["assigned_object"].Roles else [] + roles.append(self.file.createIfcActorRole("ARCHITECT")) + self.settings["assigned_object"].Roles = roles diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/data.py b/src/ifcblenderexport/blenderbim/bim/module/owner/data.py similarity index 65% rename from src/ifcblenderexport/blenderbim/bim/module/person/data.py rename to src/ifcblenderexport/blenderbim/bim/module/owner/data.py index e767cb90d4..a3b40b218d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/person/data.py +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/data.py @@ -4,6 +4,8 @@ from blenderbim.bim.ifc import IfcStore class Data: is_loaded = False people = {} + addresses = {} + roles = {} @classmethod def load(cls): @@ -14,19 +16,25 @@ class Data: for person in file.by_type("IfcPerson"): data = person.get_info() - roles = {} + roles = [] if data["Roles"]: for role in data["Roles"]: - roles[role.id()] = role.get_info() + roles.append(role.id()) data["Roles"] = roles addresses = [] if data["Addresses"]: for address in data["Addresses"]: - addresses.append(address.get_info()) + addresses.append(address.id()) data["Addresses"] = addresses data["is_engaged"] = bool(person.EngagedIn) cls.people[person.id()] = data + + for address in file.by_type("IfcAddress"): + cls.addresses[address.id()] = address.get_info() + + for role in file.by_type("IfcActorRole"): + cls.roles[role.id()] = role.get_info() cls.is_loaded = True diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py b/src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py new file mode 100644 index 0000000000..fcc14d455f --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py @@ -0,0 +1,13 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = { + "address": 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["address"], name, value) diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/edit_person.py b/src/ifcblenderexport/blenderbim/bim/module/owner/edit_person.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/person/edit_person.py rename to src/ifcblenderexport/blenderbim/bim/module/owner/edit_person.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py b/src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py new file mode 100644 index 0000000000..f081a850f7 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py @@ -0,0 +1,13 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = { + "role": 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["role"], name, value) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/operator.py b/src/ifcblenderexport/blenderbim/bim/module/owner/operator.py new file mode 100644 index 0000000000..8aad9b8d38 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/operator.py @@ -0,0 +1,281 @@ +import bpy +import json +import blenderbim.bim.module.owner.add_person as add_person +import blenderbim.bim.module.owner.edit_person as edit_person +import blenderbim.bim.module.owner.remove_person as remove_person +import blenderbim.bim.module.owner.add_role as add_role +import blenderbim.bim.module.owner.edit_role as edit_role +import blenderbim.bim.module.owner.remove_role as remove_role +import blenderbim.bim.module.owner.add_address as add_address +import blenderbim.bim.module.owner.edit_address as edit_address +import blenderbim.bim.module.owner.remove_address as remove_address +from blenderbim.bim.ifc import IfcStore +from blenderbim.bim.module.owner.data import Data + + +class EnableEditingPerson(bpy.types.Operator): + bl_idname = "bim.enable_editing_person" + bl_label = "Enable Editing Person" + person_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProperties + props.active_person_id = self.person_id + data = Data.people[self.person_id] + name = data["Id"] if self.file.schema == "IFC2X3" else data["Identification"] + props.person.name = name or "" + props.person.family_name = data["FamilyName"] or "" + props.person.given_name = data["GivenName"] or "" + props.person.middle_names = json.dumps(data["MiddleNames"]) if data["MiddleNames"] else "" + props.person.prefix_titles = json.dumps(data["PrefixTitles"]) if data["PrefixTitles"] else "" + props.person.suffix_titles = json.dumps(data["SuffixTitles"]) if data["SuffixTitles"] else "" + return {"FINISHED"} + + +class DisableEditingPerson(bpy.types.Operator): + bl_idname = "bim.disable_editing_person" + bl_label = "Disable Editing Person" + + def execute(self, context): + context.scene.BIMProperties.active_person_id = 0 + return {"FINISHED"} + + +class AddPerson(bpy.types.Operator): + bl_idname = "bim.add_person" + bl_label = "Add Person" + + def execute(self, context): + add_person.Usecase(IfcStore.get_file()).execute() + Data.load() + return {"FINISHED"} + + +class EditPerson(bpy.types.Operator): + bl_idname = "bim.edit_person" + bl_label = "Edit Person" + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProperties + attributes = { + "Identification": props.person.name or None, + "FamilyName": props.person.family_name or None, + "GivenName": props.person.given_name or None, + "MiddleNames": json.loads(props.person.middle_names) if props.person.middle_names else None, + "PrefixTitles": json.loads(props.person.prefix_titles) if props.person.prefix_titles else None, + "SuffixTitles": json.loads(props.person.suffix_titles) if props.person.suffix_titles else None, + } + if self.file.schema == "IFC2X3": + attributes["Id"] = attributes["Identification"] + del attributes["Identification"] + edit_person.Usecase( + self.file, {"person": self.file.by_id(props.active_person_id), "attributes": attributes} + ).execute() + Data.load() + bpy.ops.bim.disable_editing_person() + return {"FINISHED"} + + +class RemovePerson(bpy.types.Operator): + bl_idname = "bim.remove_person" + bl_label = "Remove Person" + person_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + remove_person.Usecase(self.file, {"person": self.file.by_id(self.person_id)}).execute() + Data.load() + return {"FINISHED"} + + +class EnableEditingRole(bpy.types.Operator): + bl_idname = "bim.enable_editing_role" + bl_label = "Enable Editing Role" + role_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProperties + props.active_role_id = self.role_id + data = Data.roles[self.role_id] + props.role.name = data["Role"] + props.role.user_defined_role = data["UserDefinedRole"] or "" + props.role.description = data["Description"] or "" + return {"FINISHED"} + + +class DisableEditingRole(bpy.types.Operator): + bl_idname = "bim.disable_editing_role" + bl_label = "Disable Editing Role" + + def execute(self, context): + context.scene.BIMProperties.active_role_id = 0 + return {"FINISHED"} + + +class AddRole(bpy.types.Operator): + bl_idname = "bim.add_role" + bl_label = "Add Role" + assigned_object_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + add_role.Usecase(self.file, {"assigned_object": self.file.by_id(self.assigned_object_id)}).execute() + Data.load() + return {"FINISHED"} + + +class EditRole(bpy.types.Operator): + bl_idname = "bim.edit_role" + bl_label = "Edit Role" + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProperties + attributes = { + "Role": props.role.name, + "UserDefinedRole": props.role.user_defined_role if props.role.name == "USERDEFINED" else None, + "Description": props.role.description or None, + } + edit_role.Usecase( + self.file, {"role": self.file.by_id(props.active_role_id), "attributes": attributes} + ).execute() + Data.load() + bpy.ops.bim.disable_editing_role() + return {"FINISHED"} + + +class RemoveRole(bpy.types.Operator): + bl_idname = "bim.remove_role" + bl_label = "Remove Role" + role_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + remove_role.Usecase(self.file, {"role": self.file.by_id(self.role_id)}).execute() + Data.load() + return {"FINISHED"} + + +class AddAddress(bpy.types.Operator): + bl_idname = "bim.add_address" + bl_label = "Add Address" + assigned_object_id: bpy.props.IntProperty() + ifc_class: bpy.props.StringProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + add_address.Usecase( + self.file, {"assigned_object": self.file.by_id(self.assigned_object_id), "ifc_class": self.ifc_class} + ).execute() + Data.load() + return {"FINISHED"} + + +class EnableEditingAddress(bpy.types.Operator): + bl_idname = "bim.enable_editing_address" + bl_label = "Enable Editing Address" + address_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProperties + props.active_address_id = self.address_id + data = Data.addresses[self.address_id] + props.address.name = data["type"] + props.address.purpose = data["Purpose"] or "None" + props.address.description = data["Description"] or "" + props.address.user_defined_purpose = data["UserDefinedPurpose"] or "" + + if data["type"] == "IfcTelecomAddress": + props.address.telephone_numbers = json.dumps(data["TelephoneNumbers"]) if data["TelephoneNumbers"] else "" + props.address.facsimile_numbers = json.dumps(data["FacsimileNumbers"]) if data["FacsimileNumbers"] else "" + props.address.pager_number = data["PagerNumber"] or "" + props.address.electronic_mail_addresses = ( + json.dumps(data["ElectronicMailAddresses"]) if data["ElectronicMailAddresses"] else "" + ) + props.address.www_home_page_url = data["WWWHomePageURL"] or "" + if self.file.schema != "IFC2X3": + props.address.messaging_ids = json.dumps(data["MessagingIDs"]) if data["MessagingIDs"] else "" + elif data["type"] == "IfcPostalAddress": + props.address.internal_location = data["InternalLocation"] or "" + props.address.address_lines = json.dumps(data["AddressLines"]) if data["AddressLines"] else "" + props.address.postal_box = data["PostalBox"] or "" + props.address.town = data["Town"] or "" + props.address.region = data["Region"] or "" + props.address.postal_code = data["PostalCode"] or "" + props.address.country = data["Country"] or "" + return {"FINISHED"} + + +class DisableEditingAddress(bpy.types.Operator): + bl_idname = "bim.disable_editing_address" + bl_label = "Disable Editing Address" + + def execute(self, context): + context.scene.BIMProperties.active_address_id = 0 + return {"FINISHED"} + + +class EditAddress(bpy.types.Operator): + bl_idname = "bim.edit_address" + bl_label = "Edit Address" + + def execute(self, context): + self.file = IfcStore.get_file() + props = context.scene.BIMProperties + attributes = { + "Purpose": props.address.purpose, + "UserDefinedPurpose": props.address.user_defined_purpose + if props.address.purpose == "USERDEFINED" + else None, + "Description": props.address.description or None, + } + address = self.file.by_id(props.active_address_id) + if address.is_a("IfcTelecomAddress"): + attributes.update( + { + "TelephoneNumbers": json.loads(props.address.telephone_numbers) + if props.address.telephone_numbers + else None, + "FacsimileNumbers": json.loads(props.address.facsimile_numbers) + if props.address.facsimile_numbers + else None, + "PagerNumber": props.address.pager_number or None, + "ElectronicMailAddresses": json.loads(props.address.electronic_mail_addresses) + if props.address.electronic_mail_addresses + else None, + "WWWHomePageURL": props.address.www_home_page_url or None, + "MessagingIDs": json.loads(props.address.messaging_ids) if props.address.messaging_ids else None, + } + ) + if self.file.schema == "IFC2X3": + del attributes["MessagingIDs"] + elif address.is_a("IfcPostalAddress"): + attributes.update({ + "InternalLocation": props.address.internal_location or None, + "AddressLines": json.loads(props.address.address_lines) if props.address.address_lines else None, + "PostalBox": props.address.postal_box or None, + "Town": props.address.town or None, + "Region": props.address.region or None, + "PostalCode": props.address.postal_code or None, + "Country": props.address.country or None, + }) + edit_address.Usecase(self.file, {"address": address, "attributes": attributes}).execute() + Data.load() + bpy.ops.bim.disable_editing_address() + return {"FINISHED"} + + +class RemoveAddress(bpy.types.Operator): + bl_idname = "bim.remove_address" + bl_label = "Remove Address" + address_id: bpy.props.IntProperty() + + def execute(self, context): + self.file = IfcStore.get_file() + remove_address.Usecase(self.file, {"address": self.file.by_id(self.address_id)}).execute() + Data.load() + return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py b/src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py new file mode 100644 index 0000000000..9891d04062 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py @@ -0,0 +1,9 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = {"address": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + self.file.remove(self.settings["address"]) diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/remove_person.py b/src/ifcblenderexport/blenderbim/bim/module/owner/remove_person.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/person/remove_person.py rename to src/ifcblenderexport/blenderbim/bim/module/owner/remove_person.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py b/src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py new file mode 100644 index 0000000000..446d0e7a39 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py @@ -0,0 +1,9 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = {"role": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + self.file.remove(self.settings["role"]) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/ui.py b/src/ifcblenderexport/blenderbim/bim/module/owner/ui.py new file mode 100644 index 0000000000..c7aaaf19df --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/owner/ui.py @@ -0,0 +1,141 @@ +from bpy.types import Panel +from blenderbim.bim.module.owner.data import Data +from blenderbim.bim.ifc import IfcStore + + +class BIM_PT_people(Panel): + bl_label = "IFC People" + bl_idname = "BIM_PT_people" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + @classmethod + def poll(cls, context): + return IfcStore.get_file() + + def draw(self, context): + if not Data.is_loaded: + Data.load() + + self.file = IfcStore.get_file() + self.layout.use_property_split = True + props = context.scene.BIMProperties + + row = self.layout.row() + row.operator("bim.add_person") + + for person_id, person in Data.people.items(): + if props.active_person_id == person_id: + blender_person = props.person + box = self.layout.box() + row = box.row(align=True) + row.prop(blender_person, "name", icon="USER", text="") + row.operator("bim.edit_person", icon="CHECKMARK", text="") + row.operator("bim.disable_editing_person", icon="X", text="") + row = box.row() + row.prop(blender_person, "family_name") + row = box.row() + row.prop(blender_person, "given_name") + row = box.row() + row.prop(blender_person, "middle_names") + row = box.row() + row.prop(blender_person, "prefix_titles") + row = box.row() + row.prop(blender_person, "suffix_titles") + + row = box.row(align=True) + row.label(text="Roles") + row.operator("bim.add_role", icon="ADD", text="").assigned_object_id = person_id + for role_id in person["Roles"]: + role = Data.roles[role_id] + if props.active_role_id == role_id: + blender_role = props.role + box2 = box.box() + row = box2.row(align=True) + row.prop(blender_role, "name", icon="MOD_CLOTH", text="") + row.operator("bim.edit_role", icon="CHECKMARK", text="") + row.operator("bim.disable_editing_role", icon="X", text="") + if blender_role.name == "USERDEFINED": + row = box2.row() + row.prop(blender_role, "user_defined_role") + row = box2.row() + row.prop(blender_role, "description") + else: + row = box.row(align=True) + row.label(text=role["UserDefinedRole"] or role["Role"]) + row.operator("bim.enable_editing_role", icon="GREASEPENCIL", text="").role_id = role_id + row.operator("bim.remove_role", icon="X", text="").role_id = role_id + + row = box.row(align=True) + row.label(text="Addresses") + op = row.operator("bim.add_address", icon="LINK_BLEND", text="") + op.assigned_object_id = person_id + op.ifc_class = "IfcTelecomAddress" + op = row.operator("bim.add_address", icon="APPEND_BLEND", text="") + op.assigned_object_id = person_id + op.ifc_class = "IfcPostalAddress" + for address_id in person["Addresses"]: + address = Data.addresses[address_id] + if props.active_address_id == address_id: + blender_address = props.address + box2 = box.box() + row = box2.row(align=True) + row.prop(blender_address, "purpose", icon="MOD_CLOTH", text="") + row.operator("bim.edit_address", icon="CHECKMARK", text="") + row.operator("bim.disable_editing_address", icon="X", text="") + if blender_address.purpose == "USERDEFINED": + row = box2.row() + row.prop(blender_address, "user_defined_purpose") + row = box2.row() + row.prop(blender_address, "description") + + if address["type"] == "IfcTelecomAddress": + row = box2.row() + row.prop(blender_address, "telephone_numbers") + row = box2.row() + row.prop(blender_address, "facsimile_numbers") + row = box2.row() + row.prop(blender_address, "pager_number") + row = box2.row() + row.prop(blender_address, "electronic_mail_addresses") + row = box2.row() + row.prop(blender_address, "www_home_page_url") + if self.file.schema != "IFC2X3": + row = box2.row() + row.prop(blender_address, "messaging_ids") + elif address["type"] == "IfcPostalAddress": + row = box2.row() + row.prop(blender_address, "internal_location") + row = box2.row() + row.prop(blender_address, "address_lines") + row = box2.row() + row.prop(blender_address, "postal_box") + row = box2.row() + row.prop(blender_address, "town") + row = box2.row() + row.prop(blender_address, "region") + row = box2.row() + row.prop(blender_address, "postal_code") + row = box2.row() + row.prop(blender_address, "country") + else: + row = box.row(align=True) + row.label(text=address["type"]) + row.operator("bim.enable_editing_address", icon="GREASEPENCIL", text="").address_id = address_id + row.operator("bim.remove_address", icon="X", text="").address_id = address_id + + else: + row = self.layout.row(align=True) + name = person["Id"] if self.file.schema == "IFC2X3" else person["Identification"] + name = name or "*" + if person["GivenName"] or person["FamilyName"]: + full_name = "{} {}".format(person["GivenName"] or "", person["FamilyName"] or "").strip() + name += f" ({full_name})" + row.label(text=name) + if person["Roles"]: + row.label(text=", ".join([Data.roles[r]["Role"] for r in person["Roles"]])) + row.operator("bim.enable_editing_person", icon="GREASEPENCIL", text="").person_id = person_id + if not person["is_engaged"]: + row.operator("bim.remove_person", icon="X", text="").person_id = person_id diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/__init__.py b/src/ifcblenderexport/blenderbim/bim/module/person/__init__.py deleted file mode 100644 index 063137b49f..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/person/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import bpy -from . import ui, operator - -classes = ( - operator.EnableEditingPerson, - operator.DisableEditingPerson, - operator.AddPerson, - operator.EditPerson, - operator.RemovePerson, - ui.BIM_PT_people, -) - - -def register(): - pass - - -def unregister(): - pass diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/operator.py b/src/ifcblenderexport/blenderbim/bim/module/person/operator.py deleted file mode 100644 index 97bec29293..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/person/operator.py +++ /dev/null @@ -1,84 +0,0 @@ -import bpy -import json -import blenderbim.bim.module.person.add_person as add_person -import blenderbim.bim.module.person.edit_person as edit_person -import blenderbim.bim.module.person.remove_person as remove_person -from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.person.data import Data - - -class EnableEditingPerson(bpy.types.Operator): - bl_idname = "bim.enable_editing_person" - bl_label = "Enable Editing Person" - person_id: bpy.props.IntProperty() - - def execute(self, context): - self.file = IfcStore.get_file() - props = context.scene.BIMProperties - props.active_person_id = self.person_id - data = Data.people[self.person_id] - name = data["Id"] if self.file.schema == "IFC2X3" else data["Identification"] - props.person.name = name or "" - props.person.family_name = data["FamilyName"] or "" - props.person.given_name = data["GivenName"] or "" - props.person.middle_names = json.dumps(data["MiddleNames"]) if data["MiddleNames"] else "" - props.person.prefix_titles = json.dumps(data["PrefixTitles"]) if data["PrefixTitles"] else "" - props.person.suffix_titles = json.dumps(data["SuffixTitles"]) if data["SuffixTitles"] else "" - return {"FINISHED"} - - -class DisableEditingPerson(bpy.types.Operator): - bl_idname = "bim.disable_editing_person" - bl_label = "Disable Editing Person" - - def execute(self, context): - context.scene.BIMProperties.active_person_id = 0 - return {"FINISHED"} - - -class AddPerson(bpy.types.Operator): - bl_idname = "bim.add_person" - bl_label = "Add Person" - - def execute(self, context): - add_person.Usecase(IfcStore.get_file()).execute() - Data.load() - return {"FINISHED"} - - -class EditPerson(bpy.types.Operator): - bl_idname = "bim.edit_person" - bl_label = "Edit Person" - - def execute(self, context): - self.file = IfcStore.get_file() - props = context.scene.BIMProperties - attributes = { - "Identification": props.person.name or None, - "FamilyName": props.person.family_name or None, - "GivenName": props.person.given_name or None, - "MiddleNames": json.loads(props.person.middle_names) if props.person.middle_names else None, - "PrefixTitles": json.loads(props.person.prefix_titles) if props.person.prefix_titles else None, - "SuffixTitles": json.loads(props.person.suffix_titles) if props.person.suffix_titles else None, - } - if self.file.schema == "IFC2X3": - attributes["Id"] = attributes["Identification"] - del attributes["Identification"] - edit_person.Usecase( - self.file, {"person": self.file.by_id(props.active_person_id), "attributes": attributes} - ).execute() - Data.load() - bpy.ops.bim.disable_editing_person() - return {"FINISHED"} - - -class RemovePerson(bpy.types.Operator): - bl_idname = "bim.remove_person" - bl_label = "Remove Person" - person_id: bpy.props.IntProperty() - - def execute(self, context): - self.file = IfcStore.get_file() - remove_person.Usecase(self.file, {"person": self.file.by_id(self.person_id)}).execute() - Data.load() - return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/person/ui.py b/src/ifcblenderexport/blenderbim/bim/module/person/ui.py deleted file mode 100644 index e090075c3f..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/person/ui.py +++ /dev/null @@ -1,69 +0,0 @@ -from bpy.types import Panel -from blenderbim.bim.module.person.data import Data -from blenderbim.bim.ifc import IfcStore - - -class BIM_PT_people(Panel): - bl_label = "IFC People" - bl_idname = "BIM_PT_people" - bl_options = {"DEFAULT_CLOSED"} - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "scene" - - @classmethod - def poll(cls, context): - return IfcStore.get_file() - - def draw(self, context): - if not Data.is_loaded: - Data.load() - - self.file = IfcStore.get_file() - self.layout.use_property_split = True - props = context.scene.BIMProperties - - row = self.layout.row() - row.operator("bim.add_person") - - for person_id, person in Data.people.items(): - if props.active_person_id == person_id: - blender_person = props.person - box = self.layout.box() - row = box.row(align=True) - row.prop(blender_person, "name", icon="USER", text="") - row.operator("bim.edit_person", icon="CHECKMARK", text="") - row.operator("bim.disable_editing_person", icon="X", text="") - row = box.row() - row.prop(blender_person, "family_name") - row = box.row() - row.prop(blender_person, "given_name") - row = box.row() - row.prop(blender_person, "middle_names") - row = box.row() - row.prop(blender_person, "prefix_titles") - row = box.row() - row.prop(blender_person, "suffix_titles") - else: - row = self.layout.row(align=True) - name = person["Id"] if self.file.schema == "IFC2X3" else person["Identification"] - name = name or "*" - if person["GivenName"] or person["FamilyName"]: - full_name = "{} {}".format(person["GivenName"] or "", person["FamilyName"] or "").strip() - name += f" ({full_name})" - row.label(text=name) - if person["Roles"]: - row.label(text=", ".join([r.Role for r in person["Roles"]])) - row.operator("bim.enable_editing_person", icon="GREASEPENCIL", text="").person_id = person_id - if not person["is_engaged"]: - row.operator("bim.remove_person", icon="X", text="").person_id = person_id - return - - - if props.people: - if props.active_person_index < len(props.people): - self.layout.label(text="Roles:") - draw_roles_ui(self.layout, person, "person") - self.layout.label(text="Addresses:") - draw_addresses_ui(self.layout, person, "person") - diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 4db4cbb9d5..2ca537238c 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -1089,6 +1089,7 @@ class Address(PropertyGroup): name: StringProperty(name="Name", default="IfcPostalAddress") # Stores IfcPostalAddress or IfcTelecomAddress purpose: EnumProperty( items=[ + ("None", "None", ""), ("OFFICE", "OFFICE", "An office address."), ("SITE", "SITE", "A site address."), ("HOME", "HOME", "A home address."), @@ -1109,7 +1110,7 @@ class Address(PropertyGroup): country: StringProperty(name="Country") telephone_numbers: StringProperty(name="Telephone Numbers") - fascimile_numbers: StringProperty(name="Fascimile Numbers") + facsimile_numbers: StringProperty(name="Facsimile Numbers") pager_number: StringProperty(name="Pager Number") electronic_mail_addresses: StringProperty(name="Emails") www_home_page_url: StringProperty(name="Websites") @@ -1165,10 +1166,6 @@ class Person(PropertyGroup): middle_names: StringProperty(name="Middle Names") prefix_titles: StringProperty(name="Prefixes") suffix_titles: StringProperty(name="Suffixes") - roles: CollectionProperty(name="Roles", type=Role) - active_role_index: bpy.props.IntProperty() - addresses: CollectionProperty(name="Addresses", type=Address) - active_address_index: bpy.props.IntProperty() class Classification(PropertyGroup): @@ -1288,11 +1285,17 @@ class BIMProperties(PropertyGroup): import_should_offset_model: BoolProperty(name="Import and Offset Model", default=False) import_model_offset_coordinates: StringProperty(name="Model Offset Coordinates", default="0,0,0") qa_reject_element_reason: StringProperty(name="Element Rejection Reason") - person: PointerProperty(type=Person) organisation: EnumProperty(items=getOrganisations, name="Organisation") people: CollectionProperty(name="People", type=Person) organisations: CollectionProperty(name="Organisations", type=Organisation) + + person: PointerProperty(type=Person) active_person_id: IntProperty(name="Active Person Id") + role: PointerProperty(type=Role) + active_role_id: IntProperty(name="Active Role Id") + address: PointerProperty(type=Address) + active_address_id: IntProperty(name="Active Address Id") + active_organisation_index: IntProperty(name="Active Organisation Index") has_georeferencing: BoolProperty(name="Has Georeferencing", default=False) has_library: BoolProperty(name="Has Project Library", default=False)