This website is made for modern browsers. You are seeing this, because your browser is missing a feature or two. Please install the latest update or switch to a modern browser. See you soon.

Tapered girder grid

#domains #grid #structure

In this tutorial, we have a look at different functions that involve numeric domains. To illustrate this topic, we will create a tapered girder grid.



Create basic grid

First thing we do, is to define the number of girders that we want to have in each direction. This number is written in a Panel(here 10). The component Squareis used to create the basic grid: At its inputs Ex and Ey we set the number of grid cells, not the number of grid lines. Therefore, we have to subtract 1 from our number of girders. For this, we use a Subtractioncomponent. The size S of the grid cells can be set to an arbitrary number.


Set curves for the sag

The tapering of the girders will not be same for each individual girder, but instead the network of girders should correspond to a sagging surface. The sag or the form of the surface will follow a sine curve in every cross-section. This will be controlled by offsetting every node of the grid and thus defining the bottom chord of the girders.

Sine curve
Finding the bottom chord by moving the top nodes down.

Each girder is segmented by the girders running in the perpendicular direction and we need the vertical coordinate according to the sine curve for each intersection. To do this, we need an array that has the same length as the number of girders in one direction. This is achieved with a Seriescomponent at which we input the number of girders at input C.

A sine curve can be drawn with the Graph Mappercomponent. After placing the component on the canvas, we right-click it and select Graph types > Sine in the context menu. The component will now display a quarter of a sine curve and we need to adjust it to show half of a sine curve (0 To Pi). This is done by moving the top handle towards the middle until the curve is centered and symmetrical (yes, this is impossible but zooming in will help).

Graph Mapper

The default range of the Graph Mapper’s coordinates is from 0 to 1 on each axis and it’s advised to leave it like that and rather apply a factor to the output to scale to the desired magnitude. And of course, if we alter the internal coordinates, we also have to provide input data in this range.

The output of our Series is not within the needed range and we use Remap Numbersto convert it: Input S takes the source domain, which we get from using a Boundscomponent. Input T takes the target domain, which by default is already 0 To 1. The values to be remapped are set at input V and to which we connect our Series. The remapped series are now the input (x-values) for the Graph Mapper.


Get sag values for the surface

The output (y-values) of the Graph Mapperis within the range of the domain 0 To 1 and we need to remap the values to the desired magnitude before they define the bottom chord of our girders. Thus, we us Remap Numbersagain. This time, the default source domain of 0 To 1 is correct and we need a target domain.

To define the target domain we use Construct Domainand connect a Number Sliderto each input. Because these values will define the bottom chord in relation to the grid points, we use negative values to later get a vector pointing downwards. A shortcut to create such a slider is double-clicking on the canvas and typing -2.0..-0.5 into the canvas search.


Get tapering values for all points

So far, we have obtained values for the sag of the surface, or more precisely, for the cross-section in the middle. When describing this surface with a grid of tapered girders, the girders towards the edges must be less tapered than the ones in the middle. Therefore, each girder needs to have the same height at the edge of the surface, but a different height in its respective middle.

same heights
different heights
Each girder is created with a different amplitude of the sine curve.

To implement this, we use another Construct Domaincomponent and connect the smaller height to input A (here -0.5). We also connect the output of the remapped values from step 3 to input B. We now have domains in which the lower bound is the height for the end points of a girder and the upper bound is the height in the middle.

These domains will now become the target domain T of another Remap Numberscomponent and we connect the output of the Graph Mapper to input V. The values from the sine curve will now be remapped within the new domains, but because the upper bounds change, we get smoother (less curved) curves at the edge area. Also, we need to Graft input T to handle the two dimensions of the girder gird; to get tapering in both directions.


Move points accordingly

After generating the heights, we will connect them to a Unit Zcomponent which turns them into vectors. Then, we use these vectors to Movethe points of the Square grid that we created in step 1.


Arrange points in rows and columns

