98d0124172 perf(core): add cached-triangulation collision and an edge-grid prefilter
Collision.HasOverlap re-triangulates both polygons on every call; Qwen
measured that as its dominant cost (over 400 s -> ~110 s on a 219-part
job once cached). TriangulatedRegion (from Qwen's TriSet) triangulates a
part once and takes translation as a parameter; it returns null when it
cannot decide so callers fall back to Collision, which stays the
reference. EdgeGridPolygon (from Qwen's FastPoly) certifies clearly
disjoint shells and never reports Clear for an overlap. A seeded harness
of 100,000 decisions (concave shapes, arcs, holes, touching contacts)
finds 0 mismatches against Collision.HasOverlap.

Co-Authored-By: Codex <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 10:08:36 -04:00
2016-05-16 22:09:19 -04:00

OpenNest

A Windows desktop application for CNC nesting — imports DXF drawings, arranges parts on material plates, and exports layouts as DXF or G-code for cutting.

OpenNest - parts nested on a 36x36 plate OpenNest - 44 parts nested on a 60x120 plate

Features

  • Import / export — DXF & DWG parts (ACadSharp), Excel BOMs, bend-line detection, built-in parametric shapes; export DXF or post-processed G-code.
  • Nesting — pluggable whole-job engines (Default, Strip, Vertical/Horizontal Remnant, StockLadder, plus DLL plugins), NFP-based interlocking pair evaluation, gravity compaction, rotation sweeps, multi-plate/multi-material jobs.
  • Plate operations — sheet cut-offs, oversized-part splitting (straight, weld-gap tabs, spike-groove), interactive editing.
  • CNC output — configurable lead-ins/outs and tabs, contour editing, user-defined G-code variables ($name → #200+ machine variables), plugin post-processors (Cincinnati CL-707/800/900/940/CLX included).

Requirements

  • Windows 10+ for the desktop app; the console, API, and most test projects build on Linux/macOS too.
  • .NET 8 SDK

Build, Test, Run

git clone https://git.thecozycat.net/aj/OpenNest.git
cd OpenNest
dotnet build OpenNest.sln                                       # full solution (Windows)
dotnet test OpenNest.Engine.Tests/OpenNest.Engine.Tests.csproj  # cross-platform engine tests
dotnet test OpenNest.Tests/OpenNest.Tests.csproj                # core/engine/IO/API tests
dotnet run --project OpenNest/OpenNest.csproj                   # desktop app (Windows)

OpenNest.WinForms.Tests (desktop-assembly tests) runs on Windows only. Format changed files with dotnet format OpenNest.sln --include <path>.

Quick start

  1. File > New Nest
  2. Import DXFs via the CAD Converter (layer/color filtering, bend detection, G-code preview) or create built-in shapes
  3. Define plate size, material, quadrant, spacing
  4. Fill — the engine arranges parts
  5. Optionally add cut-off lines, then save .nest, export DXF, or post-process to G-code

Command-Line Interface

dotnet run --project OpenNest.Console -- part.dxf --size 60x120               # fill one plate
dotnet run --project OpenNest.Console -- part1.dxf part2.dxf --size 60x120 --autonest
dotnet run --project OpenNest.Console -- project.zip                          # re-fill a nest file

Key options: --size WxL, --autonest (whole-job nesting), --engine <name> (jobs engine or fill strategy), --quantity, --spacing, --template <nest>, --output <path>, --check-overlaps, --post <name>, --no-save. Run without arguments for the full list.

Benchmarking Engines

OpenNest.Benchmark runs every registered INestingEngine against .nest files (or a JSON manifest of DXFs + quantities) and scores by salvage-credited sheet area, with a penalty per unplaced part.

dotnet run --project OpenNest.Benchmark -- ./benchmark-jobs \
  --sheet-sizes 48x96,60x120,72x120 --engines Default,StockLadder --csv results.csv

Layouts are validated (bounds, spacing, quantity, rotation, stock match); invalid runs place nothing and pay the penalty. --parallel (default 3) speeds up scoring but inflates Time(ms) — use --parallel 1 when comparing speed. Pass --sheet-sizes for an unbiased run; otherwise only each file's original sizes are offered. Custom engines drop in as DLLs implementing INestingEngine (public parameterless constructor) in an Engines/ folder next to the benchmark. Community engines live in OpenNest-Engines.

Project Structure

Project Purpose
OpenNest WinForms desktop app
OpenNest.Core Domain model, geometry, CNC primitives
OpenNest.Engine Nesting algorithms and whole-job contracts
OpenNest.IO DXF/DWG, .nest, G-code, BOM I/O; CAD import
OpenNest.Console Headless batch nesting
OpenNest.Api / .Data Programmatic pipeline; machine & cutting-parameter data
OpenNest.Gpu GPU-accelerated pair evaluation (ILGPU)
OpenNest.Benchmark Head-to-head engine comparison
OpenNest.Mcp MCP server for AI tool integration
OpenNest.Posts.Cincinnati Cincinnati laser post-processor plugin
*.Tests Cross-platform suites; WinForms tests are Windows-only

Nesting Engines

Jobs-only API: engines implement INestingEngine.Solve(NestJob); only NestJobRunner commits demand and stock, and every candidate passes the placement validator (bounds, spacing, rotation policy, stock match) before it consumes anything.

Engine Description
Default Multi-phase: linear fill → pairs → rect best-fit → extents
Strip Iterative shrink-fill for mixed-drawing layouts
Vertical / Horizontal Remnant Optimizes a clean remnant drop on one edge
StockLadder Whole-job, stock-constrained baseline with salvage-credit ranking

File Format

.nest files are ZIP archives: nest.json (metadata, plates, drawings, placements), programs/program-N (G-code per drawing), optional entities/, sub-programs, and cached best-fit data.

Supported Formats

Format Import Export
DXF Yes Yes
DWG Yes No
Excel BOM Yes No
G-code No Yes (post-processors)
.nest Yes Yes

Keyboard Shortcuts

Ctrl+F fill area · F zoom to fit · Shift+wheel / middle-click rotate · X/Y push · arrows nudge · Shift+arrow push.

Status & License

Actively developed; core workflows run end-to-end from DXF import to G-code. Contributions welcome. MIT licensed — see LICENSE.

S
Description
A Windows desktop app for CNC nesting — imports DXF drawings, arranges parts on plates and exports layouts as DXF or G-code for cutting.
Readme MIT
5.7 MiB
Languages
C# 99.7%
Jupyter Notebook 0.3%