π§± Create Brick Molds
As mentioned earlier in Thinking in Semio,
A Type is your brick mold π§± The Blueprint behind each Brick
It defines not just the shape, but also the design meaning and connection logic π§
π§© What Are the βMoldsβ in This Example?
Take a look at your sketch π
Youβll see five elements that follow the same basic shape, just stretched to different lengths π
Even though the final Design includes five Pieces, theyβre made from only three distinct shapes
with two of them used twice β giving us three Variants of one Type π’
π§± Think of it like a LEGO brick that comes in 2-stud, 4-stud, and 5-stud versions β
same shape logic, just scaled π
If the shape were completely different β like a triangle, window, or roof β°οΈπͺπ
That would count as a new Type altogether
π§ Modeling with Meaning
When you think of a mold, the first thing that comes to mind is usually its shape β the geometry π§±βοΈ
But in Semio, the mold is what combines shape with meaningful design information π‘
In traditional Grasshopper workflows, youβre modeling with raw data β points, curves, and surfaces without embedding design intent π§¬
You build logic around it, but that logic stays detached β abstract, custom, and often fragile.
In Semio, the mold connects geometry with design intent directly π§
Youβre not referencing arbitrary geometry β youβre referencing relationships, roles, and rules π§©
For example:
π Instead of saying βconnect point (x, y, z) to Brep edge 23β
π You say βconnect the door to the living roomβ ποΈπͺ
π Or in LEGO terms: βπͺ snap the window brick onto the top of the wallβ π§±
This is what gives Semio its strength β youβre not just building shapes,
youβre building a semantic system that adapts, scales, and speaks your design language π―π£οΈ
π§° Create a Brick Mold (Type β Ty)
Letβs begin by modeling the mold shown in the sketch
This will serve as the base for generating its Variants π§©
Before we start building, letβs go over the essential elements that define a Type π§±:
- π·οΈ Name β A unique name to identify your Type and reuse it in different designs
- π§± Geometry (Representation) β The 3D shape attached to the Type β it gives the piece its visual form β¨
- π§² Connection Points (Ports) β The snap points where the piece connects to others in the system π
Now letβs take a closer look at how these elements come together β and start modeling our first brick mold π οΈ
π·οΈ Name Your Mold (Type Name - Na)
Clear, consistent names in Semio make everything easier down the line β
Especially when your project grows and youβre working with many Types, Variants, and Pieces πGood names help you:
- π§ Navigate your system
- π Understand relationships
- π Make connections that are easy to track
π In our example, weβll name our Type βProfileβ
because the shape weβre modeling is based on a standard manufactured wood profile πͺ΅π§ Attach Geometry (Representation β Rp)
In Semio, the process of adding geometry to a Type is called modeling its Representation π οΈ A Representation is anything that visually or symbolically represents a Type π§± It helps you see or recognize the Type β without defining its logic or behavior π§
In most cases, this will be a 3D geometry, like in our example But it can also be:
- A 2D drawing or diagram βοΈ
- A symbolic icon or block π³
- A label, file, or reference π
π‘ Because Representations are separate from the logic of the system, theyβre fully flexible:
- You can start modeling your system without one π§
- You can add or update it later π οΈ
- You can switch between levels of detail depending on the design phase π
In this example, weβll use a simple 3D shape to represent our brick molds we need to create π§©
π§ Modeling Representation
There are two simple steps to create a Representation:
-
π οΈ Build the Geometry
Model the physical form of your brick β the shape that will appear in your design -
π Link it to the Type
Connect the geometry to a specific Type, so Semio knows how to display and use it in your design space
Letβs take a closer look at the brick mold in our example π
It always follows the same basic shape π§±
A rectangle thatβs cut at an angle βοΈ β just repeated in different lengths πAs we saw in the sketch, its size is described using two parameters:
W
β the width of one brick unitn
β the number of units in length
In Semio, you can attach geometry to a Type in different ways π
You can pick the method that best fits your workflow or tool.Letβs take a look at how that works in practice π
In Semio, Representations are typically referenced through external geometry files ποΈ
β even when those files are generated inside GrasshopperThis approach keeps your workflow clean, modular, and easy to update π§Ό
It also makes your design system more reusable and scalable πWhile the modeling process itself isnβt the focus of this tutorial,
hereβs the key takeaway:
Youβll need to follow three simple steps to attach your geometry as a Representation π§±π οΈ Geometry Modeling
Since our shape follows a clear logic π§
we use a parametric Grasshopper definition to generate the geometry of the brick mold π§±This is useful because it lets us generate all the different Variants of this brick seen in the sketch
using a single logic controlled by the parametersn
andW
which define the brickβs length and width ππΎ Geometry Export
After generating the geometry,
we need to export it as a.glb
file so it can be attached as a Representation πΎWeβll use a simple workflow that automates this export π¦Ύ
You can place it directly after your geometry generation step in Grasshopper π¦π The Export Workflow Looks Like This:
ποΈ Set the Export Location
Use the
Dir
andPath
components to define the directory path
This determines where the exported file will be savedπ Build the File Name
Use
Concat
to generate the file name dynamically
Combine the Type name and Variant (e.g.profile
+2
) βprofile_2.glb
π§© Assemble the Full File Path
Another
Concat
merges directory + file name:
C:\Users\Users\Downloads\profile_2.glb
π Prepare the Geometry
π οΈ Youβve already modeled the geometry earlier in your Grasshopper definition.
Now itβs time to export it β so Semio can use it as a referenced Representation πΎ- β
Convert the geometry into the required format (e.g. Mesh for
.glb
) - π€ Pass it into the
iGeo
component to export it as a.glb
file
Your file directory should now look like this:
π Referencing the Exported File
The exported file (e.g.
profile_2.glb
) is linked to theUr
input of the Model Representation component (~Rep
)
This tells Semio where to find the geometry that represents your Type.-
π§© The
~Rep
(Model Representation) component takes theUr
file path and creates a Representation:
βRep(model/gltf-binary)
-
π This Representation is later connected to the
Typ
(Model Type) component β
so that your Type is linked to its visual form
π Why Use File-Based Referencing?
Even inside Grasshopper, Semio requires a file-based snapshot of your geometry β
a static file that captures what your brick mold looks like at a specific moment.Hereβs why that matters:
- βοΈ If your geometry is dynamic or parametric, it still needs to be exported to a file
- π Semio connects to that file β not the live Grasshopper preview
π‘ This keeps geometry modular, portable, and easy to reuse
π§± It also supports chunking β breaking down large designs into smaller, manageable parts
π And it allows smooth transition between Grasshopper and Semio SketchpadYou donβt always need to embed geometry directly into a Type π§± In some cases, you can skip integration and reference the geometry directly in Grasshopper instead ποΈ
Just pass the geometry β either as a Geometry π§ or Object π§© β straight into the Preview Design component π This lets you visualize your Design using custom shapes without embedding them into the Typeβs definition π
π Weβll explore this option in a later step. β οΈ Just note: this method is for visualization only β the geometry wonβt be part of the mold itself
π§ͺ Switching the Representation
As introduced earlier, when you give a Type its shape in Semio, youβre attaching a Representation β
a piece of geometry that shows what the brick looks like visually ποΈBut this geometry isnβt fixed β it acts more like a placeholder π§
That means you can change or swap the Representation at any time without breaking your design logic πYou can think of it like a costume for your Type π
The name, role, and connections stay the same β youβre just changing how it looks on stage π¬This flexibility is especially useful when working across different levels of detail in a project π§©
Just like architects might use blocky volumes for urban massing ποΈ
and detailed profiles for close-ups or fabrication πͺ
Semio lets you swap the look without changing the logic π
Same brick β different shell π‘π¬ One Brick, various Representations
To illustrate this concept, we created two geometry files for the same brick mold Type:
This version uses the fully detailed geometry of the piece πͺ΅
A rectangle cut at an angle and extruded into a realistic wooden profile βοΈ
It includes every visible detail in 3D: full depth, edges, and joinery-ready shapes π
Best for:
- πͺ Joinery and production planning
- π Material-specific outputs
- πΌοΈ Detailed documentation and renders
This version is a flat sheet simplification π
A single-surface geometry that represents the general size of the piece π
It captures only one dimension and skips all 3D detail π«
Use this when:
- π Only the 2D footprint is known
- βοΈ The full shape is not finalized yet
- β‘ You need fast previews or early-stage coordination
This version is a bounding box simplification π¦
A simple block that approximates the pieceβs volume β
It includes two dimensions but omits exact geometry π§
Best for:
- π§ͺ Early-stage layouts and feasibility checks
- βοΈ Quick iterations and high-speed previews
- π§ Placeholder geometry before final detailing
Even though these two Representations look very different
They both belong to the same Type βThe Name, Variant, Ports, and logic stay exactly the same
Only the appearance changes πThis means you can design and assemble everything using lightweight placeholders π§©
Then swap in the detailed version when youβre ready for presentation, communication, or fabrication π§°This separation of logic and form is what makes Semio workflows flexible, scalable, and robust π
From early concept to detailed design to collaborative development π€β Add Snapping Points (Ports - Po)
Once your brick mold has a visual shape β its Representation β
the next step is to define how it connects to other bricksThatβs what Ports are for π§²
They act as snap points that tell Semio where and how a brick can attach to othersπ§© What Do You Need to Define a Port?
In the Semio Grasshopper plugin, each Port is defined with three main inputs:
-
π·οΈ Port ID (
Id
)
A unique name for the Port β like a tag or label used to connect it later
Examples:"n"
,"bottom"
,"hingePoint"
-
π Point (
Pt
)
The exact spot where the connection happens β like placing a stud on a LEGO brick π§±
You place this carefully on your geometry, right where the snapping should occur -
β‘οΈ Vector (
Dr
)
The direction the Port faces β telling Semio which way the brick will connect π
Itβs what lets Semio rotate and align the bricks correctly when snapping them together
π Port Location (
Pt
)When modeling Ports, itβs not just about where pieces touch β
itβs about building a clear and reusable logic that works across all Variants π§ πHereβs how to define your Ports effectively:
-
π§± Choose stable, meaningful locations
Choose positions that are geometrically logical β like the center of a face, an edge midpoint, or a corner π§©
Avoid placing them randomly β symmetry and regular patterns help your logic stay clean β»οΈ -
π Keep positions consistent across Variants
Even if your bricks differ in size or shape, place Ports in the same relative location π
This way, your connection rules stay valid across all versions of a Type π§° -
π― Donβt worry about perfect alignment
Ports donβt need to be exactly placed.
Semio lets you adjust each Pieceβs position and rotation after snapping π οΈ
So prioritize clear logic over micrometer precision π
Thereβs no strict rule for how many Ports to add β it depends on how much flexibility your system requires:
- π Fewer Ports β simpler, more controlled snapping
- π More Ports β more layout options and greater orientation flexibility
- π§ Plan ahead β add Ports you might need later, even if theyβre not used right away
π In our example, we place four Ports β one at the center of each edge of a four-sided profile π§±
π‘ Port Direction (Dr)
Every Port needs a direction β a vector that tells Semio which way the connection should face π§
This is how Semio knows how to align and snap your Pieces together correctly π§²Hereβs how to define Port directions clearly:
-
π Use clean, simple vectors
Stick to basic axes like X, Y, or Z relative to the face the Port sits on. It makes snapping easier and logic more readable π§
Avoid random or diagonal directions unless needed -
β»οΈ Be consistent across Variants
Ports donβt need to be perfectly precise β but they must stay consistent
This ensures all your bricks connect correctly no matter the shape or version π§
π In our example, each Port faces straight out β perpendicular to the edge itβs placed on π
π·οΈ Port ID (Id)
A Port ID is the name you give to each Port π·οΈ
This name is how Semio knows which Port to connect when snapping Pieces togetherFor example, you might say:
βConnect the
top
Port of Piece A to thebottom
Port of Piece BβYou can use any naming system β as long as itβs clear and consistent:
- Common examples:
n
,s
,e
,w
β for north, south, east, and west π§ - Custom names:
top
,bottom
,hinge
,plug
,windowDock
, etc. π§²
π‘ Tip: Pick a naming system thatβs easy to understand and stick to it
It helps you stay organized and makes teamwork or AI assistance much easier π€Together with the Pt (position) and Dr (direction), the Id completes each Port definition:
Each row in the three lists defines one Port β so all lists must be the same length to stay in sync π§©Now you can see how the three inputs β Id, Pt, and Dr β work together to create Ports. Each Port is defined by one entry from each list, so the lists must be the same length. This ensures that every snapping point has a matching ID, position, and direction
-
π§± Assemble the Mold (Model Type)
Once youβve defined all parts of your brick mold
the Name, Variant, Ports, and Representation
you can assemble them using theModel Type
component (Typ
) π§°Hereβs what you plug in:
- π·οΈ Name β the shared identity of the mold (e.g.
"Profile"
) - π’ Variant β the specific version number (e.g.
"2"
) - π§² Ports β the snapping points and directions (e.g.
n
,s
,e
,w
) - π§ Representation β the geometry that defines the brickβs shape
π― The result is a complete Type
A reusable brick mold that carries both shape and connection logicFor example,
Typ("Profile", 2)
creates Variant2
of the"Profile"
mold
a 2-unit-long brick ready to be placed in your Design π§±- π·οΈ Name β the shared identity of the mold (e.g.
𧬠Create Mold Versions (Variants of Type)
Now that youβve created your base Type, itβs time to generate Variants β based on the unit count n
shown in the sketch π’
Each Variant is built from the same mold, just stretched or scaled to a different length π
Think of it like longer or shorter LEGO bricks of the same kind π§±
Since they follow the same logic and structure, we treat them as Variants of one Type β not separate Types β»οΈ
Examples from our sketch:
Variant 2
β 2 units long π©π©Variant 4
β 4 units long π©π©π©π©Variant 5
β 5 units long π©π©π©π©π©
π Modeling a Variant
β What Stays the Same
- π·οΈ Type name β youβre still using the same underlying mold
π What Changes?
- π’ Variant name β a unique label like
2
,4
, or5
to distinguish the version - π§ Representation β new geometry that reflects the Variantβs shape or size
- π§² Ports β same logic, but positioned relative to the new shape
π οΈ Modeling Steps
- π·οΈ Set the Type name (same as the original mold)
- π’ Assign a new Variant name
- π§ Attach the Representation β the geometry for this Variant
- π§² Add the Ports β positioned consistently
- π§± Use the
Model Type
component to combine everything into a complete Variant
β Thatβs it β same mold, new shape, fully ready for modular design
π‘ Advanced Tip: Use Clusters to Generate Variants
In Grasshopper, a great way to handle multiple Variants is with a Cluster
Since most Variants share the same logic and differ by only one or two parameters, a Cluster helps you:
- π Model the logic once
- β‘ Generate all Variants efficiently
- π§Ό Keep your script clean and modular
Inside the Cluster:
You define the full logic:
- π§ Generate and export geometry
- π Link the exported file via
Model Representation
- π§² Place Ports using
Model Port
- π§± Create the Variant using
Model Type
Outside the Cluster:
You only feed in the changing inputs:
- π
n
β the unit count (e.g. 2, 4, 5) - π·οΈ Variant name β often also
n
- π Directory of the GH file
- π Export toggle
Inside the Cluster:
You define the full modeling logic directly, without saving external files:
- π§ Generate geometry
- π§² Place Ports using
Model Port
- π§± Create the Variant using
Model Type
Outside the Cluster:
Only the changing parameters are connected:
- π
n
β the unit count (e.g. 2, 4, 5) - π·οΈ Variant name β often also
n
β Bonus: This workflow keeps your file organized, scalable, and easy to expand β perfect for growing your Kit later on π§©