BBIM Boq Side Formwork | BlenderBim QTO in N menu

edited January 2024 in General

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

carlopavAceOwura_quatomkarincaemiliotasso

Comments

  • 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))})
      
    steverugiemiliotassoMassimo
  • 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

    atomkarinca
  • @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

  • 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

    steverugi
  • edited June 2024

    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

    emiliotassoKoAra
  • @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.

    emiliotassosteverugi
Sign In or Register to comment.