Facets and Tiers
Facet commands translate the numbers you type into actual cuts. When you enter a line such as P1 0 @ 41.8 : 0.18 x8, you first describe one reference facet (P1 0 @ 41.8 : 0.18) and then immediately tell the studio to rotate it eight times (x8). Together, that single line defines the whole tier. This chapter spells out how the reference facet is evaluated and how symmetry turns it into a complete ring of facets.
Describe the reference facet
Every facet statement starts by naming the tier (P1, PF2, Break), optionally choosing a side (up for crown, down for pavilion), and giving an index. The index is the gear tooth where the reference facet begins, so it must be a whole number. If you omit up/down, the studio keeps the previous choice; crown tiers (C, T) default to up, pavilion tiers (P) default to down, and everything else keeps whatever you last typed.
Prefer the single index form for normal cutting. When you need to force a handful of specific teeth (for example, an asymmetric outline), you can pass an explicit index set with brackets [4, 7, 11] instead of one number. In that mode the interpreter ignores symmetry completely and cuts exactly the indices you list, in order, so you leave off any xN or xxN modifier. The first element of the set is still treated as the “base” index for mp()/gp() and other meetpoint/girdle lookups. These explicit index sets will appear surrounded by brackets (e.g., [4, 7, 11]) in the printable instructions to distinguish them from standard symmetrical tiers.
Cut tiers before you reference them. Point helpers and edge lookups only work after the relevant facets exist, so keep the cut order and the reference order aligned.
Aim the reference facet
Once the tier, side, and base index are set, you provide one of three specifiers:
- Angle + depth – supply both values and the studio cuts to that exact combination. Use a variable (e.g.
size) for 90° cuts (girdle facets) to explicitly set the distance from the center. - Angle + point – pick an angle and let a point helper decide the depth.
- Point pair – specify two points and the studio slices a plane that touches both, which is ideal for matching opposing facets.
The key idea: the tier/side/index plus specifier only define a single, precise facet at the stated index. The tier becomes complete the moment you append symmetry (x8, xx6, etc.), because those modifiers rotate or mirror that one facet without re-aiming it.
Symmetry builds the tier
After the specifier, symmetry modifiers (xN, xxN) tell the studio how to copy the reference facet around the stone:
xNrotates the reference facet every360 / Ndegrees. The first rotation uses the index you typed; subsequent facets are pure rotations of that plane.xxNmirrors each rotated facet, creating alternating clockwise/counter-clockwise mates for designs that need paired faces.
Important: The studio never “hunts” for meet points when it replicates a tier. It evaluates the reference facet once—using your tier, side, index, and aiming instructions—and then performs exact rotations (and optional mirrors) to fill out the tier. No meetpoints are searched; the reference facet is simply rotated from the base index you specified. No extra math, no iterative refinement, no automatic adjustments.
The result is a full facet tier: the first facet establishes the geometry, symmetry copies it, and modifiers (below) tweak presentation.
Modifiers that follow the specifier
| Modifier | What it does |
|---|---|
xN / xxN | Apply symmetry. x8 rotates the facet every 360/8 degrees. xx8 produces mirrored pairs. |
{ instruction: "..." } | Replace the auto-generated printable description. |
{ frosted: true } | Mark the facets in the printable diagrams. It also affects the raytracer (still experimental). |
Modifiers can appear in any order after the main specifier.
Functional Style Alternative
We designed FSL to be a clean specification language that suffices for most typical gemstone designs, and a fully functional programming approach for handling complex edge cases. We intentionally try to hide the "programming language" aspects as much as possible for users who don't need them.
However, for those who prefer a more strict and familiar programming style, FSL provides explicit lambda-style functions to perform cutting operations. These functions map exactly to the three specifier types listed above.
They provide the exact same functionality, but use a standard function call syntax with parentheses and commas:
TierAD(tier_name, index, angle, depth, symmetry?, options?)- Equivalent to Angle + depth cuts.TierAP(tier_name, index, angle, point, symmetry?, options?)- Equivalent to Angle + point cuts.TierPP(tier_name, index, p1, p2, symmetry?, options?)- Equivalent to Point pair cuts.
The options object can take the same properties (notes maps to the instruction, side takes "up" or "down", and frosted takes a boolean). By offering both, you can seamlessly drop into a rigid programming model when writing complex macros, while keeping your high-level designs uncluttered.