Geometry Reference
This page covers the core geometry-building constructs commonly used in FCS models: vertices, curves, areas, volumes, shells, layers, gclasses, gblocks, and distributions.
Practical tip: build geometry from small, named parts. Clear names like
v1,cNorth,aRoof, orgcColumnmake later debugging much easier in both FLI and generated outputs.
Vertex
Vertices define points in space.
vertex {v1} xyz 0 0 0
vertex {v2} xyz 10 0 0
vertex {v3} xyz 10 8 0
vertex {v4} xyz 0 8 0
These are typically used as the endpoints for curves or as corners for polygonal boundaries.
Gotcha: expressions need parentheses
If a coordinate contains an expression, wrap it in parentheses.
vertex {v1} xyz 0 0 (height + offset) # CORRECT
vertex {v1} xyz 0 0 height + offset # WRONG — parser misinterprets
More examples
vertex {topLeft} xyz 0 wallHeight 0
vertex {roofPeak} xyz (span / 2) wallHeight roofRise
vertex {offsetPt} xyz (x0 + dx) (y0 + dy) (z0 + dz)
Practical tip: whenever you are tempted to write anything more complex than a literal number in
xyz, use parentheses immediately.
Curve
Curves connect vertices. They can represent simple straight segments or more complex edge definitions.
Straight line
curve {c1} vertex {v1} {v2}
Filleted polygon
curve {c2} filletedpoly radiusmultiplier 0 vertexes {v1} {v2} {v3} {v4} {v1} fillets 1 1 1 1 1
This form is useful for closed outlines, especially when corner treatment matters.
Notes
- Vertex order matters.
- Repeating the first vertex at the end closes the loop in polygon-style definitions.
- Fillet settings must line up with the listed corners/segments.
Example: rectangle boundary from individual edges
curve {cBottom} vertex {v1} {v2}
curve {cRight} vertex {v2} {v3}
curve {cTop} vertex {v3} {v4}
curve {cLeft} vertex {v4} {v1}
Area
Areas define planar faces bounded by curves.
area {a1} boundary curve +1 +2 +3 +4
The + sign indicates forward curve direction.
Direction matters
Boundary orientation must be consistent. If one segment is reversed relative to the loop, use - for that curve reference.
area {a2} boundary curve +1 +2 -3 +4
Practical tip: if an area fails to build, check curve direction before assuming the vertices are wrong.
Typical workflow
- Define vertices
- Define curves between them
- Define an area using those curves in loop order
Volume (Prism)
Volumes represent 3D solids. A common pattern is a prism between two areas.
volume {vol1} prism {topArea} {bottomArea} layer (myLayer)
When to use
Use a prism when you already have top and bottom faces and want a straightforward volumetric body.
Example
volume {coreVolume} prism {aTop} {aBottom} layer (concreteLayer)
Practical tip: keep area names descriptive (
aTop,aBottom,aRoof,aSlab) so prism definitions are readable at a glance.
Shell (Surface element)
Shells attach a layer or analysis/visual meaning to an area-based surface.
shell {sh1} area {a1} layer (myLayer)
Typical uses
- slabs
- wall surfaces
- roof surfaces
- facade panels
Example
shell {shRoof} area {aRoof} layer (roofLayer)
shell {shFacade} area {aFacade} layer (glassLayer)
Layer (visual styling)
Layers typically control visual styling such as color and can also help organize model outputs.
layer {myLayer} color Red
layer {roofLayer} color SaddleBrown
Example set
layer {wallLayer} color LightGray
layer {roofLayer} color SaddleBrown
layer {glassLayer} color SkyBlue
Practical tip: assign layers early. It makes exported scenes easier to inspect and helps distinguish structural parts during onboarding and debugging.
GClass / GBlock Composition
gclass lets you reference reusable geometry definitions from other FCS files. gblock places instances of those reusable definitions into the current model.
GClass
gclass {gcFence} filename "fence.fcs"
GBlock placement
gblock {gbFence1} gclass {gcFence} lcs { Origin={0,0,0}, Axes=GCS.Axes }
gblock {gbFence2} gclass {gcFence} lcs { Origin={5,0,0}, Axes=GCS.Axes } parameters { height := 2.5 }
gblock {gbOptional} gclass {gcWindow} lcs {...} if (hasWindow)
What these parts mean
gclass— reusable component definitiongblock— a placed instance of that componentlcs— local coordinate system for placement/orientationparameters— per-instance overridesif (...)— conditional inclusion
Reuse example
gclass {gcColumn} filename "column.fcs"
gblock {gbCol1} gclass {gcColumn}
lcs { Origin={0,0,0}, Axes=GCS.Axes }
parameters { height := 3.5 }
gblock {gbCol2} gclass {gcColumn}
lcs { Origin={6,0,0}, Axes=GCS.Axes }
parameters { height := 3.5 }
Practical tip: use gclasses for anything repeated or shared across files. It reduces duplication and makes later parameter tuning much faster.
Parameter-block note
Inside parameters { ... }, stay mindful of assignment syntax. In onboarding examples you may see lazy-style declarations used for overrides, but in object/config contexts you generally need to be precise about whether the block expects parameter assignment semantics.
Distribution (Repeated elements)
A distribution is a compact way to place repeated geometry or components.
distribution {dCols} gclass {gcColumn}
lcs { Origin={0,0,0}, Axes=GCS.Axes }
transformation translation direction {1,0,0}
repetitions spacings (columnSpacings)
What it does
- starts from an initial
lcs - applies a transformation repeatedly
- uses a spacing list or repetition definition to place copies
Typical pattern
columnSpacings := [5, 5, 5, 5]
distribution {dCols} gclass {gcColumn}
lcs { Origin={0,0,0}, Axes=GCS.Axes }
transformation translation direction {1,0,0}
repetitions spacings (columnSpacings)
This can create a regularly spaced line of columns or panels with much less code than individual gblock placements.
Practical tip: put spacing values into a named variable like
columnSpacingsso they can be reused, inspected in FLI, and changed without touching the distribution block.
Example: Simple Rectangular Surface
layer {wallLayer} color LightGray
vertex {v1} xyz 0 0 0
vertex {v2} xyz 10 0 0
vertex {v3} xyz 10 8 0
vertex {v4} xyz 0 8 0
curve {c1} vertex {v1} {v2}
curve {c2} vertex {v2} {v3}
curve {c3} vertex {v3} {v4}
curve {c4} vertex {v4} {v1}
area {a1} boundary curve +1 +2 +3 +4
shell {sh1} area {a1} layer (wallLayer)
Example: Raised Geometry with Expressions
height := 3.2
offset := 0.4
vertex {v1} xyz 0 0 (height + offset)
vertex {v2} xyz 10 0 (height + offset)
vertex {v3} xyz 10 8 (height + offset)
vertex {v4} xyz 0 8 (height + offset)
Note the parentheses around each computed Z value.
Common Gotchas
- Missing parentheses in coordinates cause parser confusion.
- Wrong boundary direction can break area creation.
- Unclear naming makes later FLI inspection painful.
- Repeated manual placements should often become
distributionorgclass+gblock. - Forgotten layers make scene debugging harder.
Best Practices
- Name geometry consistently:
v*,c*,a*,sh*,vol*. - Build from simple to complex: vertex → curve → area → shell/volume.
- Use layers to improve visual clarity.
- Reuse sub-models via
gclassandgblock. - Use
distributionfor repeated patterns. - Wrap coordinate expressions in parentheses every time.
Quick Reference
# Vertex
vertex {v1} xyz 0 0 0
# Curve
curve {c1} vertex {v1} {v2}
# Area
area {a1} boundary curve +1 +2 +3 +4
# Shell
shell {sh1} area {a1} layer (myLayer)
# Volume
volume {vol1} prism {topArea} {bottomArea} layer (myLayer)
# Layer
layer {myLayer} color Red
# Reuse
gclass {gcPart} filename "part.fcs"
gblock {gb1} gclass {gcPart} lcs { Origin={0,0,0}, Axes=GCS.Axes }
# Repetition
distribution {d1} gclass {gcPart}
lcs { Origin={0,0,0}, Axes=GCS.Axes }
transformation translation direction {1,0,0}
repetitions spacings ([2, 2, 2])