Person / organisation roles and acting actors are now shown

This commit is contained in:
Dion Moult
2022-05-06 16:21:12 +10:00
parent 73e048a9a8
commit b54caa8967
4 changed files with 34 additions and 16 deletions
@@ -93,15 +93,17 @@ class PeopleData(RolesAddressesData):
def get_people(cls): def get_people(cls):
people = [] people = []
for person in tool.Ifc.get().by_type("IfcPerson"): for person in tool.Ifc.get().by_type("IfcPerson"):
roles = cls.get_roles(person)
people.append( people.append(
{ {
"id": person.id(), "id": person.id(),
"props": bpy.context.scene.BIMOwnerProperties.person_attributes, "props": bpy.context.scene.BIMOwnerProperties.person_attributes,
"name": cls.get_person_name(person), "name": cls.get_person_name(person),
"roles_label": ", ".join([r["label"] for r in roles]),
"is_editing": cls.get_person_is_editing(person), "is_editing": cls.get_person_is_editing(person),
"is_engaged": bool(person.EngagedIn), "is_engaged": bool(person.EngagedIn),
"list_attributes": cls.get_person_list_attributes(person), "list_attributes": cls.get_person_list_attributes(person),
"roles": cls.get_roles(person), "roles": roles,
"addresses": cls.get_addresses(person), "addresses": cls.get_addresses(person),
} }
) )
@@ -151,14 +153,16 @@ class OrganisationsData(RolesAddressesData):
def get_organisations(cls): def get_organisations(cls):
organisations = [] organisations = []
for organisation in tool.Ifc.get().by_type("IfcOrganization"): for organisation in tool.Ifc.get().by_type("IfcOrganization"):
roles = cls.get_roles(organisation)
organisations.append( organisations.append(
{ {
"id": organisation.id(), "id": organisation.id(),
"props": bpy.context.scene.BIMOwnerProperties.organisation_attributes, "props": bpy.context.scene.BIMOwnerProperties.organisation_attributes,
"name": organisation.Name, "name": organisation.Name,
"roles_label": ", ".join([r["label"] for r in roles]),
"is_editing": bpy.context.scene.BIMOwnerProperties.active_organisation_id == organisation.id(), "is_editing": bpy.context.scene.BIMOwnerProperties.active_organisation_id == organisation.id(),
"is_engaged": bool(organisation.Engages), "is_engaged": bool(organisation.Engages),
"roles": cls.get_roles(organisation), "roles": roles,
"addresses": cls.get_addresses(organisation), "addresses": cls.get_addresses(organisation),
} }
) )
@@ -212,13 +216,13 @@ class ActorData:
@classmethod @classmethod
def load(cls): def load(cls):
cls.data = { cls.data = {
"actor": cls.actor(), "the_actor": cls.the_actor(),
"actors": cls.actors(), "actors": cls.actors(),
} }
cls.is_loaded = True cls.is_loaded = True
@classmethod @classmethod
def actor(cls): def the_actor(cls):
ifc_class = bpy.context.scene.BIMOwnerProperties.actor_type ifc_class = bpy.context.scene.BIMOwnerProperties.actor_type
return [(str(p.id()), p[0] or "Unnamed", "") for p in tool.Ifc.get().by_type(ifc_class)] return [(str(p.id()), p[0] or "Unnamed", "") for p in tool.Ifc.get().by_type(ifc_class)]
@@ -228,5 +232,14 @@ class ActorData:
props = bpy.context.scene.BIMOwnerProperties props = bpy.context.scene.BIMOwnerProperties
for actor in tool.Ifc.get().by_type(props.actor_class, include_subtypes=False): for actor in tool.Ifc.get().by_type(props.actor_class, include_subtypes=False):
is_editing = props.active_actor_id == actor.id() is_editing = props.active_actor_id == actor.id()
actors.append({"id": actor.id(), "name": actor.Name or "Unnamed", "is_editing": is_editing}) if actor.TheActor.is_a("IfcPerson"):
the_actor = actor.TheActor.Identification or "N/A"
elif actor.TheActor.is_a("IfcOrganization"):
the_actor = actor.TheActor.Identification or "N/A"
elif actor.TheActor.is_a("IfcPersonAndOrganization"):
the_actor = actor.TheActor.ThePerson.Identification or "N/A"
the_actor += "-" + actor.TheActor.TheOrganization.Identification or "N/A"
actors.append(
{"id": actor.id(), "name": actor.Name or "Unnamed", "the_actor": the_actor, "is_editing": is_editing}
)
return actors return actors
@@ -315,8 +315,8 @@ class AddActor(bpy.types.Operator, Operator):
def _execute(self, context): def _execute(self, context):
props = bpy.context.scene.BIMOwnerProperties props = bpy.context.scene.BIMOwnerProperties
if props.actor: if props.the_actor:
core.add_actor(tool.Ifc, ifc_class=props.actor_class, actor=tool.Ifc.get().by_id(int(props.actor))) core.add_actor(tool.Ifc, ifc_class=props.actor_class, actor=tool.Ifc.get().by_id(int(props.the_actor)))
class EnableEditingActor(bpy.types.Operator, Operator): class EnableEditingActor(bpy.types.Operator, Operator):
@@ -44,14 +44,14 @@ def get_user_organisation(self, context):
return OwnerData.data["user_organisation"] return OwnerData.data["user_organisation"]
def get_actor(self, context): def get_the_actor(self, context):
if not ActorData.is_loaded: if not ActorData.is_loaded:
ActorData.load() ActorData.load()
return ActorData.data["actor"] return ActorData.data["the_actor"]
def update_actor_type(self, context): def update_actor_type(self, context):
ActorData.data["actor"] = ActorData.actor() ActorData.data["the_actor"] = ActorData.the_actor()
def update_actor_class(self, context): def update_actor_class(self, context):
@@ -94,4 +94,4 @@ class BIMOwnerProperties(PropertyGroup):
name="Actor Type", name="Actor Type",
update=update_actor_type, update=update_actor_type,
) )
actor: EnumProperty(items=get_actor, name="Actor") the_actor: EnumProperty(items=get_the_actor, name="Actor")
@@ -127,7 +127,9 @@ class BIM_PT_people(bpy.types.Panel):
draw_addresses(box, person) draw_addresses(box, person)
else: else:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text=person["name"]) row.label(text=person["name"], icon="OUTLINER_OB_ARMATURE")
if person["roles_label"]:
row.label(text=person["roles_label"])
row.operator("bim.enable_editing_person", icon="GREASEPENCIL", text="").person = person["id"] row.operator("bim.enable_editing_person", icon="GREASEPENCIL", text="").person = person["id"]
if not person["is_engaged"]: if not person["is_engaged"]:
row.operator("bim.remove_person", icon="X", text="").person = person["id"] row.operator("bim.remove_person", icon="X", text="").person = person["id"]
@@ -171,7 +173,9 @@ class BIM_PT_organisations(bpy.types.Panel):
draw_addresses(box, organisation) draw_addresses(box, organisation)
else: else:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text=organisation["name"]) row.label(text=organisation["name"], icon="COMMUNITY")
if organisation["roles_label"]:
row.label(text=organisation["roles_label"])
op = row.operator("bim.enable_editing_organisation", icon="GREASEPENCIL", text="") op = row.operator("bim.enable_editing_organisation", icon="GREASEPENCIL", text="")
op.organisation = organisation["id"] op.organisation = organisation["id"]
if not organisation["is_engaged"]: if not organisation["is_engaged"]:
@@ -254,9 +258,9 @@ class BIM_PT_actor(bpy.types.Panel):
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.prop(self.props, "actor_class", text="") row.prop(self.props, "actor_class", text="")
row.prop(self.props, "actor_type", text="") row.prop(self.props, "actor_type", text="")
if ActorData.data["actor"]: if ActorData.data["the_actor"]:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.prop(self.props, "actor", text="") row.prop(self.props, "the_actor", text="")
row.operator("bim.add_actor", icon="ADD", text="") row.operator("bim.add_actor", icon="ADD", text="")
else: else:
self.layout.label(text="No users found.") self.layout.label(text="No users found.")
@@ -273,6 +277,7 @@ class BIM_PT_actor(bpy.types.Panel):
blenderbim.bim.helper.draw_attributes(self.props.actor_attributes, box) blenderbim.bim.helper.draw_attributes(self.props.actor_attributes, box)
else: else:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text=actor["name"]) row.label(text=actor["name"], icon="USER")
row.label(text=actor["the_actor"])
row.operator("bim.enable_editing_actor", icon="GREASEPENCIL", text="").actor = actor["id"] row.operator("bim.enable_editing_actor", icon="GREASEPENCIL", text="").actor = actor["id"]
row.operator("bim.remove_actor", icon="X", text="").actor = actor["id"] row.operator("bim.remove_actor", icon="X", text="").actor = actor["id"]