From 78a8a2197da6e162f2d0f350c8dcf2ccd495c3ae Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Wed, 18 Feb 2026 06:20:13 -0500 Subject: [PATCH] feat: add FabWorks.Core shared library with entity models and FormProgram Co-Authored-By: Claude Opus 4.6 --- ExportDXF.sln | 42 ++++++++++++++ FabWorks.Core/Data/FabWorksDbContext.cs | 76 +++++++++++++++++++++++++ FabWorks.Core/FabWorks.Core.csproj | 17 ++++++ FabWorks.Core/Models/BomItem.cs | 22 +++++++ FabWorks.Core/Models/CutTemplate.cs | 31 ++++++++++ FabWorks.Core/Models/ExportRecord.cs | 18 ++++++ FabWorks.Core/Models/FormProgram.cs | 20 +++++++ 7 files changed, 226 insertions(+) create mode 100644 FabWorks.Core/Data/FabWorksDbContext.cs create mode 100644 FabWorks.Core/FabWorks.Core.csproj create mode 100644 FabWorks.Core/Models/BomItem.cs create mode 100644 FabWorks.Core/Models/CutTemplate.cs create mode 100644 FabWorks.Core/Models/ExportRecord.cs create mode 100644 FabWorks.Core/Models/FormProgram.cs diff --git a/ExportDXF.sln b/ExportDXF.sln index 24040fd..6f84954 100644 --- a/ExportDXF.sln +++ b/ExportDXF.sln @@ -9,24 +9,66 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EtchBendLines", "EtchBendLi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "netDxf", "EtchBendLines\netDxf\netDxf\netDxf.csproj", "{785380E0-CEB9-4C34-82E5-60D0E33E848E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FabWorks.Core", "FabWorks.Core\FabWorks.Core.csproj", "{24547EE4-2EAA-4A6C-AD94-1117C038D8CD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Debug|x64.ActiveCfg = Debug|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Debug|x64.Build.0 = Debug|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Debug|x86.ActiveCfg = Debug|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Debug|x86.Build.0 = Debug|Any CPU {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Release|Any CPU.ActiveCfg = Release|Any CPU {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Release|Any CPU.Build.0 = Release|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Release|x64.ActiveCfg = Release|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Release|x64.Build.0 = Release|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Release|x86.ActiveCfg = Release|Any CPU + {05F21D73-FD31-4E77-8D9B-41C86D4D8305}.Release|x86.Build.0 = Release|Any CPU {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|x64.ActiveCfg = Debug|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|x64.Build.0 = Debug|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|x86.ActiveCfg = Debug|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|x86.Build.0 = Debug|Any CPU {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|Any CPU.ActiveCfg = Release|Any CPU {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|Any CPU.Build.0 = Release|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|x64.ActiveCfg = Release|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|x64.Build.0 = Release|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|x86.ActiveCfg = Release|Any CPU + {229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|x86.Build.0 = Release|Any CPU {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|x64.ActiveCfg = Debug|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|x64.Build.0 = Debug|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|x86.ActiveCfg = Debug|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|x86.Build.0 = Debug|Any CPU {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|Any CPU.ActiveCfg = Release|Any CPU {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|Any CPU.Build.0 = Release|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|x64.ActiveCfg = Release|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|x64.Build.0 = Release|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|x86.ActiveCfg = Release|Any CPU + {785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|x86.Build.0 = Release|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Debug|x64.ActiveCfg = Debug|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Debug|x64.Build.0 = Debug|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Debug|x86.ActiveCfg = Debug|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Debug|x86.Build.0 = Debug|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Release|Any CPU.Build.0 = Release|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Release|x64.ActiveCfg = Release|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Release|x64.Build.0 = Release|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Release|x86.ActiveCfg = Release|Any CPU + {24547EE4-2EAA-4A6C-AD94-1117C038D8CD}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FabWorks.Core/Data/FabWorksDbContext.cs b/FabWorks.Core/Data/FabWorksDbContext.cs new file mode 100644 index 0000000..c0a16fc --- /dev/null +++ b/FabWorks.Core/Data/FabWorksDbContext.cs @@ -0,0 +1,76 @@ +using FabWorks.Core.Models; +using Microsoft.EntityFrameworkCore; + +namespace FabWorks.Core.Data +{ + public class FabWorksDbContext : DbContext + { + public DbSet ExportRecords { get; set; } + public DbSet BomItems { get; set; } + public DbSet CutTemplates { get; set; } + public DbSet FormPrograms { get; set; } + + public FabWorksDbContext(DbContextOptions options) : base(options) { } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.DrawingNumber).HasMaxLength(100); + entity.Property(e => e.SourceFilePath).HasMaxLength(500); + entity.Property(e => e.OutputFolder).HasMaxLength(500); + entity.Property(e => e.ExportedBy).HasMaxLength(100); + entity.Property(e => e.PdfContentHash).HasMaxLength(64); + + entity.HasMany(e => e.BomItems) + .WithOne(b => b.ExportRecord) + .HasForeignKey(b => b.ExportRecordId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.ID); + entity.Property(e => e.ItemNo).HasMaxLength(50); + entity.Property(e => e.PartNo).HasMaxLength(100); + entity.Property(e => e.Description).HasMaxLength(500); + entity.Property(e => e.PartName).HasMaxLength(200); + entity.Property(e => e.ConfigurationName).HasMaxLength(100); + entity.Property(e => e.Material).HasMaxLength(100); + + entity.HasOne(e => e.CutTemplate) + .WithOne(ct => ct.BomItem) + .HasForeignKey(ct => ct.BomItemId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(e => e.FormProgram) + .WithOne(fp => fp.BomItem) + .HasForeignKey(fp => fp.BomItemId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.DxfFilePath).HasMaxLength(500); + entity.Property(e => e.CutTemplateName).HasMaxLength(100); + entity.Property(e => e.ContentHash).HasMaxLength(64); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.ProgramFilePath).HasMaxLength(500); + entity.Property(e => e.ContentHash).HasMaxLength(64); + entity.Property(e => e.ProgramName).HasMaxLength(200); + entity.Property(e => e.MaterialType).HasMaxLength(50); + entity.Property(e => e.UpperToolNames).HasMaxLength(500); + entity.Property(e => e.LowerToolNames).HasMaxLength(500); + entity.Property(e => e.SetupNotes).HasMaxLength(2000); + }); + } + } +} diff --git a/FabWorks.Core/FabWorks.Core.csproj b/FabWorks.Core/FabWorks.Core.csproj new file mode 100644 index 0000000..a82a833 --- /dev/null +++ b/FabWorks.Core/FabWorks.Core.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + disable + disable + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + diff --git a/FabWorks.Core/Models/BomItem.cs b/FabWorks.Core/Models/BomItem.cs new file mode 100644 index 0000000..863eb47 --- /dev/null +++ b/FabWorks.Core/Models/BomItem.cs @@ -0,0 +1,22 @@ +namespace FabWorks.Core.Models +{ + public class BomItem + { + public int ID { get; set; } + public string ItemNo { get; set; } = ""; + public string PartNo { get; set; } = ""; + public int SortOrder { get; set; } + public int? Qty { get; set; } + public int? TotalQty { get; set; } + public string Description { get; set; } = ""; + public string PartName { get; set; } = ""; + public string ConfigurationName { get; set; } = ""; + public string Material { get; set; } = ""; + + public int ExportRecordId { get; set; } + public virtual ExportRecord ExportRecord { get; set; } + + public virtual CutTemplate CutTemplate { get; set; } + public virtual FormProgram FormProgram { get; set; } + } +} diff --git a/FabWorks.Core/Models/CutTemplate.cs b/FabWorks.Core/Models/CutTemplate.cs new file mode 100644 index 0000000..9a268fb --- /dev/null +++ b/FabWorks.Core/Models/CutTemplate.cs @@ -0,0 +1,31 @@ +using System; + +namespace FabWorks.Core.Models +{ + public class CutTemplate + { + public int Id { get; set; } + public string DxfFilePath { get; set; } = ""; + public string ContentHash { get; set; } + public string CutTemplateName { get; set; } = ""; + + private double? _thickness; + public double? Thickness + { + get => _thickness; + set => _thickness = value.HasValue ? Math.Round(value.Value, 8) : null; + } + + public double? KFactor { get; set; } + + private double? _defaultBendRadius; + public double? DefaultBendRadius + { + get => _defaultBendRadius; + set => _defaultBendRadius = value.HasValue ? Math.Round(value.Value, 8) : null; + } + + public int BomItemId { get; set; } + public virtual BomItem BomItem { get; set; } + } +} diff --git a/FabWorks.Core/Models/ExportRecord.cs b/FabWorks.Core/Models/ExportRecord.cs new file mode 100644 index 0000000..90dfd79 --- /dev/null +++ b/FabWorks.Core/Models/ExportRecord.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace FabWorks.Core.Models +{ + public class ExportRecord + { + public int Id { get; set; } + public string DrawingNumber { get; set; } + public string SourceFilePath { get; set; } + public string OutputFolder { get; set; } + public DateTime ExportedAt { get; set; } + public string ExportedBy { get; set; } + public string PdfContentHash { get; set; } + + public virtual ICollection BomItems { get; set; } = new List(); + } +} diff --git a/FabWorks.Core/Models/FormProgram.cs b/FabWorks.Core/Models/FormProgram.cs new file mode 100644 index 0000000..feaa03f --- /dev/null +++ b/FabWorks.Core/Models/FormProgram.cs @@ -0,0 +1,20 @@ +namespace FabWorks.Core.Models +{ + public class FormProgram + { + public int Id { get; set; } + public string ProgramFilePath { get; set; } = ""; + public string ContentHash { get; set; } + public string ProgramName { get; set; } = ""; + public double? Thickness { get; set; } + public string MaterialType { get; set; } = ""; + public double? KFactor { get; set; } + public int BendCount { get; set; } + public string UpperToolNames { get; set; } = ""; + public string LowerToolNames { get; set; } = ""; + public string SetupNotes { get; set; } = ""; + + public int BomItemId { get; set; } + public virtual BomItem BomItem { get; set; } + } +}