diff --git a/src/blenderbim/blenderbim/bim/module/document/data.py b/src/blenderbim/blenderbim/bim/module/document/data.py index 3718cb46a5..fa64c1ce05 100644 --- a/src/blenderbim/blenderbim/bim/module/document/data.py +++ b/src/blenderbim/blenderbim/bim/module/document/data.py @@ -41,7 +41,13 @@ class DocumentData: @classmethod def total_information(cls): - return len(tool.Ifc.get().by_type("IfcDocumentInformation")) + return len( + [ + rel + for rel in tool.Ifc.get().by_type("IfcProject")[0].HasAssociations or [] + if rel.is_a("IfcRelAssociatesDocument") and rel.RelatingDocument.is_a("IfcDocumentInformation") + ] + ) @classmethod def total_references(cls): diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index f4a6cab8ef..c23ec11db0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -22,12 +22,24 @@ import ifcopenshell class Usecase: def __init__(self, file, **settings): self.file = file - self.settings = {} + self.settings = {"parent": None} for key, value in settings.items(): self.settings[key] = value def execute(self): id_attribute = "DocumentId" if self.file.schema == "IFC2X3" else "Identification" - return self.file.create_entity( + information = self.file.create_entity( "IfcDocumentInformation", **{id_attribute: ifcopenshell.guid.new(), "Name": "Unnamed"} ) + parent = self.settings["parent"] + if not parent and self.file.by_type("IfcProject"): + parent = self.file.by_type("IfcProject")[0] + if parent.is_a("IfcProject") or prarent.is_a("IfcContext"): + self.file.create_entity( + "IfcRelAssociatesDocument", + GlobalId=ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), + RelatingDocument=information, + RelatedObjects=[parent], + ) + return information diff --git a/src/ifcopenshell-python/test/api/document/test_add_information.py b/src/ifcopenshell-python/test/api/document/test_add_information.py new file mode 100644 index 0000000000..1499449348 --- /dev/null +++ b/src/ifcopenshell-python/test/api/document/test_add_information.py @@ -0,0 +1,35 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestAddInformation(test.bootstrap.IFC4): + def test_adding_information(self): + self.file.createIfcProject() + element = ifcopenshell.api.run("document.add_information", self.file, parent=None) + assert element.is_a("IfcDocumentInformation") + assert len(self.file.by_type("IfcDocumentInformation")) == 1 + + def test_adding_information_to_the_project(self): + project = self.file.createIfcProject() + element = ifcopenshell.api.run("document.add_information", self.file, parent=None) + rel = element.DocumentInfoForObjects[0] + assert rel.is_a("IfcRelAssociatesDocument") + assert rel.RelatedObjects[0] == project