Integraph

Parametric sketcher

Dimension and geometric constraints on ACS section geometry — persisted locks, arc radius locking, vertex drag with live constraint enforcement, and conflict resolution.

Overview

The ACS parametric sketcher extends the concrete section canvas with dimensional and geometric constraints that survive editing, page refresh, and analysis re-runs. Constraints are stored as first-class records in the database — not as ephemeral UI state — so a locked dimension or angle stays locked across sessions.

Stage 2 of the parametric sketcher epic (#3506) adds four capabilities to the ACS canvas:

  • Persisted dimension, angle, and radius locks — constraint records saved to the database and restored on page load.
  • Arc radius locking — a dedicated Lock radius toggle that fixes an arc’s radius as a dimensional constraint.
  • Vertex drag with live enforcement — dragging a vertex triggers a per-frame rough-solve that keeps all active constraints satisfied as you move.
  • Constraint conflict and status UX — a conflict dialog, a status chip in the canvas header, and the shared Constraint List Panel for managing the active constraint set.

Persisted locks

Dimension locks

A dimension lock pins the distance between two vertices (or between a vertex and an edge) to a fixed value. The lock is identical in behaviour to the GCS linear dimension constraint — the solver propagates the fixed distance whenever adjacent geometry moves.

To add a dimension lock on the ACS canvas:

  1. Shift-click two vertices (or one vertex and one edge) to select them.
  2. Click Lock dimension in the floating action bar, or press L.
  3. Type the target distance in the dimension label that appears on the canvas.

The lock is saved immediately as a constraint record. It persists across page refreshes and is visible in the Constraint List Panel.

Angle locks

An angle lock pins the interior angle at a vertex (the angle between two edges meeting at that vertex) to a fixed value. Select a vertex and click Lock angle, or Shift-click the two edges that meet at the vertex and choose Lock angle from the action bar.

The constraint record stores the target angle; the solver maintains it as surrounding geometry is edited.

Arc radius locks

An arc radius lock pins an arc segment’s radius to its current value, preventing it from changing as adjacent vertices or edges are modified. This is useful when a fillet radius must remain exact (e.g. a cover-radius requirement) while the surrounding rectilinear frame is dimensioned independently.

To lock a radius:

  1. Click the arc segment to select it.
  2. Click the Lock radius toggle in the arc property panel (padlock icon), or press R.

Unlocking restores the arc to a free-radius state — the radius is free to change with the adjacent geometry.

:::note Migration note: Dimension, angle, and radius locks created before 2026-07-17 were stored as ephemeral React state and were lost on page refresh. Locks created on or after 2026-07-17 are persisted as constraint records and survive refresh. If you had locks in a section created before this date, re-add them after the update. :::

Vertex dragging with live constraint enforcement

Dragging a vertex on the ACS canvas triggers a VertexDragSession — a per-frame rough-solve that keeps all active constraints satisfied while the drag is in progress. The solver runs a lightweight forward pass on each pointer-move event, adjusting connected geometry to honour locks before rendering the updated preview.

Refuse-not-clamp for arcs

When dragging a vertex adjacent to an arc produces a configuration where the chord length would exceed the arc’s diameter (chord > 2R), the drag is refused rather than clamped. The vertex snaps back to its last valid position and a brief toast explains the constraint.

This follows the §874 principle — returning a geometrically inconsistent arc (e.g. one whose mid-point diverges from the computed centre) is worse than refusing the move. The toast identifies the arc and suggests either reducing the locked radius or moving the endpoint less aggressively.

Constraints honoured during drag

All constraint types active in the section are enforced per frame:

  • Locked dimensions and angles are re-satisfied after each pointer move.
  • Arc radius locks hold the radius fixed; the arc centre shifts to accommodate the moved endpoint.
  • Coincident constraints keep coupled vertices co-located.

If the rough-solve cannot satisfy all constraints within the per-frame budget, the drag step is refused and the section reverts to the previous valid state. No partial or inconsistent geometry is displayed.

Constraint status and conflict UI

Status chip

The canvas header shows a constraint status chip that summarises the sketch’s constraint health at a glance:

ChipMeaning
Under-constrained (grey)One or more degrees of freedom are unconstrained.
Well-constrained (green)All geometry is fully constrained.
Conflicting (red)At least one constraint conflicts with another.

The chip updates live as constraints are added, modified, or removed.

Conflict dialog

When a new constraint conflicts with the existing set, the Conflict dialog opens before the constraint is applied:

  1. The incoming constraint is highlighted on the canvas.
  2. The conflicting existing constraints are listed with their current values.
  3. Choose Remove to remove one of the existing constraints and apply the new one, or Cancel to discard the new constraint.

The incoming constraint is named by what it locks and where — for example Distance 600.0 mm on edge 1, Angle 90.0° at vertex 3, or Radius lock on edge 2. Edges and vertices are numbered from 1, matching the E1, E2, … and node labels the canvas draws when Element numbers or Node numbers is enabled.

No constraint is ever silently discarded. Every conflict requires an explicit decision.

Constraint List Panel

The Constraint List Panel (accessible from the left sidebar’s Constraints tab) lists every active constraint with its type glyph, current state badge, and controls for editing or removing it.

ColumnDescription
GlyphVisual icon for the constraint type (padlock, double arrow, equals sign, etc.)
State badgeSatisfied (green) / driven (grey) / conflicting (red)
ValueFor dimensional constraints: current or locked value. Editable for driving dimensions.
DeleteRemove the constraint; the constrained geometry is freed.

The panel is the same shared component used across GCS and LGS, so the vocabulary (glyphs, badge colours, driven-toggle behaviour) is consistent across all tools.

Keyboard shortcuts

KeyAction
LLock dimension (after selecting two vertices or a vertex + edge)
ALock angle (after selecting a vertex or two edges)
RLock / unlock arc radius (after selecting an arc)
DeleteRemove selected constraint
ESCCancel in-progress constraint placement

Tips

  • Add dimension locks after you are satisfied with the rough geometry — the solver propagates from the locked value, not from the current position.
  • Use arc radius locks early when fillets must meet a cover specification; they prevent the radius drifting when you resize the surrounding frame.
  • The status chip is the fastest way to check whether the sketch is fully constrained before running an analysis. A well-constrained section produces identical geometry every time the section is loaded, regardless of which template or drag history produced the initial shape.
  • If a drag is refused because chord > 2R, either unlock the radius lock and increase it to allow the new endpoint position, or reduce the drag magnitude to stay within the arc’s geometric envelope.

Next steps

  • Constraint types — the full GCS constraint vocabulary applies to ACS: parallel, perpendicular, coincident, equal-length, equal-radius, midpoint, tangent, and symmetric constraints are all available from the Constraints tab.
  • Section geometry — drawing and editing the base geometry before applying constraints.
  • Reinforcement — placing and configuring longitudinal bars after the geometry is constrained.