5.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
OpenNest is a Windows desktop application for CNC nesting — arranging 2D parts on material plates to minimize waste. It imports DXF drawings, places parts onto plates using rectangle-packing algorithms, and can export nest layouts as DXF or post-process them to G-code for CNC cutting machines.
Build
This is a .NET 8 solution using SDK-style .csproj files targeting net8.0-windows. Build with:
dotnet build OpenNest.sln
NuGet dependency: ACadSharp 3.1.32 (DXF/DWG import/export), System.Drawing.Common 8.0.10.
No test projects exist in this solution.
Architecture
Three projects form a layered architecture:
OpenNest.Core (class library)
Domain model, geometry, and CNC primitives organized into namespaces:
- Root (
namespace OpenNest): Domain model —Nest→Plate[]→Part[]→Drawing→Program. ANestis the top-level container. EachPlatehas a size, material, quadrant, spacing, and contains placedPartinstances. EachPartreferences aDrawing(the template) and has its own location/rotation. ADrawingwraps a CNCProgram. Also contains utilities:Helper,Align,Sequence,Timing. - CNC (
CNC/,namespace OpenNest.CNC):Programholds a list ofICodeinstructions (G-code-like:RapidMove,LinearMove,ArcMove,SubProgramCall). Programs support absolute/incremental mode conversion, rotation, offset, bounding box calculation, and cloning. - Geometry (
Geometry/,namespace OpenNest.Geometry): Spatial primitives (Vector,Box,Size,Spacing,BoundingBox,IBoundable) and higher-level shapes (Line,Arc,Circle,Polygon,Shape) used for intersection detection, area calculation, and DXF conversion. - Converters (
Converters/,namespace OpenNest.Converters): Bridges between CNC and Geometry —ConvertProgram(CNC→Geometry),ConvertGeometry(Geometry→CNC),ConvertMode(absolute↔incremental). - Math (
Math/,namespace OpenNest.Math):Angle(radian/degree conversion),Tolerance(floating-point comparison),Trigonometry,Generic(swap utility),EvenOdd. Note:OpenNest.MathshadowsSystem.Math— useSystem.Mathfully qualified where both are needed. - Collections (
Collections/,namespace OpenNest.Collections):ObservableList<T>,DrawingCollection. - Quadrant system: Plates use quadrants 1-4 (like Cartesian quadrants) to determine coordinate origin placement. This affects bounding box calculation, rotation, and part positioning.
OpenNest.Engine (class library, depends on Core)
Nesting algorithms. NestEngine orchestrates filling plates with parts.
- RectanglePacking/:
FillBestFit(single-item fill, tries horizontal and vertical orientations),PackBottomLeft(multi-item bin packing, sorts by area descending). Both operate onBin/Itemabstractions. - CirclePacking/: Alternative packing for circular parts.
NestItem: Input to the engine — wraps aDrawingwith quantity, priority, and rotation constraints.BestCombination: Finds optimal mix of normal/rotated columns for grid fills.
OpenNest (WinForms WinExe, depends on Core + Engine)
The UI application with MDI interface.
- Forms/:
MainForm(MDI parent),EditNestForm(MDI child per nest), plus dialogs for plate editing, auto-nesting, DXF conversion, cut parameters, etc. - Controls/:
PlateView(2D plate renderer with zoom/pan),DrawingListBox,DrawControl,QuadrantSelect. - Actions/: User interaction modes —
ActionSelect,ActionAddPart,ActionClone,ActionFillArea,ActionZoomWindow,ActionSetSequence. - IO/:
DxfImporter/DxfExporter(via ACadSharp library),NestReader/NestWriter(custom ZIP-based format with XML metadata + G-code programs),ProgramReader. - Post-processing:
IPostProcessorplugin interface loaded from DLLs in aPosts/directory at runtime.
File Format
Nest files (.zip) contain:
info— XML with nest metadata and plate defaultsdrawing-info— XML with drawing metadata (name, material, quantities, colors)plate-info— XML with plate metadata (size, material, spacing)program-NNN— G-code text for each drawing's cut programplate-NNN— G-code text encoding part placements (G00 for position, G65 for sub-program call with rotation)
Tool Preferences
Always use Roslyn Bridge MCP tools (mcp__RoslynBridge__*) as the primary method for exploring and analyzing this codebase. It is faster and more efficient than file-based searches. Use it for finding symbols, references, diagnostics, type hierarchies, and code navigation. Only fall back to Glob/Grep when Roslyn Bridge cannot fulfill the query.
Code Style
- Always use
varinstead of explicit types (e.g.,var parts = new List<Part>();notList<Part> parts = new List<Part>();).
Key Patterns
- OpenNest.Core uses multiple namespaces:
OpenNest(root domain),OpenNest.CNC,OpenNest.Geometry,OpenNest.Converters,OpenNest.Math,OpenNest.Collections. ObservableList<T>provides ItemAdded/ItemRemoved/ItemChanged events used for automatic quantity tracking between plates and drawings.- Angles throughout the codebase are in radians (use
Angle.ToRadians()/Angle.ToDegrees()for conversion). Tolerance.Epsilonis used for floating-point comparisons across geometry operations.