← Back to the EFFIBLUE portal
User guide — non-specialist

Multi-Part Vector Generator

Automatically tile several types of rectangular parts onto a Ginestium™ disc, respecting a safety margin and a cutting clearance (kerf) — then produce manufacturing files (SVG, DXF, Gerber), with an optional serial number and orientation marker engraved directly into the layout. This guide explains the placement algorithm's principle, what it assumes, and how to read its results without being a developer.

Tool: Multi-Part Vector Generator Version covered: 13.3.1 Disc diameter: 1 – 300 mm
00

In short

You have a Ginestium™ disc of a given size and one or more types of rectangular parts to cut out of it (up to 200 types) — each with its own W × H dimensions and a desired quantity. The tool computes where to place each part to fit as many as possible, while respecting a safety margin at the disc's edge and a spacing (kerf) between neighbouring parts for the blade or beam that will cut them.

The result exports to SVG, DXF, or Gerber, ready for manufacturing — optionally with a serial number and an orientation marker engraved in the margin, without ever encroaching on the parts themselves.

01

What it's for

Unlike the portal's thermal tools, which simulate physics, this one solves a purely geometric problem: how many W × H rectangles can fit inside a circle of a given radius, without overlapping or spilling over — and exactly where, so that the cutting file is directly usable. It's the step that follows a part's design (a serpentine drawn in the Meander Generator, for instance, or a simple geometry) and precedes physical cutting: it turns "I need N parts of this size" into a ready-to-engrave disc layout.

The placement itself — the search that decides where each part goes — and the generation of the final files are computed and secured server-side. A Numba JIT (just-in-time compiled) kernel resolves a layout of several hundred parts in a few tens to a few hundred milliseconds, despite a search that brute-forces a large number of candidate positions (see §09).

02

How it works

Stacking types from largest to smallest

When several part types are requested, the tool does not place them in the order you entered them: it first sorts them by decreasing area, then places them one type at a time, largest to smallest. Every part already placed becomes an obstacle for the following types.

type 1 (large) + type 2 (medium) + type 3 (small)
Schematic representation (not to scale): large parts are the most constraining to fit, so placing them first, on a still-empty disc, gives them the most room to manoeuvre. Small parts, easier to slide into gaps, then come and fill what's left.

A regular grid, slid into place

For a given part type (W × H), the tool doesn't test random positions: it lays down a regular grid with a pitch of (W + kerf) × (H + kerf) — the spacing that guarantees a kerf's worth of cutting clearance between two neighbouring parts of the same type — then slides that grid (an offset) to find the position that fits the most cells at once, both inside the usable disc and outside the parts already placed. A first, coarse search sweeps a grid of candidate offsets; if a part type is already placed, or if "Evolutionary" mode is active, a second pass refines that offset over a finer area around the best one found.

Among offsets that fit the same number of parts, the tool prefers the one that centres the layout best — a simple tie-breaker, not an aesthetic goal in its own right.

Global rotation turns the whole layout as one block

Rotation (0°, 45°, 90°, or a free angle) turns the entire placement grid — and therefore every part, across all types — in a single move. It never applies to a single type in isolation: to orient one type differently from the others, you have to declare it as a second part type, with W and H swapped.

03

The model's assumptions

Rectangular parts, never automatically flipped

The algorithm never tests a W×H orientation against H×W for the same part to better fill a gap: each type keeps the orientation you entered, modulo the global rotation which applies to the whole disc. To explore both orientations of the same part, you must create two types with the dimensions swapped.

A regular grid, not a genetic algorithm despite the name "Evolutionary"

"Evolutionary" mode refines the same grid search in two passes; it does not evolve a population of solutions through selection, mutation, or crossover. Detail and nuance in the nota bene (§10).

The margin is also the engraving zone, not dead space

The ring between the disc's edge and the usable radius (diameter/2 − margin) serves as an exclusion zone for parts, but also as a home for the serial number and the orientation marker, engraved inside that ring — so it isn't simply wasted space.

Spacing guaranteed by the grid pitch, within a single type

For two adjacent parts of the same type, the centre-to-centre gap (W + kerf) leaves exactly kerf of cutting clearance. Between two parts of different types that end up neighbouring each other, the tool only checks that they don't overlap, with a half-kerf margin — not a systematic full kerf. Detail in §09, step 4.

Diameter and margin frozen at compute time

These values are read once, when "Optimise & Generate" is launched; changing them afterwards does not affect an already-computed layout until generation is run again.

An "unlimited" quantity is still capped internally

A quantity of ∞ is not truly unlimited: the engine treats it as a maximum of 9999 parts for that specific type, and the total number of parts placed, across all types, is itself capped (see §04).

04

Limits

05

