How to Use build123d Selectors for Topology in text-to-cad
text-to-cad embeds selectable topology information—including edges, faces, and custom selector meshes—inside GLB artifacts using the add_step_topology helper in cadpy/glb.py, enabling the CAD Viewer to perform edge-level picking and highlighting through the selectorView buffer.
The text-to-cad repository provides a sophisticated pipeline for converting STEP files into web-ready GLB models with interactive topology support. By leveraging build123d selectors for topology, developers can embed lightweight selector meshes that map specific geometric features—such as mounting holes or flange edges—to interactive UI elements. This capability is implemented through the cadpy package, which writes selector data directly into GLB extensions for consumption by the CAD Viewer. High-level integration patterns are documented in skills/cad/references/build123d-modeling.md, which details how the CAD skill invokes the GLB builder with topology flags enabled.
Understanding the Selector Topology Pipeline
The topology system centers on the add_step_topology function located in viewer/packages/cadpy/src/cadpy/glb.py. This utility writes a dedicated selector buffer—internally referred to as the I23d selector layer—into the GLB's STEP_topology extension. When you enable selector topology, the builder creates a selectorView manifest that maps selector IDs to specific mesh primitives, allowing the CAD Viewer to resolve user clicks to exact geometric entities like individual edges or named face groups.
The selector geometry remains physically separate from the main render mesh. According to the source code, this separation ensures that selector meshes (often rendered as lines or thin planes) do not penalize standard rendering performance while still providing barycentric-encoded edge IDs for precise hover detection.
Configuring StepArtifactSpec for Selector Output
To initiate the selector workflow, you must first define a StepArtifactSpec that declares your intent to generate topology data. This specification object, imported from cadpy.step_artifact, acts as the blueprint for the GLB generation process.
The critical flags for enabling build123d selectors are topology=True and selector=True. When both are set, the pipeline understands that the output GLB must contain the selectorView extension alongside the standard geometry buffers.
from cadpy.step_artifact import StepArtifactSpec
from pathlib import Path
spec = StepArtifactSpec(
cad_ref="my_part",
step_path=Path("models/my_part.stp"),
output_format="glb",
topology=True,
selector=True,
)
Building GLB Files with Selector Topology
Once your specification is defined, you can generate the GLB using either the high-level API or the low-level builder functions. Both approaches require the include_selector_topology=True parameter to ensure the I23d selector buffer is written to the final artifact.
High-Level API: build_glb
The simplest approach uses the build_glb function from cadpy.glb. This method accepts your StepArtifactSpec and handles the entire conversion pipeline, including the injection of selector meshes.
from cadpy.glb import build_glb
glb_path = build_glb(
spec,
include_selector_topology=True,
)
When include_selector_topology is enabled, build_glb internally invokes add_step_topology to append the selectorView buffer to the GLB's STEP_topology extension.
Low-Level API: add_step_topology
For scenarios requiring manual control—such as adding selectors to existing GLB files or customizing the selector manifest—you can use the add_step_topology function directly. This approach requires constructing a SelectorBundle that encapsulates both the manifest metadata and the selector mesh geometry.
from cadpy.glb import add_step_topology, SelectorBundle
bundle = SelectorBundle(
manifest={"selectorView": {"version": 1}},
selector_meshes=my_selector_meshes, # List of (name, trimesh) pairs
)
add_step_topology(
glb_path,
bundle,
include_selector_topology=True,
)
Viewer Integration and Validation
The CAD Viewer automatically detects and consumes the selectorView extension when present in the GLB. As documented in packages/cadpy/docs/render-pipeline.md, the viewer's render pipeline reads the STEP_topology extension to map selector IDs to interactive UI elements, enabling features like edge-highlighting on hover and custom dropdown menus for named selectors (e.g., "mount_holes" or "flange_edges").
Validation of the selector topology occurs in viewer/packages/cadpy/src/cadpy/step_targets.py. This module raises a missing_selector_topology error if the selectorView extension is absent when selectors are requested, ensuring that downstream components receive the expected topological data.
Summary
- build123d selectors for topology are embedded via the
add_step_topologyhelper inviewer/packages/cadpy/src/cadpy/glb.py. - Enable selector generation by setting
topology=Trueandselector=Truein yourStepArtifactSpec. - Pass
include_selector_topology=Truetobuild_glboradd_step_topologyto write the I23d selector layer. - The viewer consumes selector data through the
selectorViewbuffer inside theSTEP_topologyGLB extension. - Validate selector presence using the logic in
step_targets.pyto prevent runtime errors in the CAD Viewer.
Frequently Asked Questions
What is the I23d selector layer?
The I23d selector layer is the internal name for the selector mesh buffer embedded within GLB artifacts. According to the text-to-cad source code, this layer contains lightweight geometry—often lines or thin planes encoded with barycentric edge IDs—that enables the CAD Viewer to perform precise edge-level picking without affecting the main model's rendering performance.
How does the selectorView extension work?
The selectorView extension is a JSON manifest stored within the GLB's STEP_topology extension block. It maps unique selector IDs to specific mesh primitives, allowing the CAD Viewer to translate user interactions (like mouse clicks) into selections of specific geometric entities such as individual edges or named face groups.
Can I add selectors to existing GLB files?
Yes. Using the low-level add_step_topology API, you can inject selector topology into pre-existing GLB binaries. Construct a SelectorBundle containing your selectorView manifest and selector mesh geometry, then call add_step_topology with include_selector_topology=True to append the data.
Where is selector topology validated?
Selector topology validation occurs in viewer/packages/cadpy/src/cadpy/step_targets.py. This module checks for the presence of the selectorView extension and raises a missing_selector_topology error if the selector data is absent when required by the viewer configuration.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →