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.
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 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
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…
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)
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)
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?
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 hope it could help
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?
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 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