Hi everyone,
I’m working on a parametric circular pattern in Grasshopper, which will later be used as a printing pattern on an ETFE cushion façade.
The goal is to create concentric circular rings within a rectangular surface.
These rings represent alternating transparent and printed zones, similar to a “checkerboard logic,” but arranged radially (one transparent ring, one printed ring, and so on).
So far, my Grasshopper setup is organized as follows:
- Base surface : a rectangular surface with adjustable width and height.
- Circles : generated parametrically using this formula: r=(1/2)^(0.5)*B/n
whereB= total width of the cushion andn= number of rings (number of circles in the pattern). - Surface Split : splitting the rectangular base surface with these circles to get multiple ring, shaped trimmed surfaces.
- Sorting : sorting the trimmed surfaces by index.
- Selectors: used to separate alternating rings (even = transparent, odd = printed).
However, this part does not work correctly
- The sorting and selection of surfaces (transparent vs printed) behaves unpredictably.
- Sometimes all surfaces are classified the same (either all transparent or all printed).
- The parametric formula for radius or number of circles seems to affect the order of the split surfaces — so the list structure changes dynamically, and my selection logic fails.
Additionally, once I get this fixed, the next step is to map the entire pattern onto a 3D cushion geometry (or at least to extrude it slightly in Z-direction to simulate the curved cushion).
But the Surface Morph or Extrusion methods I tried either distort the pattern or remove the alternating logic.
So my main questions are:
- How can I reliably separate the trimmed circular surfaces into alternating transparent and printed groups, even when the number of circles (
n) changes parametrically? - What’s the correct way to map or morph this 2D pattern onto a 3D cushion surface
Pattern1.gh (13.6 KB)
without losing the logic of alternating zones?
I’ve attached my .gh file and a screenshot of my current setup.
Any hints, clean solutions, or example definitions would be highly appreciated ![]()
Thanks in advance,
Diellza