How to use it, step by step

  1. Set up the support disc — diameter, edge clearance (safety margin), cut width (kerf).
  2. Choose the global rotation — 0°, 45°, 90°, or a custom angle, applied to the whole layout.
  3. Declare the part types — square or rectangle, W × H dimensions, quantity (∞ unlimited, 0 no part placed, N exact).
  4. Set up S/N engraving, if needed — 13-character number, text height, number of copies distributed in a circle, angular offset of the first copy.
  5. Set up the orientation marker, if needed — ▲ triangle at one of four predefined angular positions.
  6. Choose the algorithm mode and precision — Grid (fast) or Evolutionary (finer search), number of iterations.
  7. Run "Optimise & Generate" — the placement computation runs server-side; the preview and statistics update on return.
  8. Read the results, then export — SVG, DXF, or Gerber (chosen layers, combined or separate as a zip), and optionally save the project as JSON.
06

Reading the results

Parts placed
Total number of parts actually fitted onto the disc, across all types.
Fill rate
Total area of the parts divided by the usable disc area (radius diameter/2 − margin), in %.
Part types
Number of declared types — not the number of parts placed.
Covered area
Sum of the areas (W × H) of all placed parts, in mm².
Placed / Requested
Parts actually placed compared to the total quantity requested (∞ counted as "everything that could be placed" in that total).
Per-type label
In the parts list: number placed out of quantity requested for that specific type, colour-coded.
07

Serial number engraving & orientation marker

The serial number, a text that follows a circle

The serial number (13 characters, normally produced by the Serial Number Generator and starting with "G") runs along an arc located in the safety margin, at a distance from the edge set by the chosen text height. It can be repeated 1, 2, 3, or 4 times, distributed evenly around the disc, with an adjustable starting angular offset — handy so the number stays legible whatever orientation the part ends up in on the workbench.

The marker triangle

The orientation marker is a small solid triangle, also positioned in the margin, at one of four predefined orientations (0°, 45°, 180°, 12.5°) — this last, deliberately non-round value lets you unambiguously tell a manufacturing marker apart from a plain decorative element if you come across it in isolation on a finished part. The triangle has no measurement function: it's a visual cue for orienting the part correctly during assembly.

G01QZ25100042 marker 0° usable radius
The serial number (purple, on the arc) and the marker triangle (yellow, at the top) share the same margin ring — they're added to the parts without ever covering them, since they stay outside the usable radius that bounds the placement.

Preview vs. manufacturing

The on-screen SVG preview draws the serial number with a system font, for comfortable reading; the Gerber file, on the other hand, engraves each character with a "stroke font" — a set of segments a laser or a tip can follow directly, with no fill. Both trace the same text, at the same position, but the exact shape of the characters differs slightly between the two renderings — see §09, step 8.

08

Export & sharing

SVG (full vector) — the exact drawing shown on screen, colours and labels included, for viewing or editing in a vector editor.

DXF (AutoCAD) — the disc and each part's outline (one layer named TYPE_n per type), without kerf, margin, S/N, or marker: a raw geometric plan for CAD.

GBR (Gerber, configurable) — up to 5 independently selectable layers: disc + centre, part outlines, saw paths, S/N engraving, orientation marker. Combined into a single file, or exported separately as a zip archive — useful for laser passes at different depths per layer.

Project (.efb.json) — all the tool's settings (disc, parts, S/N, marker, algorithm), not the placement results, named after the serial number. Reimports identically.

09

The calculations, formula by formula

This section is the guide's technical reference: it describes the calculations actually executed by the server-side kernel (Numba JIT compiled). It isn't necessary for using the tool.

Notation

D , r
disc diameter and radius r = D/2
e_r
usable radius = r − margin
W , H
width/height of a part type; hw, hh = W/2, H/2
kerf
cut width, added between neighbouring parts
ox , oy
offset of a type's placement grid
θ
global rotation angle

Step 1 — Sorting types by area

(1)area = W · H sort by decreasing area, before any placement computation
Why this formula

This is the classic "largest first" heuristic of rectangle bin-packing: large parts are the most constraining to fit, so placing them first, on a still-empty disc, gives them the most room to manoeuvre. Small parts, easier to slide into gaps, then come and fill what's left (§02).

Step 2 — A type's candidate grid

(2)step_x = W + kerf step_y = H + kerf n_x = ceil(r / step_x) + 1 n_y = ceil(r / step_y) + 1 for i ∈ [−n_x, n_x], j ∈ [−n_y, n_y]: (lx, ly) = (i·step_x + ox, j·step_y + oy) local frame, not rotated (gx, gy) = rotation of (lx, ly) by θ disc's global frame
Why this formula

The grid is built in a local frame aligned with the part (not with the disc), then rotated as one block by θ at the very end: that's what guarantees parts stay orthogonal to each other regardless of the chosen global angle, rather than having to recompute a tilted grid. The +1 on n_x and n_y adds a margin row to the explored area, so the search isn't cut off exactly at the usable radius's edge.

