owner.remove_person to remove IfcInventory in ifc2x3

This commit is contained in:
Andrej730
2024-05-13 14:55:48 +05:00
parent 54b4cef25e
commit 2f554db54b
2 changed files with 11 additions and 2 deletions
@@ -24,6 +24,8 @@ def remove_person(file, person=None) -> None:
All roles and addresses assigned to the person will also be All roles and addresses assigned to the person will also be
removed. removed.
In IFC2X3 will also remove related inventories if `person` was
the only responsile person for them.
:param person: The IfcPerson to remove :param person: The IfcPerson to remove
:type person: ifcopenshell.entity_instance :type person: ifcopenshell.entity_instance
@@ -52,7 +54,9 @@ def remove_person(file, person=None) -> None:
inverse.Creators = None inverse.Creators = None
elif inverse.is_a("IfcInventory"): elif inverse.is_a("IfcInventory"):
if inverse.ResponsiblePersons == (settings["person"],): if inverse.ResponsiblePersons == (settings["person"],):
inverse.ResponsiblePersons = None # in IFC2X3 ResponsiblePersons is not optional and without it IfcInventory is not valid
if file.schema == "IFC2X3":
ifcopenshell.api.run("root.remove_product", file, product=inverse)
elif inverse.is_a("IfcDocumentInformation"): elif inverse.is_a("IfcDocumentInformation"):
if inverse.Editors == (settings["person"],): if inverse.Editors == (settings["person"],):
inverse.Editors = None inverse.Editors = None
@@ -61,8 +61,13 @@ class TestRemovePerson(test.bootstrap.IFC4):
def test_ensuring_inventory_should_not_be_left_in_an_invalid_set_cardinality(self): def test_ensuring_inventory_should_not_be_left_in_an_invalid_set_cardinality(self):
person = self.file.createIfcPerson() person = self.file.createIfcPerson()
inventory = self.file.createIfcInventory(ResponsiblePersons=[person]) inventory = self.file.createIfcInventory(ResponsiblePersons=[person])
inventory_id = inventory.id()
ifcopenshell.api.run("owner.remove_person", self.file, person=person) ifcopenshell.api.run("owner.remove_person", self.file, person=person)
assert inventory.ResponsiblePersons is None if self.file.schema != "IFC2X3":
assert inventory.ResponsiblePersons is None
else:
with pytest.raises(RuntimeError):
self.file.by_id(inventory_id)
def test_deleting_person_and_organisations(self): def test_deleting_person_and_organisations(self):
person = self.file.createIfcPerson() person = self.file.createIfcPerson()