The grid points are organized in rows, but we also need the points in the column direction. To get them, we connect a Flip Matrixcomponent to the points of the top grid and to the ones of the bottom grid. Next, an Entwinecomponent will sort each direction into a separate branch of a data tree. But for this to happen, we need to right-click the component and deselect Flatten Inputs in the context menu.


Generate outlines and surfaces

Now, that we have all needed points and did the sorting, we connect a PolyLinecomponent to the points of the top grid and an Interpolatecomponent to the points of the bottom grid. This will generate curves for the top and bottom edges of the girders. The component Ruled Surfacethen takes all curves as input and will create a surface between each pair of curves. This works as desired thanks to the data tree structure that we provided.


Create tapered volumes as girders

The last step of this tutorial is to turn the surfaces into volumes. This is done with an Extrudecomponent, at which we have to provide the direction for each extrusion at input D. Each surface will be extruded in the direction of the surface’s normal. We find the normals at given uv-coordinates with an Evaluate Surfacecomponent. Here we use 0,0 as uv-values, but any value pair will work, because we have planar surfaces.

The normals are outputted at N and we append an Amplitudecomponent. The thickness of the extrusion can be regulated with a Number Sliderat input A. The output V is connected to input D of the Extrude component and now we have created three-dimensional, tapered girders.

Get the results

Version Info

  • Rhino 6.30
  • Grasshopper 1.0.0007

Test your skills

The solution above works fine, but it doesn’t give us the smoothest results, because the beams intersect. To get nicer results and also to let the bottoms align with the sagging surface at the intersections, we can create the sagging surface first and then cut the girders out. Thus, instead of the beams, we need a surface for the top and a second one for the button. Also, we need some boxes to trim holes into the surfaces. Enough said, now it’s your turn to try this approach yourself.

Hint 1

Create two surfaces

From the solution above, we can keep everything until after step 5. But, instead of creating curves for the girders, we create surfaces from the grid of points. The component Surface From Pointsis what we need, but we have to eliminate the data tree structureby flattening input P. At input U, we provide the number of points in one direction. This is the number of beams which we originally defined in step 1. Next, we need boxes to cut holes into the surfaces.

Hint 2

Create cutting boxes

We create a box in each cell that will serve as trimming objects for the surfaces. We start with defining the boxes right after step 1, where we got the grid cell outlines from output C of the Square component. The center of each cell is then generated with an Areacomponent and we connect its output C with a Center Boxcomponent. These boxes do not only need to have a center point (converted to a base plane) at input B, but also dimensions in each direction.

The height of the boxes should not be smaller than the tallest girder. This value was defined by the Number Slider of the Domain end in step 2 and we can grab it from there. The expansion of the boxes in x- and y-direction should be half of each cell size minus half of the girder width. To calculate this, we use an Expressioncomponent and set the expression to (y-x)/2. At input x we connect a Number Sliderfor a variable girder width and at input y we connect the size of the grid cells that we defined in step 1. Now, you should be able to use these boxes to cut holes into the previously created surfaces.

Hint 3

Trim surfaces

To cut holes into the surfaces, we use the component Trim Solid. Here, we connect the surface for the trim at input S and the trimming shapes, our boxes, at input T. The shapes must be provided as a list, and so we have to flatten the second input which removes the data tree structure. Now, we have the top and bottom surface of our girder grid. But, side surfaces are still missing.

Hint 4

Create missing surfaces

To close the missing sides, we create surfaces between the edges of the top and bottom surface. These edges can be extracted with the Brep Edgescomponent and then connected with a Ruled Surfacecomponent. To connect the correct edges, we have to modify the data structure by grafting both inputs of the Ruled Surface component. Finally, we can combine all surfaces of the girder grid with a Brep Joincomponent, on which we flatten the input. This way, we receive a smooth grid object.

Get the results

Get the results

Get the results

Version Info

  • Rhino 6.30
  • Grasshopper 1.0.0007
This page is open source. Edit it on GitHub or see how you can contribute.

Up next