Skip to content

Clear handling of decompositions #675

Open
@DaJansenGit

Description

@DaJansenGit

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions