bfd740c81e
feat(core): add FlangeShape with JSON preset loading
...
FlangeShape generates an outer circle with evenly-spaced bolt holes
on a bolt circle pattern. ShapeDefinition.LoadFromJson<T>() provides
generic JSON loading for any shape — no separate preset classes needed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 11:36:26 -04:00
dde07fc256
merge: resolve polylabel conflicts, keep remote version with hole support
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 09:02:30 -04:00
6e5471271d
feat(core): add RoundedRectangleShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:07:22 -04:00
0651f185e3
feat(core): add OctagonShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:06:21 -04:00
33377291a6
feat(core): add TShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:06:08 -04:00
dfd5a15274
feat(core): add TrapezoidShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:04:15 -04:00
09a7608bcb
feat(core): add IsoscelesTriangleShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:03:14 -04:00
92d2d6d2bc
feat(core): add RightTriangleShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:02:18 -04:00
641734ba70
feat(core): add RingShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 08:00:11 -04:00
5d0de4a1b1
feat(core): add CircleShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 07:59:26 -04:00
f92d09a863
feat(core): add RectangleShape
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 07:58:37 -04:00
29d58cc8af
test(engine): add integration smoke tests for engine refactor
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 22:39:51 -04:00
319eace472
refactor(engine): extract RemnantFiller for iterative remnant filling
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 22:33:00 -04:00
c8587929b5
refactor(engine): extract PairFiller from DefaultNestEngine
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 22:31:51 -04:00
a7f27480e9
refactor(engine): extract AngleCandidateBuilder from DefaultNestEngine
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 22:29:52 -04:00
094b1e9f00
refactor(engine): extract ShrinkFiller from StripNestEngine
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 22:28:24 -04:00
31dbbbeedc
refactor(engine): extract AccumulatingProgress from StripNestEngine
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 22:26:53 -04:00
909b697b78
test(geometry): add PolyLabel tests for L, C, triangle, thin rect, hole
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 20:42:49 -04:00
44657a86b8
feat(geometry): add PolyLabel algorithm with square test
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 20:40:25 -04:00
65bde123ed
fix(engine): fix remnant finder missing L-shaped and split remnants
...
Two bugs caused the remnant finder to miss valid empty regions:
1. RemoveDominated used an 80% overlap-area threshold that incorrectly
removed L-shaped remnants. A tall strip to one side would "dominate"
wide strips above/below it even though they represent different usable
space. Replaced with geometric containment check — only remove a box
if it's fully inside a larger one.
2. FindTieredRemnants split remnants at the obstacle envelope boundary,
and both pieces could fall below minDimension even though the original
remnant passed the filter (e.g., 6.6" remnant split into 5.35" + 1.25"
with minDim=5.38"). Added fallback to keep the original unsplit.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 20:03:23 -04:00
51b482aefb
test: add RemnantFinder edge cases and FillScore comparison tests
...
RemnantFinder: obstacle clipping, overlapping obstacles, iterative
workflow, grid pattern, no-overlap invariant, constructor/AddObstacles.
FillScore: count-vs-density ordering, operators, Compute edge cases.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-16 13:02:15 -04:00
f5ab070453
test: add RemnantFinder tests (red)
2026-03-16 12:44:53 -04:00
7d198f837c
feat: add PlateProcessor orchestrator
2026-03-16 00:44:25 -04:00
6dffd8f5ad
feat: add DirectRapidPlanner with line-shape intersection check
2026-03-16 00:43:06 -04:00
29b2572f9a
feat: add IRapidPlanner, RapidPath, and SafeHeightRapidPlanner
2026-03-16 00:39:34 -04:00
c1e21abd45
feat: add PartSequencerFactory
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-16 00:36:41 -04:00
edc81ae45e
feat: add AdvancedSequencer with row grouping and serpentine
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-16 00:36:07 -04:00
7edf6ee843
feat: add LeastCodeSequencer with nearest-neighbor and 2-opt
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-16 00:35:19 -04:00
f568308d1a
feat: add EdgeStartSequencer
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-16 00:32:35 -04:00
d0351ab765
feat: add directional part sequencers (RightSide, LeftSide, BottomSide)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-16 00:27:57 -04:00
00940d1b6e
chore: rename test project to OpenNest.Tests
...
Renamed OpenNest.Engine.Tests → OpenNest.Tests (directory, .csproj,
namespaces in all .cs files). Added OpenNest.IO project reference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-16 00:25:22 -04:00