Rhino.Inside.Revit – Custom Curtain Grid on Curtain System by Face

Hi everyone,

I’m looking for some guidance on creating a more controlled curtain grid workflow using Rhino.Inside.Revit + Grasshopper.

I currently have a building envelope generated parametrically in Grasshopper. The geometry is brought into Revit as a Mass, and I’m using the mass faces to create a Curtain System by Face.

The overall building form changes/slants as it rises, so the curtain panels are not all perfectly vertical or rectangular. I’m currently using quad-based mullions/panels to accommodate the changing geometry.

The main problem is the curtain grid layout.

I need a hybrid system where:

  • In some areas, curtain grid lines should be equidistant / evenly divided along the façade.

  • In other areas, the grid needs to follow a common building grid or shared reference lines so that mullions align across multiple levels/faces.

  • Ideally, those two conditions can coexist within the same curtain system.

  • Where the façade shifts or slopes, the mullions should continue to form clean four-sided panels rather than simply following a uniform UV subdivision of the surface.

The Grasshopper model already contains the geometry and logic that could define where these grid lines should occur, so ideally I would like to use that information to control the Revit curtain grid rather than manually adding hundreds of grid lines.

I’ve found a few scripts/examples on the Rhino forum for adding curtain grid lines through Rhino.Inside.Revit, but from what I can tell they seem to work when dealing with a single curtain panel/face. I haven’t been able to figure out how to adapt that approach when the curtain system is made from multiple connected mass faces and wraps continuously around the building.

That seems to be the main issue I’m running into: determining which face/grid each line belongs to and maintaining the intended alignment as the curtain system transitions from one face to the next.

Specifically:

  1. Can Grasshopper add individual curtain grid lines to an existing Revit Curtain System by Face?

  2. If so, can those grid lines be generated from curves/points calculated in Rhino/Grasshopper, rather than relying on Revit’s Fixed Distance / Fixed Number curtain grid settings?

  3. Is there a way to reference something equivalent to a global building grid and intersect/project those locations onto the different curtain-system faces?

  4. For the areas that do not need to follow the global grid, could I instead divide the façade locally by distance and use those divisions as curtain-grid locations?

  5. How should this be handled when the curtain system consists of multiple connected faces wrapping around the building, rather than a single face?

  6. Is this exposed through the standard Rhino.Inside.Revit Grasshopper components, or would this require accessing the Revit API / a GhPython or C# component?

  7. If modifying the Revit CurtainGrid directly is not practical, is there another workflow people recommend for this type of façade—for example generating the panelization entirely in Grasshopper and then creating Revit elements from that geometry?

I’m less concerned about generating the base mass, since that portion is already working. The main challenge is getting precise control over the Revit curtain-grid locations across multiple connected faces while keeping the curtain system associated with the mass geometry.

If anyone has done something similar with Rhino.Inside.Revit, particularly with curtain systems wrapping around sloped or changing façade geometry, I’d appreciate any examples or suggestions on which components/API methods I should be looking at.

Hi @Alejandro_Lecon

Curtain systems is a tricky topic but i will to answer to the best of my knowledge.

  1. Can Grasshopper add individual curtain grid lines to an existing Revit Curtain System by Face?

Yes, via the Revit API rather than a stock RiR component.

  1. If so, can those grid lines be generated from curves/points calculated in Rhino/Grasshopper, rather than relying on Revit’s Fixed Distance / Fixed Number curtain grid settings?

Yes. AddGridLine places a line through a point you supply, so you drive positions from Grasshopper and ignore Revit’s auto-layout. Keep in mind you give a point, not a curve, so the line still conforms to the face’s U or V direction. Set the Curtain System Type’s Grid 1 / Grid 2 layout to None so nothing auto-populates before you add your own.

  1. Is there a way to reference something equivalent to a global building grid and intersect/project those locations onto the different curtain-system faces?

Not automatically, since Revit grids don’t drive curtain grids. You intersect or project your shared reference lines onto each face in Grasshopper, then feed the resulting on-face points to AddGridLine. Feeding the same global lines to every face is what keeps mullions aligned across faces and levels.

  1. For the areas that do not need to follow the global grid, could I instead divide the façade locally by distance and use those divisions as curtain-grid locations?

Yes. Divide the face in GH and feed those points to AddGridLine. It mixes freely with #3 in a single system, which is the hybrid you want.

  1. How should this be handled when the curtain system consists of multiple connected faces wrapping around the building, rather than a single face?

A face-based system has one CurtainGrid per face (CurtainGrids Property), with no global UV across faces. You iterate the faces, map each grid to its host face, pick the U/V boolean per face (their axes differ), and feed each grid the points on that face. Continuity at shared edges is your responsibility, so feed matching points there.

  1. Is this exposed through the standard Rhino.Inside.Revit Grasshopper components, or would this require accessing the Revit API / a GhPython or C# component?

No only analysis componnets. You need Scripted components using the API.

  1. If modifying the Revit CurtainGrid directly is not practical, is there another workflow people recommend for this type of façade—for example generating the panelization entirely in Grasshopper and then creating Revit elements from that geometry?

Place 4-point adaptive components per panel (RiR Add Component (Adaptive)). That gives clean four-sided panels, full control, and schedulable families. It’s often the better route when cells are non-planar.