Create ceiling profiles from gridlines

Hi

I’m working on a project where we want to show the ceiling gridlines in IFC for coordination. I know Revit 2025.3 came with the possibility to export this, but neither Solibri nor Dalux reads the grids from the IFC. (So far, I’ve only seen the grids in BIMvision)

Since 2025.3 doesn’t solve the problem, we’ll stick to 2024.3 version for now.

The Idea is to make a script that read the ceiling-grids and create a “T-profile” along the grids. Then import this into the model and export it with the IFC. I have seen some other posts about this, but they don’t show the scripts on how to make this happen. I’m a bit rusty in dynamo, so I would love to get some guidance on how this can be solved.

I’ve downloaded the Sparrow package to get the gridlines from the ceiling. Tried to use those lines in different combinations to make a Solid.BySweep. But I keep getting errors.

Any ideas on how this can be done? :blush:

Hi @Tore i would try with a line based family, but if you want that way you show as i assume its a profile family, just a guess :wink: you could get the profile from that familytype and extrude, but dont think we have ootb for that…so i would 100 go with a line based family :wink:

ps. guess pattern ceiling grids from api, comes 2525.4…Just a guess cant remember, so check it, so if upgrade you can do it via api, the issue with the sparrow solution it isnt so stable, and only work on straight boundaries…and i can say its super fast via api vs sparrow or other alternative ways we had to deal with before the api solution…:wink: :wink:

1 Like

have just check it, should work in 2025,3…GetCeilingGridLines Method and from link as well…and cpyhon 3 or pythonnet3


ceiling_grid.dyn (10.4 KB)

2 Likes

a variant using serialisation of lines :smiley:

import clr

clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
doc = DocumentManager.Instance.CurrentDBDocument

ceiling = UnwrapElement(IN[0])

def get_ceiling_curves(ceiling):
    grids_with_perimeter = {f"{c.GetEndPoint(0).ToString()}-{c.GetEndPoint(1).ToString()}" : c.ToProtoType()  
                                        for c in ceiling.GetCeilingGridLines(True) }
    grids_without_perimeter = {f"{c.GetEndPoint(0).ToString()}-{c.GetEndPoint(1).ToString()}" : c.ToProtoType() 
                                        for c in ceiling.GetCeilingGridLines(False) }
    #
    perimeter_curves = [c for k, c in grids_with_perimeter.items() if k not in grids_without_perimeter]
    grids_curves = grids_without_perimeter.values()
    return perimeter_curves, grids_curves


OUT = get_ceiling_curves(ceiling)
3 Likes

yeah as always ;)… nice clean one :wink: hahaha you are the master :wink: awesome :wink:

1 Like

Thank you for the replies.

I’ve updated to 2025.3 and tested those Python nodes from Sovitek. Seems to be working fine and I’m getting out the lines. (might be harder to convince the fully design team to upgrade just for this) :wink:

For the next part, I want some kind of geometry added along the lines to represent the profiles in the ceiling, which can be exported as IFC objects. Any recommendations on how I should progress with this?

1 Like

Hi @Tore i would try create a line based family with 2 family types, one for edges and one for center bars…and then use family.instance by curve, dont think we have ootb for that but clockwork should have one :wink: hope it could help

1 Like

Hi @sovitek. Clockwork node and line based family worked great thanks, starting to get some geometry out now. A few new questions:

1. The python nodes reading the lines does not read the area with 1200x600 “stretcher bond” pattern correct, but instead makes a 600x600 grid out of them. Is there a quick fix for this?

2. The objects always end up with elevation 0. I have to manually adjust them to correct height. Tried different nodes. The clockwork “Element.Level” reads correct floor automatically from the objects, but not correct height in that floor. Is there a way to read “Height offset from level” and then automatically place the objects with correct Z value?

1 Like

Hi @Tore maybe something here could work ;)..on my side it works on all types of ceiling pattern

EDIT PS my bad havent tried on bond, you are probably right i will see later what we can do…you know time :wink: :wink:

1 Like

maybe something here…probably this can be done a more elegant way :wink: :wink: but could maybe work

I’ve been trying to find an efficient way to map ceiling tiles to actual gridlines rather than just using a generic surface pattern. The logic for using the grid intersections to drive the profile boundaries is a real time-saver.

Hello @grobert2k and welcome :wink: could you show what you have tried so far ? but for get gridlines its all depends which version you are in comes in 2025.3 with api…in other version you could try sparrow package or create an auto dimension and use them for split/intersect, but guess all you ask for is possible :wink: