Parametric circular pattern

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:

  1. Base surface : a rectangular surface with adjustable width and height.
  2. Circles : generated parametrically using this formula: r=(1/2)^(0.5)*B/n
    where B = total width of the cushion and n = number of rings (number of circles in the pattern).
  3. Surface Split : splitting the rectangular base surface with these circles to get multiple ring, shaped trimmed surfaces.
  4. Sorting : sorting the trimmed surfaces by index.
  5. 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:

  1. How can I reliably separate the trimmed circular surfaces into alternating transparent and printed groups, even when the number of circles (n) changes parametrically?
  2. 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 :folded_hands:

Thanks in advance,
Diellza

I think there are two ways you went wrong:

  1. Not grafting the circles into their own branches early enough. If each circle pair is put into its own branch of the tree, then all its fragments will stay in that branch. You can then split the tree and recombine it at any point if one set of surfaces reuires some different process.
  2. Splitting the rectangle by the circles means you have to figure out afterwards which fragments are the Ring and the Remainder. The better way is to make the rings, then cut out everything outside the rectangle.

Unfortunately, GH doesn’t have robust 2D region boolean support; you can’t subtract a ring (ie an area defined by 2 concentric circles) from a plane to leave a ring-shaped hole. So I’ve done it all here with solids - cylinders and a box, then filter out everything except the up-facing surfaces.

I did the simulation too, which is a simple setup.

Pattern TN.gh (23.7 KB)

or … if u insist to sort the trims…

sorting_circularTrims_jvs_01.gh (34.4 KB)

I don’t see any screenshot? I got lost in your long description. I see no reason for using a mesh for this, and no reason to use Kangaroo. Hidden wires make it more difficult to see how things work.


Pattern1_2025Oct5a.gh (19.4 KB)

P.S. It may be unnecessary to flatten the ‘B’ input of Split Brep.

I clustered the code I had to produce the other set of surfaces. Could have combined them but followed the code I had written.


Pattern1_2025Oct5c.gh (24.2 KB)

MakeSrf cluster:

CutSrf cluster:

P.S. Combined two clusters into one.


Pattern1_2025Oct5d.gh (22.8 KB)

Combined MakeSrf cluster:

P.P.S. Slightly simplified by using the ‘B’ input instead of the ‘C’ input.
Pattern1_2025Oct5e.gh (26.9 KB)