Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clear handling of decompositions #675

Open
DaJansenGit opened this issue Jul 1, 2024 · 0 comments
Open

Clear handling of decompositions #675

DaJansenGit opened this issue Jul 1, 2024 · 0 comments

Comments

@DaJansenGit
Copy link
Member

Currently, we don't take into account dempositions. We had a task specific tailored towards IfcRoof decompositions but this should be generalized. Below is the task that we used in the past which might help for a fresh integration.


from bim2sim.kernel.decision import BoolDecision, DecisionBunch
from bim2sim.elements.bps_elements import Slab, GroundFloor, Floor, Roof
from bim2sim.tasks.base import ITask
from bim2sim.utilities.common_functions import filter_elements


class ProcessSlabsRoofs(ITask):
    """Handles decomposed roofs and wrong slab elements."""

    reads = ('elements',)
    touches = ('elements',)

    def run(self, elements: dict):
        for element in elements.copy().values():
            if type(element).__bases__[0] is Slab or type(element) is Slab:
                elements = self.recognize_decomposed_roofs(element, elements)
        return elements,

    def recognize_decomposed_roofs(self, element, elements):
        """recognize the roofs that are decomposed on another slabs, and after
        that:
        * set decompositions on decomposed element
        * set decomposition properties on decomposed element"""
        if element.ifc.IsDecomposedBy:
            for decomp in element.ifc.IsDecomposedBy:
                for inst_ifc in decomp.RelatedObjects:
                    inst = elements.get(inst_ifc.GlobalId, None)
                    if inst:
                        self.set_decompositions(element, inst)
                        self.set_decomposition_properties(element, inst)
                        del elements[inst.guid]
        return elements

    @staticmethod
    def set_decompositions(element, d_element):
        """set decompositions of a decomposed slab and vice versa as list in the
        element"""
        if not hasattr(element, 'decomposed_by'):
            element.decomposed_by = []
        element.decomposed_by.append(d_element)
        if not hasattr(d_element, 'decomposes'):
            d_element.decomposes = []
        d_element.decomposes.append(element)

    @staticmethod
    def set_decomposition_properties(element, d_element):
        """set attributes of decomposes element, if attribute of decomposed
        element not available or invalid"""
        # when decomposed,decomposes element has attributes of the decomposed
        # element
        if len(d_element.space_boundaries):
            for sb in d_element.space_boundaries:
                if sb not in element.space_boundaries:
                    element.space_boundaries.append(sb)

        for tz in d_element.thermal_zones:
            if tz not in element.thermal_zones:
                element.thermal_zones.append(tz)
            if element not in tz.bound_elements:
                tz.bound_elements.append(element)
            d_element_index = tz.bound_elements.index(d_element)
            del tz.bound_elements[d_element_index]

        for attr, (value, available) in element.attributes.items():
            if not value and hasattr(d_element, attr):
                if getattr(d_element, attr):
                    setattr(element, attr, getattr(d_element, attr))
        if hasattr(element, 'layerset') and hasattr(d_element, 'layerset'):
            if element.layerset and d_element.layerset:
                element.layerset = d_element.layerset
                element.layerset.parents.append(element)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant