This project started in a different thread but soon took a different direction, having nothing to do with projecting curves onto breps or Python or attractor curves that affect circle radii.

It took awhile to get data trees straightened out to work with any planar shape. This version has a Value List to switch between three sources of geometry. The third one is “Custom” to handle arbitrary geometry, to be defined. As a demo ten triangles are supplied (two branches of five). Other choices are ten hexagons (two branches of five) and 56 parallelograms at arbitrary orientations from the other thread (two branches of 28).

There are sliders for ‘Min_R ’ and ‘Max_R ’ (radius domain) and a slider for ‘Steps’ (rows) that must be adjusted depending on shape and size of the surfaces. A slider (one per branch) chooses a reference edge where rows of different radii begin. I added a ‘Reverse’ switch that inverts the rows because with triangles, there is no opposite edge to act as a reference.

SrfSplit is slow so should be disabled when exploring circle sizes, many holes and different shapes. Enable preview on the circles instead. 49.3 seconds for 56 panels(51,054 holes total, ~912 holes per panel), 2.8 seconds for 10 hexagons(5,430 holes total, 543 holes per hexagon) and 1.4 seconds for 10 triangles(rows reversed, 2,000 holes total, 200 per triangle).

Because the 20 triangles in this version vary in size and shape, I decided to scale the circles to have the same number of rows in all surfaces. After that, some rows are culled if they are too short to have two or more circles.

P.S.SrfSplit is disabled in the red group labeled “SLOW” (bottom right). Enable it only when you have a circle pattern you like.

One of the issues at play is selection of a “base edge” (white group), where I sorted edges by the Z value of their edge mid-points, choosing the lowest edge. This was appropriate for the geometry used but that was a special case. Different methods for other geometry could be better.

P.S. I forgot to enable SrfSplit - all polyhedra (96 faces, 19544 holes) takes only 6.8 seconds.