OSArch Community

BBIM Boq Side Formwork | BlenderBim QTO in N menu

  1. S

    using the BlenderBIM N menu allows some nice quantity take-off of building elements, like the side area of a slab, which is not available from the quantity drop-down menu in the Cost Item Quantities pane

    Question:

    is there any chance to link the output from the N menu into a cost item quantity? (Apart from copy-past it)

    I understand it is not standard Qto_SlabBaseQuantities, but it would be handy to have it available

    as always, thanks for your kind support

    PS as second option the chance to use quantity sets in a formula to calculate it as cost item value, in this case Perimeter * Depth

  2. A

    I have a small script that adds a custom Formwork Qto to the file. What it calculates:

    • for IfcSlab / BASESLAB: perimeter * height

    • for IfcSlab / FLOOR | LANDING | ROOF: horizontal area - perimeter * height

    • for IfcColumn / COLUMN: surface area - area * 2

    • for IfcWall / SOLIDWALL | PARAPET | SHEAR: side area

    • for IfcBeam / BEAM: (width + height 2) length - (width height) 2

    I assume that every beam is connected to a column or a wall on either end, and every slab is surrounded by beams, columns or walls. So if you have beams and slabs that don't conform to these rules you will have deviations. The code is below, I hope this helps.

        from blenderbim.bim.ifc import IfcStore
    
        import ifcopenshell
    
        import ifcopenshell.api
    
        import ifcopenshell.geom
    
        import ifcopenshell.util.unit
    
        import ifcopenshell.util.shape
    
    
    
        file = IfcStore.file
    
        elements = file.by_type("IfcElement")
    
    
    
        unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file)
    
        net_settings = ifcopenshell.geom.settings()
    
        net_settings.set(net_settings.DISABLE_OPENING_SUBTRACTIONS, False)
    
    
    
        qtos = ifcopenshell.util.element.get_psets(elements[0], qtos_only = True)
    
        net_shape = ifcopenshell.geom.create_shape(net_settings, elements[0])
    
    
    
        sub_formwork = 0
    
        super_formwork = 0
    
    
    
        for element in elements:
    
            qtos = ifcopenshell.util.element.get_psets(element, qtos_only = True)
    
            net_shape = ifcopenshell.geom.create_shape(net_settings, element)
    
            try:
    
                predefined_type = ifcopenshell.util.element.get_type(element).PredefinedType
    
            except:
    
                pass
    
            if element.is_a() == "IfcSlab" or element.is_a() == "IfcRamp":
    
                if predefined_type == "BASESLAB":
    
                    surface_area = ifcopenshell.util.shape.get_outer_surface_area(net_shape.geometry) / unit_scale
    
                    sub_formwork = sub_formwork + surface_area
    
                    qto = ifcopenshell.api.run("pset.add_qto", file, product = element, name = "Qto_ReinforcedConcreteQuantities")
    
                    ifcopenshell.api.run("pset.edit_qto", file, qto = qto, properties = {"Formwork": file.createIfcAreaMeasure(round(surface_area, 2))})
    
                elif element.is_a() == "IfcRamp" or predefined_type == "FLOOR" or predefined_type == "LANDING" or predefined_type == "ROOF":
    
                    area = ifcopenshell.util.shape.get_footprint_area(net_shape.geometry) / unit_scale
    
                    surface_area = ifcopenshell.util.shape.get_outer_surface_area(net_shape.geometry) / unit_scale
    
                    super_formwork = super_formwork + area - surface_area
    
                    qto = ifcopenshell.api.run("pset.add_qto", file, product = element, name = "Qto_ReinforcedConcreteQuantities")
    
                    ifcopenshell.api.run("pset.edit_qto", file, qto = qto, properties = {"Formwork": file.createIfcAreaMeasure(round(area - surface_area, 2))})
    
            elif element.is_a() == "IfcColumn":
    
                if predefined_type == "COLUMN":
    
                    surface_area = ifcopenshell.util.shape.get_outer_surface_area(net_shape.geometry) / unit_scale
    
                    area = ifcopenshell.util.shape.get_footprint_area(net_shape.geometry) / unit_scale
    
                    super_formwork = super_formwork + surface_area - area * 2
    
                    qto = ifcopenshell.api.run("pset.add_qto", file, product = element, name = "Qto_ReinforcedConcreteQuantities")
    
                    ifcopenshell.api.run("pset.edit_qto", file, qto = qto, properties = {"Formwork": file.createIfcAreaMeasure(round(surface_area - area * 2, 2))})
    
            elif element.is_a() == "IfcWall":
    
                if predefined_type == "SOLIDWALL" or predefined_type == "PARAPET" or predefined_type == "SHEAR":
    
                    side_area = ifcopenshell.util.shape.get_side_area(net_shape.geometry) / unit_scale
    
                    super_formwork = super_formwork + side_area
    
                    qto = ifcopenshell.api.run("pset.add_qto", file, product = element, name = "Qto_ReinforcedConcreteQuantities")
    
                    ifcopenshell.api.run("pset.edit_qto", file, qto = qto, properties = {"Formwork": file.createIfcAreaMeasure(round(side_area, 2))})
    
            elif element.is_a() == "IfcBeam":
    
                if predefined_type == "BEAM":
    
                    length = ifcopenshell.util.shape.get_z(net_shape.geometry) / unit_scale
    
                    width = ifcopenshell.util.shape.get_x(net_shape.geometry) / unit_scale
    
                    height = ifcopenshell.util.shape.get_y(net_shape.geometry) / unit_scale
    
                    super_formwork = super_formwork + (width + height * 2) * length - (width * height) * 2
    
                    qto = ifcopenshell.api.run("pset.add_qto", file, product = element, name = "Qto_ReinforcedConcreteQuantities")
    
                    ifcopenshell.api.run("pset.edit_qto", file, qto = qto, properties = {"Formwork": file.createIfcAreaMeasure(round((width + height * 2) * length - (width * height) * 2, 2))})
  3. S

    Hi @atomkarinca

    I have a small script that adds a custom Formwork Qto to the file. What it calculates:

    • for IfcSlab / BASESLAB: perimeter * height
    • for IfcSlab / FLOOR | LANDING | ROOF: horizontal area - perimeter * height
    • for IfcColumn / COLUMN: surface area - area * 2
    • for IfcWall / SOLIDWALL | PARAPET | SHEAR: side area
    • for IfcBeam / BEAM: (width + height 2) length - (width height) 2

    I assume that every beam is connected to a column or a wall on either end, and every slab is surrounded by beams, columns or walls. So if you have beams and slabs that don't conform to these rules you will have deviations. The code is below, I hope this helps.

    Amazing stuff!, your code does help me just right, incidentally these days I am trying to learn how to use the util API to improve my workflow (and understand ifcopenshell and IFC a bit more in depth), I just finished with util.cost which I found very useful for handling QTO data.

    many thanks for your help

  4. E

    @atomkarinca great works!

    for IfcSlab / FLOOR | LANDING | ROOF: horizontal area - perimeter * height

    in the formula above horizontal area is only one face or two (bottom and up?)

    usually slabs have only formworks on the bottom side.

    Thank you, your script is very useful

  5. E

    Some time ago, following the very interesting job that @steverugi has made with quantity calculations i was thinking about formwork costing.

    So I've thought that the net area for concrete element covered by formwork maybe can be extrapolated using clash detection algoritm in order to evaluate the free surface of the objects

  6. S

    hi @emiliotasso

    @atomkarinca great works!

    for IfcSlab / FLOOR | LANDING | ROOF: horizontal area - perimeter * height

    in the formula above horizontal area is only one face or two (bottom and up?)

    usually slabs have only formworks on the bottom side.

    Thank you, your script is very useful

    good point, I've yet to go through the script in details

    my personal take on formwork quantities:

    • slabs depends on how you consider the RC frame, I normally see them framed inside beams and column tops, unless they are balconies or landings. In the first case only the soffit (i.e. the bottom side area) is considered, otherwise external faces too.

    • beams differ if external or internal due to slab thickness, both sides and soffit with adjustments due to different colum sides/orientation

    • columns are usually perimeter * length with deduction for beam height or similar

    formork quantity calculation is, in my view a nasty business, currently I prefer to use IfcCovering and go with relevant area, tbh it's faster if you have basic modeling skills

    ciao

  7. A

    @emiliotasso said:

    @atomkarinca great works!

    for IfcSlab / FLOOR | LANDING | ROOF: horizontal area - perimeter * height

    in the formula above horizontal area is only one face or two (bottom and up?)

    usually slabs have only formworks on the bottom side.

    Thank you, your script is very useful

    In my original post I mentioned that I assume that slabs are surrounded by columns, beams or walls. In this scenario I would like to deduct the amount of formwork resulting from this connection, because the connected elements have less formwork resulting from this.

Login or Register to reply.