Skip to content

🧱 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 🧩

πŸ“€ sketch drawing

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 πŸ› οΈ

  1. 🏷️ 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 πŸͺ΅


  2. 🧊 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 unit
    • n β†’ 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 Grasshopper

    This 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 parameters n and W
    which define the brick’s length and width πŸ“

    πŸ“ Geometry Generation


    πŸ’Ύ 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:

    πŸ“€ Export Geometry


    πŸ—‚οΈ Set the Export Location

    Use the Dir and Path 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:

    πŸ“€ Exported file



    πŸ”— Referencing the Exported File

    The exported file (e.g. profile_2.glb) is linked to the Ur 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 the Ur 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

    πŸ“ Reference Geometry


    πŸ” 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 Sketchpad


    πŸ§ͺ 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 πŸ”

    πŸ“ Switch Representation
    πŸ“ Filename

    Best for:

    • πŸͺš Joinery and production planning
    • πŸ“ Material-specific outputs
    • πŸ–ΌοΈ Detailed documentation and renders

    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 🀝

  3. βš“ 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 bricks

    That’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

    πŸ“ Ports


    πŸ“ 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 together

    For example, you might say:

    β€œConnect the top Port of Piece A to the bottom 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

  4. 🧱 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 the Model 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

    πŸ“ Model Type
    πŸ“ Model Type


    🎯 The result is a complete Type
    A reusable brick mold that carries both shape and connection logic

    For example, Typ("Profile", 2)
    creates Variant 2 of the "Profile" mold
    a 2-unit-long brick ready to be placed in your Design 🧱


🧬 Create Mold Versions (Variants of Type)

πŸ“€ sketch drawing

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, or 5 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
  1. 🏷️ Set the Type name (same as the original mold)
  2. πŸ”’ Assign a new Variant name
  3. 🧊 Attach the Representation β€” the geometry for this Variant
  4. 🧲 Add the Ports β€” positioned consistently
  5. 🧱 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

πŸ“ Variant GIF

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

πŸ“ Cluster

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

πŸ“ Cluster
πŸ“ Cluster


βœ… Bonus: This workflow keeps your file organized, scalable, and easy to expand β€” perfect for growing your Kit later on 🧩