Local Claude Code settings are machine-specific and should not be
version controlled. Added .claude/ to .gitignore.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move Revision from Drawing to ExportRecord so each export captures its own revision snapshot
- Add Hamming distance comparison for perceptual hashes (tolerance of 10 bits) to avoid false revision bumps
- Replace CoenM.ImageHash with inline DifferenceHash impl (compatible with ImageSharp 3.x)
- Increase PDF render DPI from 72 to 150 for better hash fidelity
- Add download-dxfs-by-drawing endpoint for cross-export DXF zip downloads
- Prefix DXF filenames with equipment number when no drawing number is present
- Pass original filename to storage service for standalone part exports
- Auto-start FabWorks.Api from ExportDXF client if not already running
- Add cut list modal with copy-to-clipboard in the web UI
- Update PDF hash on existing export records after upload
- Bump static asset cache versions to v3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a PDF hash is set on an export record, resolve or create the
associated Drawing and bump its revision if the content hash changed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce a Drawing table that tracks unique drawing numbers with their
current PDF content hash and revision counter. ExportRecord gains a
DrawingId FK. Includes a data migration to seed Drawings from existing
export records.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Render PDF page 1 to an image and compute a DifferenceHash instead of
SHA256 on raw file bytes. This ignores metadata/timestamp changes that
SolidWorks varies between exports, preventing false revision bumps on
Drawing entities.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SolidWorks re-exports produce files with identical geometry but different
entity ordering, handle assignments, style names, and floating-point
epsilon values. This caused hash mismatches and unnecessary API updates.
Uses ACadSharp to parse DXF entities and build canonical, sorted
signatures (LINE, ARC, CIRCLE, MTEXT) with coordinates rounded to 4
decimal places. Falls back to raw file hash if parsing fails.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a Description property to DrawingInfo that extracts the
descriptive text after the equipment/drawing number, excluding the
file extension. MainForm now sets the title box from this description
when no title was already set by the API history lookup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the duplicate export detail page and route exports list
directly to drawing detail. When navigating from exports, the
specific export's BOM items are shown via eid param; from drawings,
items are deduplicated to the latest revision. Add Rev column,
PDF download, and All DXFs download to drawing detail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ACadSharp misreads UTF-8 degree symbol (C2 B0) as two ANSI_1252
characters (°) then writes that back out. Post-process the saved
DXF to replace ° with ° so bend notes display correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes DXF files failing to open with "GroupTable dictionary was not
defined in NamedObject dictionary" error.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Updates submodule to include the yield break -> return lines fix
that was causing etch lines to be silently discarded.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add DELETE /api/exports/{id} endpoint with cascade delete, trash icon
buttons on both the exports list and export detail pages, and disable
browser caching for static files to prevent stale JS issues.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace dark blueprint theme with a clean light theme for better
readability. Bump all font sizes (10px labels to 12px, 13px body
text to 14px) and improve text contrast for users with reading
glasses. Icon colors now use CSS variables instead of hardcoded hex.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each export record now keeps a complete BOM snapshot instead of moving
BomItems between records. CutTemplate gains a Revision field that
auto-increments when the content hash changes across exports for the
same drawing+item, and stays the same when the geometry is unchanged.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Detach EquipmentBox event before programmatically setting equipment to
prevent async UpdateDrawingDropdownAsync from clearing the drawing
selection and duplicating entries. Also update ExportRecord.PdfContentHash
in StorePdfAsync so the web frontend can serve PDF downloads.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Delete old incremental migrations and regenerate a single
InitialCreate that creates all tables (ExportRecords, BomItems,
CutTemplates, FormPrograms) with current schema.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add equipmentOnlyRegex fallback so names like "5028 Prox switch bracket"
correctly extract equipment number 5028 even without a drawing number.
Handle null DrawingNo in ToString and UI dropdown population.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add static HTML/CSS/JS frontend with export browser, search, and
file download capabilities served via UseStaticFiles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace direct DB access with API client calls throughout MainForm,
DxfExportService, PartExporter, and Program. Add title field to UI,
async export flow, API-based dropdown loading, and file uploads.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add find-existing endpoint and upsert logic to POST so re-exporting
a part updates the existing BomItem rather than creating duplicates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add list/search, equipment/drawing number lookups, PDF hash tracking,
cut template lookup, DXF zip download, and wire up FileStorageService
and static files in Program.cs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add separate EquipmentNo and DrawingNo fields alongside the combined
DrawingNumber, plus a Title field for labeling exports. Updated across
Core model, DbContext, API DTOs, and ExportDXF models.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add FileStorageService for DXF/PDF storage using content hashing,
FileStorageOptions config, FilesController for uploads, and
FileBrowserController for browsing stored files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add IFabWorksApiClient interface, FabWorksApiClient implementation,
and DTO classes for communicating with the FabWorks API from the
SolidWorks add-in.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove ExportDxfDbContext, EF migrations, FileExportService, and
SqlServer/EF Tools packages. ExportDXF will now use the FabWorks API
for persistence and file storage instead of direct DB access.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add initial FabWorksDbContext migration that creates the FormPrograms
table with FK to BomItems. Existing tables (ExportRecords, BomItems,
CutTemplates) are excluded from the migration since they were already
created by ExportDXF's ExportDxfDbContext. Also adds EF Core Design
package to FabWorks.Api for migration tooling support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add database-first lookup for equipment/drawing number auto-fill when
reopening previously exported files
- Remove prefix prepending for named parts (only use prefix for PT## BOM items)
- Create ExportRecord/BomItem/CutTemplate chains for Part and Assembly
exports, not just Drawings
- Add auto-incrementing item numbers across drawing numbers
- Add content hashing (SHA256) for DXF and PDF versioning with
stash/archive pattern
- Add EF Core initial migration for ExportDxfDb
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move ParseDrawingNumber + GetDrawingOutputFolder into Export() before
the document-type switch so folder resolution happens once. Extract
PrependPrefix helper in PartExporter to deduplicate the prefix guard.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
BomItems are now created for every BOM item regardless of whether they
produce a DXF. Sheet metal cut data (thickness, k-factor, bend radius,
DXF path, content hash) moved to a new CutTemplate entity with a 1:1
optional relationship. Non-sheet-metal items are counted as "skipped"
instead of "failed" in the export summary. Added Cut Templates tab to
the UI with a DataGridView for viewing cut template records.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove CutFab API references and document the current architecture:
local file export, SQL Server tracking, and .NET 8.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sets CommandInProgress to block user interaction with SolidWorks
while the DXF export is running, preventing accidental interference.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>