Sign in
← Skills Map

The Grasshopper
Manual

Everything in the Skills Map’s Grasshopper trail, in order, as one long read — plus the parts a card cannot hold: a data-tree chapter that actually explains data trees, a cookbook of studio recipes, a component index, and a troubleshooting table for the night before review. Written for architecture students: concept design, modelling, representation and fabrication, not construction documents.

Parts
7
Chapters
37
Deep dive
Data trees
Cost
Free · no sign-in

How to read this

  • Have Grasshopper open. Every chapter ends in something to do; reading it without the software is like reading about swimming.
  • Part 01 and 02 in one sitting, then stop and build something small and useless. Part 03 (data trees) is the investment that pays for the rest — read it slowly, once, with the canvas in front of you.
  • Parts 04–07 are reference-ish. Skim them now, come back when studio asks the question.
  • The figures move — data trees are a change of shape, so the diagrams animate. They hold still if your system asks for reduced motion.
01

Getting the machine running

Grasshopper is a second window on top of Rhino where you build a machine that makes geometry, instead of making the geometry by hand. This part gets you to the moment that converts everyone: a slider you drag, and a building that answers. Nothing here is hard — it is vocabulary, and it is worth doing slowly on something trivial, because every later chapter assumes you can read a component and drive a wire.

01.1

The Grasshopper window

Beginner

Where everything is, and which file holds what.

Type Grasshopper in Rhino's command line and a second window opens. Along the top is the ribbon of component tabs — Params, Maths, Sets, Vector, Curve, Surface, Mesh, Intersect, Transform, Display (plus a tab for each plugin you install, and a Rhino tab in Rhino 8). Under it is the canvas: an infinite sheet where you place components and wire them together. Everything you build lives in a .gh file that is SEPARATE from the .3dm — think of the definition as a machine, and the Rhino file as the workshop it runs in.

Grasshopper draws its results as a live preview in the Rhino viewport: red-ish for selected components, green for the rest, and nothing you see there is real Rhino geometry until you Bake it. Because the preview is live, the fastest way to learn is to keep both windows visible — canvas on one side, a Rhino perspective view on the other — so every wire you make shows up immediately.

Four canvas habits pay off forever. Double-click empty canvas to open the search box and type a component name instead of hunting the ribbon. Scroll to zoom; zoom in far and components sprout extra widgets (the + / − that add inputs on components like Merge). Middle-mouse-drag opens the radial menu. And read a component before wiring it: hover an input or output port and a tooltip tells you the data type it expects and what it means.

Key moves

Rhino command line: Grasshoppertabs: Params · Maths · Sets · Vector · Curve · Surface · Mesh · Intersect · Transform · Displaydouble-click canvas → search a componentmiddle-mouse drag → radial menuthe .gh is a separate file from the .3dm

Try this in studio

Open Grasshopper, snap the canvas beside a Rhino perspective view, then place five components you have never used by typing their names into the canvas search — just to learn that searching beats hunting the ribbon.

Watch out for

Saving the .3dm does NOT save your definition — the .gh is a separate file, so save both, and keep them named together in the project folder.

01.2

Your first definition

Beginner

Slider → circle. The whole idea in three components.

Grasshopper is a visual programming canvas that runs on top of Rhino: instead of typing commands, you drop components (boxes) and wire their outputs to inputs, and geometry previews live in the Rhino viewport. Open it by typing Grasshopper in Rhino's command line.

Start tiny. Drag a Number Slider, a Point, and a Circle onto the canvas; wire the slider to the circle's radius and watch the circle resize as you drag. That loop — change an input, see the geometry update — is the whole point of parametric modeling, and it's worth feeling it on something trivial first.

Two habits from day one: hover over a component's inputs/outputs to read what they expect, and keep your canvas tidy left-to-right (inputs on the left, results on the right) with the occasional group and label. A readable definition is one you can still understand a week later.

Your first definition — Wire components together and drive geometry live with a slider.

Key moves

type Grasshopper in Rhino to openwire output → input, left to rightNumber Slider drives a value livehover ports to read what they expect

Try this in studio

Wire a Number Slider into a Circle's radius and drag it; then add a Move with a second slider. Feel the loop — change an input, watch Rhino update — on something trivial before anything complex.

Watch out for

'Nothing happens when I drag' usually means the slider's range or rounding is wrong (or it's not wired) — double-click it to set min/max and check the wire.

Official docsNumber Slider

01.3

Components, parameters & wires

Beginner

Components do; parameters hold. And how geometry gets in.

Two kinds of object live on the canvas. COMPONENTS do something — they have inputs on the left, outputs on the right, and a name in the middle. PARAMETERS just hold data: a Point param, a Curve param, a Number param. Parameters are the containers you use to store geometry from Rhino, label a value, or park data mid-definition so the graph stays readable.

To bring Rhino geometry in, drop the matching parameter (Curve, Brep, Surface, Point), right-click it and choose 'Set one Curve' or 'Set multiple Curves', then pick in the viewport. That's a live reference: edit the curve in Rhino and the definition updates. When you want the definition to stop depending on the Rhino file — to email it, or to stop an accidental delete from breaking everything — right-click the parameter and choose 'Internalise data', which copies the geometry into the .gh file and drops the wire.

Wires carry data downstream, and you can shape them. Drag from an output to an input to connect; drag from an input to empty canvas to disconnect. Hold Shift while dropping onto an input to ADD a second wire (many components accept several), and hold Ctrl while dropping to REMOVE one. If the canvas gets noisy, right-click an input and set Wire Display to Faint or Hidden — the data still flows, the spaghetti just stops shouting.

Key moves

components DO things · parameters HOLD dataright-click a param → Set one / Set multipleright-click → Internalise data (cut the Rhino link)Shift+drop = add a wire · Ctrl+drop = removeright-click an input → Wire Display → Faint

Try this in studio

Reference a site curve with a Curve param, build something off it, then internalise the param and delete the Rhino curve — the definition should keep working. Undo, and watch it break again when the curve goes.

Watch out for

A referenced param dies if the Rhino object is deleted or the .3dm is missing — internalise before you email a definition, or ship the .3dm with it.

01.4

Sliders, toggles & panels — the input kit

Beginner

Build a control panel someone else could drive.

The Params tab holds the inputs that make a definition usable by a human: Number Slider (double-click it to set min, max, and rounding — floating, integer, even, odd), Boolean Toggle (true/false, for on-off switches), Value List (a named dropdown — perfect for 'brick / glass / timber' or a set of preset spans), Colour Swatch, MD Slider (a 2D pad), and Graph Mapper (a curve you draw that remaps 0–1 values).

Panel is your window into the data: wire any output into a Panel and it prints what is actually there — numbers, 'null', an error string, or a list you can count. Keep one Panel wired to the output you are currently debugging and Grasshopper stops being mysterious. A Panel with typed text also works as an INPUT (one line per item), which is the quickest way to hand-enter a short list of values or names.

Design the control panel deliberately. Give sliders real ranges (a floor-to-floor slider that runs 2.4–4.5 m, not 0–100), rename them by pressing F2 so they say 'bay spacing' rather than 'Number Slider', and group them in one corner of the canvas. At review, that corner is the thing you actually drive in front of the room — the rest of the definition is machinery nobody needs to read.

Key moves

double-click a slider → min / max / roundingBoolean Toggle · Value List · Colour Swatch · MD SliderPanel = see the data (and type a list in)F2 renames anythingpark all inputs in one labelled corner

Try this in studio

Rebuild the inputs of a definition you already have as a proper control panel: real ranges, renamed sliders, a Value List for the material, and one Panel showing the key number. Then drive it in front of someone.

Watch out for

A slider running 0–100 when the sensible range is 2.4–4.5 makes the definition unusable by anyone else — set real min/max and the right rounding (integer for counts).

Official docsNumber Slider

01.5

Organising a definition

Beginner

Readable from day one is cheaper than readable later.

A definition is a document other people (and future you) have to read. Keep the flow strictly left-to-right: inputs on the left, geometry in the middle, output and bake on the right. When a chain wants to double back, move the components rather than crossing wires — five minutes of tidying saves an hour the night before review.

Group related components (select them, Ctrl+G) and give the group a name and a colour by right-clicking it: 'INPUTS', 'site curves', 'panel logic', 'bake'. Add Scribbles (the big text objects) as headings across the canvas so the definition reads like a set of chapters. Rename individual components with F2 when their default name lies about what they do in this context — a Number Slider called 'louvre angle' is documentation.

Finish with hygiene. Delete dead branches you were experimenting with (or move them into a disabled group clearly labelled 'scrap'). Internalise geometry that no longer needs to track a Rhino object. Save versions as you go — gh_facade_v03.gh — because Grasshopper's undo does not survive a crash and a definition is exactly the kind of file you will want to roll back.

Key moves

flow strictly left → rightCtrl+G group · right-click group → name + colourScribble as a heading · F2 to rename componentsdelete or clearly disable scrap branchessave versions: gh_facade_v03.gh

Try this in studio

Open your messiest definition and spend fifteen minutes only tidying: group and name four regions, add Scribble headings, rename the sliders, and delete the dead ends. Nothing about the output changes; everything about using it does.

Watch out for

Grasshopper's undo does not survive a crash — save numbered versions at real milestones instead of trusting Ctrl+Z.

02

The raw materials: numbers, vectors, geometry

Under every parametric model there are three kinds of thing: numbers (how many, how far, how much), directions and planes (which way, on what), and geometry (points, curves, surfaces). Learn to move between them fluently and most 'how do I make this?' questions answer themselves — a façade is a number that became a set of points that became frames that became panels.

02.1

Numbers, maths & expressions

Beginner

Arithmetic on the wire, and when to write a formula instead.

The Maths tab does what you would expect — Addition, Subtraction, Multiplication, Division, Power, Modulus, Minimum/Maximum, Round, Absolute, plus trigonometry (Sine, Cosine, Tangent, Degrees/Radians) and constants like Pi. Chained together these drive dimensions: a bay width times a count gives a total length; a floor height times a level index gives an elevation.

When a chain of maths components gets long, collapse it into an Expression component and type the formula: `(x + y) / 2`, `x * sin(y)`, `min(x, 5)`. Most component inputs ALSO accept an inline expression — right-click an input, choose Expression, and type something like `x*2` to scale a value as it arrives. Use inline expressions for a quick tweak and a real Expression component when the formula is part of the design logic and should be visible.

Two more numeric workhorses. Random gives you a set of pseudo-random values with a seed you can change (same seed, same result — so 'random' stays reproducible for a review). Graph Mapper takes 0–1 values and bends them along a curve you draw, which is how you turn a linear gradient into something that eases, spikes, or steps — the difference between a mechanical pattern and a designed one.

Key moves

Maths tab: A+B · A×B · Round · Min/Max · Sin/CosExpression component: (x + y) / 2right-click any input → Expression → x*2Random (with a seed) · Graph MapperDegrees ↔ Radians before any Rotate

Try this in studio

Replace a chain of four maths components in one of your definitions with a single Expression, then add a Graph Mapper so the value eases rather than ramps linearly. Compare the two results side by side.

Watch out for

Random with no seed set re-rolls on every change, so your 'chosen' option vanishes — pin the seed, and note it, if the result is going on a board.

02.2

Vectors & planes

Beginner

