mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 14:23:53 +00:00
WIP port address and role editing to owner module. See #1222.
This commit is contained in:
@@ -14,7 +14,7 @@ if bpy is not None:
|
|||||||
import blenderbim.bim.module.debug as module_debug
|
import blenderbim.bim.module.debug as module_debug
|
||||||
import blenderbim.bim.module.geometry as module_geometry
|
import blenderbim.bim.module.geometry as module_geometry
|
||||||
import blenderbim.bim.module.model as module_model
|
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.project as module_project
|
||||||
import blenderbim.bim.module.pset as module_pset
|
import blenderbim.bim.module.pset as module_pset
|
||||||
import blenderbim.bim.module.spatial as module_spatial
|
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_debug.classes)
|
||||||
classes.extend(module_geometry.classes)
|
classes.extend(module_geometry.classes)
|
||||||
classes.extend(module_model.classes)
|
classes.extend(module_model.classes)
|
||||||
classes.extend(module_person.classes)
|
classes.extend(module_owner.classes)
|
||||||
classes.extend(module_project.classes)
|
classes.extend(module_project.classes)
|
||||||
classes.extend(module_pset.classes)
|
classes.extend(module_pset.classes)
|
||||||
classes.extend(module_spatial.classes)
|
classes.extend(module_spatial.classes)
|
||||||
@@ -355,7 +355,7 @@ if bpy is not None:
|
|||||||
module_debug.register()
|
module_debug.register()
|
||||||
module_geometry.register()
|
module_geometry.register()
|
||||||
module_model.register()
|
module_model.register()
|
||||||
module_person.register()
|
module_owner.register()
|
||||||
module_project.register()
|
module_project.register()
|
||||||
module_pset.register()
|
module_pset.register()
|
||||||
module_spatial.register()
|
module_spatial.register()
|
||||||
@@ -388,7 +388,7 @@ if bpy is not None:
|
|||||||
module_spatial.unregister()
|
module_spatial.unregister()
|
||||||
module_pset.unregister()
|
module_pset.unregister()
|
||||||
module_project.unregister()
|
module_project.unregister()
|
||||||
module_person.unregister()
|
module_owner.unregister()
|
||||||
module_model.unregister()
|
module_model.unregister()
|
||||||
module_geometry.unregister()
|
module_geometry.unregister()
|
||||||
module_debug.unregister()
|
module_debug.unregister()
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
+11
-3
@@ -4,6 +4,8 @@ from blenderbim.bim.ifc import IfcStore
|
|||||||
class Data:
|
class Data:
|
||||||
is_loaded = False
|
is_loaded = False
|
||||||
people = {}
|
people = {}
|
||||||
|
addresses = {}
|
||||||
|
roles = {}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def load(cls):
|
def load(cls):
|
||||||
@@ -14,19 +16,25 @@ class Data:
|
|||||||
for person in file.by_type("IfcPerson"):
|
for person in file.by_type("IfcPerson"):
|
||||||
data = person.get_info()
|
data = person.get_info()
|
||||||
|
|
||||||
roles = {}
|
roles = []
|
||||||
if data["Roles"]:
|
if data["Roles"]:
|
||||||
for role in data["Roles"]:
|
for role in data["Roles"]:
|
||||||
roles[role.id()] = role.get_info()
|
roles.append(role.id())
|
||||||
data["Roles"] = roles
|
data["Roles"] = roles
|
||||||
|
|
||||||
addresses = []
|
addresses = []
|
||||||
if data["Addresses"]:
|
if data["Addresses"]:
|
||||||
for address in data["Addresses"]:
|
for address in data["Addresses"]:
|
||||||
addresses.append(address.get_info())
|
addresses.append(address.id())
|
||||||
data["Addresses"] = addresses
|
data["Addresses"] = addresses
|
||||||
|
|
||||||
data["is_engaged"] = bool(person.EngagedIn)
|
data["is_engaged"] = bool(person.EngagedIn)
|
||||||
|
|
||||||
cls.people[person.id()] = data
|
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
|
cls.is_loaded = True
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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"}
|
||||||
@@ -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"])
|
||||||
@@ -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"])
|
||||||
@@ -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
|
||||||
@@ -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
|
|
||||||
@@ -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"}
|
|
||||||
@@ -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")
|
|
||||||
|
|
||||||
@@ -1089,6 +1089,7 @@ class Address(PropertyGroup):
|
|||||||
name: StringProperty(name="Name", default="IfcPostalAddress") # Stores IfcPostalAddress or IfcTelecomAddress
|
name: StringProperty(name="Name", default="IfcPostalAddress") # Stores IfcPostalAddress or IfcTelecomAddress
|
||||||
purpose: EnumProperty(
|
purpose: EnumProperty(
|
||||||
items=[
|
items=[
|
||||||
|
("None", "None", ""),
|
||||||
("OFFICE", "OFFICE", "An office address."),
|
("OFFICE", "OFFICE", "An office address."),
|
||||||
("SITE", "SITE", "A site address."),
|
("SITE", "SITE", "A site address."),
|
||||||
("HOME", "HOME", "A home address."),
|
("HOME", "HOME", "A home address."),
|
||||||
@@ -1109,7 +1110,7 @@ class Address(PropertyGroup):
|
|||||||
country: StringProperty(name="Country")
|
country: StringProperty(name="Country")
|
||||||
|
|
||||||
telephone_numbers: StringProperty(name="Telephone Numbers")
|
telephone_numbers: StringProperty(name="Telephone Numbers")
|
||||||
fascimile_numbers: StringProperty(name="Fascimile Numbers")
|
facsimile_numbers: StringProperty(name="Facsimile Numbers")
|
||||||
pager_number: StringProperty(name="Pager Number")
|
pager_number: StringProperty(name="Pager Number")
|
||||||
electronic_mail_addresses: StringProperty(name="Emails")
|
electronic_mail_addresses: StringProperty(name="Emails")
|
||||||
www_home_page_url: StringProperty(name="Websites")
|
www_home_page_url: StringProperty(name="Websites")
|
||||||
@@ -1165,10 +1166,6 @@ class Person(PropertyGroup):
|
|||||||
middle_names: StringProperty(name="Middle Names")
|
middle_names: StringProperty(name="Middle Names")
|
||||||
prefix_titles: StringProperty(name="Prefixes")
|
prefix_titles: StringProperty(name="Prefixes")
|
||||||
suffix_titles: StringProperty(name="Suffixes")
|
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):
|
class Classification(PropertyGroup):
|
||||||
@@ -1288,11 +1285,17 @@ class BIMProperties(PropertyGroup):
|
|||||||
import_should_offset_model: BoolProperty(name="Import and Offset Model", default=False)
|
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")
|
import_model_offset_coordinates: StringProperty(name="Model Offset Coordinates", default="0,0,0")
|
||||||
qa_reject_element_reason: StringProperty(name="Element Rejection Reason")
|
qa_reject_element_reason: StringProperty(name="Element Rejection Reason")
|
||||||
person: PointerProperty(type=Person)
|
|
||||||
organisation: EnumProperty(items=getOrganisations, name="Organisation")
|
organisation: EnumProperty(items=getOrganisations, name="Organisation")
|
||||||
people: CollectionProperty(name="People", type=Person)
|
people: CollectionProperty(name="People", type=Person)
|
||||||
organisations: CollectionProperty(name="Organisations", type=Organisation)
|
organisations: CollectionProperty(name="Organisations", type=Organisation)
|
||||||
|
|
||||||
|
person: PointerProperty(type=Person)
|
||||||
active_person_id: IntProperty(name="Active Person Id")
|
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")
|
active_organisation_index: IntProperty(name="Active Organisation Index")
|
||||||
has_georeferencing: BoolProperty(name="Has Georeferencing", default=False)
|
has_georeferencing: BoolProperty(name="Has Georeferencing", default=False)
|
||||||
has_library: BoolProperty(name="Has Project Library", default=False)
|
has_library: BoolProperty(name="Has Project Library", default=False)
|
||||||
|
|||||||
Reference in New Issue
Block a user