140 Commits

Author SHA1 Message Date
AJ
ee5c20bc8b Add factory pattern for engine creation
Replace hard-coded engine instantiation with factory pattern
to enable dependency injection and improve testability.

Changes:
- IEngineFactory: Interface for creating engines
- EngineFactory: Default implementation using AdvancedFitEngine
- MultiBinEngine: Now accepts IEngineFactory via constructor

This eliminates the hard-coded dependency on AdvancedFitEngine
and allows for easy swapping of engine implementations through
configuration or dependency injection.

Benefits:
- Dependency inversion principle satisfied
- Engines can be mocked in tests
- Engine selection can be configured externally
- Single responsibility for engine creation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 17:43:22 -05:00
AJ
9abd00487b Add Result pattern for standardized error handling
Implement Result<T> and Result classes to provide type-safe,
functional error handling throughout the application. This
eliminates the need for exceptions as control flow and provides
a consistent way to communicate success/failure.

Features:
- Result<T> for operations that return values
- Result for operations without return values
- Map() method for functional composition
- IsSuccess/IsFailure properties for easy checking

This pattern enables cleaner service contracts and eliminates
the need for out parameters and exception handling boilerplate.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 17:43:12 -05:00
AJ
c7c841acab Extract business logic into dedicated service layer
Create CutListService and DocumentService to separate business
logic from UI concerns, following the service layer pattern.

Changes:
- CutListService: Handles bin packing algorithm orchestration
  and data transformation from UI models to domain models
- DocumentService: Handles document persistence and validation
- Document: Removed Save/Load/Validate methods (now pure POCO)
- MainForm: Refactored to delegate to service classes instead
  of containing business logic directly

Benefits:
- Improved separation of concerns
- Business logic can now be unit tested independently
- Removed MessageBox dependencies from business logic layer
- MainForm is now focused on UI concerns only

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:03:07 -05:00
AJ
703efd528a Encapsulate mutable collections in Bin and Result
Replace public mutable collection fields/properties with private
backing fields and expose them as IReadOnlyList. Add proper methods
for mutation (AddItem, AddItems, RemoveItem, SortItems).

Changes:
- Bin.Items: Now private with AddItem/AddItems/RemoveItem/SortItems
- Result.ItemsNotUsed: Now readonly with Add methods
- Result.Bins: Now readonly with Add methods
- Updated all engine classes to use new encapsulated APIs