'That way, this far' — and 'on this plane'.

A vector is a direction with a length. Unit X / Unit Y / Unit Z give you the world axes (their input scales them, so Unit Z with 3.5 is 'up 3.5 m'); Vector 2Pt makes the vector from one point to another; Amplitude sets a vector's length while keeping its direction; Deconstruct Vector splits it back into x, y, z. Every Move, every extrusion, every offset direction is a vector question underneath.

A plane is a position plus an orientation: an origin point and two axes. XY / XZ / YZ Plane give the world planes, Construct Plane builds one from an origin and axes, Plane Normal makes a plane from a point and a direction, and Deconstruct Plane pulls the pieces out. Planes matter because most components that place or orient things — Rectangle, Circle, Box, Orient, Text Tag 3D — want a plane, not a point.

Two vector operations earn their keep in analysis. Cross Product gives a vector perpendicular to two others (that's how you get a surface normal or a 'sideways' direction). Dot Product tells you how much two directions agree, which is the one-line way to test whether a façade panel faces the sun or a slope faces north — feed the result into a colour or a filter and you have a real analytical drawing.

Key moves

Unit X / Y / Z (the input is the length)Vector 2Pt · Amplitude · Deconstruct VectorXY / XZ / YZ Plane · Construct Plane · Plane NormalCross Product = perpendicular · Dot Product = agreementmost placement components want a PLANE, not a point

Try this in studio

Place a circle on a sloped plane built with Plane Normal, then use Dot Product between each face normal and a south vector to find which faces of a massing look south — Panel the numbers to check.

Watch out for

Feeding a point where a plane is expected gives you world-oriented geometry in the wrong direction — build the plane deliberately (Plane Normal / Perp Frame) instead.

02.3

Lists & sequences

Beginner

How Grasshopper holds many things.

Grasshopper's power is doing something to many items at once, and a list is how it holds 'many.' Series (start, step, count) and Range (a domain divided into steps) generate evenly spaced numbers; feed those into points, and you've placed a row of columns or a set of floor levels with two components.

List Item pulls one element out by index (counting from 0), and you'll constantly use it to grab 'the first curve' or 'the top point.' Panel and the param viewer let you actually see what's in a list — keep one wired in while you learn, so the data isn't a mystery.

Once you can make and read lists, repetition stops being manual. A façade of 40 louvres, a stair of 18 treads, a row of structure — all become one slider you can change, instead of 40 copies you have to redo when the design shifts.

The rest of the list kit lives in the Sets tab and is worth learning early: List Length (how many?), Reverse List, Shift List (rotate the order — the trick for pairing each item with the next one), Sub List (a slice), Insert Items, Replace Items, Split List, Partition List (chop into groups of n) and Weave (interleave two lists by a pattern). Between Series, Range and these, most 'how do I get THAT arrangement' questions have a two-component answer.

Lists & sequences — Generate and address many things at once with numbers.

Key moves

Series (start, step, count)Range (domain ÷ steps)List Item (index, 0-based)Panel to see the data

Try this in studio

Use Series to place 18 stair treads at an accumulating height, then use List Item to pull out just the top one. Keep a Panel wired in so you can see the numbers the whole time.

Watch out for

Range with N steps returns N+1 numbers (both ends included) while Series returns exactly Count — that one fact explains most off-by-one surprises; check the endpoints in a Panel.

Official docsSeries & RangeList Item

02.4

Points, curves & surfaces from data

Beginner

Numbers and referenced Rhino objects become form.

Geometry in Grasshopper usually starts from points: Construct Point (from x,y,z numbers) or points along a curve (Divide Curve, Evaluate Curve). From points you build curves (Polyline, Interpolate, Line), and from curves you build surfaces (Extrude, Loft, the same operations as Rhino, now driven by data).

You can also reference geometry you drew in Rhino: right-click a Curve or Surface parameter and 'Set' it to a Rhino object, then let Grasshopper operate on it. This mix — hand-draw the tricky bits in Rhino, let Grasshopper handle the repetition — is how most studio definitions actually work.

Remember the preview is live but not yet 'real' Rhino geometry. When you're happy, Bake it (right-click a component) to create editable Rhino objects on a chosen layer. Until you bake, changing a slider just regenerates the preview.

Points, curves & surfaces from data — Turn numbers and referenced geometry into real form.

Key moves

Construct Point · Divide Curve · Evaluate CurveInterpolate / Polyline / Line for curvesright-click param → Set one Rhino objectBake (right-click) to make real geometry

Try this in studio

Reference a curve you drew in Rhino, Divide it into 20 points, and put a vertical column at each. Change the division count with a slider, then Bake the columns onto a named layer.

Watch out for

The live preview isn't real Rhino geometry yet — if you can't select it in Rhino, you forgot to Bake; and re-baking makes duplicates, so delete the old bake first.

03

Data trees — the chapter everyone skips

This is the concept that separates people who fight Grasshopper from people who use it. It is not advanced and it is not optional: nearly every 'why did I get 400 results instead of 20?' is a data-tree question. The deep dive below is deliberately the longest chapter in the manual — read it once slowly with Grasshopper open, and the rest of the software stops being mysterious.

03.1

Data trees

Intermediate

Branches, paths, and why they exist at all.

A data tree is Grasshopper's nested list: instead of one flat list, data sits in branches addressed by paths like {0;1}. This is the single concept that trips up every beginner, because most 'why did I get the wrong number of results?' bugs are really tree-shape mismatches, not broken logic.

Three tools reshape trees. Graft pushes each item into its own branch (use it to make operations happen 'one per item'); Flatten collapses everything back into a single list (the quick fix when you have too many results); and the param viewer shows you the tree structure so you can see what's actually happening.

The mental model: components match data branch-by-branch across their inputs. When two inputs have different tree shapes, results multiply or repeat in confusing ways. Learn to read the tree, graft and flatten deliberately, and most of Grasshopper's mystery evaporates.

Data trees — Understand branches and reshape data with Graft and Flatten.

Key moves

paths look like {0;1}Graft = one item per branchFlatten = one flat listParam Viewer to read the tree

Try this in studio

Make a grid of points, then Graft and Flatten the same list into a downstream component and watch the result count change. Keep a Param Viewer on the output so you can see the branches.

Watch out for

Most 'wrong number of results' bugs are tree-shape mismatches, not broken logic — read the tree in a Param Viewer and graft/flatten deliberately rather than guessing.

Official docsData treeGraftFlatten

03.2

Matching, sorting & filtering

Intermediate

What happens when two inputs disagree about shape.

When two lists have different lengths, Grasshopper pairs them by a matching rule — by default it reuses the last item of the shorter list. Mismatched counts producing 'too many' or repeated results are almost always a data-matching question; Shortest List, Longest List, and Cross Reference let you choose how the pairing happens.

Dispatch splits a list into two by a true/false pattern, and Cull Pattern keeps or drops items by a repeating mask — together they let you separate 'every other one,' inside vs. outside, or pass vs. fail, then treat each group differently. Sort List orders items (and can carry a second list along by the same order).

These are the components that turn raw geometry into designed variation: dispatch your façade panels into solid and glazed by a rule, cull every third column, sort openings by size. This is where a definition starts to express a design idea rather than just repeat one.

Matching, sorting & filtering — Pair lists predictably and split them by rules.

Key moves

Longest / Shortest List · Cross ReferenceDispatch (split by true/false)Cull Pattern (keep/drop by mask)Sort List (carry a second list along)

Try this in studio

Dispatch a row of façade panels into 'solid' and 'glazed' by an alternating pattern and give each group a different colour or depth; then Cull every third one to make an opening.

Watch out for

Two lists of different lengths get padded by the default match rule, repeating the last item — set Shortest/Longest/Cross Reference on purpose to control the pairing.

Official docsData matchingDispatchCull Pattern

03.3

Tree tools in depth

Intermediate

The precision set: flip, partition, prune, remap paths.

Graft and Flatten are the blunt instruments; the Sets ▸ Tree panel is the precision set. Simplify strips the meaningless leading zeros from paths so two trees can match. Trim Tree removes the last level of branching. Flip Matrix swaps rows and columns — the one-component answer to 'I have my panels grouped by column and I need them grouped by row'. Explode Tree hands each branch to its own output, and Merge / Entwine build a tree from several inputs.

Then the readers: Param Viewer (draw mode shows the tree as a diagram), Tree Statistics (paths, branch lengths, depth), Tree Branch (pull one branch by path), and Prune / Clean Tree (drop empty or null branches — the fix for 'my list has holes where a boolean failed'). Keep a Param Viewer parked on the tricky part of a definition the way you keep a Panel on a number.

Path Mapper is the escape hatch: it rewrites paths by a rule you type, like `{A;B}(i)` → `{A}(B)` (which flattens one level while keeping the item order) or `{A;B}` → `{B;A}` (which swaps two levels). It is enormously powerful and genuinely brittle — it assumes a tree depth, so if the upstream shape changes it silently does the wrong thing. Reach for Simplify, Flip Matrix and Graft first, and comment the Path Mapper when you do use one.

Key moves

Simplify · Trim Tree · Flip Matrix · Explode TreeMerge / Entwine to build a treeParam Viewer (draw mode) · Tree StatisticsPrune Tree / Clean Tree to drop nulls + emptiesPath Mapper last: {A;B}(i) → {A}(B)

Try this in studio

Panelise a surface, then use Flip Matrix to switch the grouping from columns to rows and colour each branch differently — you'll see instantly which way the tree was organised.

Watch out for

Path Mapper assumes a tree depth, so it silently does the wrong thing when the upstream shape changes — try Simplify, Graft and Flip Matrix first, and label any Path Mapper you keep.

Official docsPath MapperData tree

Deep dive · read this one slowly

Data trees, properly

Almost everyone learns Grasshopper twice: once badly, guessing at Flatten until the numbers look right, and once properly, after someone explains what a branch IS. This is that explanation. Nine sections, each with a moving figure, ending in a six-step procedure you can run whenever a definition goes wrong.

01 Why trees exist at all

Start with the problem. You divide a surface into a 6 × 10 grid of panels. That is 60 panels — but they are not just 60 things in a row, they are 6 columns of 10, and you will constantly want to work column-by-column: give the top row a different depth, join each column into a strip, run a curve through each row. If Grasshopper handed you one flat list of 60, you would have thrown that structure away and would have to reconstruct it by hand.

So Grasshopper does not use a flat list. It uses a DATA TREE: a set of branches, each holding its own list, each addressed by a PATH written in curly braces — {0;0}, {0;1}, {0;2}. Sixty panels arrive as 6 branches of 10 items. The structure of your geometry is preserved in the structure of your data, and that is the whole idea.

This is worth saying plainly because it is the source of the confusion: a data tree is not a complication Grasshopper added. It is the record of how your data was BUILT. A tree with 6 branches of 10 exists because something upstream divided something into 6 and then into 10. When a tree surprises you, the question is never 'why is this so complicated' — it is 'what did I do upstream that made this shape?'

A data tree: one root splitting into three branches addressed {0;0}, {0;1} and {0;2}, each holding a list of a different length.

02 Reading a tree (do this before anything else)

You cannot debug what you cannot see. Two components make trees visible, and the habit of keeping them wired in is most of what separates a fluent user from a stuck one. PANEL prints the actual contents, grouped by path — you see {0;0} with its three numbers, then {0;1} with its two. PARAM VIEWER prints the structure: right-click it and switch to draw mode and you get a picture of the branching, with the item count on each branch.

Learn to say a tree's shape out loud: '6 branches of 10' or '60 branches of 1' or 'one branch of 60'. Those three trees hold exactly the same 60 items and behave completely differently downstream. Most Grasshopper bugs are a mismatch between the shape you have and the shape you assumed, and you cannot notice a mismatch you never described.

Two more readers earn their place: TREE STATISTICS (paths, branch lengths, tree depth — the fastest way to compare two trees) and LIST LENGTH (wired after a Flatten, to answer 'how many things do I actually have?'). Wire them in while you are building, not after something breaks.

The same 60 panels, three ways

{0}          → 60 items      one flat list — the grid is forgotten
{0;0}…{0;5}  → 6 × 10 items  six columns of ten — the useful one
{0;0}…{0;59} → 60 × 1 item   fully grafted — one operation per panel

03 The one rule: components match branch to branch

Here is the rule that explains almost every strange result. When a component has two inputs and both carry trees, it pairs them BRANCH BY BRANCH: branch {0;0} of input A meets branch {0;0} of input B, {0;1} meets {0;1}, and so on. Inside each pair of branches, it then matches item by item. It never mixes branch 0 of one input with branch 1 of the other.

This is why matching tree shapes is the goal. If A has 6 branches and B has 6 branches, everything is calm. If A has 6 branches and B has 1, that single branch is reused for all six — often exactly what you want (one vector moving six groups). If A has 6 branches and B has 60, you get results you did not ask for, because Grasshopper will pair what it can and pad the rest.

So when a component gives you the wrong number of results, do not start deleting things. Put a Param Viewer on each of its inputs, say both shapes out loud, and ask which one is wrong. Nine times in ten the fix is a single Graft, Flatten or Simplify on ONE input — not a rebuild.

Two trees entering one component: branch {0;0} of A pairs with branch {0;0} of B, {0;1} with {0;1}, and {0;2} with {0;2} — never across.

04 Flatten — pour every branch into one list

Flatten takes any tree and returns a single branch containing every item, in order. Sixty panels in 6 branches become 60 panels in {0}. You can add it as a component (Sets ▸ Tree ▸ Flatten Tree) or, faster, right-click any input or output and choose Flatten — a small downward chevron appears on the port to show it is happening.

Flatten is the correct answer whenever the grouping has done its job and you now want to treat everything as one population: bake all the panels, count them, find the total area, feed them all into one Custom Preview. It is the WRONG answer when you flatten only because the numbers looked wrong — because the grouping you just destroyed was the information you needed two components later.

The tell that you have over-flattened: your façade suddenly has one continuous surface where you wanted twelve strips, or a Loft runs through every section curve in the model instead of each group. If flattening 'fixed' the count but the geometry is now joined up wrong, undo it and look for the real mismatch.

Flatten: three branches of items collapsing into a single list of nine, the branch paths disappearing.

05 Graft — give every item its own branch

Graft is the opposite move: it takes a list of n items and returns n branches with one item each. A flat list of 12 points becomes {0;0} through {0;11}. Again, either the component (Sets ▸ Tree ▸ Graft Tree) or a right-click on the port, which marks it with an upward chevron.

Grafting is how you say 'do this ONCE PER ITEM'. The classic case: you have 12 points and 12 circles and you want a line from each point to its own circle — that works fine flat. But now you want every point connected to EVERY circle: graft one input, and each of its branches meets the whole list on the other side, giving you 12 branches of 12 lines. Grafting one side is how you turn a one-to-one operation into a one-to-many one.

The second classic case is per-group operations: graft your panel curves so each is offset, extruded and capped on its own rather than being treated as one 60-curve batch that Boundary Surface tries to interpret as a single region. If a component quietly returns one big joined thing when you expected many separate things, try grafting its input.

Graft: a flat list of three items separating into three branches of one item each, with new paths {0;0}, {0;1}, {0;2}.

06 When list lengths disagree

Inside a branch, Grasshopper pairs item 1 with item 1, item 2 with item 2 — and when one list runs out, it REPEATS ITS LAST ITEM to cover the rest. Three depths and five panels means panels 3, 4 and 5 all get depth number 3. Nothing errors; you simply get a result that looks almost right, which is worse.

You can choose the rule explicitly. SHORTEST LIST truncates both to the shorter length (honest: five panels, three depths → three panels). LONGEST LIST is the default padding behaviour, made visible. CROSS REFERENCE pairs every A with every B, giving you A × B results — the right choice for building a grid from an x list and a y list, and a spectacular accident when it happens by mistake.

The discipline: whenever two lists meet, know both their lengths. Wire a List Length into a Panel on each side while you are building. The moment you see 3 and 5 where you expected 5 and 5, you have found your bug before it has had a chance to look like a design decision.

Default matching between a 3-item and a 5-item list: the first three pair normally, then the third item of the short list is reused for the remaining two.

07 Cross Reference and the multiplication trap

Cross Reference is the component you reach for when you genuinely want every combination: a grid of points from an x list and a y list, every panel tested against every attractor, every unit type costed at every price. It multiplies — 12 × 40 is 480 results, and that is the intent.

The trap is getting that multiplication by ACCIDENT, which usually happens through grafting. Graft two inputs that both have 40 items and you have asked for 1,600 operations; graft inside a definition that is already running per-panel and the number goes up by another factor. The symptom is unmistakable once you know it: Grasshopper hangs, the count in a Panel has an extra zero or two, and the geometry looks like a solid smear.

The cure is arithmetic, not intuition. Before you graft, say what you expect the result count to be. Then check it. If you expected 40 and the Param Viewer says 1,600, you have grafted one input too many — remove the graft rather than flattening the output, because flattening the smear only hides it.

Cross Reference: a list of three and a list of four producing a full grid of twelve pairings.

08 Reshaping without breaking things

Beyond graft and flatten, four components do most of the honest tree work. SIMPLIFY removes the meaningless leading path numbers that stop two otherwise-identical trees from matching — often the entire fix, and it is safe. TRIM TREE removes the deepest level of branching, merging siblings back together — the gentle version of flatten. FLIP MATRIX swaps the two levels of a tree so 'grouped by column' becomes 'grouped by row'. PARTITION LIST chops a flat list into branches of n, which is how you rebuild a grid you accidentally flattened.

PATH MAPPER is the power tool and the loaded gun. You type a rule — `{A;B}(i)` → `{A}(B;i)` and so on — and it rewrites every path. It can do things nothing else can, and it silently does the WRONG thing when the incoming tree depth changes, because the rule you typed assumed a shape. Use it when the four components above genuinely cannot get there, and leave a Scribble next to it saying what it assumes.

Finally, housekeeping: CLEAN TREE removes nulls and empty branches (the holes left where a boolean or an offset failed on a few items), and PRUNE TREE drops branches outside a size range. A tree full of nulls will fail three components later with a message that points at the wrong place — clean it where the failure happens.

Flip Matrix: the same twelve items regrouped from three row-branches into four column-branches.

09 A procedure for when it goes wrong

When results are wrong, resist the urge to add components until it looks right. Run this instead, in order. (1) Find the FIRST component whose output is wrong — not the last one you noticed, the first one. Work upstream with a Panel until the data is right, then come back down one step. (2) Param Viewer both of that component's inputs and say the two shapes out loud.

(3) Decide what the shapes SHOULD be. 'One vector per panel branch' or 'one profile curve for all of them'. This is a design decision, not a technical one, and stating it usually reveals the answer. (4) Fix one input with the least destructive tool that gets there: Simplify first, then Graft or Flatten on ONE side, then Trim Tree or Flip Matrix. Change one thing, look, change the next.

(5) If the counts are enormous, look for an accidental cross-reference or a double graft — the fix is upstream, never a flatten at the end. (6) If the counts are right and the geometry is still wrong, it is probably not a tree problem at all: check units, check that you passed planes where planes were wanted, and check for nulls with Clean Tree. Written out it looks laborious; in practice it takes ninety seconds and it works every time.

04

Making things: curves, surfaces, solids, meshes

Now the modelling proper. These chapters mirror the Rhino commands you already know, but every one of them is now driven by data — which is what lets one definition produce forty schemes. Pay attention to domains and frames: they are the two ideas that make the difference between geometry that lands where you meant and geometry that is 'nearly right' in a way you cannot fix.

04.1

Curves: divide, evaluate, offset, frame

Beginner

Divide, evaluate, reparameterise — and place planes, not points.

A curve in Grasshopper is measured by its DOMAIN — the range of parameter values from its start to its end. Raw domains are ugly (0 to 37.42), so almost every curve input can be reparameterised: right-click the input and choose Reparameterize, and the curve now runs 0 to 1. Then 'halfway along' is simply 0.5, and the same definition works on a 3 m curve and a 30 m one.

The core moves: Divide Curve (n segments → n+1 points on an open curve, and it also gives you tangents and parameters), Evaluate Curve (one point, tangent and angle at a parameter), Curve Closest Point (the nearest point on a curve to any point — the basis of curve attractors), End Points, Curve Middle, and Length. Offset Curve, Fillet, Explode, Join Curves and Shatter reshape the curve itself.

For anything that must sit ON the curve — louvres along a path, ribs on a spline, columns following a road — you need FRAMES, not just points. Perp Frame gives a plane perpendicular to the curve at each parameter; Horizontal Frame keeps the plane level (usually what you want for a building); Curve Frame follows the curve's own twist. Feed those planes into Rectangle, Circle or Orient and the profile rides the curve correctly instead of standing in the wrong direction.

Curves: divide, evaluate, offset, frame — Get points, tangents and planes off a curve — the backbone of most definitions.

Key moves

right-click a curve input → Reparameterize (0→1)Divide Curve (n → n+1 points, open curve)Evaluate Curve · Curve Closest Point · End PointsPerp Frame · Horizontal Frame for planes on a curveOffset · Fillet · Join · Shatter · Explode

Try this in studio

Take a curved path, divide it into 24, put a Horizontal Frame at each division and an oriented rectangle on every frame — a run of louvres following the path. Then reparameterize and place one marker at exactly 0.5.

Watch out for

Points that look right but profiles that stand in the wrong direction means you used points where you needed FRAMES — swap Divide Curve's points for Perp/Horizontal Frame planes.

04.2

Surfaces & solids

Beginner

Extrude, loft, sweep, cap — and why booleans hurt.

The Surface tab mirrors the Rhino commands you already know, now driven by data: Extrude (a curve plus a vector), Loft (a list of section curves in order), Sweep 1 / Sweep 2 (a profile along rails), Revolution, Pipe, Boundary Surface (a planar region from closed curves), Patch and Ruled Surface. Cap Holes turns an open extrusion into a closed solid — you almost always want it before any volume or boolean operation.

Surfaces have a domain in two directions, u and v, exactly like a curve's domain in one. Reparameterize a surface input and u,v both run 0 to 1. Evaluate Surface gives a point, a normal and a frame at any u,v; Divide Domain² plus Isotrim (SubSurface) chops a surface into a grid of smaller surfaces — the standard first step of any panelling job; Surface Frames gives you a plane per patch.

Solids follow: Solid Union / Difference / Intersection, Trim Solid, and Boolean operations on Breps. They work, but they are the slowest and most fragile part of Grasshopper — a boolean that fails on one of 200 pieces poisons the whole list. Keep boolean chains short, model the pieces so they intersect cleanly (overlap them rather than making them touch exactly), and if a boolean is fighting you, bake and finish it in Rhino.

Key moves

Extrude · Loft · Sweep 1/2 · Revolution · PipeBoundary Surface (planar) · Cap Holes → solidReparameterize surfaces too (u,v → 0→1)Divide Domain² + Isotrim = a grid of sub-surfacesSolid Union / Difference — slow and fragile

Try this in studio

Loft three section curves into a massing, Cap it, then Isotrim the result into a 6×10 grid of sub-surfaces and offset each one — the first half of every façade definition you will ever write.

Watch out for

One failed boolean in a list of 200 poisons everything downstream — keep boolean chains short, overlap solids rather than making them just touch, and bake to finish in Rhino when it fights you.

Official docsMesh vs. NURBS / solid

04.3

Move, rotate, scale, array

Beginner

Move, rotate, orient, array.

The Transform tab takes a piece of geometry plus a rule and returns a moved copy — the original stays where it was, which is why transformations chain so cleanly. Move (geometry + vector), Rotate (geometry + angle in RADIANS + plane), Rotate Axis, Scale (uniform, about a centre), Scale NU (different factors per axis), and Mirror (about a plane) cover most of it.

Arrays do the repetition: Linear Array (a vector and a count), Rectangular Array (a grid), Polar Array (around a plane), and Array Along Curve. Feeding a LIST of vectors into a single Move is often better than an array component — you get one moved copy per vector, and the list is something you can compute, filter, and vary.

Two components punch above their weight. Orient takes geometry from a source plane to a target plane — that's how you place a detail, a panel, or a piece of furniture onto every frame you generated from a curve or surface. Box Morph squeezes geometry into a twisted box, which is how a single detailed module gets warped across a curved façade. Remember Rotate wants radians: wire degrees through a Radians component (or type `radians(x)` in an expression) or your building will spin 57× too far.

Move, rotate, scale, array — Place and repeat geometry with transformations instead of copies.

Key moves

Move (geometry + vector) — the original stays putRotate wants RADIANS (use Radians / radians(x))Linear · Rectangular · Polar Array · Array Along CurveOrient: source plane → target planea LIST of vectors into one Move beats an array component

Try this in studio

Model one detailed module, then Orient a copy onto every frame of a divided curve. Change the module in Rhino and watch every copy update — that's the whole argument for parametric placement.

Watch out for

A rotation that spins wildly is degrees fed into a radians input — wire it through Radians (45° = 0.785), and check the plane you're rotating about.

04.4

Panelising a surface

Intermediate

One surface → a buildable field of panels.

The canonical chain is four components long: Divide Domain² (split the surface's u,v into a grid), Isotrim (cut the surface into that grid of sub-surfaces), then either Surface Frames or Deconstruct Brep → corner points to get something to build on. From there, Boundary Surface or a Polyline through the corners gives you a flat panel, and Offset / Extrude gives it thickness.

The choice that matters is planarity. Isotrim panels on a doubly-curved surface are curved — fine for a render, expensive to build. Taking the four CORNER points and making a polyline gives you a flat-ish quad that is usually warped; triangulating (or using diamond/hex patterns, which Lunchbox generates in one component) gets you genuinely flat panels. Deciding between curved glass, warped quads and flat triangles IS the façade design conversation, so make it explicitly rather than accepting whatever the default chain produced.

Once panelised, everything else is list work you already know: attractors vary the opening size, Dispatch chooses solid vs glazed, Cull removes panels at the entrance, Remap drives the depth of a shading fin per panel. Watch the data tree — Isotrim outputs a tree with one branch per u-row, which is exactly why Flip Matrix and Flatten show up so often in façade definitions.

Panelising a surface — Turn one surface into a buildable field of panels, frames and openings.

Key moves

Divide Domain² → Isotrim (SubSurface)Surface Frames / Deconstruct Brep for cornerscorner points → Polyline → flat-ish panelLunchbox for diamond / hex / triangle gridsexpect a tree: one branch per u-row

Try this in studio

Panelise a curved surface twice — once with Isotrim (curved panels) and once through corner points (warped quads) — then triangulate one region. Compare what each would cost to build.

Watch out for

Isotrim panels on a doubly-curved surface are CURVED — lovely in a render, expensive in glass; decide between curved, warped and flat panels on purpose.

Official docsData tree

04.5

Intersections, sections & contours

Intermediate

Cut the model to get plans, sections, contours, parts.

The Intersect tab is where 3D turns back into 2D. Brep | Plane cuts a solid with a plane and returns the section curves — feed it a list of planes at your floor levels and you have every plan, live. Contour does the same thing at a regular spacing along a direction (the input for waffle structures and topographic models), and Section / Curve | Plane handle the simpler cases.

For flat work there is a full set of region tools: Region Union, Region Difference, Region Intersection and Region Slits operate on closed planar curves, which is how you build poché, subtract courtyards from a footprint, or resolve overlapping site outlines. Curve | Curve gives you intersection points and parameters between two curves; Split with Brep / Trim with Region cut geometry with geometry.

This tab is also how you drive analysis. Intersect a sun vector with the massing to get shadow outlines, intersect a sight line with a façade to test a view, intersect a grid of lines with the terrain to place footings. Because everything stays parametric, changing the massing regenerates every section and every shadow — which is the actual argument for doing your drawings in Grasshopper at all.

Key moves

Brep | Plane → section curves (plans, sections)Contour (direction + spacing) for waffles + terrainRegion Union / Difference / Intersection (planar)Curve | Curve → intersection points + parametersTrim with Brep / Split with Brep

Try this in studio

Feed a list of planes at your floor levels into Brep | Plane and bake every plan at once; then contour the same massing at 300 mm for a laser-cut model.

Watch out for

Region tools only work on CLOSED, PLANAR curves — an open or slightly non-planar curve returns nothing, so Join and project to a plane first.

04.6

Meshes in Grasshopper

Intermediate

The faceted geometry simulation and fabrication actually want.

A mesh is a net of triangles or quads — no smooth mathematics, just vertices, edges and faces. It is what renderers, 3D printers, game engines, physics solvers and analysis tools want, and it is far faster to compute with than NURBS. Mesh (from a Brep, with a settings input), Mesh Surface / Mesh UV, Mesh Sphere/Box/Plane and Construct Mesh (points + face indices) get you one.

The mesh toolkit: Deconstruct Mesh (vertices, faces, colours, normals), Mesh Join, Weld, Mesh Explode, Face Boundaries, Mesh Edges (naked / interior / clothed — naked edges are how you check a mesh is closed), Mesh Split, and Cull Faces. Weaverbird — the first plugin most students install — adds the sculpting half: Catmull-Clark and Loop subdivision, thicken/frame (turn a mesh into a printable lattice), and picture-frame each face.

Two rules keep meshes sane. First, the density is a design decision: too coarse and curves look chipped, too fine and Grasshopper crawls — set it with the mesh settings input rather than accepting the default. Second, a mesh headed for a 3D printer must be CLOSED and manifold; check with Mesh Edges (no naked edges) before you export, because slicers reject open meshes and the failure happens hours later at the printer.

Key moves

Mesh (from Brep) + mesh settings inputDeconstruct Mesh · Mesh Join · Weld · Mesh Edgesnaked edges = the mesh is openWeaverbird: subdivide (Catmull-Clark), thicken, framedensity is a design decision, not a default

Try this in studio

Mesh a massing at three different settings and compare the silhouette and the solve time; then run one through Weaverbird's subdivision and thicken it into a printable lattice.

Watch out for

A 3D printer rejects open meshes — check Mesh Edges for naked edges (there should be none) BEFORE you export, not at the print queue.

Official docsMesh vs. NURBS / solid

05

Making it a design argument

A definition that repeats something is a labour-saving device. A definition that DECIDES something is a design instrument. This part is about the second kind: measuring a real driver, mapping it onto a parameter, testing it with a rule, and labelling the result so the drawing argues rather than decorates.

05.1

Domains & remapping

Intermediate

Any measurement, expressed in any parameter's range.

A domain is a numeric range written 0 To 1 or 2.4 To 4.5. Construct Domain builds one from two numbers, Deconstruct Domain splits it, Bounds reads the min and max of an existing list, and Divide Domain / Divide Domain² chop a domain (or a surface's u,v) into equal steps. Domains are how Grasshopper talks about 'the extent of' a curve, a surface, or a set of measurements.

Remap Numbers is the workhorse: give it a list of values, the SOURCE domain those values live in (Bounds of the list, usually) and a TARGET domain you want them expressed in, and it rescales every value proportionally. Distances 3.2–46.8 m become rotations 0–45°, or panel depths 50–400 mm, or opacities 0–1. Any time you find yourself doing arithmetic to squeeze one range into another, Remap already did it.

Two refinements make remapping designerly. Clamp the source domain deliberately — using Bounds means the extremes always hit the full range, whereas a hand-set source domain lets values saturate, which often reads better. And run the remapped 0–1 value through a Graph Mapper before it reaches the parameter: a linear falloff looks computational, an eased or stepped one looks composed.

Domains & remapping — Convert any measurement into any parameter range — the move behind every gradient.

Key moves

Construct / Deconstruct Domain · BoundsDivide Domain · Divide Domain² (surfaces)Remap Numbers: value + source domain + target domainBounds → source, Construct Domain → targetGraph Mapper after the remap to shape the falloff

Try this in studio

Measure the distance from every panel of a façade to the entrance, Bounds it, Remap into 50–400 mm, and drive panel depth. Then hand-set the source domain instead and see how the gradient changes character.

Watch out for

Using Bounds as the source domain means the extremes ALWAYS hit the full range, so the pattern shifts every time the geometry moves — hand-set the source domain when you want it stable.

05.2

Booleans, conditions & filtering

Intermediate

Ask a true/false question of every item.

Grasshopper has no if-statement; it has boolean lists. Larger Than, Smaller Than and Equality compare a list against a value and return true/false per item. Gate And / Or / Not combine those tests — 'faces south AND is below 12 m'. The result is a pattern, and the pattern is what drives everything downstream.

Spend the pattern with Dispatch (splits a list into A = true and B = false, so you can treat each stream differently and Weave them back together later), Cull Pattern (drop the falses), Cull Index (drop specific positions), Cull Nth (every nth), Sift Pattern (route into more than two streams), and Replace Items (swap only the ones that failed). Sort List orders a list by a key list and can drag other lists along in the same order — how you rank rooms by area or panels by sun exposure.

This is where a definition stops repeating and starts deciding. Glaze the panels that face north, thicken the mullions on the tall bays, remove the columns that land in the entry, colour the units that fail a daylight test. Write the rule as a test on real data and the drawing that comes out is an argument, not a texture.

Booleans, conditions & filtering — Ask a true/false question of every item and treat the two answers differently.

Key moves

Larger Than / Smaller Than / Equality → true-false listGate And · Or · Not to combine testsDispatch (A = true, B = false) · Weave to recombineCull Pattern / Index / Nth · Sift PatternSort List with a key list (drag other lists along)

Try this in studio

Write one real rule for your project — 'panels that face within 45° of south get a fin' — as a Dot Product, a Larger Than and a Dispatch, and give each stream different geometry.

Watch out for

A boolean pattern shorter than the list repeats, quietly mis-tagging items — check the two list lengths in a Panel before you trust the split.

Official docsDispatchCull Pattern

05.3

Attractors & parametric patterns

Intermediate

The classic field workflow — with a reason attached.

An 'attractor' is just a point or curve whose distance to each element drives a parameter — panel size, rotation, opening, height. Measure the distance from every panel to the attractor, remap that distance into a useful range (Remap Number), and feed it into the thing you want to vary. It's the most reusable trick in parametric design.

The pattern is always the same three moves: a field of elements, a distance measurement, and a remap into the parameter's domain. Move the attractor and the whole field responds — a façade that opens up toward a view, louvres that twist toward the sun, a perforation that thins near an entrance.

Keep it meaningful. An attractor pattern is only as good as the reason behind it: tie the variation to a real driver — sun, view, program, structure — so the gradient reads as a design argument and not just a cool effect. Graphs (Graph Mapper) let you shape how the variation falls off.

Attractors & parametric patterns — Drive variation across a field — the classic facade/screen workflow.

Key moves

measure Distance (point/curve → each element)Remap Number into the parameter's domainGraph Mapper to shape the fallofffeed it into size / rotation / opening

Try this in studio

Build a grid of panels, pick an attractor point, measure each panel's distance to it, remap that into a rotation range, and drive the panels — then move the attractor and watch the field respond.

Watch out for

An attractor pattern with no reason behind it reads as a gimmick — tie the variation to a real driver (sun, view, entrance) so the gradient is an argument, not an effect.

05.4

Analysis & colour mapping

Advanced

Measure the model and draw the measurement honestly.

Grasshopper measures as easily as it builds: Area (with a centroid), Volume, Length, Curvature and Surface Curvature, Distance, Angle, and Deconstruct Brep for face-by-face access. Point In Curve / Point In Brep test containment; Dot Product against a sun vector or the north axis gives orientation. The measurement is a plain list of numbers per piece of geometry — which is exactly what a diagram needs.

Turn numbers into an image with the Display tab: Bounds and Remap the values to 0–1, run them through a Gradient (Colour Wheel / custom stops) to get one colour per item, and feed geometry + colours into Custom Preview. Add a Legend so the drawing is readable, and Text Tag 3D for the actual figures. For meshes, Mesh Colours assigns per-vertex colour and gives you a smooth field rather than flat patches.

The intellectual work is choosing the scale and admitting the limits. A rainbow gradient exaggerates small differences; a two-colour ramp from a meaningful midpoint usually tells the truth better. Always print the range on the legend — 'red = 4.2 h of direct sun, blue = 0.3 h' — because an unlabelled colour field can be made to say anything, and a labelled one is evidence.

Key moves

Area · Volume · Length · Curvature · Distance · AngleDot Product vs a sun/north vector for orientationBounds → Remap → Gradient → Custom PreviewMesh Colours for a smooth fieldalways add a Legend with the real range

Try this in studio

Colour your massing by how much each face faces south (Dot Product → Remap → Gradient → Custom Preview), add a legend with the actual numbers, and screenshot it as a diagram.

Watch out for

An unlabelled rainbow gradient can be made to say anything — print the range on the legend and prefer a two-colour ramp from a meaningful midpoint.

05.5

Text, tags & numbering

Intermediate

Number and tag hundreds of unique parts automatically.

Text Tag draws a screen-facing label at a point; Text Tag 3D draws real, oriented text on a plane at a size you set — which is the one you want when the labels have to bake and print. Feed it a list of strings and a matching list of planes and you have every panel numbered in one component.

Build the strings with Concatenate and Format: 'P-' + panel index, or a code like `A-03-17` from row and column indices, or a dimension printed to two decimals with Format's `{0:0.00}` pattern. Text Split / Text Join / Replace Text handle incoming names from a spreadsheet. Because the labels are computed, they cannot drift out of sync with the geometry they name.

The studio payoff is fabrication and analysis drawings: every laser-cut rib engraved with its number, every façade panel tagged with its type, every unit stamped with its area. Pair Text Tag 3D with a Legend or a colour scale (Display tab) and the same definition produces the diagram that explains the scheme — labelled, quantified and regenerated the moment the design changes.

Key moves

Text Tag (screen) · Text Tag 3D (real, oriented text)Concatenate / Format to build the stringsFormat: {0:0.00} for two decimalsplanes from Surface Frames / Perp Frame place the tagsLegend + colour scale for the diagram version

Try this in studio

Number every panel of a façade `A-01`, `A-02`… with Concatenate and Text Tag 3D on each panel's frame, then bake the tags with the geometry so the laser-cut parts arrive labelled.

Watch out for

Text Tag is screen-facing and does not bake as usable annotation — use Text Tag 3D (with a real plane and size) for anything that has to print.

05.6

Data in & out: images, CSV, spreadsheets

Intermediate

Images, CSVs and spreadsheets in; numbers back out.

Image Sampler reads a bitmap and returns a value per point you feed it — brightness, hue, or a single channel — mapped over the image's area. Point a grid of panels at it and a photograph becomes a perforation pattern, a site plan becomes a density field, a hand-drawn gradient becomes a façade. It is the fastest bridge between something you drew by hand and something parametric.

For tabular data, Read File (or the File Path param plus Text Split) pulls a CSV in as lines; split on commas, convert with Text To Number, and you have site survey points, unit schedules, or a year of weather data as lists. Going the other way, Stream Contents / Write File exports any list to a text or CSV file — so a definition can output areas, counts and cut lengths straight into a spreadsheet or a schedule on your board.

Keep the data honest. Record where the file came from and its units, re-check the first and last rows in a Panel after parsing (a stray header row is the classic off-by-one), and internalise a copy of the data if the definition needs to survive without the original file. A parametric drawing built on numbers you cannot source is a rendering of a claim, not evidence for one.

Key moves

Image Sampler: a value per point from a bitmapRead File → Text Split (,) → Text To NumberStream Contents / Write File to export a CSVcheck the first and last parsed rows in a Panelrecord the source + units of any data you import

Try this in studio

Drive a perforation pattern from a photograph with Image Sampler, then export the resulting hole diameters and count to a CSV you can put on the board as a schedule.

Watch out for

A header row parsed as data is the classic off-by-one — Panel the first and last rows after parsing, and state where the data came from on the drawing.

06

Craft: speed, legibility, and getting it out

Definitions get slow, crowded and unshareable in about the third week. These chapters are the craft half of the discipline: measure before you optimise, package logic so it can be reused, bake into a structure your drawings can use, and leave a file that opens on someone else's machine.

06.1

Preview, bake & debug

Beginner

Control what you see; turn a preview into real objects.

Grasshopper previews EVERY component that makes geometry, which quickly becomes soup. Right-click a component and untick Preview to hide it, or select the ones that matter and use the Preview toggle; the Display menu has Preview Off / Wireframe / Shaded for the whole document. Custom Preview (Display tab) draws geometry in a colour or material you choose — the fastest way to make a definition legible while you work and presentable in a screenshot.

Baking makes real Rhino objects. Right-click a component → Bake, and choose the layer in the dialog. Bake deliberately and by piece: structure to one layer, panels to another, linework to a third. Baking is a ONE-WAY snapshot — the baked objects do not update when you move a slider, and baking again makes a second copy on top of the first, so delete the previous bake before you re-bake.

Learn the colour code. A component with an ORANGE bubble has a warning (usually 'null data' or an empty list) and an orange-red one has an ERROR that stops everything downstream. Hover the balloon to read the message. A greyed-out, pale component is DISABLED (right-click → Enabled) and a hatched one is inside a disabled group. Most of debugging is: find the first component that is not grey-green, read its message, and wire a Panel into the input just before it.

Key moves

right-click → Preview off (or Display menu, whole doc)Custom Preview (Display tab) for colour/materialright-click → Bake, and CHOOSE the layerorange = warning · red = error · pale = disabledhover the balloon to read the message

Try this in studio

Take a working definition, turn preview off on everything except the final geometry, add a Custom Preview in two colours to distinguish structure from skin, then bake each onto its own named layer.

Watch out for

Baked geometry is a snapshot — it does not follow the sliders, and re-baking stacks a duplicate on the old one, so delete the previous bake first.

06.2

Performance & troubleshooting

Intermediate

Find the slow component instead of guessing.

When a definition crawls, measure before you guess: turn on the Profiler (Display menu → Show Profiler) and Grasshopper prints the milliseconds each component spends. Nearly always one or two components own the whole cost, and they are usually a boolean, a Pipe/Fillet on hundreds of curves, a huge mesh, or a component that is quietly running on 40,000 items because something upstream got grafted.

The standard fixes, in order: shrink the count while you work (a slider that drives the divisions down to 5 during development and up to 200 for the final bake), turn preview off on everything but the result, disable finished branches of the definition (right-click → Disable, or disable a whole group), replace expensive NURBS operations with mesh equivalents, and internalise upstream data so Grasshopper stops re-solving it.

For errors, work upstream from the first red or orange component. 'Null' or empty inputs mean something failed earlier — Clean Tree and Prune Tree remove the holes; 'Data conversion failed' means the wrong type arrived (a curve where a surface was expected); 'Invalid brep' usually means a boolean or offset gave up on a piece of geometry. If Rhino itself freezes, remember Grasshopper is single-threaded per solution: hit Escape, disable the offending group, and re-enable it once the count is lower.

Key moves

Display menu → Show Profiler (ms per component)work at low counts; raise them for the final bakepreview off · disable finished groupsmesh instead of NURBS where you canClean Tree / Prune Tree to remove nulls

Try this in studio

Turn on the Profiler in your heaviest definition, find the two components that own the time, and try one fix each — fewer divisions, preview off, or a mesh equivalent. Note the before/after milliseconds.

Watch out for

Guessing at the slow part wastes an evening — measure with the Profiler first; it is almost always one boolean, pipe, or a component quietly running on a grafted 40,000-item list.

06.3

Clusters & keeping it readable

Advanced

Package stable logic behind named inputs.

As definitions grow they become spaghetti. A Cluster bundles a working group of components behind named inputs and outputs, like a function — it declutters the canvas and lets you reuse the same logic in several places, editing it once. Build a cluster only once a sub-graph is stable.

Discipline keeps a big definition usable: group and colour related parts, label groups with what they do, and keep the flow left-to-right. Internalise data you don't need to keep editing, and delete dead branches. A definition you'll hand to a teammate (or your future self before review) has to be legible.

Path Mapper and Mass Addition show up in advanced definitions — Path Mapper rewrites tree paths explicitly when Graft and Flatten aren't enough, and Mass Addition gives running totals for placing things end-to-end. Reach for them deliberately; they're powerful but brittle if the input shape changes.

Clusters & keeping it readable — Package working logic into reusable, legible blocks.

Key moves

select components → Clustername the cluster's inputs/outputsgroup + colour + label regionsPath Mapper / Mass Addition when needed

Try this in studio

Take a working sub-graph (say your attractor logic), turn it into a named Cluster, and reuse it twice in the same definition. Then group and label the rest so a teammate could read it.

Watch out for

Cluster only once a sub-graph is stable — clustering half-finished logic just hides bugs; and Path Mapper breaks if the input tree depth changes, so reach for it last.

Official docsClusterPath MapperMass Addition

06.4

From Grasshopper to drawings & fabrication

Advanced

Baked layers, drawings, cut files.

A definition isn't finished until you can get clean output. Bake to named layers (some components let you set the bake layer, or use a 'Bake' helper) so your parametric panels, structure, and lines land sorted and ready to draw or fabricate — don't bake everything onto one layer and sort it by hand.

For drawings, you can Make2D the baked geometry, or use Grasshopper to generate the linework directly (sections, unrolled panels, labels) and bake that. For fabrication, generate nested, flat, labelled parts — Grasshopper is excellent at numbering hundreds of unique pieces, which is exactly what hand-laying-out a parametric model would make miserable.

Plan the hand-off back to the rest of your pipeline: baked DWG into Illustrator for line weights, baked STL/DXF to the printer or laser. The value of a definition at review time is partly the form and partly that you can regenerate every drawing of it in minutes when the design changes.

From Grasshopper to drawings & fabrication — Get parametric results out as baked geometry, drawings, and cut files.

Key moves

Bake to named layers (set the bake layer)Make2D the baked geometry for drawingsnumber/nest parts for fabricationDWG → Illustrator · STL/DXF → machine

Try this in studio

Take a parametric panel system, bake it onto sorted layers, Make2D one elevation of it, and export a numbered, nested set of the panels flat — the thing that would be miserable to lay out by hand.

Watch out for

Baking everything onto one layer throws away the structure your definition just built — set bake layers so drawings and cut files arrive sorted.

Official docsMake2D

06.5

Sharing, versioning & reusing definitions

Advanced

Versioning, internalising, user objects, handover.

Grasshopper saves as .gh (compact binary) or .ghx (XML — bigger, but readable as text and much friendlier to version control and to recovering a corrupt file). Keep the .gh next to its .3dm in the project folder, name them together (tower_facade_v04.gh / tower_facade_v04.3dm), and version them by saving new files at real milestones rather than trusting undo.

Before you send a definition anywhere: internalise the referenced geometry (or ship the .3dm), list the plugins it needs in a Scribble, delete or clearly disable the scrap branches, set the sliders to a state that produces something sensible on open, and check it opens on a machine that is not yours. A definition that opens to a canvas of red placeholders teaches nobody anything.

Reuse is the compound interest of learning Grasshopper. Save a working sub-graph as a User Object (select, File → Create User Object) and it appears in your own ribbon tab on every future project; save clusters as .ghcluster files; keep a personal folder of definitions with a one-line README each. Three semesters of that is a private toolkit no course can hand you.

Key moves

.gh (binary) vs .ghx (XML — diff-able, recoverable)keep .gh + .3dm named together in the project folderbefore sending: internalise, list plugins, delete scrapFile → Create User Object for reusable sub-graphsclusters save as .ghcluster

Try this in studio

Package one definition to hand over: internalise the geometry, add a Scribble listing plugins and what the sliders do, set a sensible default state, and open it on another machine.

Watch out for

A definition that opens to red placeholders and empty params teaches nobody anything — internalise data and note the plugins BEFORE you send it.

Official docsCluster

06.6

Grasshopper in Rhino 8

Intermediate

What changed in Rhino 8 — and the compatibility trap.

Rhino 8 keeps the Grasshopper you know (now sometimes called GH1, with Grasshopper 2 still in development) and adds several things worth using. The biggest is the new Script component: one component that runs Python 3 (real CPython, so libraries work), Python 2 or C#, with a proper editor, and the ability to declare packages at the top of the file — a far better place to write a custom node than the old GhPython component.

Rhino 8 also adds a Rhino tab with 'model object' components — geometry bundled with its attributes (layer, name, colour, user text) — plus Bake and Query components that read and write those attributes directly. That is what people used to install Elefront or Human for: baking to a named layer with a name and custom data attached, and pulling Rhino objects back into a definition by their attributes.

Compatibility is the practical caveat. A definition saved in Rhino 8 may not open in Rhino 7, and plugin components that are missing on another machine come back as red placeholders that lose their settings. If you are sharing with studio-mates or a fabrication shop, agree on a Rhino version, keep the plugin list short, note the plugins used inside the file with a Scribble, and internalise data so the .gh at least opens and shows something.

Key moves

Script component: Python 3 / C# with a real editorRhino tab: model objects with layer + name + user textBake / Query components read + write attributesR8 files may not open in R7missing plugin components come back as red placeholders

Try this in studio

Bake a set of panels through Rhino 8's model-object components with a layer, a name and a user-text attribute each, then query them back into a fresh definition by that attribute.

Watch out for

Sharing across Rhino versions and plugin sets is where definitions die — agree a version with your studio-mates, note plugins in a Scribble, and internalise data so the file at least opens.

07

Going further

Everything past here is optional and none of it is exotic. Plugins, physics, optimisation, scripting and environmental analysis are what most published parametric work is made of — and each one is a small addition to the same graph you already know how to read.

07.1

The plugin ecosystem

Advanced

The shortlist worth installing, and the dependency cost.

Install plugins through Rhino's Package Manager (type PackageManager, search, install, restart Rhino) — that is the safe route. Downloads from Food4Rhino arrive as .gha files that go in Grasshopper's Libraries folder (File → Special Folders → Components Folder); on Windows you must right-click the file → Properties → Unblock first, or the components silently never appear.

The short list worth having: KANGAROO (physics and form-finding, ships with Rhino), WEAVERBIRD (mesh subdivision, thicken, frame), LUNCHBOX (panelling grids — diamond, hex, triangle — and structural systems), PUFFERFISH (tweens, morphs, and better transforms), ANEMONE (loops), LADYBUG TOOLS (climate and environmental analysis), ELEFRONT / HUMAN (baking with layers, names and attributes — largely built into Rhino 8's Rhino tab now), and METAHOPPER (managing the definition itself).

Be conservative about what you add. Every plugin is a dependency: a definition using five of them will not open cleanly on a classmate's machine or a fab shop's, missing components come back as red placeholders that have LOST their settings, and abandoned plugins break at the next Rhino release. Note the plugins a definition needs in a Scribble on the canvas, and prefer a native chain of five components over an exotic plugin that does it in one.

Key moves

Rhino → PackageManager → search → install → restartmanual .gha → Components Folder, then UNBLOCK on WindowsKangaroo · Weaverbird · LunchBox · Pufferfish · AnemoneLadybug Tools · Elefront / Human · Metahoppernote the plugins a file needs in a Scribble

Try this in studio

Install Weaverbird and LunchBox through the Package Manager, then rebuild one panelling job with LunchBox's diamond panels and compare it to your native Isotrim version.

Watch out for

Every plugin is a dependency — missing components open as red placeholders that have LOST their settings, so keep the list short and write it on the canvas.

07.2

Loops & recursion

Intermediate

Iteration, recursion, growth.

Grasshopper's graph runs once, top to bottom, so it cannot loop on its own. Anemone (the standard free plugin) adds the missing pieces: a Loop Start component that takes your initial data and a number of iterations, a Loop End that sends the result back around, and the components in between as the body of the loop. Hoopsnake does the same job with a different interface.

What loops are for: subdividing a shape repeatedly (each iteration cuts every piece again), growing an aggregation one module at a time, running an L-system or a branching structure, packing circles until nothing more fits, or stepping a simple simulation forward. Anything where the NEXT state depends on the CURRENT one needs a loop; anything that just does the same thing to many items does not — that is a list, and lists are much faster.

Loops are the easiest way to hang Rhino, so bound them: start at 3 iterations, watch what the geometry does, and only then raise the count. Keep the loop body small and preview-off, and bake the result rather than leaving a heavy loop live in the file. Before reaching for one, check whether an existing component already does it — Weaverbird subdivides, Kangaroo relaxes, and both are far faster than hand-rolled iteration.

Loops & recursion — Feed a result back into itself — subdivision, growth, and iterative rules.

Key moves

Anemone: Loop Start (data + iterations) → body → Loop Enduse loops only when the next state depends on the current onestart at 3 iterations, then raisepreview off inside the loop bodycheck for an existing component first (Weaverbird, Kangaroo)

Try this in studio

Build a three-iteration recursive subdivision with Anemone — each pass splits every face again — and bake the result at iteration 2, 3 and 4 to compare.

Watch out for

An unbounded loop hangs Rhino with no warning — set a small iteration count before you wire the last connection, and save first.

07.3

Form-finding with Kangaroo

Advanced

Kangaroo: describe the rules, let the shape settle.

Kangaroo is a physics solver: instead of drawing the shape, you describe the RULES it must satisfy and let it relax into equilibrium — the digital descendant of Gaudí's hanging chains and Frei Otto's soap films. The setup is always the same three parts: a starting mesh or set of lines, a list of GOALS, and the Solver component with a Boolean Toggle to run it and a reset to start over.

The goals you will use most: Anchor (pin these points — the supports), Length / EdgeLengths (springs with a rest length and a stiffness), Load (gravity or any directional force), Planarize (make each quad flat, which is what makes a gridshell buildable in glass), OnMesh / OnCurve (keep points on a surface or line), CollisionSphere (keep things apart) and Show / Output to get the geometry back out. Stiffness values are relative — what matters is which goals win when they conflict.

Two disciplines make this design work rather than a novelty. First, watch it settle: run the solver live, drag an anchor, and read how the form responds — that feedback is the real value, more than any single result. Second, treat the output as a sketch, not a structural proof: a relaxed net is in equilibrium under the assumptions YOU typed in, so bake the version you want, rebuild it cleanly in Rhino, and say what the simulation did and did not test when you present it.

Form-finding with Kangaroo — Let a shape settle under forces — catenaries, tensile nets, gridshells, planarisation.

Key moves

Kangaroo Solver + a list of Goals + a Boolean ToggleAnchor (supports) · Length/EdgeLengths (springs) · Load (gravity)Planarize for buildable quads · OnMesh / OnCurvestiffness is RELATIVE — it decides which goal winsShow / Output to get geometry back out

Try this in studio

Relax a grid of springs with four anchored corners under gravity into a catenary net, drag an anchor while the solver runs, then bake the version you like and rebuild it cleanly in Rhino.

Watch out for

A relaxed net is in equilibrium under the assumptions YOU typed in — present it as a form-finding sketch and say what it did not test, not as structural proof.

07.4

Optimisation with Galapagos

Advanced

Search the slider space — and read the result critically.

Galapagos (built into Grasshopper, Params ▸ Util) needs exactly two things: a GENOME — the sliders it is allowed to move — and a FITNESS — one single number to maximise or minimise. Wire your sliders into Genome, wire your measurement (total solar gain, floor area, deviation from a target, structural span) into Fitness, open the solver, and hit Start; it breeds slider combinations and shows the population converging.

It is only as good as your fitness function, and that is the design question. 'Maximise floor area' will happily give you a block that fills the site; a useful fitness usually combines objectives with weights (area minus overshadowing, daylight minus glare) or optimises one thing while HARD-CONSTRAINING others by making illegal options score terribly. Keep the genome small — five or six sliders converge, twenty do not — and keep each solve fast, because Galapagos will run your definition thousands of times.

Use it as a search tool, not an oracle. The honest workflow is: run it, then look at the top ten individuals rather than only the winner, bake several, and choose with your eyes and your argument. Record the fitness definition and the slider ranges in a Scribble — 'the computer chose it' is not a design rationale, but 'here is the trade-off I optimised for, and here is what it cost' is.

Optimisation with Galapagos — Let the computer search your slider space for a good option — and read the results critically.

Key moves

Genome = the sliders · Fitness = ONE numberkeep the genome to 5–6 sliderskeep one solve fast — it runs thousands of timescombine objectives with weights, or hard-constrainread the top ten, not just the winner

Try this in studio

Optimise a courtyard block for winter sun minus overshadowing with four sliders, then bake the best three results and choose between them by eye — and write down why.

Watch out for

'The computer chose it' is not a rationale — Galapagos optimises exactly the fitness you wrote, so state the objective, the weights and the trade-off you accepted.

07.5

Scripting inside Grasshopper

Advanced

Python or C# for the logic wires cannot express.

Some logic is simply shorter as code: nested conditions, a while-loop, a recursive subdivision, a custom sort, or reading an odd file format. Rhino 8's Script component (and the older GhPython component in Rhino 7) gives you a code node on the canvas with typed inputs and outputs — you name the inputs, they arrive as variables, and whatever you assign to the outputs flows back into the graph.

Three things to get right. Set each input's ACCESS mode: Item (runs your code once per item), List (the whole list arrives as a Python list), or Tree (you get the whole structure). Set the type hint so a Curve arrives as a Rhino curve object rather than a generic blob. And use the right library — `rhinoscriptsyntax` for quick, familiar commands, `Rhino.Geometry` for the real API when you want speed and control.

Script components are also where AI assistance is most useful and most dangerous: an assistant will happily produce forty lines that look right and silently return the wrong list. Ask for small, single-purpose scripts; read them; test them on five items with a Panel wired to the output before you run 5,000. And keep them documented — a Script component nobody can read is the least legible thing you can leave in a definition.

Key moves

Rhino 8 Script component (Python 3 / C#) · R7 GhPythonset input ACCESS: Item · List · Treeset the type hint (Curve, Point3d, …)rhinoscriptsyntax for quick · Rhino.Geometry for realtest on 5 items with a Panel before 5,000

Try this in studio

Rewrite one gnarly ten-component chain as a short Python script with named inputs, then check both give identical results on the same input before deleting the components.

Watch out for

AI-written script components look right and can silently return the wrong list — read the code, test it small, and comment it, or it becomes the least legible thing in the file.

07.6

Environmental analysis (Ladybug Tools)

Advanced

Real climate data through your massing.

Ladybug reads an EPW weather file for your site (free from the EnergyPlus / climate.onebuilding archives) and turns a year of hourly data into things you can draw: a sun path for the location, wind roses, temperature and humidity charts, direct sun hours on a surface, and incident radiation mapped onto your massing as a coloured mesh. Honeybee goes further, handing geometry to Radiance and EnergyPlus for daylight and energy simulation.

The workflow is consistent: import the EPW, define an analysis period (a day, a season, a year), give it your geometry as context and as the analysed surface, set a grid size, and run. The output is a coloured mesh plus a legend plus raw numbers — so the same run gives you both the diagram for the board and the figures for the text.

Two cautions. Simulation results are only as good as the inputs: the wrong weather file, a missing neighbouring building, or a grid too coarse to see a courtyard will each produce a confident, wrong picture. And these are DESIGN-STAGE tools — use them comparatively ('scheme B gets 30% more winter sun than scheme A') rather than absolutely, state the assumptions on the drawing, and let the comparison drive a decision you can defend.

Key moves

download the site's EPW (EnergyPlus / climate.onebuilding)import EPW → analysis period → geometry → grid size → runsun path · radiation mesh · direct sun hours · wind roseHoneybee → Radiance / EnergyPlus for daylight + energyoutput = coloured mesh + legend + raw numbers

Try this in studio

Run direct-sun-hours on your scheme's courtyard for 21 December with the neighbouring buildings included, then re-run with one massing change and report the difference.

Watch out for

Wrong weather file, missing context buildings or a coarse grid produce a confident, wrong picture — use results COMPARATIVELY between schemes and state the assumptions.

07.7

Grasshopper beyond Rhino (Rhino.Inside.Revit)

Advanced

Rhino.Inside.Revit — parametric geometry into BIM.

Rhino.Inside.Revit runs Rhino and Grasshopper INSIDE a Revit session, so a definition can read Revit elements (levels, grids, rooms, walls and their parameters) and create native Revit elements from Grasshopper geometry — walls, floors, adaptive components, direct shapes. It is the standard bridge between the design geometry students actually make and the BIM model an office needs.

The useful patterns for a student are simpler than they sound: bring a Revit level and grid into Grasshopper so a parametric façade lands in the right place; generate a panel family instance per panel with its own parameters; or pull room areas and names out of a Revit model to drive a diagram or a schedule. Data flows both ways, which is why coordination workflows in practice increasingly look like this.

Expect friction: it is version-specific (a given Rhino.Inside build matches particular Revit versions), it can be slow on large models, and writing to a live team model needs care. Learn it on a small test project, keep an eye on what is created versus referenced, and always work on a copy of the Revit file until you know exactly what your definition writes.

Key moves

Rhino.Inside.Revit runs Rhino + GH inside Revitread levels, grids, rooms, walls + their parameterscreate walls, floors, direct shapes, family instancesversion-specific: match the Revit releasealways test on a COPY of the model

Try this in studio

Bring a Revit level and grid into Grasshopper, place a parametric façade against them, and push one bay in as a family instance — on a copy of the file.

Watch out for

Writing into a live team model can create hundreds of elements you did not intend — work on a copy, and watch what is created versus merely referenced.

Official docsFamily

08

Reference

The part you come back to: chains that answer real studio questions, what lives on each ribbon tab, the shortcuts worth muscle memory, what each error actually means, which plugins earn their dependency, and the vocabulary.

Cookbook — six chains that answer real questions

Louvres along a curved façade

A run of shading fins following a curved edge, rotating toward the sun.

  1. Curve param → Set the façade edge you drew in Rhino.
  2. Divide Curve (Count from a slider) → points + tangents.
  3. Horizontal Frame at the same parameters → a level plane per louvre.
  4. Rectangle on each plane (fin depth × height) → Extrude for thickness.
  5. Dot Product of each frame's normal against a sun vector → Remap → Rotate each fin.
  6. Custom Preview to colour them; Bake to a 'louvres' layer.

Note. Use Horizontal Frame, not Perp Frame, or the fins will roll with the curve's twist.

An attractor façade that means something

Panel openings that grow toward a view or an entrance.

  1. Surface param → Divide Domain² (U, V sliders) → Isotrim.
  2. Area of each panel → centre points.
  3. Curve Closest Point (or Distance to a point) from each centre to the driver — the view line, the entrance.
  4. Bounds → Remap Numbers into your opening range (say 0.1–0.8 of the panel).
  5. Graph Mapper on the remapped value to shape the falloff.
  6. Scale each panel's inner boundary by that value → Boundary Surface between outer and inner.

Note. The driver must be a real one — sun, view, entry, program. Distance to an arbitrary point is decoration.

Every floor plan, live

Section curves at each level that update when the massing changes.

  1. Brep param → Set the massing.
  2. Series (start = ground level, step = floor-to-floor, count = storeys).
  3. Construct Point / XY Plane at each height → a list of planes.
  4. Brep | Plane → section curves (one branch per level).
  5. Move each branch apart on X if you want them laid out side by side for a drawing.
  6. Bake to layers per level, then Make2D or export to Illustrator.

Note. Change the floor-to-floor slider and every plan redraws — that is the argument for doing drawings here.

A waffle structure for a physical model

Two sets of interlocking ribs, notched, flat and labelled for the laser.

  1. Contour the form in X at your material spacing; contour again in Y.
  2. Region Intersection between each X rib and each Y rib → the notch rectangles.
  3. Region Difference to cut half-depth slots from each rib (top half one way, bottom half the other).
  4. Orient every rib onto the XY plane, nested in rows.
  5. Text Tag 3D with an index per rib → engrave layer.
  6. Bake cut / score / engrave to separate layers, export DWG at 1:1.

Note. Cut one test rib first: material thickness and kerf decide whether the notches fit.

A stair that stays code-plausible

Treads and risers driven by a height and a going, with the count computed.

  1. Sliders: total rise, target riser height, going.
  2. Divide total rise by target riser → Round up → the riser COUNT (this is the trick).
  3. Total rise ÷ count → the actual riser height. Multiply by a Series (0…count) → level heights.
  4. Series × going → horizontal positions. Construct Point from both.
  5. Rectangle at each point → Extrude for the treads.
  6. Panel the actual riser height and the going so you can check them against the rule of thumb.

Note. Computing the count from a target — rather than sliding it by hand — is what makes it hold up when the floor height changes.

Massing options you can compare

One definition, many schemes, with the numbers next to each.

  1. Build the massing from 4–6 meaningful sliders (footprint, setback, storeys, courtyard width).
  2. Volume and Area components → total GFA and footprint area.
  3. Text Tag 3D beside each option printing its numbers.
  4. Save slider states as separate baked options on separate layers, or step them with a Value List.
  5. Optional: wire the sliders into Galapagos with a fitness you can defend.

Note. Bake three or four options and pin them together — the comparison is the design work, not the parametrics.

Component index, by tab

Params

Inputs, containers, and the things you actually touch.
Number Slider
A driven value. Double-click for min, max and rounding (float / integer / even / odd).
Panel
Prints whatever is wired into it. Also an input: type one item per line.
Boolean Toggle
True/false switch — solver on-off, option A or B.
Value List
A named dropdown of preset values. The tidy way to offer material or type options.
Colour Swatch / Gradient
Pick a colour; map 0–1 values to a colour ramp.
Graph Mapper
Draw a curve that reshapes 0–1 values — easing, spikes, steps.
Image Sampler
Reads a bitmap and returns a value per point — photos become patterns.
Geometry / Curve / Brep / Point param
Holds referenced Rhino geometry. Right-click → Set one / Set multiple / Internalise data.
Galapagos
Evolutionary solver: a genome of sliders plus one fitness number.
Scribble
Big text on the canvas. Your headings and your notes to the next person.

Maths

Arithmetic, ranges, and shaping numbers.
Addition / Subtraction / Multiplication / Division
The basics — they accept lists, so they operate on everything at once.
Expression
Type a formula: (x + y) / 2, x * sin(y), min(x, 5). Replaces long maths chains.
Remap Numbers
Rescale values from a source domain into a target domain. The gradient workhorse.
Bounds
The min–max domain of a list of numbers — usually Remap's source.
Construct / Deconstruct Domain
Build a range from two numbers, or split one apart.
Round / Absolute / Minimum / Maximum
Clean numbers up before they drive geometry.
Sine / Cosine / Degrees / Radians
Trigonometry — and the conversion every Rotate needs.
Random / Jitter
Pseudo-random values and shuffles. Pin the seed so a result is reproducible.
Mass Addition
Running totals — how you place things end to end with varying spacing.

Sets

Lists, trees, and the logic of selection.
Series / Range
Series = start, step, count. Range = a domain in N steps (which returns N+1 numbers).
List Item / List Length / Reverse / Shift List
Get one item, count them, flip the order, rotate the order.
Sub List / Split List / Partition List
Slice a list, cut it in two, or chop it into branches of n.
Dispatch / Sift Pattern
Split one list into two (or more) streams by a true/false pattern.
Cull Pattern / Cull Index / Cull Nth
Drop items by mask, by position, or every nth.
Sort List
Order by a key list — and drag other lists along in the same order.
Cross Reference
Every A against every B. Deliberate multiplication.
Weave / Merge / Entwine
Interleave lists by a pattern; combine streams; build a tree from several inputs.
Graft / Flatten / Simplify / Trim Tree
The four tree-shape operations you will use daily.
Flip Matrix / Explode Tree / Path Mapper
Regroup rows↔columns, split branches to outputs, rewrite paths by rule.
Param Viewer / Tree Statistics
SEE the tree. Keep one wired while you build.
Clean Tree / Prune Tree
Remove nulls, empty branches, and branches outside a size range.

Vector

Directions, planes, points, and grids.
Unit X / Unit Y / Unit Z
A world-axis direction; the input sets its length.
Vector 2Pt / Amplitude / Deconstruct Vector
Direction between points; set a length; read x, y, z.
Cross Product / Dot Product / Angle
Perpendicular direction; how much two directions agree; the angle between them.
Construct Point / Deconstruct Point
Points from numbers and back again.
XY / XZ / YZ Plane, Construct Plane, Plane Normal
The planes almost every placement component wants.
Rectangular / Hexagonal / Radial grid
Ready-made point and cell grids — with the tree structure already right.

Curve

Everything that starts from a line.
Line / Polyline / Interpolate / Nurbs Curve
Build curves from points.
Divide Curve
n segments → n+1 points on an open curve, plus tangents and parameters.
Evaluate Curve / Curve Closest Point
Point and tangent at a parameter; nearest point to any point (curve attractors).
Perp Frame / Horizontal Frame / Curve Frame
Planes along a curve — use these, not bare points, to place profiles.
Offset Curve / Fillet / Join Curves / Explode / Shatter
Reshape and rebuild curves.
Rectangle / Circle / Polygon / Arc
Primitives — note they take a PLANE, not a point.
Length / End Points / Curve Middle / Closed
Measure and test.

Surface

Surfaces, solids, and the panelling chain.
Extrude / Loft / Sweep 1 / Sweep 2 / Revolution / Pipe
The construction commands you know from Rhino, now driven by lists.
Boundary Surface / Patch / Ruled Surface
Surfaces from closed planar curves and from freer inputs.
Cap Holes
Close an open extrusion into a solid — before any volume or boolean.
Divide Domain² / Isotrim (SubSurface)
Split a surface into a grid of sub-surfaces. Step one of panelling.
Surface Frames / Evaluate Surface
A plane (and normal) per patch or at any u,v.
Deconstruct Brep
Faces, edges and vertices of a solid — how you get at one wall of a mass.
Solid Union / Difference / Intersection
Booleans. Powerful, slow, and the most common cause of a broken list.
Box / Sphere / Cylinder / Box Morph
Primitives, and the component that warps a module into a twisted box.

Mesh

Faceted geometry for simulation, rendering, and printing.
Mesh (from Brep) / Mesh Surface
Convert NURBS to mesh — the settings input controls density.
Construct Mesh / Deconstruct Mesh
Build from vertices and faces; pull vertices, faces, normals and colours back out.
Mesh Edges
Naked / interior / clothed edges — naked edges mean the mesh is open.
Mesh Join / Weld / Mesh Split / Cull Faces
Combine, tidy, cut and thin a mesh.
Mesh Colours
Per-vertex colour — a smooth analysis field rather than flat patches.
Weaverbird (plugin)
Catmull-Clark and Loop subdivision, thicken, frame, picture-frame.

Intersect

Where 3D becomes drawings and parts.
Brep | Plane
Section curves from a solid and a plane — every plan and section, live.
Contour
Regular sections along a direction: waffles, terrain, stacked models.
Curve | Curve / Curve | Brep
Intersection points and parameters.
Region Union / Difference / Intersection
Boolean operations on closed planar curves — footprints, poché, courtyards.
Split with Brep / Trim with Region
Cut geometry with geometry.
Project
Drop curves or points onto a surface or plane — site linework onto terrain.

Transform

Placement and repetition.
Move
Geometry + vector. The original stays; feed a LIST of vectors for many copies.
Rotate / Rotate Axis
Radians, about a plane or an axis.
Scale / Scale NU
Uniform about a centre, or per-axis.
Mirror
About a plane.
Orient
Source plane → target plane. How a module lands on every frame.
Linear / Rectangular / Polar Array
Repetition by vector, grid, or rotation.
Box Morph
Warp a detailed module into a twisted box — curved façades from one part.

Display

Making the definition legible and the drawing presentable.
Custom Preview
Draw geometry in a chosen colour or material.
Text Tag / Text Tag 3D
Screen labels; real oriented text that bakes and prints.
Legend
The key for a colour-mapped analysis drawing. Never ship the field without it.
Colour Gradient / Create Material
Map values to colour; build a preview material.
Dot Display / Symbol Display
Fast markers for large point sets.

Canvas shortcuts & menus worth knowing

Double-click canvas
Search box — type a component name instead of hunting the ribbon.
Middle-mouse drag
Radial menu (and canvas pan).
Scroll
Zoom. Zoom in far and components reveal extra widgets.
F2
Rename the selected component or slider.
Ctrl + G / Ctrl + Shift + G
Group / ungroup the selection.
Shift + drop a wire
ADD a wire to an input that already has one.
Ctrl + drop a wire
REMOVE that wire from the input.
Right-click an input
Flatten, Graft, Simplify, Reparameterize, Expression, Wire Display.
Right-click a component
Preview, Enabled, Bake, runtime message, help.
Ctrl + Alt + click a component
Highlight where it lives in the ribbon.
Ctrl + Z / Ctrl + Y
Undo / redo — but do not trust it across a crash.
Display menu → Show Profiler
Milliseconds per component. Measure before optimising.
File → Special Folders
Components folder (where .gha plugins go) and user objects.
File → Create User Object
Save a selected sub-graph into your own ribbon tab, forever.

Troubleshooting — symptom, cause, fix

SymptomUsual causeFix
Far too many results (400 instead of 20)An accidental cross-reference, or a graft on an input that was already per-item.Param Viewer both inputs of the first wrong component; remove the extra graft upstream rather than flattening the output.
Too few results, or the last item repeatingTwo lists of different lengths meeting under the default (longest-list) matching rule.Wire List Length into a Panel on both sides; then set Shortest List, Longest List or Cross Reference deliberately.
One joined thing where you wanted many separate onesA flat list arriving at a component that treats the whole list as one input (Loft, Boundary Surface, Join).Graft the input so the operation runs once per item — or partition it back into the groups you meant.
Orange balloon: warningUsually null or empty data arriving, or an input left unset.Hover to read the message; Clean Tree / Prune Tree to remove nulls; check the first component upstream that produced them.
Red component: error'Data conversion failed' (wrong type), 'Invalid brep' (a boolean or offset gave up), or a script exception.Read the balloon, Panel the inputs, and test the operation on ONE item to see what the geometry actually is.
Geometry is invisible in RhinoPreview is off on the component, the layer is hidden, or you never baked it.Right-click → Preview; check the Display menu's document-wide preview; remember the preview is not real geometry until you Bake.
Rhino freezes when you move a sliderA heavy operation (boolean, pipe, fillet, mesh) running on far too many items.Escape; disable the group; drop the counts while you work; turn on the Profiler and fix the top one or two components.
The definition opens with red placeholder componentsA plugin used in the file is not installed on this machine — and the placeholder has lost its settings.Install the plugin via PackageManager, or rebuild that part natively. Prevent it by listing plugins in a Scribble.
Everything breaks after you tidy the Rhino fileReferenced geometry was deleted or moved to a hidden layer, so the params lost their objects.Re-set the params, or internalise the data once the geometry is final so the definition stops depending on the .3dm.
Rotations spin wildlyDegrees fed into an input that expects radians.Wire through Radians, or type radians(x) as an expression on the input.
The model imports or bakes at the wrong sizeDocument units mismatch between the .3dm, an import, or a collaborator's file.Check units before modelling; scale by 1000 / 0.001 for m↔mm rather than redrawing.
A 3D print or laser file is rejectedThe mesh is open (naked edges), or cut/score/engrave layers are not separated.Mesh Edges should report no naked edges; bake to layers named for the machine operation before exporting.

The plugin shortlist

Kangaroo 2
Physics and form-finding: relaxation, catenaries, tensile nets, planarisation. Ships with Rhino 6+ — nothing to install.
Weaverbird
Mesh subdivision, thicken, frame, picture-frame. The first plugin most students install.
LunchBox
Panelling grids (diamond, hex, triangle), structures, some maths surfaces. Saves a dozen components on any façade.
Pufferfish
Tweens, morphs, blends and better transforms. Excellent for interpolating between two design states.
Anemone
Loops and recursion — Loop Start / Loop End. The standard free looping plugin.
Ladybug Tools
Climate analysis from EPW files; Honeybee adds Radiance and EnergyPlus. The environmental-analysis standard. Bigger install.
Elefront / Human
Bake with layers, names and attributes; reference Rhino objects by attribute. Largely built into Rhino 8's Rhino tab now.
Metahopper
Manage the definition itself — find, select, and edit components in bulk. For when a definition gets big.

Glossary

Definition
A Grasshopper file (.gh / .ghx) — the graph of components. Saved separately from the .3dm.
Component
A box that does something: inputs on the left, outputs on the right.
Parameter
A box that holds data — a Curve param, a Number param — rather than acting on it.
Wire
The connection carrying data from an output to an input.
List
Many items in one branch, in order, addressed by index from 0.
Data tree
Nested lists: branches addressed by a path like {0;1}, each holding its own list.
Path
A branch's address, written in curly braces. {0;2} is the third branch of the first group.
Graft
Put every item into its own branch — 'do this once per item'.
Flatten
Pour every branch into one list — the grouping is discarded.
Simplify
Strip meaningless leading path numbers so two trees can match.
Domain
A numeric range, written 0 To 1. Curves and surfaces are measured in their own domains.
Reparameterize
Right-click option that forces a curve or surface domain to 0–1.
Bake
Turn the live preview into real Rhino objects on a layer. One-way.
Internalise
Copy referenced geometry into the definition and cut the link to the Rhino object.
Cluster
A group of components packaged behind named inputs and outputs, like a function.
User object
A saved sub-graph that appears in your own ribbon tab on every project.
Attractor
Any point, curve or surface whose distance to each element drives a parameter.
Remap
Rescale values from one domain into another — the move behind every gradient.
Goal (Kangaroo)
A rule the solver tries to satisfy: an anchor, a spring length, a load, planarity.
Genome / fitness (Galapagos)
The sliders the solver may move, and the single number it optimises.
GHA
A compiled Grasshopper plugin file. Goes in the Components folder — and must be unblocked on Windows.

Finished a chapter and want to practise it against something? Take it to Coach → or go back to the Skills Map to see where Grasshopper sits next to Rhino, Revit and the rest.