Equal Grid Across Surfaces

I have a box with rounded corners, open on top and bottom. I want to create a perforation pattern that wraps all the way around the box with equally spaced features. The first step is to create a point grid, but the surface UV curves are sized differently for each surface within the brep. How can I create one pattern with equal spacing around all the connected surfaces?

My instinct is to divide one edge into equal parts (the way a normal Divide Surface command would), find the length of the segments and use that number to drive the segment length across other surfaces, but that doesn’t seem to work. Any insight would be appreciated.

Equal Grid Across Surfaces.gh (19.6 KB)

Have a try pufferfish plugin’s Unsplit Loft Surface.

Equal Grid Across Surfaces_re.gh (25.0 KB)


A way to attempt to do that is:

Get the Surfaces sizes in U or V. Get the min or max (or average). Then for each Surface sizeU/V (and for given divisions uDiv, vDiv) get a proportional division value as follows (min is used):

int divInU = (int) Math.Round (uDiv * sizeU/minU, 0);
int divInV = (int) Math.Round (vDiv * sizeV/minV, 0);

The tricky part is to do your Surfaces (or BrepFaces) having the same orientation in U/V in order to allow this approach to work.

See an example on a List of BrepFaces (for U/V 26/23) and spot the values in the blue/red panels according the proportional option (no means use divisions as provided) used:

Perfect, thank you!

White group (3 components) is pretty close, eh?

Equal Grid Across Surfaces_2020Jun20a.gh (22.8 KB)


This is a very clean approach. It works great for simple extrusions. Unfortunately, the application that I’m working up to has a more uneven surface (I reduced it to simplest terms in my original question to help me understand the approach). When the surface is broken or uneven, the contour approach doesn’t keep the columns of points aligned so it doesn’t form a perfect grid.

Thanks, I appreciate all the input on this project!

At some point the definition needs to be freed up from any UV relationship, especially if there are trims on the surface or a polysurfaces where UV is not predictable. In this case you have both.

In that case I use PanelingTools and create a series of sections around the object intersecting planes or whatever gives the spacing you want. You may even want to filter what is interior and what is on boundary. Because many times the logic is different at the boundary.

Many times intersecting the untrimmed version of will give a regular count and spacing, then come back and use only the points that are inside the trim. PanelingTools can help with that too.

UV is very limiting and has very little to do with 3d space or spacing. All to often we try to idealize UV to make sections and spacing to match, but that is very fragile. That is why PanelingTools has more tools beyond UV.

Here are a bunch of tutorials on it: PanelingTools Tutorials [McNeel Wiki]


Follow up question,

The actual target geometry in my application is a little more complex. Instead of being a straight extrusion, the box has an irregular cut in it. A loft (in Rhino or in Grasshopper) isn’t ideal because the unequal curves produce irregular UV curves that don’t follow a grid.

If I remodel the surface ahead of time in Rhino by extruding the box and trimming against a curve, the Divide Surface works exactly as I want, even without the Pufferfish Unsplit Loft.

Remodeling ahead of time is a perfectly fine solution for this application, but I’m just curious how this process would work in Grasshopper. I can extrude or loft a surface but I can’t seem to trim the surface using a curve. What am I missing with this step?


Equal Grid Across Surfaces Pt 2.gh (62.6 KB)

1 Like

Loft does not equal vertical or promise verticality.

1 Like

Using the original surfaces. Grasshopper does a bit of a cleanup on the Brep.

Horizontals are sections with planes. Verticals made with vertical lines from a section across the middle.

Using PanelingTools to create the Grid and the grid cells.

Now it is an ordered set of grid cells.

Here is the definition so far: Equal Grid Across Surfaces Panelingtools.gh (60.2 KB)

A little clean up on the original Brep. Same shape only the bottom cut out is a trim.

You can see how using the untrimmed and trimmed test allows the panels to work around the trims.

You can find inner panels that are full quads and can be populated with the standard facade frame.

Now the key is to decide what to do when the grid intersects the trimmed edge. These are special case grids that Grasshopper and single out an do something different.


Here is a final one. This one creates the grids, and returns the inside and edges panels separate.

Building-for-panleing.3dm (67.9 KB)

Equal Grid Across Surfaces Panelingtools-edge.gh (34.7 KB)


The next level of fun on this is to use this grid in a larger workflow:

  1. Populate these grids with geometry using Paneltools Grid mapping.
  2. Drive adaptive components directly using Rhino.Inside.Revit. Grasshopper can get smart at placing different adaptive components for different situations such as panels with 3, 4 and 5 points for each panel.
  3. Create the frames and spanning elements in Rhino and then insert Families or each panel type.
  4. Create a smart facade in Archicad to get elevations.
  5. Create smart Grasshopper Styles with VisualARQ that adapt to their situation and create a schdeule.
1 Like

Equal Grid Across Surfaces_2020Jun22a.gh (44.1 KB)

Here is a new plug-in that might relate to gridding. https://www.food4rhino.com/app/unify-uvs

HI David,
Can’t open your full GH file, really interested to see.
Are those missing battery separate plug in?

Yes, those are Panelingtools.