Skip to content

Grids and snapping

DrawingGridConfiguration configures one grid interval shared by rendering and snapping. Visibility and snapping are independent. DiagramGridPattern controls appearance without changing that interval.

DrawingGridConfiguration

dart
DrawingGridConfiguration({
  bool visible = false,
  bool snap = false,
  double size = 20,
  DiagramGridPattern pattern = DiagramGridPattern.layered,
})

DrawingGridConfiguration copyWith({
  bool? visible,
  bool? snap,
  double? size,
  DiagramGridPattern? pattern,
})
PropertyTypeDefaultContract
visibleboolfalsePaint the grid. Does not enable snapping.
snapboolfalseEnable grid snapping. Does not require a visible grid.
sizedouble20World-space interval, normalized on construction and copyWith.
patternDiagramGridPatternDiagramGridPattern.layeredImmutable composition of paint layers.

copyWith returns a new configuration; omitted or null arguments preserve existing values. All four properties are final.

Size normalization

The implementation uses DiagramEditorSettings.normalizeGridSize(double value) and exposes these constants:

ConstantTypeValue
minimumGridSizedouble4
maximumGridSizedouble128
gridSizeStepdouble4

Finite inputs are divided by 4, rounded with Dart's round(), multiplied by 4, and clamped to [4, 128]. Non-finite inputs become 20; negative or zero finite inputs become 4. Normalization does not throw for those values.

DiagramGridPattern

dart
factory DiagramGridPattern({
  required String id,
  required String label,
  required Iterable<DiagramGridLayer> layers,
})
PropertyTypeRequirement
idStringNonempty after trimming and no leading/trailing whitespace.
labelStringNonempty after trimming.
layersList<DiagramGridLayer>Unmodifiable copy containing 1–16 layers.

Patterns compare by id, label, and ordered layer values, with a matching hashCode.

Static valueID / labelLayers
DiagramGridPattern.dotsdots / DotsOne default DiagramDotGridLayer.
DiagramGridPattern.lineslines / LinesOne default DiagramLineGridLayer.
DiagramGridPattern.layeredlayered / LayeredLines at interval 1, color 0xB8E5E5E5; lines at interval 5, color 0x9ED4D4D4.
DiagramGridPattern.presetsConstant list [dots, lines, layered].

Grid layers

DiagramGridLayer is sealed. Its concrete productions are dots, lines, and crosses:

dart
const DiagramDotGridLayer({
  int spacingMultiple = 1,
  DiagramColor color = const DiagramColor(0xFFCDD5E4),
  double size = 2,
})
const DiagramLineGridLayer({
  int spacingMultiple = 1,
  DiagramColor color = const DiagramColor(0xFFCDD5E4),
  double size = 1,
})
const DiagramCrossGridLayer({
  int spacingMultiple = 1,
  DiagramColor color = const DiagramColor(0xFFCDD5E4),
  double size = 3,
})
PropertyTypeDefaultMeaning / accepted range in a pattern
spacingMultipleint1Multiplies the shared world interval; 11024.
colorDiagramColorDiagramColor(0xFFCDD5E4)ARGB integer from 0 through 0xFFFFFFFF.
sizedoubleDot: 2; line: 1; cross: 3Screen-space dot diameter, line stroke width, or cross arm length. Must be finite, > 0, and <= 32.

Layer values compare by concrete type and all three properties. Validation occurs when constructing DiagramGridPattern, which throws ArgumentError for invalid identity, label, layer count, spacing, size, or color. Layer constructors themselves do not perform this pattern validation.

Example

dart
final pattern = DiagramGridPattern(
  id: 'cross-and-major-lines',
  label: 'Crosses and major lines',
  layers: const [
    DiagramCrossGridLayer(size: 3),
    DiagramLineGridLayer(
      spacingMultiple: 5,
      color: DiagramColor(0x99CDD5E4),
    ),
  ],
);

session.setConfiguration(session.configuration.copyWith(
  grid: session.configuration.grid.copyWith(
    visible: true,
    snap: true,
    size: 20,
    pattern: pattern,
  ),
));

See custom grid patterns for a canvas example. Rotation snapping uses DrawingConfiguration.rotationSnapDegrees rather than the grid configuration.