Step 3 — Usable-disc membership test

(3)for each of the 4 corners (±hw, ±hh) of the rectangle, rotated and translated to (gx, gy): valid if distance to centre ≤ e_r, for all 4 corners at once
Why test all 4 corners rather than just the centre

A rotated rectangle can have a corner outside the usable circle even when its centre sits well inside. Testing all 4 corners is the conservative test that guarantees no part ever spills over, even slightly — at the cost of discarding a few positions that, by centre alone, would have looked valid.

Step 4 — Overlap test against already-placed parts

(4)in the frame rotated by θ, for an already-placed part p: dx, dy = projection of the centre-to-centre gap along (cos θ, sin θ) overlap if |dx| < hw + hw_p + kerf/2 AND |dy| < hh + hh_p + kerf/2
Why kerf/2 here, and not a full kerf

Within a single type, it's the grid pitch from step 2 (step = W + kerf) that already guarantees a full kerf between two neighbouring parts — this test has nothing more to check. This test (4) only comes into play between parts of different types, which don't share the same grid and must therefore be compared directly: it guarantees a minimum half-kerf gap between them, not systematically a full kerf. A nuance worth knowing if you're placing very different-sized types next to each other and the cutting clearance matters down to a tenth of a millimetre.

Step 5 — Choosing the offset that maximises the fill

(5)Phase 1 (coarse), p1 trials per axis: Grid : p1 = max(10, min(prec, 40)) Evolutionary : p1 = max(8, prec / 2) Phase 2 (fine, around the best offset from phase 1): triggered if a type is already placed, OR in Evolutionary mode Grid : p2 = max(15, prec) Evolutionary : p2 = floor(prec × 1.5) winning offset = the one that fits the most valid cells; ties broken by minimising |ox| + |oy| (the most centred)
Why a two-phase search

The coarse phase locates the right offset zone without testing the full resolution everywhere; the fine phase then refines locally around the best candidate found. This is a deliberate computational saving, not an exhaustive search of every possible offset — see the nota bene (§10) for what this changes between Grid and Evolutionary modes.

Step 6 — Final sort and truncation to the requested quantity

(6)candidates sorted by increasing distance to centre hypot(cx, cy) then truncated to the first N (N = requested quantity, or 9999 if ∞)
Why sort by distance to centre

At equal fill, preferring positions close to the centre leaves peripheral positions — more constrained by the disc's edge — available for the following types, which statistically need them more.

Step 7 — Fill rate

(7)rate = ( Σ W·H of placed parts ) / ( π · e_r² )

Step 8 — Serial number and marker, in polar coordinates

(8)midR_marker = e_r − textH / 2 triangle's radius baseR_S/N = e_r − textH base radius of the engraved text angle(copy i) = offset + (i / copies) × 360°, i = 0 … copies−1
Why these two radii differ

The marker triangle is centred on its own radius (midR), while the serial number's text is anchored at its base (baseR) and then drawn outward over a height of textH — the two elements thus occupy neighbouring but distinct rings, never overlapping regardless of the chosen text height. Each S/N character is then traced along the arc with a "stroke font" vector typeface dedicated to Gerber engraving (pure segments, no fill) — see §07.

10

Nota bene — "Evolutionary" mode is not a genetic algorithm

Nota bene

The name can be misleading: "Evolutionary" mode does not evolve a population of solutions through selection, mutation, and crossover, as a true evolutionary or genetic algorithm would. It's the same grid-search algorithm as "Grid" mode (§09, steps 2 to 5), with two measurable differences and nothing more.

What actually changes between the two modes

BehaviourGridEvolutionary
Fine phase (2 of step 5) for the very first type placednot triggeredalways triggered
Fine phase for subsequent typestriggeredalways triggered
Grid size p1 (coarse phase)max(10, min(prec, 40))max(8, prec / 2)
Grid size p2 (fine phase)max(15, prec)floor(prec × 1.5)

Concretely, the only real difference for a disc with a single part type is the systematic triggering of the fine phase in Evolutionary mode: in Grid mode, that single part only benefits from the coarse search, for lack of an obstacle to avoid that would justify a refinement. As soon as a second part type comes into play, both modes run both phases — only the search grid sizes keep differing.

The trade-off worth knowing

Because "Evolutionary" refines systematically, it costs more computation time for a gain that's only significant on tight configurations — little free space left, a single part type, a large kerf relative to the parts' size. On a disc well below its packing capacity, both modes generally converge to the same result, and the name "Evolutionary" shouldn't suggest a smarter or more exhaustive search — only a more locally persistent one.

11

Small glossary of units

mm disc diameter, margin, kerf, a part's W × H dimensions mm² area covered by the placed parts % fill rate ° global rotation, marker's angular position, S/N angular offset iter. precision iterations of the offset search char. characters in the serial number (13 maximum)