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, or gcColumn make 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

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

  1. Define vertices
  2. Define curves between them
  3. 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

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

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

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 columnSpacings so 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

Best Practices

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])