This improves encapsulation and prevents external code from
bypassing business logic by directly manipulating collections.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:02:48 -05:00
AJ
2c6fe924e5 Remove useless catch-and-rethrow blocks in Toolbox
Remove empty catch-and-rethrow blocks in Load() and Save() methods
that were catching exceptions only to rethrow them without adding
any value. This improves code clarity and exception propagation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:02:36 -05:00
AJ
ee7275ac4f Fix state-mutating getter in LengthItem.Length
Remove dangerous side effect where the Length property getter
was modifying the LengthInputValue field. Property getters should
be pure and not cause state mutations, as this violates the principle
of least surprise and can cause issues with data binding, serialization,
and debugging.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:02:27 -05:00
AJ
2869daf4f7 Remove commented-out sanity check code in MultiBinEngine 2025-10-01 23:26:30 -04:00
AJ
b8612f72d7 Fix null reference risk in BestFitEngine 2025-10-01 23:25:43 -04:00
AJ
d64d5a8d53 Fix CreateDuplicateBins bug in AdvancedFitEngine 2025-10-01 23:23:12 -04:00
AJ
a4dfd8c0c4 Simplified BestCombination.FindFrom2 2025-10-01 23:17:34 -04:00
AJ
95b663c893 SyncDocumentFromUI 2025-10-01 23:09:00 -04:00
AJ
0fb54daf6f Duplicate bins when possible in AdvancedFitEngine 2025-01-11 00:02:01 -05:00
AJ
ccbf8beeae Allow quantity -1 for infinite. 2025-01-05 23:16:39 -05:00
AJ
a1ad16bc52 Document 2025-01-02 23:21:34 -05:00
AJ
1636a62a77 Refactored BinLayoutView 2025-01-02 23:20:48 -05:00
AJ
491b98f983 Added cancel option to load example data 2025-01-01 01:30:47 -05:00
AJ
08b3aa9182 Didnt like the name EnhancedBestFitEngine, new one isn't great either but it's better 2025-01-01 00:48:33 -05:00
AJ
913064f4f8 Load Example Data 2025-01-01 00:47:01 -05:00
AJ
8651465864 Refactored BestCombination.FindFrom2 2024-12-29 22:17:05 -05:00
AJ
58b3c49cc6 Added option to OpenFileAfterSave 2024-12-24 13:34:31 -05:00
AJ
90ae89802a BinFileSaver 2024-12-09 11:15:08 -05:00
AJ Isaacs
791eb23fc0 Show mixed fractions instead of decimals for output 2024-12-09 10:26:36 -05:00
AJ Isaacs
0b20ac5acf Fixed wrong name 2024-12-09 10:18:10 -05:00
AJ Isaacs
6c719f6ca5 Sort items from largest to smallest after packing 2024-12-09 10:17:06 -05:00
AJ Isaacs
1b2d7a004c Show inches as mixed fraction in ArchUnits 2024-12-09 10:16:07 -05:00
AJ Isaacs
26de4b885b Updated Newtonsoft.Json 2024-12-09 09:37:57 -05:00
AJ
d3ab49a7d2 Renamed Engine2 to EnhancedBestFitEngine 2023-03-01 21:59:24 -05:00
AJ
2ce685bb83 Added Toolbox to manage tools 2023-01-14 08:39:01 -05:00
AJ
2af0c5967f Show results windows maximized 2023-01-14 07:37:48 -05:00
AJ
eac422cba6 Fixed bin height when drawing BinLayoutView 2023-01-14 02:13:02 -05:00
AJ
9ae37ca10c Fixed method name DrawingRowNumbers to DrawRowNumbers 2023-01-13 06:43:37 -05:00
AJ
93f5571bbb BestCombination 2022-12-11 21:42:16 -05:00
AJ
b65dd1ec7d Used lower value priority bins first. 2022-02-09 11:22:56 -05:00
AJ
4427cde20d End edit for controls before running 2022-02-09 11:14:33 -05:00
AJ
804eedc649 Fixed DataSource reference. 2021-11-15 11:39:12 -05:00
AJ
a750fe0953 Fixed bin id increment twice. 2021-11-15 11:38:38 -05:00
AJ
497d1fc7fc Revised publish url 2021-11-15 09:27:05 -05:00
AJ
90d770e10c Fixed utilization greater than 100 percent 2021-11-15 09:10:20 -05:00
AJ
029414099e Remember save file name. 2021-11-15 08:46:46 -05:00
AJ
24cec30bf7 Set CutList as startup project. 2021-10-14 08:08:31 -04:00
AJ
f892a4096b Base class LengthItem
Item and BinInputItem are basically the same for accepting string input.
2021-10-14 08:06:29 -04:00
AJ
263ce9c0f4 Round inches when converting to feet / inches 2021-10-14 08:03:21 -04:00
AJ
495abe8cc3 Reordered methods within MainForm 2021-10-14 07:53:07 -04:00
AJ
5e12d8db9c LoadTools 2021-10-14 07:39:32 -04:00
AJ
fc557d2500 Cleanup 2021-10-07 09:12:38 -04:00
AJ
5af1daac11 DataGridView.DrawingRowNumbers 2021-10-07 09:10:34 -04:00
AJ
63fa51c5cd Display lengths in feet and inches 2021-10-05 09:25:39 -04:00
AJ
28d53e6d38 Multi-bin nesting 2021-10-05 09:24:05 -04:00
AJ
25b3cdcfdc Rename UIItem to Item 2021-10-04 19:16:51 -04:00
AJ
5f3d95a4c9 Renamed CutToLength to CutList 2021-10-04 19:12:37 -04:00