From 5d09f56e009ffb80a1ebb5c0c3293137fc8723cc Mon Sep 17 00:00:00 2001 From: pszsh Date: Thu, 26 Feb 2026 15:27:05 -0800 Subject: [PATCH] =?UTF-8?q?Initial=20commit:=20Former=20=E2=80=94=20PCB=20?= =?UTF-8?q?Stencil=20&=20Enclosure=20Generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Desktop application (Wails v2) for generating 3D-printable solder paste stencils and snap-fit enclosures from KiCad/Gerber files. Features include native OpenSCAD export, interactive 3D layer viewer, visual cutout placement, automatic USB port detection, and CLI mode for batch workflows. Based on pcb-to-stencil by Nikolai Danylchyk (https://github.com/kennycoder/pcb-to-stencil). --- .gitignore | 29 + .gitmodules | 3 + LICENSE | 21 + README.md | 95 ++ app.go | 981 +++++++++++++++++++++ build-windows.bat | 16 + build-windows.sh | 20 + build.sh | 19 + cmd/genicon/main.go | 130 +++ drill.go | 189 ++++ enclosure.go | 1217 ++++++++++++++++++++++++++ former.go | 412 +++++++++ frontend/index.html | 33 + frontend/package.json | 16 + frontend/package.json.md5 | 1 + frontend/src/former3d.js | 1344 +++++++++++++++++++++++++++++ frontend/src/main.js | 1714 +++++++++++++++++++++++++++++++++++++ frontend/src/style.css | 713 +++++++++++++++ frontend/vite.config.js | 7 + gbrjob.go | 108 +++ gerber.go | 1004 ++++++++++++++++++++++ go.mod | 36 + go.sum | 81 ++ instance.go | 225 +++++ main.go | 113 +++ scad.go | 1069 +++++++++++++++++++++++ session.go | 362 ++++++++ static/showcase.png | Bin 0 -> 695787 bytes static/vectors | 1 + stencil_process.go | 403 +++++++++ stl.go | 85 ++ storage.go | 274 ++++++ svg.go | 182 ++++ svg_render_darwin.go | 117 +++ svg_render_other.go | 11 + util.go | 12 + wails.json | 12 + 37 files changed, 11055 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app.go create mode 100644 build-windows.bat create mode 100755 build-windows.sh create mode 100755 build.sh create mode 100644 cmd/genicon/main.go create mode 100644 drill.go create mode 100644 enclosure.go create mode 100644 former.go create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100755 frontend/package.json.md5 create mode 100644 frontend/src/former3d.js create mode 100644 frontend/src/main.js create mode 100644 frontend/src/style.css create mode 100644 frontend/vite.config.js create mode 100644 gbrjob.go create mode 100644 gerber.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 instance.go create mode 100644 main.go create mode 100644 scad.go create mode 100644 session.go create mode 100644 static/showcase.png create mode 160000 static/vectors create mode 100644 stencil_process.go create mode 100644 stl.go create mode 100644 storage.go create mode 100644 svg.go create mode 100644 svg_render_darwin.go create mode 100644 svg_render_other.go create mode 100644 util.go create mode 100644 wails.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..636c2e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Build output +build/ +bin/ + +# Dependencies +frontend/node_modules/ +frontend/dist/ +frontend/wailsjs/ +frontend/package-lock.json + +# Temp / working files +temp/ +data/ +.DS_Store +*.DS_Store + +# Go +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..779f736 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "static/vectors"] + path = static/vectors + url = git@ssh-git.else-if.org:jess/FormerStaticVectors.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3e4c433 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f0aaab --- /dev/null +++ b/README.md @@ -0,0 +1,95 @@ +# Former + +A desktop application for generating 3D-printable solder paste stencils and snap-fit enclosures from KiCad/Gerber files. + +![Former](static/showcase.png) + +## Features + +**Stencil Generation** +- Parses RS-274X Gerber solder paste layers +- Supports standard apertures (Circle, Rectangle, Obround) and Aperture Macros with rotation +- Generates optimized STL meshes for 3D printing +- Automatic cropping to PCB bounds + +**Enclosure Generation** +- Generates snap-fit enclosures with lids and trays from KiCad `.gbrjob` projects +- Native OpenSCAD `.scad` export for parametric editing +- Interactive 3D layer viewer with per-layer colorization (KiCad color scheme) +- Visual cutout placement on any surface (top, bottom, sides) with live 3D preview +- Automatic USB port detection and cutout alignment from F.Fab/B.Fab layers +- Tray clip system with vertical relief slots +- Dado/engrave mode for surface text and logos + +**Desktop App** +- Native macOS and Windows application (Wails v2) +- Project saving and loading with persistent cutout state +- CLI mode for scripted/batch workflows + +## Install + +### Requirements + +- [Go](https://go.dev/dl/) 1.21+ +- [Wails CLI](https://wails.io/docs/gettingstarted/installation): `go install github.com/wailsapp/wails/v2/cmd/wails@latest` +- [Node.js](https://nodejs.org/) 18+ (for frontend build) +- macOS: Xcode Command Line Tools (`xcode-select --install`) + +### Build + +**macOS:** +```bash +./build.sh +``` + +**Windows (native):** +```bat +build-windows.bat +``` + +**Cross-compile for Windows (from macOS/Linux):** +```bash +./build-windows.sh +``` + +The built application will be at `build/bin/Former.app` (macOS) or `build/bin/Former.exe` (Windows). + +## CLI Usage + +Former can also run headless from the command line: + +```bash +./Former [options] [outline.gbr] +``` + +### Options + +| Flag | Default | Description | +|------|---------|-------------| +| `--height` | 0.16 | Stencil height in mm | +| `--wall-height` | 2.0 | Wall height in mm | +| `--wall-thickness` | 1.0 | Wall thickness in mm | +| `--dpi` | 1016 | Rendering DPI | +| `--keep-png` | false | Save intermediate PNG | + +### Example + +```bash +./Former --height=0.16 --keep-png my_board-F_Paste.gbr my_board-Edge_Cuts.gbr +``` + +## 3D Printing Tips + +For fine-pitch SMD stencils (TSSOP, 0402, etc.): + +- **Nozzle**: 0.2mm recommended +- **Layer height**: 0.16mm total (0.10mm first layer + 0.06mm second) +- **Build surface**: Smooth PEI sheet for flat stencil bottom + +## Acknowledgments + +Former began as a fork of [pcb-to-stencil](https://github.com/kennycoder/pcb-to-stencil) by [Nikolai Danylchyk](https://github.com/kennycoder), a Go tool for converting Gerber paste layers to STL stencils. The original Gerber parser and STL mesh generation formed the foundation that Former builds upon. + +## License + +MIT License — see [LICENSE](LICENSE) for details. diff --git a/app.go b/app.go new file mode 100644 index 0000000..b15fd0b --- /dev/null +++ b/app.go @@ -0,0 +1,981 @@ +package main + +import ( + "bytes" + "context" + "encoding/base64" + "fmt" + "image/png" + "log" + "net/http" + "os" + "os/exec" + "path/filepath" + "strings" + "sync" + "time" + + wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime" +) + +// ======== Image Server ======== + +// ImageServer serves dynamically-generated images at /api/* paths. +// It implements http.Handler and is used as the Wails AssetServer fallback handler. +type ImageServer struct { + mu sync.RWMutex + images map[string][]byte +} + +func NewImageServer() *ImageServer { + return &ImageServer{images: make(map[string][]byte)} +} + +func (s *ImageServer) Store(key string, data []byte) { + s.mu.Lock() + defer s.mu.Unlock() + s.images[key] = data +} + +func (s *ImageServer) Clear() { + s.mu.Lock() + defer s.mu.Unlock() + s.images = make(map[string][]byte) +} + +func (s *ImageServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { + path := r.URL.Path + + s.mu.RLock() + data, ok := s.images[path] + s.mu.RUnlock() + + if !ok { + http.NotFound(w, r) + return + } + + if strings.HasSuffix(path, ".png") { + w.Header().Set("Content-Type", "image/png") + } else if strings.HasSuffix(path, ".svg") { + w.Header().Set("Content-Type", "image/svg+xml") + } + w.Header().Set("Cache-Control", "no-cache") + w.Write(data) +} + +// ======== Frontend-facing Types ======== + +type ProjectInfoJS struct { + ID string `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + Type string `json:"type"` + CreatedAt string `json:"createdAt"` + BoardW float64 `json:"boardW"` + BoardH float64 `json:"boardH"` +} + +type SessionInfoJS struct { + ProjectName string `json:"projectName"` + BoardW float64 `json:"boardW"` + BoardH float64 `json:"boardH"` + Sides []BoardSide `json:"sides"` + TotalH float64 `json:"totalH"` + Cutouts []Cutout `json:"cutouts"` + HasSession bool `json:"hasSession"` + MinX float64 `json:"minX"` + MaxY float64 `json:"maxY"` + DPI float64 `json:"dpi"` +} + +type LayerInfoJS struct { + Index int `json:"index"` + Name string `json:"name"` + ColorHex string `json:"colorHex"` + Visible bool `json:"visible"` + Highlight bool `json:"highlight"` + BaseAlpha float64 `json:"baseAlpha"` +} + +type GenerateResultJS struct { + Files []string `json:"files"` +} + +type StencilResultJS struct { + Files []string `json:"files"` +} + +// ======== App ======== + +type App struct { + ctx context.Context + imageServer *ImageServer + + mu sync.RWMutex + enclosureSession *EnclosureSession + cutouts []Cutout + projectDir string // path to the current project directory (for auto-saving) + formerLayers []*FormerLayer + stencilFiles []string +} + +func NewApp(imageServer *ImageServer) *App { + return &App{ + imageServer: imageServer, + } +} + +// autosaveCutouts persists the current cutouts to the project directory's former.json +func (a *App) autosaveCutouts() { + a.mu.RLock() + dir := a.projectDir + cutouts := make([]Cutout, len(a.cutouts)) + copy(cutouts, a.cutouts) + a.mu.RUnlock() + + if dir == "" { + return + } + if err := UpdateProjectCutouts(dir, cutouts); err != nil { + log.Printf("autosave cutouts failed: %v", err) + } +} + +func (a *App) startup(ctx context.Context) { + a.ctx = ctx + + // Render and cache the logo (PNG for favicon, SVG for background art) + logoImg := renderSVGNative(formerLogoSVG, 512, 512) + if logoImg != nil { + var buf bytes.Buffer + png.Encode(&buf, logoImg) + a.imageServer.Store("/api/logo.png", buf.Bytes()) + } + a.imageServer.Store("/api/logo.svg", formerLogoSVG) +} + +// ======== Landing Page ======== + +func (a *App) GetRecentProjects() []ProjectInfoJS { + entries, err := ListProjects(20) + if err != nil { + return nil + } + var result []ProjectInfoJS + for _, e := range entries { + name := e.Data.ProjectName + if e.Data.Name != "" { + name = e.Data.Name + } + if name == "" { + name = "Untitled" + } + result = append(result, ProjectInfoJS{ + ID: e.Data.ID, + Name: name, + Path: e.Path, + Type: e.Type, + CreatedAt: e.ModTime.Format(time.RFC3339), + BoardW: e.Data.BoardW, + BoardH: e.Data.BoardH, + }) + } + return result +} + +func (a *App) GetLogoDataURL() string { + logoImg := renderSVGNative(formerLogoSVG, 256, 256) + if logoImg == nil { + return "" + } + var buf bytes.Buffer + png.Encode(&buf, logoImg) + return "data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes()) +} + +// ======== File Dialogs ======== + +func (a *App) SelectFile(title string, patterns string) (string, error) { + var filters []wailsRuntime.FileFilter + if patterns != "" { + filters = append(filters, wailsRuntime.FileFilter{ + DisplayName: "Files", + Pattern: patterns, + }) + } + return wailsRuntime.OpenFileDialog(a.ctx, wailsRuntime.OpenDialogOptions{ + Title: title, + Filters: filters, + }) +} + +func (a *App) SelectFolder(title string) (string, error) { + return wailsRuntime.OpenDirectoryDialog(a.ctx, wailsRuntime.OpenDialogOptions{ + Title: title, + }) +} + +func (a *App) SelectMultipleFiles(title string, patterns string) ([]string, error) { + var filters []wailsRuntime.FileFilter + if patterns != "" { + filters = append(filters, wailsRuntime.FileFilter{ + DisplayName: "Files", + Pattern: patterns, + }) + } + return wailsRuntime.OpenMultipleFilesDialog(a.ctx, wailsRuntime.OpenDialogOptions{ + Title: title, + Filters: filters, + }) +} + +// ======== Stencil Workflow ======== + +func (a *App) GenerateStencil(gerberPath, outlinePath string, height, wallHeight, wallThickness, dpi float64, exports []string) (*StencilResultJS, error) { + if gerberPath == "" { + return nil, fmt.Errorf("no solder paste gerber file selected") + } + + cfg := Config{ + StencilHeight: height, + WallHeight: wallHeight, + WallThickness: wallThickness, + DPI: dpi, + } + if cfg.StencilHeight == 0 { + cfg.StencilHeight = DefaultStencilHeight + } + if cfg.WallHeight == 0 { + cfg.WallHeight = DefaultWallHeight + } + if cfg.WallThickness == 0 { + cfg.WallThickness = DefaultWallThickness + } + if cfg.DPI == 0 { + cfg.DPI = DefaultDPI + } + if len(exports) == 0 { + exports = []string{"stl"} + } + + files, pasteImg, outlineImg, err := processPCB(gerberPath, outlinePath, cfg, exports) + if err != nil { + return nil, err + } + + // Store layers for The Former + a.mu.Lock() + a.formerLayers = buildStencilLayers(pasteImg, outlineImg) + a.stencilFiles = files + a.mu.Unlock() + a.prepareFormerImages() + + return &StencilResultJS{Files: files}, nil +} + +// ======== Enclosure Workflow ======== + +func (a *App) DiscoverGerberFiles(folderPath string) ([]string, error) { + entries, err := os.ReadDir(folderPath) + if err != nil { + return nil, fmt.Errorf("could not read folder: %v", err) + } + + var paths []string + for _, entry := range entries { + if entry.IsDir() { + continue + } + name := strings.ToLower(entry.Name()) + if strings.HasSuffix(name, ".gbr") || strings.HasSuffix(name, ".gbrjob") || + strings.HasSuffix(name, ".gtp") || strings.HasSuffix(name, ".gbp") || + strings.HasSuffix(name, ".gko") || strings.HasSuffix(name, ".gm1") || + strings.HasSuffix(name, ".gtl") || strings.HasSuffix(name, ".gbl") || + strings.HasSuffix(name, ".gts") || strings.HasSuffix(name, ".gbs") { + paths = append(paths, filepath.Join(folderPath, entry.Name())) + } + } + return paths, nil +} + +func (a *App) BuildEnclosureSession(gbrjobPath string, gerberPaths []string, drillPath, npthPath string, wallThickness, wallHeight, clearance, dpi float64, exports []string) error { + if gbrjobPath == "" { + return fmt.Errorf("no gerber job file selected") + } + if len(gerberPaths) == 0 { + return fmt.Errorf("no gerber files selected") + } + + ecfg := EnclosureConfig{ + WallThickness: wallThickness, + WallHeight: wallHeight, + Clearance: clearance, + DPI: dpi, + } + if ecfg.WallThickness == 0 { + ecfg.WallThickness = DefaultEncWallThick + } + if ecfg.WallHeight == 0 { + ecfg.WallHeight = DefaultEncWallHeight + } + if ecfg.Clearance == 0 { + ecfg.Clearance = DefaultClearance + } + if ecfg.DPI == 0 { + ecfg.DPI = 600 + } + if len(exports) == 0 { + exports = []string{"stl", "scad"} + } + + os.MkdirAll("temp", 0755) + uuid := randomID() + + // Copy gbrjob + gbrjobDst := filepath.Join("temp", uuid+"_"+filepath.Base(gbrjobPath)) + if err := CopyFile(gbrjobPath, gbrjobDst); err != nil { + return fmt.Errorf("failed to copy gbrjob: %v", err) + } + + // Copy gerbers + savedGerbers := make(map[string]string) + var sourceDir string + for _, src := range gerberPaths { + baseName := filepath.Base(src) + dst := filepath.Join("temp", uuid+"_"+baseName) + if err := CopyFile(src, dst); err != nil { + return fmt.Errorf("failed to copy %s: %v", baseName, err) + } + savedGerbers[baseName] = dst + if sourceDir == "" { + sourceDir = filepath.Dir(src) + } + } + + // Copy drill files + var drillDst, npthDst string + if drillPath != "" { + drillDst = filepath.Join("temp", uuid+"_drill"+filepath.Ext(drillPath)) + if err := CopyFile(drillPath, drillDst); err != nil { + return fmt.Errorf("failed to copy PTH drill: %v", err) + } + } + if npthPath != "" { + npthDst = filepath.Join("temp", uuid+"_npth"+filepath.Ext(npthPath)) + if err := CopyFile(npthPath, npthDst); err != nil { + return fmt.Errorf("failed to copy NPTH drill: %v", err) + } + } + + _, session, err := BuildEnclosureSession(gbrjobDst, savedGerbers, drillDst, npthDst, ecfg, exports) + if err != nil { + return fmt.Errorf("session build failed: %v", err) + } + session.SourceDir = sourceDir + + a.mu.Lock() + a.enclosureSession = session + a.cutouts = nil + a.mu.Unlock() + + // Render board preview + if session.OutlineImg != nil { + var buf bytes.Buffer + png.Encode(&buf, session.OutlineImg) + a.imageServer.Store("/api/board-preview.png", buf.Bytes()) + } + + return nil +} + +func (a *App) GetSessionInfo() *SessionInfoJS { + a.mu.RLock() + defer a.mu.RUnlock() + + if a.enclosureSession == nil { + return &SessionInfoJS{HasSession: false} + } + s := a.enclosureSession + result := make([]Cutout, len(a.cutouts)) + copy(result, a.cutouts) + return &SessionInfoJS{ + ProjectName: s.ProjectName, + BoardW: s.BoardW, + BoardH: s.BoardH, + Sides: s.Sides, + TotalH: s.TotalH, + Cutouts: result, + HasSession: true, + MinX: s.OutlineBounds.MinX, + MaxY: s.OutlineBounds.MaxY, + DPI: s.Config.DPI, + } +} + +func (a *App) AddSideCutout(side int, x, y, w, h, radius float64, layer string) { + a.mu.Lock() + a.cutouts = append(a.cutouts, Cutout{ + ID: randomID(), + Surface: "side", + SideNum: side, + X: x, + Y: y, + Width: w, + Height: h, + CornerRadius: radius, + SourceLayer: layer, + }) + a.mu.Unlock() + a.autosaveCutouts() +} + +func (a *App) RemoveSideCutout(index int) { + a.mu.Lock() + // Find the Nth side cutout + count := 0 + for i, c := range a.cutouts { + if c.Surface == "side" { + if count == index { + a.cutouts = append(a.cutouts[:i], a.cutouts[i+1:]...) + break + } + count++ + } + } + a.mu.Unlock() + a.autosaveCutouts() +} + +func (a *App) GetSideCutouts() []SideCutout { + a.mu.RLock() + defer a.mu.RUnlock() + var result []SideCutout + for _, c := range a.cutouts { + if c.Surface == "side" { + result = append(result, CutoutToSideCutout(c)) + } + } + return result +} + +// ======== Unified Cutout CRUD ======== + +func (a *App) AddCutout(c Cutout) string { + a.mu.Lock() + if c.ID == "" { + c.ID = randomID() + } + a.cutouts = append(a.cutouts, c) + a.mu.Unlock() + a.autosaveCutouts() + return c.ID +} + +func (a *App) UpdateCutout(c Cutout) { + a.mu.Lock() + for i, existing := range a.cutouts { + if existing.ID == c.ID { + a.cutouts[i] = c + break + } + } + a.mu.Unlock() + a.autosaveCutouts() +} + +func (a *App) RemoveCutout(id string) { + a.mu.Lock() + for i, c := range a.cutouts { + if c.ID == id { + a.cutouts = append(a.cutouts[:i], a.cutouts[i+1:]...) + break + } + } + a.mu.Unlock() + a.autosaveCutouts() +} + +func (a *App) GetCutouts() []Cutout { + a.mu.RLock() + defer a.mu.RUnlock() + result := make([]Cutout, len(a.cutouts)) + copy(result, a.cutouts) + return result +} + +func (a *App) DuplicateCutout(id string) string { + a.mu.Lock() + var dupID string + for _, c := range a.cutouts { + if c.ID == id { + dup := c + dup.ID = randomID() + if dup.Surface == "side" { + dup.X += 1.0 + } else { + dup.X += 1.0 + dup.Y += 1.0 + } + a.cutouts = append(a.cutouts, dup) + dupID = dup.ID + break + } + } + a.mu.Unlock() + a.autosaveCutouts() + return dupID +} + +func (a *App) GetSideLength(sideNum int) float64 { + a.mu.RLock() + defer a.mu.RUnlock() + if a.enclosureSession == nil { + return 0 + } + for _, s := range a.enclosureSession.Sides { + if s.Num == sideNum { + return s.Length + } + } + return 0 +} + +// AddLidCutouts converts element pixel bboxes to mm coordinates and stores them as unified cutouts. +func (a *App) AddLidCutouts(elements []ElementBBox, plane string, isDado bool, depth float64) { + a.mu.Lock() + + if a.enclosureSession == nil { + a.mu.Unlock() + return + } + + bounds := a.enclosureSession.OutlineBounds + dpi := a.enclosureSession.Config.DPI + + surface := "top" + if plane == "tray" { + surface = "bottom" + } + + for _, el := range elements { + mmMinX := float64(el.MinX)*(25.4/dpi) + bounds.MinX + mmMaxX := float64(el.MaxX)*(25.4/dpi) + bounds.MinX + mmMinY := bounds.MaxY - float64(el.MaxY)*(25.4/dpi) + mmMaxY := bounds.MaxY - float64(el.MinY)*(25.4/dpi) + + a.cutouts = append(a.cutouts, Cutout{ + ID: randomID(), + Surface: surface, + X: mmMinX, + Y: mmMinY, + Width: mmMaxX - mmMinX, + Height: mmMaxY - mmMinY, + IsDado: isDado, + Depth: depth, + }) + } + a.mu.Unlock() + a.autosaveCutouts() +} + +func (a *App) GetLidCutouts() []LidCutout { + a.mu.RLock() + defer a.mu.RUnlock() + var result []LidCutout + for _, c := range a.cutouts { + if c.Surface == "top" || c.Surface == "bottom" { + result = append(result, CutoutToLidCutout(c)) + } + } + return result +} + +func (a *App) ClearLidCutouts() { + a.mu.Lock() + var kept []Cutout + for _, c := range a.cutouts { + if c.Surface == "side" { + kept = append(kept, c) + } + } + a.cutouts = kept + a.mu.Unlock() + a.autosaveCutouts() +} + +func (a *App) GenerateEnclosureOutputs() (*GenerateResultJS, error) { + a.mu.RLock() + session := a.enclosureSession + allCutouts := make([]Cutout, len(a.cutouts)) + copy(allCutouts, a.cutouts) + a.mu.RUnlock() + + if session == nil { + return nil, fmt.Errorf("no enclosure session active") + } + + outputDir := session.SourceDir + if outputDir == "" { + outputDir = filepath.Join(".", "temp") + } + + files, err := GenerateEnclosureOutputs(session, allCutouts, outputDir) + if err != nil { + return nil, err + } + + // Auto-save session + inst := InstanceData{ + ID: randomID(), + CreatedAt: time.Now(), + GerberFiles: session.GerberFiles, + DrillPath: session.DrillPath, + NPTHPath: session.NPTHPath, + EdgeCutsFile: session.EdgeCutsFile, + CourtyardFile: session.CourtyardFile, + SoldermaskFile: session.SoldermaskFile, + FabFile: session.FabFile, + Config: session.Config, + Exports: session.Exports, + BoardW: session.BoardW, + BoardH: session.BoardH, + ProjectName: session.ProjectName, + Cutouts: allCutouts, + } + if savedDir, saveErr := SaveSession(inst, filepath.Join(".", "temp"), session.OutlineImg); saveErr != nil { + log.Printf("Warning: could not save session: %v", saveErr) + } else { + a.mu.Lock() + a.projectDir = savedDir + a.mu.Unlock() + } + + // Prepare Former layers + a.mu.Lock() + a.formerLayers = buildEnclosureLayers(session) + a.mu.Unlock() + a.prepareFormerImages() + + return &GenerateResultJS{Files: files}, nil +} + +func (a *App) SaveEnclosureProfile(name string) error { + a.mu.RLock() + session := a.enclosureSession + allCutouts := make([]Cutout, len(a.cutouts)) + copy(allCutouts, a.cutouts) + a.mu.RUnlock() + + if session == nil { + return fmt.Errorf("no enclosure session active") + } + if name == "" { + name = session.ProjectName + } + if name == "" { + name = "Untitled" + } + + inst := InstanceData{ + ID: randomID(), + Name: name, + CreatedAt: time.Now(), + GerberFiles: session.GerberFiles, + DrillPath: session.DrillPath, + NPTHPath: session.NPTHPath, + EdgeCutsFile: session.EdgeCutsFile, + CourtyardFile: session.CourtyardFile, + SoldermaskFile: session.SoldermaskFile, + FabFile: session.FabFile, + Config: session.Config, + Exports: session.Exports, + BoardW: session.BoardW, + BoardH: session.BoardH, + ProjectName: session.ProjectName, + Cutouts: allCutouts, + } + sourceDir := session.SourceDir + if sourceDir == "" { + sourceDir = filepath.Join(".", "temp") + } + savedDir, err := SaveProfile(inst, name, sourceDir, session.OutlineImg) + if err == nil && savedDir != "" { + a.mu.Lock() + a.projectDir = savedDir + a.mu.Unlock() + } + return err +} + +func (a *App) OpenProject(projectPath string) error { + _, session, inst, err := RestoreProject(projectPath) + if err != nil { + return err + } + + a.mu.Lock() + a.enclosureSession = session + a.cutouts = inst.MigrateCutouts() + a.projectDir = projectPath + a.mu.Unlock() + + // Render board preview + if session.OutlineImg != nil { + var buf bytes.Buffer + png.Encode(&buf, session.OutlineImg) + a.imageServer.Store("/api/board-preview.png", buf.Bytes()) + } + + return nil +} + +func (a *App) DeleteProject(projectPath string) error { + return DeleteProject(projectPath) +} + +// ======== Auto-Detect USB Port ======== + +type AutoDetectResultJS struct { + Footprints []Footprint `json:"footprints"` + FabImageURL string `json:"fabImageURL"` +} + +func (a *App) UploadAndDetectFootprints(fabPaths []string) (*AutoDetectResultJS, error) { + a.mu.RLock() + session := a.enclosureSession + a.mu.RUnlock() + + if session == nil { + return nil, fmt.Errorf("no enclosure session active") + } + if len(fabPaths) == 0 { + return nil, fmt.Errorf("no fab gerber files selected") + } + + footprints, fabImg := UploadFabAndExtractFootprints(session, fabPaths) + + if fabImg != nil { + var buf bytes.Buffer + png.Encode(&buf, fabImg) + a.imageServer.Store("/api/fab-overlay.png", buf.Bytes()) + } + + return &AutoDetectResultJS{ + Footprints: footprints, + FabImageURL: "/api/fab-overlay.png?t=" + fmt.Sprint(time.Now().UnixMilli()), + }, nil +} + +// ======== Former ======== + +type MountingHoleJS struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Diameter float64 `json:"diameter"` +} + +type Enclosure3DDataJS struct { + OutlinePoints [][2]float64 `json:"outlinePoints"` + WallThickness float64 `json:"wallThickness"` + Clearance float64 `json:"clearance"` + WallHeight float64 `json:"wallHeight"` + PCBThickness float64 `json:"pcbThickness"` + BoardW float64 `json:"boardW"` + BoardH float64 `json:"boardH"` + TrayFloor float64 `json:"trayFloor"` + SnapHeight float64 `json:"snapHeight"` + LidThick float64 `json:"lidThick"` + TotalH float64 `json:"totalH"` + MountingHoles []MountingHoleJS `json:"mountingHoles"` + Sides []BoardSide `json:"sides"` + Cutouts []Cutout `json:"cutouts"` + MinBX float64 `json:"minBX"` + MaxBX float64 `json:"maxBX"` + BoardCenterY float64 `json:"boardCenterY"` +} + +func (a *App) GetEnclosure3DData() *Enclosure3DDataJS { + a.mu.RLock() + s := a.enclosureSession + allCutouts := make([]Cutout, len(a.cutouts)) + copy(allCutouts, a.cutouts) + a.mu.RUnlock() + + if s == nil { + return nil + } + poly := ExtractPolygonFromGerber(s.OutlineGf) + if poly == nil { + return nil + } + + wt := s.Config.WallThickness + trayFloor := 1.5 + pcbT := s.Config.PCBThickness + totalH := s.Config.WallHeight + pcbT + trayFloor + + var mountingHoles []MountingHoleJS + for _, h := range s.DrillHoles { + if h.Type == DrillTypeMounting { + mountingHoles = append(mountingHoles, MountingHoleJS{X: h.X, Y: h.Y, Diameter: h.Diameter}) + } + } + + return &Enclosure3DDataJS{ + OutlinePoints: poly, + WallThickness: wt, + Clearance: s.Config.Clearance, + WallHeight: s.Config.WallHeight, + PCBThickness: pcbT, + BoardW: s.BoardW, + BoardH: s.BoardH, + TrayFloor: trayFloor, + SnapHeight: 2.5, + LidThick: wt, + TotalH: totalH, + MountingHoles: mountingHoles, + Sides: s.Sides, + Cutouts: allCutouts, + MinBX: s.MinBX, + MaxBX: s.MaxBX, + BoardCenterY: s.BoardCenterY, + } +} + +func (a *App) GetFormerLayers() []LayerInfoJS { + a.mu.RLock() + defer a.mu.RUnlock() + + var result []LayerInfoJS + for i, l := range a.formerLayers { + result = append(result, LayerInfoJS{ + Index: i, + Name: l.Name, + ColorHex: fmt.Sprintf("#%02x%02x%02x", l.Color.R, l.Color.G, l.Color.B), + Visible: l.Visible, + Highlight: l.Highlight, + BaseAlpha: l.BaseAlpha, + }) + } + return result +} + +func (a *App) SetLayerVisibility(index int, visible bool) { + a.mu.Lock() + defer a.mu.Unlock() + if index >= 0 && index < len(a.formerLayers) { + a.formerLayers[index].Visible = visible + if !visible { + a.formerLayers[index].Highlight = false + } + } +} + +func (a *App) ToggleHighlight(index int) { + a.mu.Lock() + defer a.mu.Unlock() + if index < 0 || index >= len(a.formerLayers) { + return + } + if a.formerLayers[index].Highlight { + a.formerLayers[index].Highlight = false + } else { + for i := range a.formerLayers { + a.formerLayers[i].Highlight = false + } + a.formerLayers[index].Highlight = true + a.formerLayers[index].Visible = true + } +} + +func (a *App) GetLayerElements(layerIndex int) ([]ElementBBox, error) { + a.mu.RLock() + defer a.mu.RUnlock() + + if layerIndex < 0 || layerIndex >= len(a.formerLayers) { + return nil, fmt.Errorf("layer index %d out of range", layerIndex) + } + + layer := a.formerLayers[layerIndex] + if layer.SourceFile == "" { + return nil, fmt.Errorf("no source file for layer %q", layer.Name) + } + + if a.enclosureSession == nil { + return nil, fmt.Errorf("no enclosure session active") + } + + gf, ok := a.enclosureSession.AllLayerGerbers[layer.SourceFile] + if !ok || gf == nil { + return nil, fmt.Errorf("parsed gerber not available for %q", layer.SourceFile) + } + + bounds := a.enclosureSession.OutlineBounds + dpi := a.enclosureSession.Config.DPI + elements := ExtractElementBBoxes(gf, dpi, &bounds) + return elements, nil +} + +func (a *App) OpenFormerEnclosure() { + a.mu.Lock() + if a.enclosureSession != nil { + a.formerLayers = buildEnclosureLayers(a.enclosureSession) + } + a.mu.Unlock() + a.prepareFormerImages() +} + +func (a *App) prepareFormerImages() { + a.mu.RLock() + layers := a.formerLayers + a.mu.RUnlock() + + for i, layer := range layers { + if layer.Source == nil { + continue + } + // Colorize at full alpha — frontend controls opacity via canvas globalAlpha + colored := colorizeLayer(layer.Source, layer.Color, 1.0) + var buf bytes.Buffer + png.Encode(&buf, colored) + a.imageServer.Store(fmt.Sprintf("/api/layers/%d.png", i), buf.Bytes()) + } +} + +// RenderFromFormer generates output files (SCAD, SVG, etc.) from the current session. +// Called from the Former 3D editor's "Render & View" button. +func (a *App) RenderFromFormer() (*GenerateResultJS, error) { + return a.GenerateEnclosureOutputs() +} + +// GetOutputDir returns the output directory path for the current session. +func (a *App) GetOutputDir() (string, error) { + a.mu.RLock() + session := a.enclosureSession + a.mu.RUnlock() + + if session == nil { + return "", fmt.Errorf("no enclosure session active") + } + + outputDir := session.SourceDir + if outputDir == "" { + outputDir = filepath.Join(".", "temp") + } + + absDir, err := filepath.Abs(outputDir) + if err != nil { + return outputDir, nil + } + return absDir, nil +} + +// OpenOutputFolder opens the output directory in the OS file manager. +func (a *App) OpenOutputFolder() error { + dir, err := a.GetOutputDir() + if err != nil { + return err + } + return exec.Command("open", dir).Start() +} diff --git a/build-windows.bat b/build-windows.bat new file mode 100644 index 0000000..64abb57 --- /dev/null +++ b/build-windows.bat @@ -0,0 +1,16 @@ +@echo off +REM Build Former for Windows — run this on a Windows machine with Go and Wails installed +REM Prerequisites: Go 1.21+, Wails CLI (go install github.com/wailsapp/wails/v2/cmd/wails@latest) + +echo Generating app icon... +go run ./cmd/genicon 2>nul && echo Icon generated. || echo Icon generation skipped. + +echo Building Former for Windows... +wails build -skipbindings +if %ERRORLEVEL% NEQ 0 ( + echo Build failed. + exit /b 1 +) + +echo. +echo Done: build\bin\Former.exe diff --git a/build-windows.sh b/build-windows.sh new file mode 100755 index 0000000..496ef0d --- /dev/null +++ b/build-windows.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Cross-compile Former for Windows (amd64) from macOS/Linux +set -e + +# Generate app icon (needs CGO on macOS for native SVG rendering) +echo "Generating app icon..." +if [[ "$OSTYPE" == darwin* ]]; then + SDKROOT=$(xcrun --show-sdk-path) CC=/usr/bin/clang CGO_ENABLED=1 \ + go run ./cmd/genicon 2>/dev/null && echo "Icon generated." || echo "Icon generation skipped." +else + CGO_ENABLED=0 go run ./cmd/genicon 2>/dev/null && echo "Icon generated." || echo "Icon generation skipped." +fi + +WAILS=$(command -v wails || echo "$HOME/go/bin/wails") + +echo "Building Former for Windows (amd64)..." +CGO_ENABLED=0 "$WAILS" build -skipbindings -platform windows/amd64 + +echo "" +ls -lh build/bin/Former.exe 2>/dev/null && echo "Done." || echo "Build failed." diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..674add4 --- /dev/null +++ b/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Build Former for macOS +set -e +pkill -f "Former.app" || true +sleep 0.5 + +export SDKROOT=$(xcrun --show-sdk-path) +export CC=/usr/bin/clang +export CGO_ENABLED=1 + +WAILS=$(command -v wails || echo "$HOME/go/bin/wails") + +# Generate app icon from Former.svg +echo "Generating app icon..." +go run ./cmd/genicon 2>/dev/null && echo "Icon generated." || echo "Icon generation skipped." + +"$WAILS" build -skipbindings + +open build/bin/Former.app diff --git a/cmd/genicon/main.go b/cmd/genicon/main.go new file mode 100644 index 0000000..656fd35 --- /dev/null +++ b/cmd/genicon/main.go @@ -0,0 +1,130 @@ +package main + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework AppKit -framework CoreGraphics + +#import +#import + +unsigned char* renderSVGToPixels(const void* svgBytes, int svgLen, int targetW, int targetH) { + @autoreleasepool { + NSData *data = [NSData dataWithBytesNoCopy:(void*)svgBytes length:svgLen freeWhenDone:NO]; + NSImage *svgImage = [[NSImage alloc] initWithData:data]; + if (!svgImage) return NULL; + + int w = targetW; + int h = targetH; + int rowBytes = w * 4; + int totalBytes = rowBytes * h; + + NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:w + pixelsHigh:h + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSDeviceRGBColorSpace + bytesPerRow:rowBytes + bitsPerPixel:32]; + + [NSGraphicsContext saveGraphicsState]; + NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:rep]; + [NSGraphicsContext setCurrentContext:ctx]; + + [[NSColor clearColor] set]; + NSRectFill(NSMakeRect(0, 0, w, h)); + + [svgImage drawInRect:NSMakeRect(0, 0, w, h) + fromRect:NSZeroRect + operation:NSCompositingOperationSourceOver + fraction:1.0]; + + [NSGraphicsContext restoreGraphicsState]; + + unsigned char* result = (unsigned char*)malloc(totalBytes); + if (result) { + memcpy(result, [rep bitmapData], totalBytes); + } + return result; + } +} +*/ +import "C" + +import ( + "fmt" + "image" + "image/color" + "image/png" + "os" + "unsafe" +) + +func main() { + svgPath := "static/vectors/Former.svg" + outPath := "build/appicon.png" + size := 1024 + + svgData, err := os.ReadFile(svgPath) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to read SVG: %v\n", err) + os.Exit(1) + } + + pixels := C.renderSVGToPixels( + unsafe.Pointer(&svgData[0]), + C.int(len(svgData)), + C.int(size), + C.int(size), + ) + if pixels == nil { + fmt.Fprintln(os.Stderr, "SVG rendering failed") + os.Exit(1) + } + defer C.free(unsafe.Pointer(pixels)) + + rawLen := size * size * 4 + raw := unsafe.Slice((*byte)(unsafe.Pointer(pixels)), rawLen) + + img := image.NewNRGBA(image.Rect(0, 0, size, size)) + for y := 0; y < size; y++ { + for x := 0; x < size; x++ { + i := (y*size + x) * 4 + r, g, b, a := raw[i], raw[i+1], raw[i+2], raw[i+3] + if a > 0 && a < 255 { + scale := 255.0 / float64(a) + r = clamp(float64(r) * scale) + g = clamp(float64(g) * scale) + b = clamp(float64(b) * scale) + } + img.SetNRGBA(x, y, color.NRGBA{R: r, G: g, B: b, A: a}) + } + } + + f, err := os.Create(outPath) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to create output: %v\n", err) + os.Exit(1) + } + defer f.Close() + + if err := png.Encode(f, img); err != nil { + fmt.Fprintf(os.Stderr, "PNG encode failed: %v\n", err) + os.Exit(1) + } + + fmt.Printf("Generated %s (%dx%d) from %s\n", outPath, size, size, svgPath) +} + +func clamp(v float64) uint8 { + if v > 255 { + return 255 + } + if v < 0 { + return 0 + } + return uint8(v) +} diff --git a/drill.go b/drill.go new file mode 100644 index 0000000..6c2bd66 --- /dev/null +++ b/drill.go @@ -0,0 +1,189 @@ +package main + +import ( + "bufio" + "math" + "os" + "regexp" + "strconv" + "strings" +) + +// DrillHoleType classifies a drill hole by function +type DrillHoleType int + +const ( + DrillTypeUnknown DrillHoleType = iota + DrillTypeVia // ViaDrill — ignore for enclosure + DrillTypeComponent // ComponentDrill — component leads + DrillTypeMounting // Mounting holes (from NPTH) +) + +// DrillHole represents a single drill hole with position, diameter, and type +type DrillHole struct { + X, Y float64 // Position in mm + Diameter float64 // Diameter in mm + Type DrillHoleType // Classified by TA.AperFunction + ToolNum int // Tool number (T1, T2, etc.) +} + +// ParseDrill parses an Excellon drill file and returns hole positions +func ParseDrill(filename string) ([]DrillHole, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + var holes []DrillHole + type toolInfo struct { + diameter float64 + holeType DrillHoleType + } + tools := make(map[int]toolInfo) + currentTool := 0 + inHeader := true + units := "MM" + isNPTH := false + + // Format spec + formatDec := 0 + + // Pending aperture function for the next tool definition + pendingType := DrillTypeUnknown + + scanner := bufio.NewScanner(file) + + reToolDef := regexp.MustCompile(`^T(\d+)C([\d.]+)`) + reToolSelect := regexp.MustCompile(`^T(\d+)$`) + reCoord := regexp.MustCompile(`^X([+-]?[\d.]+)Y([+-]?[\d.]+)`) + reAperFunc := regexp.MustCompile(`TA\.AperFunction,(\w+),(\w+),(\w+)`) + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + + // Check file function for NPTH + if strings.Contains(line, "TF.FileFunction") { + if strings.Contains(line, "NonPlated") || strings.Contains(line, "NPTH") { + isNPTH = true + } + } + + // Parse TA.AperFunction comments (appears before tool definition) + if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "G04") { + m := reAperFunc.FindStringSubmatch(line) + if len(m) >= 4 { + funcType := m[3] + switch funcType { + case "ViaDrill": + pendingType = DrillTypeVia + case "ComponentDrill": + pendingType = DrillTypeComponent + default: + pendingType = DrillTypeUnknown + } + } + // Also check for format spec + if strings.HasPrefix(line, ";FORMAT=") { + re := regexp.MustCompile(`\{(\d+):(\d+)\}`) + fm := re.FindStringSubmatch(line) + if len(fm) == 3 { + formatDec, _ = strconv.Atoi(fm[2]) + } + } + continue + } + + // Detect header end + if line == "%" || line == "M95" { + inHeader = false + continue + } + + // Units + if strings.Contains(line, "METRIC") || line == "M71" { + units = "MM" + continue + } + if strings.Contains(line, "INCH") || line == "M72" { + units = "IN" + continue + } + + // Tool definitions (in header): T01C0.300 + if inHeader { + m := reToolDef.FindStringSubmatch(line) + if len(m) == 3 { + toolNum, _ := strconv.Atoi(m[1]) + dia, _ := strconv.ParseFloat(m[2], 64) + + ht := pendingType + // If this is an NPTH file and type is unknown, classify as mounting + if isNPTH && ht == DrillTypeUnknown { + ht = DrillTypeMounting + } + + tools[toolNum] = toolInfo{diameter: dia, holeType: ht} + pendingType = DrillTypeUnknown // Reset + continue + } + } + + // Tool selection: T01 + m := reToolSelect.FindStringSubmatch(line) + if len(m) == 2 { + toolNum, _ := strconv.Atoi(m[1]) + currentTool = toolNum + continue + } + + // End of file + if line == "M30" || line == "M00" { + break + } + + // Coordinate: X123456Y789012 + mc := reCoord.FindStringSubmatch(line) + if len(mc) == 3 && currentTool != 0 { + x := parseExcellonCoord(mc[1], formatDec) + y := parseExcellonCoord(mc[2], formatDec) + + ti := tools[currentTool] + dia := ti.diameter + + // Convert inches to mm if needed + if units == "IN" { + x *= 25.4 + y *= 25.4 + if dia < 1.0 { + dia *= 25.4 + } + } + + holes = append(holes, DrillHole{ + X: x, + Y: y, + Diameter: dia, + Type: ti.holeType, + ToolNum: currentTool, + }) + } + } + + return holes, nil +} + +func parseExcellonCoord(s string, fmtDec int) float64 { + if strings.Contains(s, ".") { + val, _ := strconv.ParseFloat(s, 64) + return val + } + val, _ := strconv.ParseFloat(s, 64) + if fmtDec > 0 { + return val / math.Pow(10, float64(fmtDec)) + } + return val / 1000.0 +} diff --git a/enclosure.go b/enclosure.go new file mode 100644 index 0000000..7acda29 --- /dev/null +++ b/enclosure.go @@ -0,0 +1,1217 @@ +package main + +import ( + "fmt" + "image" + "image/color" + "math" +) + +// EnclosureConfig holds parameters for enclosure generation +type EnclosureConfig struct { + PCBThickness float64 `json:"pcbThickness"` + WallThickness float64 `json:"wallThickness"` + WallHeight float64 `json:"wallHeight"` + Clearance float64 `json:"clearance"` + DPI float64 `json:"dpi"` + OutlineBounds *Bounds `json:"-"` +} + +// Default enclosure values +const ( + DefaultPCBThickness = 1.6 + DefaultEncWallHeight = 10.0 + DefaultEncWallThick = 1.5 + DefaultClearance = 0.3 +) + +// EnclosureResult contains the generated meshes +type EnclosureResult struct { + EnclosureTriangles [][3]Point + TrayTriangles [][3]Point +} + +// SideCutout defines a cutout on a side wall face +type SideCutout struct { + Side int `json:"side"` + X float64 `json:"x"` + Y float64 `json:"y"` + Width float64 `json:"w"` + Height float64 `json:"h"` + CornerRadius float64 `json:"r"` + Layer string `json:"l"` +} + +// LidCutout defines a cutout on the lid or tray plane (top/bottom flat surfaces) +type LidCutout struct { + ID int `json:"id"` + Plane string `json:"plane"` // "lid" or "tray" + MinX float64 `json:"minX"` // gerber mm coordinates + MinY float64 `json:"minY"` + MaxX float64 `json:"maxX"` + MaxY float64 `json:"maxY"` + IsDado bool `json:"isDado"` + Depth float64 `json:"depth"` // dado depth mm; 0 = through-cut +} + +// Cutout is the unified cutout type — replaces separate SideCutout/LidCutout. +type Cutout struct { + ID string `json:"id"` + Surface string `json:"surface"` // "top", "bottom", "side" + SideNum int `json:"sideNum"` // only when Surface="side" + X float64 `json:"x"` // side: mm along side; top/bottom: gerber mm minX + Y float64 `json:"y"` // side: mm height from PCB; top/bottom: gerber mm minY + Width float64 `json:"w"` + Height float64 `json:"h"` + CornerRadius float64 `json:"r"` + IsDado bool `json:"isDado"` + Depth float64 `json:"depth"` // dado depth mm; 0 = through-cut + SourceLayer string `json:"sourceLayer"` // "F" or "B" for side cutouts +} + +// CutoutToSideCutout converts a unified Cutout (surface="side") to legacy SideCutout +func CutoutToSideCutout(c Cutout) SideCutout { + return SideCutout{ + Side: c.SideNum, + X: c.X, + Y: c.Y, + Width: c.Width, + Height: c.Height, + CornerRadius: c.CornerRadius, + Layer: c.SourceLayer, + } +} + +// CutoutToLidCutout converts a unified Cutout (surface="top"/"bottom") to legacy LidCutout +func CutoutToLidCutout(c Cutout) LidCutout { + plane := "lid" + if c.Surface == "bottom" { + plane = "tray" + } + return LidCutout{ + Plane: plane, + MinX: c.X, + MinY: c.Y, + MaxX: c.X + c.Width, + MaxY: c.Y + c.Height, + IsDado: c.IsDado, + Depth: c.Depth, + } +} + +// SplitCutouts partitions unified cutouts into side and lid slices for SCAD/STL generation. +func SplitCutouts(cutouts []Cutout) ([]SideCutout, []LidCutout) { + var sides []SideCutout + var lids []LidCutout + for _, c := range cutouts { + switch c.Surface { + case "side": + sides = append(sides, CutoutToSideCutout(c)) + case "top", "bottom": + lids = append(lids, CutoutToLidCutout(c)) + } + } + return sides, lids +} + +// BoardSide represents a physical straight edge of the board outline +type BoardSide struct { + Num int `json:"num"` + Label string `json:"label"` + Length float64 `json:"length"` + StartX float64 `json:"startX"` + StartY float64 `json:"startY"` + EndX float64 `json:"endX"` + EndY float64 `json:"endY"` + Angle float64 `json:"angle"` // Angle in radians of the normal vector pushing OUT of the board +} + +func perpendicularDistance(pt, lineStart, lineEnd [2]float64) float64 { + dx := lineEnd[0] - lineStart[0] + dy := lineEnd[1] - lineStart[1] + + // Normalize line vector + mag := math.Sqrt(dx*dx + dy*dy) + if mag == 0 { + return math.Sqrt((pt[0]-lineStart[0])*(pt[0]-lineStart[0]) + (pt[1]-lineStart[1])*(pt[1]-lineStart[1])) + } + dx /= mag + dy /= mag + + // Vector from lineStart to pt + px := pt[0] - lineStart[0] + py := pt[1] - lineStart[1] + + // Cross product gives perpendicular distance + return math.Abs(px*dy - py*dx) +} + +func simplifyPolygonRDP(points [][2]float64, epsilon float64) [][2]float64 { + if len(points) < 3 { + return points + } + + dmax := 0.0 + index := 0 + end := len(points) - 1 + + for i := 1; i < end; i++ { + d := perpendicularDistance(points[i], points[0], points[end]) + if d > dmax { + index = i + dmax = d + } + } + + if dmax > epsilon { + recResults1 := simplifyPolygonRDP(points[:index+1], epsilon) + recResults2 := simplifyPolygonRDP(points[index:], epsilon) + + result := append([][2]float64{}, recResults1[:len(recResults1)-1]...) + result = append(result, recResults2...) + return result + } + + return [][2]float64{points[0], points[end]} +} + +func ExtractBoardSides(poly [][2]float64) []BoardSide { + if len(poly) < 3 { + return nil + } + + // Determine "center" of polygon to find outward normals + cx, cy := 0.0, 0.0 + for _, p := range poly { + cx += p[0] + cy += p[1] + } + cx /= float64(len(poly)) + cy /= float64(len(poly)) + + // Ensure the polygon is closed for RDP, if it isn't already + if poly[0][0] != poly[len(poly)-1][0] || poly[0][1] != poly[len(poly)-1][1] { + poly = append(poly, poly[0]) + } + + simplified := simplifyPolygonRDP(poly, 0.2) // 0.2mm tolerance + fmt.Printf("[DEBUG] ExtractBoardSides: poly points = %d, simplified points = %d\n", len(poly), len(simplified)) + + var sides []BoardSide + sideNum := 1 + + for i := 0; i < len(simplified)-1; i++ { + p1 := simplified[i] + p2 := simplified[i+1] + + dx := p2[0] - p1[0] + dy := p2[1] - p1[1] + length := math.Sqrt(dx*dx + dy*dy) + + // Only keep substantial straight edges (e.g. > 4mm) + if length > 4.0 { + // Calculate outward normal angle + // The segment path vector is (dx, dy). Normal is either (-dy, dx) or (dy, -dx) + nx := dy + ny := -dx + // Dot product with center->midpoint to check if it points out + midX := (p1[0] + p2[0]) / 2.0 + midY := (p1[1] + p2[1]) / 2.0 + vx := midX - cx + vy := midY - cy + if nx*vx+ny*vy < 0 { + nx = -nx + ny = -ny + } + angle := math.Atan2(ny, nx) + + sides = append(sides, BoardSide{ + Num: sideNum, + Label: fmt.Sprintf("Side %d (%.1fmm)", sideNum, length), + Length: length, + StartX: p1[0], + StartY: p1[1], + EndX: p2[0], + EndY: p2[1], + Angle: angle, + }) + sideNum++ + } + } + return sides +} + +// ExtractBoardSidesFromMask traces the outer boundary of a boolean mask +// and simplifies it into BoardSides. This perfectly matches the 3D generation. +func ExtractBoardSidesFromMask(mask []bool, imgW, imgH int, pixelToMM float64, bounds *Bounds) []BoardSide { + // Find top-leftmost pixel of mask + startX, startY := -1, -1 +outer: + for y := 0; y < imgH; y++ { + for x := 0; x < imgW; x++ { + if mask[y*imgW+x] { + startX, startY = x, y + break outer + } + } + } + if startX == -1 { + return nil + } + + // Moore-neighbor boundary tracing + var boundary [][2]int + dirs := [8][2]int{{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}} + + curX, curY := startX, startY + boundary = append(boundary, [2]int{curX, curY}) + + // Initial previous neighbor direction (up/west of top-left is empty) + pDir := 6 + + for { + found := false + for i := 0; i < 8; i++ { + // Scan clockwise starting from dir after the previous background pixel + testDir := (pDir + 1 + i) % 8 + nx, ny := curX+dirs[testDir][0], curY+dirs[testDir][1] + if nx >= 0 && nx < imgW && ny >= 0 && ny < imgH && mask[ny*imgW+nx] { + curX, curY = nx, ny + boundary = append(boundary, [2]int{curX, curY}) + // The new background pixel is opposite to the direction we found the solid one + pDir = (testDir + 4) % 8 + found = true + break + } + } + if !found { + break // Isolated pixel + } + // Stop when we return to the start and moved in the same direction + if curX == startX && curY == startY { + break + } + // Failsafe for complex shapes + if len(boundary) > imgW*imgH { + break + } + } + + // Convert boundary pixels to Gerber mm coordinates + var poly [][2]float64 + for _, p := range boundary { + px := float64(p[0])*pixelToMM + bounds.MinX + // Image Y=0 is MaxY in Gerber space + py := bounds.MaxY - float64(p[1])*pixelToMM + poly = append(poly, [2]float64{px, py}) + } + + sides := ExtractBoardSides(poly) + fmt.Printf("[DEBUG] ExtractBoardSidesFromMask: mask size=%dx%d, boundary pixels=%d, sides extracted=%d\n", imgW, imgH, len(boundary), len(sides)) + if len(sides) == 0 && len(poly) > 0 { + fmt.Printf("[DEBUG] poly[0]=%v, poly[n/2]=%v, poly[last]=%v\n", poly[0], poly[len(poly)/2], poly[len(poly)-1]) + } + return sides +} + +// GenerateEnclosure creates enclosure + tray meshes from a board outline image and drill holes. +// The enclosure walls conform to the actual board outline shape. +// courtyardImg is optional — if provided, component courtyard regions are cut from the lid (flood-filled). +// soldermaskImg is optional — if provided, soldermask pad openings are also cut from the lid. +func GenerateEnclosure(outlineImg image.Image, drillHoles []DrillHole, cfg EnclosureConfig, courtyardImg image.Image, soldermaskImg image.Image, sideCutouts []SideCutout, boardSides []BoardSide) *EnclosureResult { + pixelToMM := 25.4 / cfg.DPI + bounds := outlineImg.Bounds() + imgW := bounds.Max.X + imgH := bounds.Max.Y + + // Use ComputeWallMask to get the board shape and wall around it + // WallThickness for enclosure = clearance + 2 * wall thickness + clearance := cfg.Clearance + wt := cfg.WallThickness + lidThick := wt + snapHeight := 2.5 + totalWallMM := clearance + 2.0*wt + fmt.Printf("Computing board shape (wall=%.1fmm)...\n", totalWallMM) + wallMask, boardMask := ComputeWallMask(outlineImg, totalWallMM, pixelToMM) // wallMask is now an int slice + + // Determine the actual enclosure boundary = wall | board (expanded by clearance) + // wallMask = pixels that are the wall + // boardMask = pixels inside the board outline + // clearanceMask is just an expansion of boardMask using distance logic up to clearance + // However, we already have wallDist which measures distance OUTWARD from board + clearanceDistPx := int(clearance * cfg.DPI / 25.4) + trayWallOuterPx := int((clearance + wt) * cfg.DPI / 25.4) + encWallOuterPx := int((clearance + 2.0*wt) * cfg.DPI / 25.4) + snapDepthPx := int(0.5 * cfg.DPI / 25.4) + if snapDepthPx < 1 { + snapDepthPx = 1 + } + + // Total height of the enclosure (from bottom of tray to top of lid) + pcbT := cfg.PCBThickness + trayFloor := pcbT + 0.5 // Tray floor is 0.5mm thick, sits below PCB + totalH := trayFloor + cfg.WallHeight + lidThick + + size := imgW * imgH + + var encTris [][3]Point + var trayTris [][3]Point + + // Mounting pegs from NPTH holes: cylinders going from lid downward + pegMask := make([]bool, size) // true = peg/socket at this pixel (exclude from tray floor) + if cfg.OutlineBounds != nil { + mountingHoles := 0 + for _, h := range drillHoles { + if h.Type != DrillTypeMounting { + continue + } + mountingHoles++ + + // Convert drill mm coordinates to pixel coordinates + px := (h.X - cfg.OutlineBounds.MinX) * cfg.DPI / 25.4 + py := (h.Y - cfg.OutlineBounds.MinY) * cfg.DPI / 25.4 + + // Peg radius slightly smaller than hole for press fit + pegRadiusMM := (h.Diameter / 2) - 0.15 + pegRadiusPx := pegRadiusMM * cfg.DPI / 25.4 + // Socket radius slightly larger for easy insertion + socketRadiusPx := (h.Diameter/2 + 0.1) * cfg.DPI / 25.4 + + // Peg height: from bottom (z=0) up to lid + pegH := totalH - lidThick + + // Scan a bounding box around the hole + rInt := int(socketRadiusPx) + 2 + cx, cy := int(px), int(py) + + for dy := -rInt; dy <= rInt; dy++ { + for dx := -rInt; dx <= rInt; dx++ { + ix, iy := cx+dx, cy+dy + if ix < 0 || ix >= imgW || iy < 0 || iy >= imgH { + continue + } + dist := math.Sqrt(float64(dx*dx + dy*dy)) + + // Peg cylinder (in enclosure, from z=0 up to lid) + if dist <= pegRadiusPx { + bx := float64(ix) * pixelToMM + by := float64(iy) * pixelToMM + addBoxAtZ(&encTris, bx, by, 0, pixelToMM, pixelToMM, pegH) + } + + // Socket mask (for tray floor removal) + if dist <= socketRadiusPx { + pegMask[iy*imgW+ix] = true + } + } + } + } + if mountingHoles > 0 { + fmt.Printf("Generated %d mounting pegs\n", mountingHoles) + } + } + + // Pre-compute board bounding box (needed for side cutout detection and removal tabs) + minBX, minBY := imgW, imgH + maxBX, maxBY := 0, 0 + boardCenterX, boardCenterY := 0.0, 0.0 + boardCount := 0 + for y := 0; y < imgH; y++ { + for x := 0; x < imgW; x++ { + if boardMask[y*imgW+x] { + boardCenterX += float64(x) + boardCenterY += float64(y) + boardCount++ + if x < minBX { + minBX = x + } + if x > maxBX { + maxBX = x + } + if y < minBY { + minBY = y + } + if y > maxBY { + maxBY = y + } + } + } + } + + // === APPLY PRY SLOT CUTOUTS TO WALL MASK BEFORE MESHING === + // We want 8mm wide by 1.5mm deep slots in the left and right exterior walls + if boardCount > 0 { + pryWPx := int(8.0 * cfg.DPI / 25.4) + pryDPx := int(1.5 * cfg.DPI / 25.4) + if pryWPx < 1 { + pryWPx = 1 + } + if pryDPx < 1 { + pryDPx = 1 + } + + centerYPx := int(boardCenterY / float64(boardCount)) + leftXPx := minBX + rightXPx := maxBX + + // For the left side, we clear the wall mask from minBX-wallPx up to minBX-wallPx+pryDPx + for y := centerYPx - pryWPx/2; y <= centerYPx+pryWPx/2; y++ { + if y < 0 || y >= imgH { + continue + } + // Find outer edge of wall on the left + for x := 0; x < leftXPx; x++ { + idx := y*imgW + x + if wallMask[idx] > clearanceDistPx { + // Blank out the outermost pryDPx pixels of the wall + for dx := 0; dx < pryDPx; dx++ { + if x+dx < imgW { + wallMask[y*imgW+(x+dx)] = -1 + } + } + break // Only do the outer edge + } + } + + // Find outer edge of wall on the right (search backwards) + for x := imgW - 1; x > rightXPx; x-- { + idx := y*imgW + x + if wallMask[idx] > clearanceDistPx { + // Blank out the outermost pryDPx pixels of the wall + for dx := 0; dx < pryDPx; dx++ { + if x-dx >= 0 { + wallMask[y*imgW+(x-dx)] = -1 + } + } + break // Only do the outer edge + } + } + } + } + + // Build wall-cutout mask from side cutouts + // For each side cutout, determine which wall pixels to subtract + wallCutoutMask := make([]bool, size) + if len(sideCutouts) > 0 && cfg.OutlineBounds != nil { + // Board bounding box in pixels + for y := 0; y < imgH; y++ { + for x := 0; x < imgW; x++ { + idx := y*imgW + x + if !(wallMask[idx] > clearanceDistPx && wallMask[idx] <= encWallOuterPx && !boardMask[idx]) { + continue // not a wall pixel + } + + // Determine which side this wall pixel belongs to + bx := float64(x)*pixelToMM + cfg.OutlineBounds.MinX + by := cfg.OutlineBounds.MaxY - float64(y)*pixelToMM + + sideNum := -1 + minDist := math.MaxFloat64 + var posAlongSide float64 + + for _, bs := range boardSides { + dx := bs.EndX - bs.StartX + dy := bs.EndY - bs.StartY + lenSq := dx*dx + dy*dy + if lenSq == 0 { + continue + } + + t := ((bx-bs.StartX)*dx + (by-bs.StartY)*dy) / lenSq + tClamp := math.Max(0, math.Min(1, t)) + + projX := bs.StartX + tClamp*dx + projY := bs.StartY + tClamp*dy + + dist := math.Sqrt((bx-projX)*(bx-projX) + (by-projY)*(by-projY)) + if dist < minDist { + minDist = dist + sideNum = bs.Num + posAlongSide = t * bs.Length + } + } + + // Check all cutouts for this side + for _, c := range sideCutouts { + if c.Side != sideNum { + continue + } + // Check if this pixel's position falls within the cutout X range + if posAlongSide >= c.X && posAlongSide <= c.X+c.Width { + wallCutoutMask[idx] = true + break + } + } + } + } + fmt.Printf("Wall cutout mask: applied %d side cutouts\n", len(sideCutouts)) + } + + // ENCLOSURE (top shell — conforms to board shape) + // ========================================== + fmt.Println("Generating edge-cut conforming enclosure...") + + // The Enclosure Wall sits on top of the Tray Floor (starts at Z = trayFloor) + // Inner Wall (above snapHeight) = `clearanceDistPx` to `trayWallOuterPx` + // Outer Wall (full height) = `trayWallOuterPx` to `encWallOuterPx` + for y := 0; y < imgH; y++ { + runStartX := -1 + curIsInner := false + curIsSnap := false + for x := 0; x <= imgW; x++ { + isWallPx := false + isInnerWall := false + isSnapGroove := false + if x < imgW { + idx := y*imgW + x + dist := wallMask[idx] + if dist > clearanceDistPx && dist <= encWallOuterPx && !boardMask[idx] && !pegMask[idx] { + isWallPx = true + if dist <= trayWallOuterPx { + isInnerWall = true + } else if dist <= trayWallOuterPx+snapDepthPx { + isSnapGroove = true + } + } + } + + if isWallPx { + if runStartX == -1 { + runStartX = x + curIsInner = isInnerWall + curIsSnap = isSnapGroove + } else if isInnerWall != curIsInner || isSnapGroove != curIsSnap { + // boundary between inner, outer, and snap groove + bx := float64(runStartX) * pixelToMM + by := float64(y) * pixelToMM + bw := float64(x-runStartX) * pixelToMM + bh := pixelToMM + + isSpringRelief := false + if !curIsInner && bx >= float64(minBX)*pixelToMM-clearance-wt-1.0 && bx <= float64(maxBX)*pixelToMM+clearance+wt+1.0 { + // Check if the current pixel run constitutes either the left or right clip relief + pryWMM := 8.0 + by_center := float64(int(boardCenterY/float64(boardCount))) * pixelToMM + + leftClipX := float64(minBX)*pixelToMM - clearance - wt + rightClipX := float64(maxBX)*pixelToMM + clearance + wt + + if by >= by_center-pryWMM/2.0-0.5 && by <= by_center+pryWMM/2.0+0.5 { + if math.Abs(bx-leftClipX) <= 1.5 || math.Abs(bx-rightClipX) <= 1.5 { + isSpringRelief = true + } + } + } + + if curIsInner { + addBoxAtZ(&encTris, bx, by, trayFloor+snapHeight, bw, bh, totalH-(trayFloor+snapHeight)) + } else { + if isSpringRelief { + // For relief wall cut, omit the bottom solid wall material from the tray floor + addBoxAtZ(&encTris, bx, by, trayFloor+snapHeight+1.0, bw, bh, totalH-(trayFloor+snapHeight+1.0)) + } else if curIsSnap { + // Snap groove: remove material from (trayFloor+snapHeight-0.7) to (trayFloor+snapHeight-0.1) + addBoxAtZ(&encTris, bx, by, trayFloor, bw, bh, snapHeight-0.7) + addBoxAtZ(&encTris, bx, by, trayFloor+snapHeight-0.1, bw, bh, totalH-(trayFloor+snapHeight-0.1)) + } else { + // Outer wall + addBoxAtZ(&encTris, bx, by, trayFloor, bw, bh, totalH-trayFloor) + } + } + + runStartX = x + curIsInner = isInnerWall + curIsSnap = isSnapGroove + } + } else { + if runStartX != -1 { + bx := float64(runStartX) * pixelToMM + by := float64(y) * pixelToMM + bw := float64(x-runStartX) * pixelToMM + bh := pixelToMM + + isSpringRelief := false + if !curIsInner && bx >= float64(minBX)*pixelToMM-clearance-wt-1.0 && bx <= float64(maxBX)*pixelToMM+clearance+wt+1.0 { + pryWMM := 8.0 + by_center := float64(int(boardCenterY/float64(boardCount))) * pixelToMM + + leftClipX := float64(minBX)*pixelToMM - clearance - wt + rightClipX := float64(maxBX)*pixelToMM + clearance + wt + + if by >= by_center-pryWMM/2.0-0.5 && by <= by_center+pryWMM/2.0+0.5 { + if math.Abs(bx-leftClipX) <= 1.5 || math.Abs(bx-rightClipX) <= 1.5 { + isSpringRelief = true + } + } + } + + if curIsInner { + addBoxAtZ(&encTris, bx, by, trayFloor+snapHeight, bw, bh, totalH-(trayFloor+snapHeight)) + } else { + if isSpringRelief { + // For relief wall cut, omit the bottom solid wall material from the tray floor + addBoxAtZ(&encTris, bx, by, trayFloor+snapHeight+1.0, bw, bh, totalH-(trayFloor+snapHeight+1.0)) + } else if curIsSnap { + addBoxAtZ(&encTris, bx, by, trayFloor, bw, bh, snapHeight-0.7) + addBoxAtZ(&encTris, bx, by, trayFloor+snapHeight-0.1, bw, bh, totalH-(trayFloor+snapHeight-0.1)) + } else { + addBoxAtZ(&encTris, bx, by, trayFloor, bw, bh, totalH-trayFloor) + } + } + runStartX = -1 + } + } + } + } + + // Now subtract side cutout regions from the walls + // For each cutout, we remove wall material in the Z range [cutout.Y, cutout.Y+cutout.H] + // by NOT generating boxes in that region. Since we already generated full-height walls, + // we rebuild wall columns where cutouts exist with gaps. + if len(sideCutouts) > 0 { + var cutoutEncTris [][3]Point + for y := 0; y < imgH; y++ { + runStart := -1 + for x := 0; x <= imgW; x++ { + isCutWall := false + if x < imgW { + idx := y*imgW + x + isCutWall = wallCutoutMask[idx] + } + + if isCutWall { + if runStart == -1 { + runStart = x + } + } else { + if runStart != -1 { + // This run of wall pixels has cutouts — find which cutout + midX := (runStart + x) / 2 + midIdx := y*imgW + midX + _ = midIdx + + // Find the dominant side and cutout for this run + bx := float64(midX)*pixelToMM + cfg.OutlineBounds.MinX + by := cfg.OutlineBounds.MaxY - float64(y)*pixelToMM + + sideNum := -1 + minDist := math.MaxFloat64 + var bestPosAlongSide float64 + for _, bs := range boardSides { + dx := bs.EndX - bs.StartX + dy := bs.EndY - bs.StartY + lenSq := dx*dx + dy*dy + if lenSq == 0 { + continue + } + t := ((bx-bs.StartX)*dx + (by-bs.StartY)*dy) / lenSq + tClamp := math.Max(0, math.Min(1, t)) + projX := bs.StartX + tClamp*dx + projY := bs.StartY + tClamp*dy + dist := math.Sqrt((bx-projX)*(bx-projX) + (by-projY)*(by-projY)) + if dist < minDist { + minDist = dist + sideNum = bs.Num + bestPosAlongSide = t * bs.Length + } + } + + bx2 := float64(runStart) * pixelToMM + by2 := float64(y) * pixelToMM + bw := float64(x-runStart) * pixelToMM + bh := pixelToMM + + // Find the matching cutout for this side + for _, c := range sideCutouts { + if c.Side != sideNum { + continue + } + + minZ, maxZ := cutoutZBounds(c, bestPosAlongSide) + minZ += trayFloor + pcbT + maxZ += trayFloor + pcbT + + // Wall below cutout: from trayFloor to minZ (preserve enclosure floor) + if minZ > trayFloor+0.3 { + addBoxAtZ(&cutoutEncTris, bx2, by2, trayFloor, bw, bh, minZ-trayFloor) + } + // Wall above cutout: from maxZ to totalH + if maxZ < totalH-0.05 { + addBoxAtZ(&cutoutEncTris, bx2, by2, maxZ, bw, bh, totalH-maxZ) + } + break + } + runStart = -1 + } + } + } + } + // Replace full-height walls with cutout walls + // First remove the original full-height boxes for cutout pixels + // (They were already added above, so we need to rebuild) + // Simpler approach: rebuild encTris without cutout regions, then add partial walls + var newEncTris [][3]Point + // Re-generate walls, skipping cutout pixels + for y := 0; y < imgH; y++ { + runStart := -1 + for x := 0; x <= imgW; x++ { + isWallPixel := false + if x < imgW { + idx := y*imgW + x + isWallPixel = wallMask[idx] > clearanceDistPx && wallMask[idx] <= encWallOuterPx && !boardMask[idx] && !wallCutoutMask[idx] + } + + if isWallPixel { + if runStart == -1 { + runStart = x + } + } else { + if runStart != -1 { + bx := float64(runStart) * pixelToMM + by2 := float64(y) * pixelToMM + bw := float64(x-runStart) * pixelToMM + bh := pixelToMM + addBoxAtZ(&newEncTris, bx, by2, trayFloor, bw, bh, totalH-trayFloor) + runStart = -1 + } + } + } + } + // Add the partial (cut) wall sections + newEncTris = append(newEncTris, cutoutEncTris...) + encTris = newEncTris + } + + // Note: We handled pry slots by cropping the wallMask before running the generation. + + // Lid: cover the entire enclosure footprint at the top + // Lid pixels = any pixel in wallMask OR clearanceMask OR boardMask + // Subtract courtyard regions (component footprints) from the lid + fmt.Println("Generating lid...") + + // Build courtyard cutout mask using flood-fill + courtyardMask := buildCutoutMask(courtyardImg, imgW, imgH, true) // flood-fill closed outlines + if courtyardImg != nil { + cutoutCount := 0 + for _, v := range courtyardMask { + if v { + cutoutCount++ + } + } + fmt.Printf("Courtyard cutout (flood-filled): %d pixels\n", cutoutCount) + } + + // Build soldermask cutout mask (direct pixel match, no flood-fill) + soldermaskMask := buildCutoutMask(soldermaskImg, imgW, imgH, false) + if soldermaskImg != nil { + cutoutCount := 0 + for _, v := range soldermaskMask { + if v { + cutoutCount++ + } + } + fmt.Printf("Soldermask cutout: %d pixels\n", cutoutCount) + } + + // Combined cutout: union of courtyard (filled) and soldermask + combinedCutout := make([]bool, size) + for i := 0; i < size; i++ { + combinedCutout[i] = courtyardMask[i] || soldermaskMask[i] + } + + for y := 0; y < imgH; y++ { + runStart := -1 + for x := 0; x <= imgW; x++ { + isLidPixel := false + if x < imgW { + idx := y*imgW + x + inFootprint := (wallMask[idx] >= 0 && wallMask[idx] <= encWallOuterPx) || boardMask[idx] + // Cut lid where combined cutout exists inside the board area + isCutout := combinedCutout[idx] && boardMask[idx] + isLidPixel = inFootprint && !isCutout + } + + if isLidPixel { + if runStart == -1 { + runStart = x + } + } else { + if runStart != -1 { + bx := float64(runStart) * pixelToMM + by := float64(y) * pixelToMM + bw := float64(x-runStart) * pixelToMM + bh := pixelToMM + addBoxAtZ(&encTris, bx, by, totalH-lidThick, bw, bh, lidThick) + runStart = -1 + } + } + } + } + // (Peg calculations moved above) + + // ========================================== + // TRAY (bottom — conforms to board shape) + // ========================================== + fmt.Println("Generating edge-cut conforming tray...") + + for y := 0; y < imgH; y++ { + runStartX := -1 + curIsWall := false + for x := 0; x <= imgW; x++ { + isTrayFloor := false + isTrayWall := false + if x < imgW { + idx := y*imgW + x + if !pegMask[idx] { + dist := wallMask[idx] + // Tray Floor covers everything up to encWallOuterPx + if (dist >= 0 && dist <= encWallOuterPx) || boardMask[idx] { + isTrayFloor = true + } + // Tray Wall goes from clearance to trayWallOuterPx + if dist > clearanceDistPx && dist <= trayWallOuterPx && !boardMask[idx] { + isTrayWall = true + } + } + } + + if isTrayFloor { + if runStartX == -1 { + runStartX = x + curIsWall = isTrayWall + } else if isTrayWall != curIsWall { + bx := float64(runStartX) * pixelToMM + by := float64(y) * pixelToMM + bw := float64(x-runStartX) * pixelToMM + bh := pixelToMM + + addBoxAtZ(&trayTris, bx, by, 0, bw, bh, trayFloor) + + wallBase := trayFloor + wallH := snapHeight + + // Evaluate cutout limits if this pixel run falls into a cutout mask + isCutout := false + for testX := runStartX; testX < x; testX++ { + if wallCutoutMask[y*imgW+testX] { + isCutout = true + break + } + } + + if isCutout && len(sideCutouts) > 0 { + midX := (runStartX + x) / 2 + bxMid := float64(midX)*pixelToMM + cfg.OutlineBounds.MinX + byMid := cfg.OutlineBounds.MaxY - float64(y)*pixelToMM + + sideNum := -1 + minDist := math.MaxFloat64 + var bestPosAlongSide float64 + for _, bs := range boardSides { + dx := bs.EndX - bs.StartX + dy := bs.EndY - bs.StartY + lenSq := dx*dx + dy*dy + if lenSq == 0 { + continue + } + t := ((bxMid-bs.StartX)*dx + (byMid-bs.StartY)*dy) / lenSq + tClamp := math.Max(0, math.Min(1, t)) + projX := bs.StartX + tClamp*dx + projY := bs.StartY + tClamp*dy + dist := math.Sqrt((bxMid-projX)*(bxMid-projX) + (byMid-projY)*(byMid-projY)) + if dist < minDist { + minDist = dist + sideNum = bs.Num + bestPosAlongSide = t * bs.Length + } + } + + for _, c := range sideCutouts { + if c.Side == sideNum { + minZ, _ := cutoutZBounds(c, bestPosAlongSide) + minZ += trayFloor + pcbT + + // Tray wall goes up to trayFloor + snapHeight. If minZ is lower, truncate it. + if minZ < trayFloor+wallH { + wallH = minZ - trayFloor + if wallH < 0 { + wallH = 0 + } + } + break + } + } + } + + if curIsWall && wallH > 0.05 { + addBoxAtZ(&trayTris, bx, by, wallBase, bw, bh, wallH) + } + + runStartX = x + curIsWall = isTrayWall + } + } else { + if runStartX != -1 { + bx := float64(runStartX) * pixelToMM + by := float64(y) * pixelToMM + bw := float64(x-runStartX) * pixelToMM + bh := pixelToMM + + addBoxAtZ(&trayTris, bx, by, 0, bw, bh, trayFloor) + + wallBase := trayFloor + wallH := snapHeight + + // Evaluate cutout limits if this pixel run falls into a cutout mask + isCutout := false + for testX := runStartX; testX < x; testX++ { + if wallCutoutMask[y*imgW+testX] { + isCutout = true + break + } + } + + if isCutout && len(sideCutouts) > 0 { + midX := (runStartX + x) / 2 + bxMid := float64(midX)*pixelToMM + cfg.OutlineBounds.MinX + byMid := cfg.OutlineBounds.MaxY - float64(y)*pixelToMM + + sideNum := -1 + minDist := math.MaxFloat64 + var bestPosAlongSide float64 + for _, bs := range boardSides { + dx := bs.EndX - bs.StartX + dy := bs.EndY - bs.StartY + lenSq := dx*dx + dy*dy + if lenSq == 0 { + continue + } + t := ((bxMid-bs.StartX)*dx + (byMid-bs.StartY)*dy) / lenSq + tClamp := math.Max(0, math.Min(1, t)) + projX := bs.StartX + tClamp*dx + projY := bs.StartY + tClamp*dy + dist := math.Sqrt((bxMid-projX)*(bxMid-projX) + (byMid-projY)*(byMid-projY)) + if dist < minDist { + minDist = dist + sideNum = bs.Num + bestPosAlongSide = t * bs.Length + } + } + + for _, c := range sideCutouts { + if c.Side == sideNum { + minZ, _ := cutoutZBounds(c, bestPosAlongSide) + minZ += trayFloor + pcbT + + if minZ < trayFloor+wallH { + wallH = minZ - trayFloor + if wallH < 0 { + wallH = 0 + } + } + break + } + } + } + + if curIsWall && wallH > 0.05 { + addBoxAtZ(&trayTris, bx, by, wallBase, bw, bh, wallH) + } + runStartX = -1 + } + } + } + } + + // Add Pry Clips to the Tray to sit under the Enclosure Pry Slots + if boardCount > 0 { + pryWMM := 8.0 + pryDMM := 1.0 + clipH := 0.8 + + leftX := float64(minBX)*pixelToMM - clearance - wt + rightX := float64(maxBX)*pixelToMM + clearance + wt + by_center := float64(int(boardCenterY/float64(boardCount))) * pixelToMM + + // Z coordinates: trayFloor + snapHeight - clipH ensures the clip finishes flush with the top of the tray wall + addBoxAtZ(&trayTris, leftX-pryDMM, by_center-pryWMM/2.0, trayFloor+snapHeight-clipH, pryDMM, pryWMM, clipH) + addBoxAtZ(&trayTris, rightX, by_center-pryWMM/2.0, trayFloor+snapHeight-clipH, pryDMM, pryWMM, clipH) + } + + _ = math.Pi // keep math import for Phase 2 cylindrical pegs + + // Shift meshes to origin so the exported STL is centered + offsetX := float64(imgW) * pixelToMM / 2.0 + offsetY := float64(imgH) * pixelToMM / 2.0 + + for i := range encTris { + for j := 0; j < 3; j++ { + encTris[i][j].X -= offsetX + encTris[i][j].Y -= offsetY + } + } + for i := range trayTris { + for j := 0; j < 3; j++ { + trayTris[i][j].X -= offsetX + trayTris[i][j].Y -= offsetY + } + } + + return &EnclosureResult{ + EnclosureTriangles: encTris, + TrayTriangles: trayTris, + } +} + +// addBoxAtZ creates a box at a specific Z offset +func addBoxAtZ(triangles *[][3]Point, x, y, z, w, h, zHeight float64) { + x0, y0 := x, y + x1, y1 := x+w, y+h + z0, z1 := z, z+zHeight + + p000 := Point{x0, y0, z0} + p100 := Point{x1, y0, z0} + p110 := Point{x1, y1, z0} + p010 := Point{x0, y1, z0} + p001 := Point{x0, y0, z1} + p101 := Point{x1, y0, z1} + p111 := Point{x1, y1, z1} + p011 := Point{x0, y1, z1} + + addQuad := func(a, b, c, d Point) { + *triangles = append(*triangles, [3]Point{a, b, c}) + *triangles = append(*triangles, [3]Point{c, d, a}) + } + + addQuad(p000, p010, p110, p100) // Bottom + addQuad(p101, p111, p011, p001) // Top + addQuad(p000, p100, p101, p001) // Front + addQuad(p100, p110, p111, p101) // Right + addQuad(p110, p010, p011, p111) // Back + addQuad(p010, p000, p001, p011) // Left +} + +// buildCutoutMask creates a boolean mask from an image. +// If floodFill is true, it flood-fills from the edges to find closed regions. +func buildCutoutMask(img image.Image, w, h int, floodFill bool) []bool { + size := w * h + mask := make([]bool, size) + + if img == nil { + return mask + } + + // First: build raw pixel mask from the image + bounds := img.Bounds() + rawPixels := make([]bool, size) + for y := 0; y < h && y < bounds.Max.Y; y++ { + for x := 0; x < w && x < bounds.Max.X; x++ { + r, g, b, _ := img.At(x+bounds.Min.X, y+bounds.Min.Y).RGBA() + gray := color.GrayModel.Convert(color.NRGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), 255}).(color.Gray) + if gray.Y > 128 { + rawPixels[y*w+x] = true + } + } + } + + if !floodFill { + // Direct mode: raw pixels are the mask + return rawPixels + } + + // Flood-fill mode: fill from edges to find exterior, invert to get interiors + // Exterior = everything reachable from edges without crossing a white pixel + exterior := floodFillExterior(rawPixels, w, h) + + // Interior = NOT exterior AND NOT raw pixel (the outline itself) + // Actually, interior = NOT exterior (includes both outline pixels and filled regions) + for i := 0; i < size; i++ { + mask[i] = !exterior[i] + } + + return mask +} + +// floodFillExterior marks all pixels reachable from the image edges +// without crossing a white (true) pixel as exterior +func floodFillExterior(pixels []bool, w, h int) []bool { + size := w * h + exterior := make([]bool, size) + + // BFS queue starting from all edge pixels that are not white + queue := make([]int, 0, w*2+h*2) + + for x := 0; x < w; x++ { + // Top edge + if !pixels[x] { + exterior[x] = true + queue = append(queue, x) + } + // Bottom edge + idx := (h-1)*w + x + if !pixels[idx] { + exterior[idx] = true + queue = append(queue, idx) + } + } + for y := 0; y < h; y++ { + // Left edge + idx := y * w + if !pixels[idx] { + exterior[idx] = true + queue = append(queue, idx) + } + // Right edge + idx = y*w + (w - 1) + if !pixels[idx] { + exterior[idx] = true + queue = append(queue, idx) + } + } + + // BFS + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + + x := cur % w + y := cur / w + + for _, d := range [][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} { + nx, ny := x+d[0], y+d[1] + if nx >= 0 && nx < w && ny >= 0 && ny < h { + ni := ny*w + nx + if !exterior[ni] && !pixels[ni] { + exterior[ni] = true + queue = append(queue, ni) + } + } + } + } + + return exterior +} + +// cutoutZBounds calculates the accurate Z bounds taking into account corner radii +func cutoutZBounds(c SideCutout, posAlongSide float64) (float64, float64) { + minZ := c.Y + maxZ := c.Y + c.Height + + if c.CornerRadius > 0 { + r := c.CornerRadius + localX := posAlongSide - c.X + + if localX < r { + dx := r - localX + dy := r - math.Sqrt(math.Max(0, r*r-dx*dx)) + minZ += dy + maxZ -= dy + } else if localX > c.Width-r { + dx := localX - (c.Width - r) + dy := r - math.Sqrt(math.Max(0, r*r-dx*dx)) + minZ += dy + maxZ -= dy + } + } + return minZ, maxZ +} diff --git a/former.go b/former.go new file mode 100644 index 0000000..9a1dc6a --- /dev/null +++ b/former.go @@ -0,0 +1,412 @@ +package main + +import ( + "image" + "image/color" + "strings" +) + +// KiCad-standard layer colors (NRGBA, no alpha — alpha is controlled by BaseAlpha) +var ( + ColorFCu = color.NRGBA{R: 200, G: 52, B: 52, A: 255} + ColorBCu = color.NRGBA{R: 77, G: 127, B: 196, A: 255} + ColorFPaste = color.NRGBA{R: 200, G: 52, B: 52, A: 255} + ColorBPaste = color.NRGBA{R: 0, G: 194, B: 194, A: 255} + ColorFMask = color.NRGBA{R: 132, G: 0, B: 132, A: 255} + ColorBMask = color.NRGBA{R: 0, G: 132, B: 132, A: 255} + ColorFSilkS = color.NRGBA{R: 232, G: 232, B: 232, A: 255} + ColorBSilkS = color.NRGBA{R: 200, G: 200, B: 200, A: 255} + ColorFab = color.NRGBA{R: 132, G: 132, B: 132, A: 255} + ColorEdgeCuts = color.NRGBA{R: 200, G: 200, B: 0, A: 255} + ColorCrtYd = color.NRGBA{R: 194, G: 194, B: 194, A: 255} + ColorEnclosure = color.NRGBA{R: 255, G: 253, B: 230, A: 255} + ColorStencil = color.NRGBA{R: 180, G: 180, B: 180, A: 255} +) + +// FormerLayer represents a single displayable layer in The Former. +type FormerLayer struct { + Name string + Color color.NRGBA + Source image.Image // raw white-on-black gerber render + Visible bool + Highlight bool + BaseAlpha float64 // default opacity 0.0–1.0 (all layers slightly transparent) + SourceFile string // original gerber filename (key into AllLayerGerbers) +} + +// ElementBBox describes a selectable graphic element's bounding box on a layer. +type ElementBBox struct { + ID int `json:"id"` + MinX float64 `json:"minX"` + MinY float64 `json:"minY"` + MaxX float64 `json:"maxX"` + MaxY float64 `json:"maxY"` + Type string `json:"type"` + Footprint string `json:"footprint"` +} + +// ExtractElementBBoxes walks gerber commands and returns bounding boxes in image pixel coordinates. +func ExtractElementBBoxes(gf *GerberFile, dpi float64, bounds *Bounds) []ElementBBox { + if gf == nil { + return nil + } + + mmToPx := func(mmX, mmY float64) (float64, float64) { + px := (mmX - bounds.MinX) * dpi / 25.4 + py := (bounds.MaxY - mmY) * dpi / 25.4 + return px, py + } + + apertureRadius := func(dcode int) float64 { + if ap, ok := gf.State.Apertures[dcode]; ok && len(ap.Modifiers) > 0 { + return ap.Modifiers[0] / 2.0 + } + return 0.25 + } + + var elements []ElementBBox + id := 0 + curX, curY := 0.0, 0.0 + curDCode := 0 + + for _, cmd := range gf.Commands { + switch cmd.Type { + case "APERTURE": + if cmd.D != nil { + curDCode = *cmd.D + } + continue + case "G01", "G02", "G03", "G36", "G37": + continue + } + + prevX, prevY := curX, curY + if cmd.X != nil { + curX = *cmd.X + } + if cmd.Y != nil { + curY = *cmd.Y + } + + switch cmd.Type { + case "FLASH": // D03 + r := apertureRadius(curDCode) + px, py := mmToPx(curX, curY) + rpx := r * dpi / 25.4 + elements = append(elements, ElementBBox{ + ID: id, + MinX: px - rpx, + MinY: py - rpx, + MaxX: px + rpx, + MaxY: py + rpx, + Type: "pad", + Footprint: cmd.Footprint, + }) + id++ + + case "DRAW": // D01 + r := apertureRadius(curDCode) + px1, py1 := mmToPx(prevX, prevY) + px2, py2 := mmToPx(curX, curY) + rpx := r * dpi / 25.4 + minPx := px1 + if px2 < minPx { + minPx = px2 + } + maxPx := px1 + if px2 > maxPx { + maxPx = px2 + } + minPy := py1 + if py2 < minPy { + minPy = py2 + } + maxPy := py1 + if py2 > maxPy { + maxPy = py2 + } + elements = append(elements, ElementBBox{ + ID: id, + MinX: minPx - rpx, + MinY: minPy - rpx, + MaxX: maxPx + rpx, + MaxY: maxPy + rpx, + Type: "trace", + Footprint: cmd.Footprint, + }) + id++ + } + } + + return elements +} + +// colorizeLayer converts a white-on-black source image into a colored NRGBA image. +// Bright pixels become the layer color at the given alpha; dark pixels become transparent. +func colorizeLayer(src image.Image, col color.NRGBA, alpha float64) *image.NRGBA { + bounds := src.Bounds() + w := bounds.Dx() + h := bounds.Dy() + dst := image.NewNRGBA(image.Rect(0, 0, w, h)) + + a := uint8(alpha * 255) + for y := 0; y < h; y++ { + for x := 0; x < w; x++ { + r, _, _, _ := src.At(x+bounds.Min.X, y+bounds.Min.Y).RGBA() + // r is 0–65535; treat anything above ~10% as "active" + if r > 6500 { + dst.SetNRGBA(x, y, color.NRGBA{R: col.R, G: col.G, B: col.B, A: a}) + } + // else: stays transparent (zero value) + } + } + return dst +} + +// composeLayers blends all visible layers into a single image. +// Background matches the app theme. If any layer has Highlight=true, +// that layer renders at full BaseAlpha while others are dimmed. +func composeLayers(layers []*FormerLayer, width, height int) *image.NRGBA { + dst := image.NewNRGBA(image.Rect(0, 0, width, height)) + + // Fill with theme background + bg := color.NRGBA{R: 52, G: 53, B: 60, A: 255} + for i := 0; i < width*height*4; i += 4 { + dst.Pix[i+0] = bg.R + dst.Pix[i+1] = bg.G + dst.Pix[i+2] = bg.B + dst.Pix[i+3] = bg.A + } + + // Check if any layer is highlighted + hasHighlight := false + for _, l := range layers { + if l.Highlight && l.Visible { + hasHighlight = true + break + } + } + + for _, l := range layers { + if !l.Visible || l.Source == nil { + continue + } + + alpha := l.BaseAlpha + if hasHighlight && !l.Highlight { + alpha *= 0.3 // dim non-highlighted layers + } + + colored := colorizeLayer(l.Source, l.Color, alpha) + + // Alpha-blend colored layer onto dst + srcBounds := colored.Bounds() + for y := 0; y < height && y < srcBounds.Dy(); y++ { + for x := 0; x < width && x < srcBounds.Dx(); x++ { + si := (y*srcBounds.Dx() + x) * 4 + di := (y*width + x) * 4 + + sa := float64(colored.Pix[si+3]) / 255.0 + if sa == 0 { + continue + } + + sr := float64(colored.Pix[si+0]) + sg := float64(colored.Pix[si+1]) + sb := float64(colored.Pix[si+2]) + + dr := float64(dst.Pix[di+0]) + dg := float64(dst.Pix[di+1]) + db := float64(dst.Pix[di+2]) + + inv := 1.0 - sa + dst.Pix[di+0] = uint8(sr*sa + dr*inv) + dst.Pix[di+1] = uint8(sg*sa + dg*inv) + dst.Pix[di+2] = uint8(sb*sa + db*inv) + dst.Pix[di+3] = 255 + } + } + } + + return dst +} + +// layerInfo holds the display name and color for a KiCad layer. +type layerInfo struct { + Name string + Color color.NRGBA + DefaultOn bool // visible by default + Alpha float64 // base alpha + SortOrder int // lower = drawn first (bottom) +} + +// inferLayer maps a gerber filename to its KiCad layer name, color, and defaults. +func inferLayer(filename string) layerInfo { + lf := strings.ToLower(filename) + switch { + case strings.Contains(lf, "edge_cuts") || strings.Contains(lf, "edge.cuts"): + return layerInfo{"Edge Cuts", ColorEdgeCuts, true, 0.7, 10} + case strings.Contains(lf, "f_cu") || strings.Contains(lf, "f.cu") || strings.Contains(lf, "-gtl"): + return layerInfo{"F.Cu", ColorFCu, false, 0.7, 20} + case strings.Contains(lf, "b_cu") || strings.Contains(lf, "b.cu") || strings.Contains(lf, "-gbl"): + return layerInfo{"B.Cu", ColorBCu, false, 0.7, 21} + case (strings.Contains(lf, "in1") || strings.Contains(lf, "in_1")) && strings.Contains(lf, "cu"): + return layerInfo{"In1.Cu", color.NRGBA{R: 200, G: 160, B: 52, A: 255}, false, 0.7, 22} + case (strings.Contains(lf, "in2") || strings.Contains(lf, "in_2")) && strings.Contains(lf, "cu"): + return layerInfo{"In2.Cu", color.NRGBA{R: 200, G: 52, B: 200, A: 255}, false, 0.7, 23} + case strings.Contains(lf, "f_paste") || strings.Contains(lf, "f.paste") || strings.Contains(lf, "-gtp"): + return layerInfo{"F.Paste", ColorFPaste, false, 0.7, 30} + case strings.Contains(lf, "b_paste") || strings.Contains(lf, "b.paste") || strings.Contains(lf, "-gbp"): + return layerInfo{"B.Paste", ColorBPaste, false, 0.7, 31} + case strings.Contains(lf, "f_silks") || strings.Contains(lf, "f.silks") || strings.Contains(lf, "f_silk"): + return layerInfo{"F.SilkS", ColorFSilkS, false, 0.7, 40} + case strings.Contains(lf, "b_silks") || strings.Contains(lf, "b.silks") || strings.Contains(lf, "b_silk"): + return layerInfo{"B.SilkS", ColorBSilkS, false, 0.7, 41} + case strings.Contains(lf, "f_mask") || strings.Contains(lf, "f.mask") || strings.Contains(lf, "-gts"): + return layerInfo{"F.Mask", ColorFMask, false, 0.6, 50} + case strings.Contains(lf, "b_mask") || strings.Contains(lf, "b.mask") || strings.Contains(lf, "-gbs"): + return layerInfo{"B.Mask", ColorBMask, false, 0.6, 51} + case strings.Contains(lf, "f_courtyard") || strings.Contains(lf, "f_crtyd") || strings.Contains(lf, "f.crtyd"): + return layerInfo{"F.CrtYd", ColorCrtYd, false, 0.6, 60} + case strings.Contains(lf, "b_courtyard") || strings.Contains(lf, "b_crtyd") || strings.Contains(lf, "b.crtyd"): + return layerInfo{"B.CrtYd", ColorCrtYd, false, 0.6, 61} + case strings.Contains(lf, "f_fab") || strings.Contains(lf, "f.fab"): + return layerInfo{"F.Fab", ColorFab, false, 0.6, 70} + case strings.Contains(lf, "b_fab") || strings.Contains(lf, "b.fab"): + return layerInfo{"B.Fab", ColorFab, false, 0.6, 71} + case strings.Contains(lf, ".gbrjob"): + return layerInfo{} // skip job files + default: + return layerInfo{filename, color.NRGBA{R: 160, G: 160, B: 160, A: 255}, false, 0.6, 100} + } +} + +// renderEnclosureWallImage generates a 2D top-down image of the enclosure walls +// from the outline image and config. White pixels = wall area. +func renderEnclosureWallImage(outlineImg image.Image, cfg EnclosureConfig) image.Image { + bounds := outlineImg.Bounds() + w := bounds.Dx() + h := bounds.Dy() + + pixelToMM := 25.4 / cfg.DPI + wallDist, boardMask := ComputeWallMask(outlineImg, cfg.WallThickness+cfg.Clearance, pixelToMM) + + wallThickPx := int(cfg.WallThickness / pixelToMM) + + dst := image.NewRGBA(image.Rect(0, 0, w, h)) + for y := 0; y < h; y++ { + for x := 0; x < w; x++ { + idx := y*w + x + // Wall area: outside the board, within wall thickness distance + if !boardMask[idx] && wallDist[idx] > 0 && wallDist[idx] <= wallThickPx { + dst.Pix[idx*4+0] = 255 + dst.Pix[idx*4+1] = 255 + dst.Pix[idx*4+2] = 255 + dst.Pix[idx*4+3] = 255 + } + } + } + return dst +} + +// buildStencilLayers creates FormerLayer slice for the stencil workflow. +func buildStencilLayers(pasteImg, outlineImg image.Image) []*FormerLayer { + var layers []*FormerLayer + + if outlineImg != nil { + layers = append(layers, &FormerLayer{ + Name: "Edge Cuts", + Color: ColorEdgeCuts, + Source: outlineImg, + Visible: true, + BaseAlpha: 0.7, + }) + } + + if pasteImg != nil { + layers = append(layers, &FormerLayer{ + Name: "Solder Paste", + Color: ColorFPaste, + Source: pasteImg, + Visible: true, + BaseAlpha: 0.8, + }) + } + + return layers +} + +// buildEnclosureLayers creates FormerLayer slice for the enclosure workflow +// using ALL uploaded gerber layers, not just the ones with special roles. +func buildEnclosureLayers(session *EnclosureSession) []*FormerLayer { + type sortedLayer struct { + layer *FormerLayer + order int + } + var sorted []sortedLayer + + // Tray — hidden by default, rendered as 3D geometry in the Former + if session.EnclosureWallImg != nil { + sorted = append(sorted, sortedLayer{ + layer: &FormerLayer{ + Name: "Tray", + Color: color.NRGBA{R: 180, G: 200, B: 160, A: 255}, + Source: session.EnclosureWallImg, // placeholder image + Visible: false, + BaseAlpha: 0.4, + }, + order: -1, + }) + } + + // Enclosure walls — bottom layer, very transparent + if session.EnclosureWallImg != nil { + sorted = append(sorted, sortedLayer{ + layer: &FormerLayer{ + Name: "Enclosure", + Color: ColorEnclosure, + Source: session.EnclosureWallImg, + Visible: true, + BaseAlpha: 0.35, + }, + order: 0, + }) + } + + // All gerber layers from uploaded files + for origName, img := range session.AllLayerImages { + if img == nil { + continue + } + info := inferLayer(origName) + if info.Name == "" { + continue + } + sorted = append(sorted, sortedLayer{ + layer: &FormerLayer{ + Name: info.Name, + Color: info.Color, + Source: img, + Visible: info.DefaultOn, + BaseAlpha: info.Alpha, + SourceFile: origName, + }, + order: info.SortOrder, + }) + } + + // Sort by order (lower = bottom) + for i := 0; i < len(sorted); i++ { + for j := i + 1; j < len(sorted); j++ { + if sorted[j].order < sorted[i].order { + sorted[i], sorted[j] = sorted[j], sorted[i] + } + } + } + + layers := make([]*FormerLayer, len(sorted)) + for i, s := range sorted { + layers[i] = s.layer + } + return layers +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..a47569c --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,33 @@ + + + + + + Former + + + +
+ + + + +
+
+
+
+
+
+
+
+
+
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..15fe86f --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,16 @@ +{ + "name": "former-frontend", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "vite": "^6.0.0" + }, + "dependencies": { + "three": "^0.183.1" + } +} diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 new file mode 100755 index 0000000..af9ef55 --- /dev/null +++ b/frontend/package.json.md5 @@ -0,0 +1 @@ +98e9f2b9e6d5bad224e73bd97622e3b9 \ No newline at end of file diff --git a/frontend/src/former3d.js b/frontend/src/former3d.js new file mode 100644 index 0000000..edda5d8 --- /dev/null +++ b/frontend/src/former3d.js @@ -0,0 +1,1344 @@ +// Former 3D — Three.js layer viewer with orbit controls, layer selection, cutout tools, and grid +import * as THREE from 'three'; +import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; + +const Z_SPACING = 3; + +export class Former3D { + constructor(container) { + this.container = container; + this.layers = []; + this.layerMeshes = []; + this.selectedLayerIndex = -1; + this.cutoutMode = false; + this.elements = []; + this.elementMeshes = []; + this.hoveredElement = -1; + this.cutouts = []; + this.enclosureMesh = null; + this.trayMesh = null; + this.enclosureLayerIndex = -1; + this.trayLayerIndex = -1; + + this._onLayerSelect = null; + this._onCutoutSelect = null; + this._onCutoutHover = null; + + this._initScene(); + this._initControls(); + this._initGrid(); + this._initRaycasting(); + this._animate(); + } + + _initScene() { + this.scene = new THREE.Scene(); + this.scene.background = new THREE.Color(0x000000); + + const w = this.container.clientWidth; + const h = this.container.clientHeight; + this.camera = new THREE.PerspectiveCamera(45, w / h, 0.1, 50000); + this.camera.position.set(0, -60, 80); + this.camera.up.set(0, 0, 1); + this.camera.lookAt(0, 0, 0); + + this.renderer = new THREE.WebGLRenderer({ antialias: true, logarithmicDepthBuffer: true }); + this.renderer.setSize(w, h); + this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); + this.container.appendChild(this.renderer.domElement); + + this.scene.add(new THREE.AmbientLight(0xffffff, 0.9)); + const dirLight = new THREE.DirectionalLight(0xffffff, 0.3); + dirLight.position.set(50, -50, 100); + this.scene.add(dirLight); + + this.layerGroup = new THREE.Group(); + this.scene.add(this.layerGroup); + + this.arrowGroup = new THREE.Group(); + this.arrowGroup.visible = false; + this.scene.add(this.arrowGroup); + + this.elementGroup = new THREE.Group(); + this.elementGroup.visible = false; + this.scene.add(this.elementGroup); + + this.selectionOutline = null; + + this._resizeObserver = new ResizeObserver(() => this._onResize()); + this._resizeObserver.observe(this.container); + } + + _initControls() { + this.controls = new OrbitControls(this.camera, this.renderer.domElement); + this.controls.enableDamping = true; + this.controls.dampingFactor = 0.1; + this.controls.mouseButtons = { + LEFT: THREE.MOUSE.ROTATE, + MIDDLE: THREE.MOUSE.PAN, + RIGHT: THREE.MOUSE.DOLLY + }; + this.controls.target.set(0, 0, 0); + this.controls.update(); + } + + _initGrid() { + this.gridHelper = new THREE.GridHelper(2000, 100, 0x333333, 0x222222); + this.gridHelper.rotation.x = Math.PI / 2; + this.gridHelper.position.z = -0.5; + this.scene.add(this.gridHelper); + this.gridVisible = true; + } + + toggleGrid() { + this.gridVisible = !this.gridVisible; + this.gridHelper.visible = this.gridVisible; + return this.gridVisible; + } + + _initRaycasting() { + this.raycaster = new THREE.Raycaster(); + this.mouse = new THREE.Vector2(); + this._isDragging = false; + this._mouseDownPos = { x: 0, y: 0 }; + + const canvas = this.renderer.domElement; + + canvas.addEventListener('mousedown', e => { + this._isDragging = false; + this._mouseDownPos = { x: e.clientX, y: e.clientY }; + + // Start rectangle selection in dado mode (left button only) + if (this.cutoutMode && this.isDadoMode && e.button === 0) { + this._rectSelecting = true; + this._rectStart = { x: e.clientX, y: e.clientY }; + // Create overlay div + if (!this._rectOverlay) { + this._rectOverlay = document.createElement('div'); + this._rectOverlay.style.cssText = 'position:fixed;border:2px dashed #f9e2af;background:rgba(249,226,175,0.1);pointer-events:none;z-index:9999;display:none;'; + document.body.appendChild(this._rectOverlay); + } + } + }); + + canvas.addEventListener('mousemove', e => { + const dx = e.clientX - this._mouseDownPos.x; + const dy = e.clientY - this._mouseDownPos.y; + if (Math.abs(dx) > 3 || Math.abs(dy) > 3) { + this._isDragging = true; + } + + // Update rectangle overlay during dado drag + if (this._rectSelecting && this._rectStart && this._rectOverlay) { + const x1 = Math.min(this._rectStart.x, e.clientX); + const y1 = Math.min(this._rectStart.y, e.clientY); + const w = Math.abs(e.clientX - this._rectStart.x); + const h = Math.abs(e.clientY - this._rectStart.y); + this._rectOverlay.style.left = x1 + 'px'; + this._rectOverlay.style.top = y1 + 'px'; + this._rectOverlay.style.width = w + 'px'; + this._rectOverlay.style.height = h + 'px'; + this._rectOverlay.style.display = (w > 5 || h > 5) ? 'block' : 'none'; + } + + if (this.cutoutMode && this.elementMeshes.length > 0) { + this._updateMouse(e); + this.raycaster.setFromCamera(this.mouse, this.camera); + const hits = this.raycaster.intersectObjects(this.elementMeshes); + const newHover = hits.length > 0 ? this.elementMeshes.indexOf(hits[0].object) : -1; + if (newHover !== this.hoveredElement) { + if (this.hoveredElement >= 0 && this.hoveredElement < this.elementMeshes.length) { + const m = this.elementMeshes[this.hoveredElement]; + if (!m.userData.selected) { + m.material.opacity = 0.2; + m.material.color.setHex(0x89b4fa); + } + } + if (newHover >= 0) { + const m = this.elementMeshes[newHover]; + if (!m.userData.selected) { + m.material.opacity = 0.6; + m.material.color.setHex(0xfab387); + } + } + this.hoveredElement = newHover; + if (this._onCutoutHover) this._onCutoutHover(newHover); + } + } + }); + + canvas.addEventListener('mouseup', e => { + if (this._rectSelecting && this._rectStart && this._isDragging) { + const x1 = Math.min(this._rectStart.x, e.clientX); + const y1 = Math.min(this._rectStart.y, e.clientY); + const x2 = Math.max(this._rectStart.x, e.clientX); + const y2 = Math.max(this._rectStart.y, e.clientY); + + if (x2 - x1 > 10 && y2 - y1 > 10) { + // Select all elements whose projected center falls within the rectangle + for (let i = 0; i < this.elementMeshes.length; i++) { + const m = this.elementMeshes[i]; + if (m.userData.selected) continue; + // Project mesh center to screen + const pos = m.position.clone(); + pos.project(this.camera); + const rect = this.renderer.domElement.getBoundingClientRect(); + const sx = (pos.x * 0.5 + 0.5) * rect.width + rect.left; + const sy = (-pos.y * 0.5 + 0.5) * rect.height + rect.top; + + if (sx >= x1 && sx <= x2 && sy >= y1 && sy <= y2) { + m.userData.selected = true; + m.material.color.setHex(0xf9e2af); + m.material.opacity = 0.7; + this.cutouts.push(this.elements[i]); + if (this._onCutoutSelect) this._onCutoutSelect(this.elements[i], true); + } + } + } + } + this._rectSelecting = false; + this._rectStart = null; + if (this._rectOverlay) this._rectOverlay.style.display = 'none'; + }); + + canvas.addEventListener('click', e => { + if (this._isDragging) return; + + this._updateMouse(e); + this.raycaster.setFromCamera(this.mouse, this.camera); + + if (this.cutoutMode) { + if (this.hoveredElement >= 0 && this.hoveredElement < this.elements.length) { + const el = this.elements[this.hoveredElement]; + const m = this.elementMeshes[this.hoveredElement]; + if (m.userData.selected) { + m.userData.selected = false; + m.material.color.setHex(0xfab387); + m.material.opacity = 0.6; + this.cutouts = this.cutouts.filter(c => c.id !== el.id); + } else { + m.userData.selected = true; + const selColor = this.isDadoMode ? 0xf9e2af : 0xa6e3a1; + m.material.color.setHex(selColor); + m.material.opacity = 0.7; + this.cutouts.push(el); + } + if (this._onCutoutSelect) this._onCutoutSelect(el, m.userData.selected); + } + } else { + // Check for cutout viz click first + if (this._cutoutVizMeshes && this._cutoutVizMeshes.length > 0) { + const cutoutHits = this.raycaster.intersectObjects(this._cutoutVizMeshes); + if (cutoutHits.length > 0) { + const hitMesh = cutoutHits[0].object; + const cutoutId = hitMesh.userData.cutoutId; + if (e.shiftKey) { + this._toggleCutoutSelection(cutoutId); + } else { + this._selectCutout(cutoutId); + } + return; + } + } + + const clickables = this.layerMeshes.filter((m, i) => m && this.layers[i]?.visible); + const hits = this.raycaster.intersectObjects(clickables, true); + if (hits.length > 0) { + let hitObj = hits[0].object; + let idx = this.layerMeshes.indexOf(hitObj); + if (idx < 0) { + // For enclosure mesh, check ancestors + hitObj.traverseAncestors(p => { + const ei = this.layerMeshes.indexOf(p); + if (ei >= 0) idx = ei; + }); + } + if (idx >= 0) this.selectLayer(idx); + } else { + this._deselectAllCutouts(); + this.selectLayer(-1); + } + } + }); + } + + _updateMouse(e) { + const rect = this.renderer.domElement.getBoundingClientRect(); + this.mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1; + this.mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1; + } + + _onResize() { + const w = this.container.clientWidth; + const h = this.container.clientHeight; + if (w === 0 || h === 0) return; + this.camera.aspect = w / h; + this.camera.updateProjectionMatrix(); + this.renderer.setSize(w, h); + } + + _animate() { + this._animId = requestAnimationFrame(() => this._animate()); + this.controls.update(); + this.renderer.render(this.scene, this.camera); + } + + // ===== Layer loading ===== + async loadLayers(layers, imageUrls) { + this.layers = layers; + const loader = new THREE.TextureLoader(); + + while (this.layerGroup.children.length > 0) { + const child = this.layerGroup.children[0]; + if (child.geometry) child.geometry.dispose(); + if (child.material) { + if (child.material.map) child.material.map.dispose(); + child.material.dispose(); + } + this.layerGroup.remove(child); + } + this.layerMeshes = []; + this.enclosureMesh = null; + this.trayMesh = null; + this.enclosureLayerIndex = -1; + this.trayLayerIndex = -1; + + let maxW = 0, maxH = 0; + + for (let i = 0; i < layers.length; i++) { + const layer = layers[i]; + const url = imageUrls[i]; + + if (layer.name === 'Enclosure') { + this.enclosureLayerIndex = i; + this.layerMeshes.push(null); // placeholder, replaced by loadEnclosureGeometry + continue; + } + if (layer.name === 'Tray') { + this.trayLayerIndex = i; + this.layerMeshes.push(null); // placeholder, replaced by loadEnclosureGeometry + continue; + } + + if (!url) { this.layerMeshes.push(null); continue; } + + try { + const tex = await new Promise((resolve, reject) => { + loader.load(url, resolve, undefined, reject); + }); + tex.minFilter = THREE.LinearFilter; + tex.magFilter = THREE.LinearFilter; + + const imgW = tex.image.width; + const imgH = tex.image.height; + if (imgW > maxW) maxW = imgW; + if (imgH > maxH) maxH = imgH; + + const geo = new THREE.PlaneGeometry(imgW, imgH); + const mat = new THREE.MeshBasicMaterial({ + map: tex, + transparent: true, + opacity: layer.visible ? layer.baseAlpha : 0, + side: THREE.DoubleSide, + depthWrite: false, + }); + + const mesh = new THREE.Mesh(geo, mat); + mesh.position.set(imgW / 2, -imgH / 2, i * Z_SPACING); + mesh.visible = layer.visible; + mesh.userData = { layerIndex: i }; + + this.layerGroup.add(mesh); + this.layerMeshes.push(mesh); + } catch (e) { + console.warn(`Failed to load layer ${i}:`, e); + this.layerMeshes.push(null); + } + } + + this._maxW = maxW; + this._maxH = maxH; + + if (maxW > 0 && maxH > 0) { + const cx = maxW / 2; + const cy = -maxH / 2; + const cz = (layers.length * Z_SPACING) / 2; + this.controls.target.set(cx, cy, cz); + const dist = Math.max(maxW, maxH) * 0.7; + this.camera.position.set(cx, cy - dist * 0.5, cz + dist * 0.6); + this.camera.lookAt(cx, cy, cz); + this.controls.update(); + + this.gridHelper.position.set(cx, cy, -0.5); + } + } + + // ===== 3D Enclosure geometry ===== + // Creates full enclosure + tray geometry from the same parameters as the SCAD output. + loadEnclosureGeometry(encData, dpi, minX, maxY) { + if (!encData || !encData.outlinePoints || encData.outlinePoints.length < 3) return; + + // Store context for cutout viz and side highlighting + this.storeEnclosureContext(encData, dpi, minX, maxY); + + // Remove previous meshes + this._disposeEnclosureMeshes(); + + const s = dpi / 25.4; // mm to pixels + + // Convert mm to 3D pixel-space coordinates (Y inverted for image space) + const toPixel = (mmX, mmY) => [ + (mmX - minX) * s, + -(maxY - mmY) * s + ]; + + const pts = encData.outlinePoints.map(p => toPixel(p[0], p[1])); + + // Compute winding and offset function + let area = 0; + for (let i = 0; i < pts.length; i++) { + const j = (i + 1) % pts.length; + area += pts[i][0] * pts[j][1] - pts[j][0] * pts[i][1]; + } + const sign = area < 0 ? 1 : -1; // outward offset sign + + const offsetPoly = (points, dist) => { + const n = points.length; + const result = []; + const maxMiter = Math.abs(dist) * 2; // clamp miter to 2x offset (bevel-style at sharp corners) + for (let i = 0; i < n; i++) { + const prev = points[(i - 1 + n) % n]; + const curr = points[i]; + const next = points[(i + 1) % n]; + const e1x = curr[0] - prev[0], e1y = curr[1] - prev[1]; + const e2x = next[0] - curr[0], e2y = next[1] - curr[1]; + const len1 = Math.sqrt(e1x * e1x + e1y * e1y) || 1; + const len2 = Math.sqrt(e2x * e2x + e2y * e2y) || 1; + const n1x = -e1y / len1, n1y = e1x / len1; + const n2x = -e2y / len2, n2y = e2x / len2; + let nx = n1x + n2x, ny = n1y + n2y; + const nlen = Math.sqrt(nx * nx + ny * ny) || 1; + nx /= nlen; ny /= nlen; + const dot = n1x * nx + n1y * ny; + const rawMiter = dot > 0.01 ? dist / dot : dist; + // Clamp: if corner is too sharp, insert bevel (two points) + if (Math.abs(rawMiter) > maxMiter) { + const d = dist; + result.push([curr[0] + n1x * d, curr[1] + n1y * d]); + result.push([curr[0] + n2x * d, curr[1] + n2y * d]); + } else { + result.push([curr[0] + nx * rawMiter, curr[1] + ny * rawMiter]); + } + } + return result; + }; + + const makeShape = (poly) => { + const shape = new THREE.Shape(); + shape.moveTo(poly[0][0], poly[0][1]); + for (let i = 1; i < poly.length; i++) shape.lineTo(poly[i][0], poly[i][1]); + shape.closePath(); + return shape; + }; + + const makeHole = (poly) => { + const path = new THREE.Path(); + path.moveTo(poly[0][0], poly[0][1]); + for (let i = 1; i < poly.length; i++) path.lineTo(poly[i][0], poly[i][1]); + path.closePath(); + return path; + }; + + const makeRing = (outerPoly, innerPoly, depth, zPos) => { + const shape = makeShape(outerPoly); + shape.holes.push(makeHole(innerPoly)); + const geo = new THREE.ExtrudeGeometry(shape, { depth, bevelEnabled: false }); + return { geo, zPos }; + }; + + const makeSolid = (poly, depth, zPos) => { + const shape = makeShape(poly); + const geo = new THREE.ExtrudeGeometry(shape, { depth, bevelEnabled: false }); + return { geo, zPos }; + }; + + // Key dimensions from SCAD (converted to pixels for XY, raw mm for Z which we scale) + const cl = encData.clearance; + const wt = encData.wallThickness; + const trayFloor = encData.trayFloor; + const snapH = encData.snapHeight; + const lidThick = encData.lidThick; + const totalH = encData.totalH; + + // Pre-compute offset polygons in pixel space + const polyInner = offsetPoly(pts, sign * cl * s); // offset(clearance) + const polyTrayWall = offsetPoly(pts, sign * (cl + wt) * s); // offset(clearance + wt) + const polyOuter = offsetPoly(pts, sign * (cl + 2 * wt) * s); // offset(clearance + 2*wt) + + const enclosureParts = []; + const trayParts = []; + + // ===== ENCLOSURE (lid-on-top piece) ===== + // Small epsilon to prevent Z-fighting at shared boundaries + const eps = 0.05 * s; + + // 1. Lid plate: solid from totalH-lidThick to totalH + enclosureParts.push(makeSolid(polyOuter, lidThick * s, (totalH - lidThick) * s + eps)); + + // 2. Upper wall ring: outer to inner, from trayFloor+snapH to totalH-lidThick + const upperWallH = totalH - lidThick - (trayFloor + snapH); + if (upperWallH > 0.1) { + enclosureParts.push(makeRing(polyOuter, polyInner, upperWallH * s - eps, (trayFloor + snapH) * s + eps)); + } + + // 3. Lower wall ring: outer to trayWall, from trayFloor to trayFloor+snapH + // (wider inner cavity for tray snap-fit recess) + if (snapH > 0.1) { + enclosureParts.push(makeRing(polyOuter, polyTrayWall, snapH * s - eps, trayFloor * s)); + } + + // 4. Mounting pegs (cylinders) + if (encData.mountingHoles) { + for (const h of encData.mountingHoles) { + const [px, py] = toPixel(h.x, h.y); + const r = ((h.diameter / 2) - 0.15) * s; + const pegH = (totalH - lidThick) * s; + const cylGeo = new THREE.CylinderGeometry(r, r, pegH, 16); + cylGeo.rotateX(Math.PI / 2); // align cylinder with Z axis + enclosureParts.push({ geo: cylGeo, zPos: pegH / 2, cx: px, cy: py, isCyl: true }); + } + } + + // ===== TRAY ===== + // 1. Tray floor: solid, from 0 to trayFloor + trayParts.push(makeSolid(polyOuter, trayFloor * s, 0)); + + // 2. Tray inner wall: ring from trayWall to inner, from trayFloor to trayFloor+snapH + if (snapH > 0.1) { + trayParts.push(makeRing(polyTrayWall, polyInner, snapH * s - eps, trayFloor * s + eps)); + } + + // Build enclosure group mesh + const encMat = new THREE.MeshPhongMaterial({ + color: 0xfffdcc, transparent: true, opacity: 0.55, + side: THREE.DoubleSide, depthWrite: false, + polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 1, + }); + + const encGroup = new THREE.Group(); + for (const part of enclosureParts) { + const mesh = new THREE.Mesh(part.geo, encMat.clone()); + if (part.isCyl) { + mesh.position.set(part.cx, part.cy, part.zPos); + } else { + mesh.position.z = part.zPos; + } + encGroup.add(mesh); + } + + if (this.enclosureLayerIndex >= 0) { + encGroup.position.z = this.enclosureLayerIndex * Z_SPACING; + encGroup.userData = { layerIndex: this.enclosureLayerIndex, isEnclosure: true }; + const layer = this.layers[this.enclosureLayerIndex]; + encGroup.visible = layer ? layer.visible : true; + this.enclosureMesh = encGroup; + this.layerMeshes[this.enclosureLayerIndex] = encGroup; + this.layerGroup.add(encGroup); + } + + // Build tray group mesh + const trayMat = new THREE.MeshPhongMaterial({ + color: 0xb8c8a0, transparent: true, opacity: 0.5, + side: THREE.DoubleSide, depthWrite: false, + polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 1, + }); + + const trayGroup = new THREE.Group(); + for (const part of trayParts) { + const mesh = new THREE.Mesh(part.geo, trayMat.clone()); + mesh.position.z = part.zPos; + trayGroup.add(mesh); + } + + if (this.trayLayerIndex >= 0) { + trayGroup.position.z = this.trayLayerIndex * Z_SPACING; + trayGroup.userData = { layerIndex: this.trayLayerIndex, isEnclosure: true }; + const layer = this.layers[this.trayLayerIndex]; + trayGroup.visible = layer ? layer.visible : false; + this.trayMesh = trayGroup; + this.layerMeshes[this.trayLayerIndex] = trayGroup; + this.layerGroup.add(trayGroup); + } + } + + _disposeEnclosureMeshes() { + for (const mesh of [this.enclosureMesh, this.trayMesh]) { + if (mesh) { + this.layerGroup.remove(mesh); + mesh.traverse(c => { + if (c.geometry) c.geometry.dispose(); + if (c.material) c.material.dispose(); + }); + } + } + this.enclosureMesh = null; + this.trayMesh = null; + } + + // ===== Layer visibility ===== + setLayerVisibility(index, visible) { + if (index < 0 || index >= this.layerMeshes.length) return; + const mesh = this.layerMeshes[index]; + if (!mesh) return; + this.layers[index].visible = visible; + mesh.visible = visible; + if (mesh.material && !mesh.userData?.isEnclosure) { + if (!visible) mesh.material.opacity = 0; + else mesh.material.opacity = this.layers[index].baseAlpha; + } + } + + _setGroupOpacity(group, opacity) { + group.traverse(c => { + if (c.material) c.material.opacity = opacity; + }); + } + + setLayerHighlight(index, highlight) { + const hasHL = highlight && index >= 0; + this.layers.forEach((l, i) => { + l.highlight = (i === index && highlight); + const mesh = this.layerMeshes[i]; + if (!mesh || !l.visible) return; + if (mesh.userData?.isEnclosure) { + this._setGroupOpacity(mesh, (hasHL && !l.highlight) ? 0.15 : 0.55); + } else if (mesh.material) { + mesh.material.opacity = (hasHL && !l.highlight) ? l.baseAlpha * 0.3 : l.baseAlpha; + } + }); + } + + // ===== Selection ===== + selectLayer(index) { + this.selectedLayerIndex = index; + + if (this.selectionOutline) { + this.scene.remove(this.selectionOutline); + this.selectionOutline.geometry?.dispose(); + this.selectionOutline.material?.dispose(); + this.selectionOutline = null; + } + + this.arrowGroup.visible = false; + while (this.arrowGroup.children.length) { + const c = this.arrowGroup.children[0]; + this.arrowGroup.remove(c); + } + + if (index < 0 || index >= this.layerMeshes.length) { + if (this._onLayerSelect) this._onLayerSelect(-1); + return; + } + + const mesh = this.layerMeshes[index]; + if (!mesh) return; + + // Selection outline (skip for enclosure — too complex) + if (mesh.geometry && !mesh.userData?.isEnclosure) { + const edges = new THREE.EdgesGeometry(mesh.geometry); + const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ + color: 0x89b4fa, linewidth: 2, + })); + line.position.copy(mesh.position); + line.position.z += 0.1; + this.selectionOutline = line; + this.scene.add(line); + } + + // Z-axis arrows + const pos = mesh.position.clone(); + if (mesh.userData?.isEnclosure) { + const box = new THREE.Box3().setFromObject(mesh); + box.getCenter(pos); + } + const arrowLen = 8; + const upArrow = new THREE.ArrowHelper( + new THREE.Vector3(0, 0, 1), + new THREE.Vector3(pos.x, pos.y, pos.z + 2), + arrowLen, 0x89b4fa, 3, 2 + ); + const downArrow = new THREE.ArrowHelper( + new THREE.Vector3(0, 0, -1), + new THREE.Vector3(pos.x, pos.y, pos.z - 2), + arrowLen, 0x89b4fa, 3, 2 + ); + this.arrowGroup.add(upArrow); + this.arrowGroup.add(downArrow); + this.arrowGroup.visible = true; + + if (this._onLayerSelect) this._onLayerSelect(index); + } + + moveSelectedZ(delta) { + if (this.selectedLayerIndex < 0) return; + const mesh = this.layerMeshes[this.selectedLayerIndex]; + if (!mesh) return; + mesh.position.z += delta; + if (this.selectionOutline) this.selectionOutline.position.z = mesh.position.z + 0.1; + if (this.arrowGroup.children.length >= 2) { + const pos = mesh.position; + this.arrowGroup.children[0].position.set(pos.x, pos.y, pos.z + 2); + this.arrowGroup.children[1].position.set(pos.x, pos.y, pos.z - 2); + } + } + + // ===== Cutout mode ===== + enterCutoutMode(elements, layerIndex, isDado = false) { + this.cutoutMode = true; + this.isDadoMode = isDado; + this.elements = elements; + this.hoveredElement = -1; + this.cutouts = []; + this._rectSelecting = false; + this._rectStart = null; + this._rectOverlay = null; + + while (this.elementGroup.children.length) { + const c = this.elementGroup.children[0]; + c.geometry?.dispose(); + c.material?.dispose(); + this.elementGroup.remove(c); + } + this.elementMeshes = []; + + const layerMesh = this.layerMeshes[layerIndex]; + const layerZ = layerMesh ? layerMesh.position.z : 0; + + for (const el of elements) { + const w = el.maxX - el.minX; + const h = el.maxY - el.minY; + if (w < 0.5 || h < 0.5) continue; + + const geo = new THREE.PlaneGeometry(w, h); + const mat = new THREE.MeshBasicMaterial({ + color: 0x89b4fa, + transparent: true, + opacity: 0.2, + side: THREE.DoubleSide, + depthWrite: false, + }); + const mesh = new THREE.Mesh(geo, mat); + const elCx = el.minX + w / 2; + const elCy = el.minY + h / 2; + mesh.position.set(elCx, -elCy, layerZ + 0.2); + mesh.userData = { elementId: el.id, selected: false }; + + this.elementGroup.add(mesh); + this.elementMeshes.push(mesh); + } + + this.elementGroup.visible = true; + this._homeTopDown(layerIndex); + } + + exitCutoutMode() { + this.cutoutMode = false; + this.isDadoMode = false; + this.elements = []; + this.hoveredElement = -1; + this._rectSelecting = false; + this._rectStart = null; + if (this._rectOverlay) { + this._rectOverlay.remove(); + this._rectOverlay = null; + } + this.elementGroup.visible = false; + while (this.elementGroup.children.length) { + const c = this.elementGroup.children[0]; + c.geometry?.dispose(); + c.material?.dispose(); + this.elementGroup.remove(c); + } + this.elementMeshes = []; + } + + // ===== Camera ===== + _homeTopDown(layerIndex) { + const mesh = this.layerMeshes[layerIndex]; + if (!mesh) return; + const pos = mesh.position.clone(); + if (mesh.userData?.isEnclosure) { + const box = new THREE.Box3().setFromObject(mesh); + box.getCenter(pos); + } + let imgW, imgH; + if (mesh.geometry?.parameters) { + imgW = mesh.geometry.parameters.width; + imgH = mesh.geometry.parameters.height; + } else { + imgW = this._maxW || 500; + imgH = this._maxH || 500; + } + const dist = Math.max(imgW, imgH) * 1.1; + this.camera.position.set(pos.x, pos.y, pos.z + dist); + this.camera.up.set(0, 1, 0); + this.controls.target.set(pos.x, pos.y, pos.z); + this.controls.update(); + } + + homeTopDown(layerIndex) { + if (layerIndex !== undefined && layerIndex >= 0) { + this._homeTopDown(layerIndex); + } else if (this.selectedLayerIndex >= 0) { + this._homeTopDown(this.selectedLayerIndex); + } else { + const cx = (this._maxW || 500) / 2; + const cy = -(this._maxH || 500) / 2; + const cz = (this.layers.length * Z_SPACING) / 2; + const dist = Math.max(this._maxW || 500, this._maxH || 500) * 1.1; + this.camera.position.set(cx, cy, cz + dist); + this.camera.up.set(0, 1, 0); + this.controls.target.set(cx, cy, cz); + this.controls.update(); + } + } + + resetView() { + if (this.layers.length === 0) return; + const maxW = this._maxW || 500; + const maxH = this._maxH || 500; + const cx = maxW / 2; + const cy = -maxH / 2; + const cz = (this.layers.length * Z_SPACING) / 2; + const dist = Math.max(maxW, maxH) * 0.7; + this.camera.position.set(cx, cy - dist * 0.5, cz + dist * 0.6); + this.camera.up.set(0, 0, 1); + this.controls.target.set(cx, cy, cz); + this.controls.update(); + } + + // Switch to solid render preview: show only enclosure+tray opaque, hide all other layers + enterSolidView() { + this._savedVisibility = this.layers.map(l => l.visible); + for (let i = 0; i < this.layers.length; i++) { + const mesh = this.layerMeshes[i]; + if (!mesh) continue; + if (i === this.enclosureLayerIndex || i === this.trayLayerIndex) { + mesh.visible = true; + mesh.traverse(c => { + if (c.material) { + c.material.opacity = 1.0; + c.material.transparent = false; + c.material.depthWrite = true; + c.material.side = THREE.FrontSide; + c.material.needsUpdate = true; + } + }); + } else { + mesh.visible = false; + } + } + this.selectLayer(-1); + this.gridHelper.visible = false; + this.scene.background = new THREE.Color(0x1e1e2e); + this.resetView(); + } + + // Return from solid view to normal editor + exitSolidView() { + this.scene.background = new THREE.Color(0x000000); + this.gridHelper.visible = this.gridVisible; + for (let i = 0; i < this.layers.length; i++) { + const mesh = this.layerMeshes[i]; + if (!mesh) continue; + const wasVisible = this._savedVisibility ? this._savedVisibility[i] : this.layers[i].visible; + this.layers[i].visible = wasVisible; + mesh.visible = wasVisible; + if (i === this.enclosureLayerIndex || i === this.trayLayerIndex) { + const baseOpacity = i === this.enclosureLayerIndex ? 0.55 : 0.5; + mesh.traverse(c => { + if (c.material) { + c.material.opacity = baseOpacity; + c.material.transparent = true; + c.material.depthWrite = false; + c.material.side = THREE.DoubleSide; + c.material.needsUpdate = true; + } + }); + } + } + this._savedVisibility = null; + this.resetView(); + } + + // ===== Placed cutout selection ===== + _selectCutout(cutoutId) { + this.selectedCutoutIds = new Set([cutoutId]); + this._updateCutoutHighlights(); + if (this._onPlacedCutoutSelect) this._onPlacedCutoutSelect([...this.selectedCutoutIds]); + } + + _toggleCutoutSelection(cutoutId) { + if (!this.selectedCutoutIds) this.selectedCutoutIds = new Set(); + if (this.selectedCutoutIds.has(cutoutId)) { + this.selectedCutoutIds.delete(cutoutId); + } else { + this.selectedCutoutIds.add(cutoutId); + } + this._updateCutoutHighlights(); + if (this._onPlacedCutoutSelect) this._onPlacedCutoutSelect([...this.selectedCutoutIds]); + } + + _deselectAllCutouts() { + if (this.selectedCutoutIds && this.selectedCutoutIds.size > 0) { + this.selectedCutoutIds = new Set(); + this._updateCutoutHighlights(); + if (this._onPlacedCutoutSelect) this._onPlacedCutoutSelect([]); + } + } + + _updateCutoutHighlights() { + // Remove old outlines + if (this._cutoutOutlines) { + for (const ol of this._cutoutOutlines) { + this.scene.remove(ol); + ol.geometry.dispose(); + ol.material.dispose(); + } + } + this._cutoutOutlines = []; + + if (!this._cutoutVizMeshes || !this.selectedCutoutIds) return; + for (const mesh of this._cutoutVizMeshes) { + const isSelected = this.selectedCutoutIds.has(mesh.userData.cutoutId); + mesh.material.opacity = isSelected ? 0.9 : 0.6; + if (isSelected) { + const edges = new THREE.EdgesGeometry(mesh.geometry); + const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ + color: 0x89b4fa, linewidth: 2, + })); + line.position.copy(mesh.position); + line.quaternion.copy(mesh.quaternion); + this._cutoutOutlines.push(line); + this.scene.add(line); + } + } + } + + onPlacedCutoutSelect(cb) { this._onPlacedCutoutSelect = cb; } + + getSelectedCutouts() { + if (!this._cutoutVizMeshes || !this.selectedCutoutIds) return []; + return this._cutoutVizMeshes + .filter(m => this.selectedCutoutIds.has(m.userData.cutoutId)) + .map(m => m.userData.cutout); + } + + // ===== Store enclosure context for cutout viz / side highlight ===== + storeEnclosureContext(encData, dpi, minX, maxY) { + this._encData = encData; + this._dpi = dpi; + this._minX = minX; + this._maxY = maxY; + this._s = dpi / 25.4; + } + + _toPixel(mmX, mmY) { + const s = this._s; + return [(mmX - this._minX) * s, -(this._maxY - mmY) * s]; + } + + // ===== Side Highlight ===== + highlightSide(sideNum) { + this.clearSideHighlight(); + if (!this._encData) return; + const side = this._encData.sides.find(s => s.num === sideNum); + if (!side) return; + + const s = this._s; + const [startPx, startPy] = this._toPixel(side.startX, side.startY); + const [endPx, endPy] = this._toPixel(side.endX, side.endY); + const dx = endPx - startPx; + const dy = endPy - startPy; + const len = Math.sqrt(dx * dx + dy * dy); + const totalH = this._encData.totalH * s; + const cl = this._encData.clearance; + const wt = this._encData.wallThickness; + + const geo = new THREE.PlaneGeometry(len, totalH); + const sideColors = [0xef4444, 0x3b82f6, 0x22c55e, 0xf59e0b, 0x8b5cf6, 0xec4899, 0x14b8a6, 0xf97316]; + const color = sideColors[(sideNum - 1) % sideColors.length]; + const mat = new THREE.MeshBasicMaterial({ + color, transparent: true, opacity: 0.4, + side: THREE.DoubleSide, depthWrite: false, + }); + const mesh = new THREE.Mesh(geo, mat); + + // Position at wall midpoint + const midX = (startPx + endPx) / 2; + const midY = (startPy + endPy) / 2; + const wallAngle = Math.atan2(dy, dx); + + // Offset outward to wall exterior + const offset = (cl + wt) * s; + const nx = Math.cos(side.angle); + const ny = -Math.sin(side.angle); + + const encZ = this.enclosureLayerIndex >= 0 ? this.enclosureLayerIndex * Z_SPACING : 0; + + mesh.position.set( + midX + nx * offset, + midY + ny * offset, + encZ + totalH / 2 + ); + + // Rotate: first face XY plane upright, then rotate around Z to match wall direction + mesh.rotation.set(Math.PI / 2, 0, wallAngle); + mesh.rotation.order = 'ZXY'; + mesh.rotation.set(0, 0, 0); + // Build rotation manually: wall runs along wallAngle in XY, and is vertical in Z + mesh.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, wallAngle, 0, 'ZYX')); + + this._sideHighlightMesh = mesh; + this.scene.add(mesh); + + // Add label sprite + const canvas2d = document.createElement('canvas'); + canvas2d.width = 64; + canvas2d.height = 64; + const ctx = canvas2d.getContext('2d'); + ctx.fillStyle = `#${color.toString(16).padStart(6, '0')}`; + ctx.beginPath(); + ctx.arc(32, 32, 28, 0, Math.PI * 2); + ctx.fill(); + ctx.fillStyle = 'white'; + ctx.font = 'bold 32px sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(sideNum.toString(), 32, 33); + + const tex = new THREE.CanvasTexture(canvas2d); + const spriteMat = new THREE.SpriteMaterial({ map: tex, depthWrite: false }); + const sprite = new THREE.Sprite(spriteMat); + const labelScale = Math.max(len, totalH) * 0.15; + sprite.scale.set(labelScale, labelScale, 1); + sprite.position.set( + midX + nx * offset * 1.5, + midY + ny * offset * 1.5, + encZ + totalH / 2 + ); + this._sideHighlightLabel = sprite; + this.scene.add(sprite); + } + + clearSideHighlight() { + if (this._sideHighlightMesh) { + this.scene.remove(this._sideHighlightMesh); + this._sideHighlightMesh.geometry.dispose(); + this._sideHighlightMesh.material.dispose(); + this._sideHighlightMesh = null; + } + if (this._sideHighlightLabel) { + this.scene.remove(this._sideHighlightLabel); + this._sideHighlightLabel.material.map.dispose(); + this._sideHighlightLabel.material.dispose(); + this._sideHighlightLabel = null; + } + } + + lookAtSide(sideNum) { + if (!this._encData) return; + const side = this._encData.sides.find(s => s.num === sideNum); + if (!side) return; + + const s = this._s; + const [startPx, startPy] = this._toPixel(side.startX, side.startY); + const [endPx, endPy] = this._toPixel(side.endX, side.endY); + const midX = (startPx + endPx) / 2; + const midY = (startPy + endPy) / 2; + const encZ = this.enclosureLayerIndex >= 0 ? this.enclosureLayerIndex * Z_SPACING : 0; + const totalH = this._encData.totalH * s; + const midZ = encZ + totalH / 2; + + const nx = Math.cos(side.angle); + const ny = -Math.sin(side.angle); + const dist = Math.max(this._maxW || 500, this._maxH || 500) * 0.5; + + this.camera.position.set(midX + nx * dist, midY + ny * dist, midZ); + this.camera.up.set(0, 0, 1); + this.controls.target.set(midX, midY, midZ); + this.controls.update(); + } + + // ===== Cutout Visualization ===== + refreshCutouts(cutouts, encData, dpi, minX, maxY) { + this._disposeCutoutViz(); + if (!cutouts || cutouts.length === 0 || !encData) return; + + this.storeEnclosureContext(encData, dpi, minX, maxY); + const s = this._s; + + this._cutoutVizGroup = new THREE.Group(); + this._cutoutVizMeshes = []; + + const cl = encData.clearance; + const wt = encData.wallThickness; + const trayFloor = encData.trayFloor; + const pcbT = encData.pcbThickness; + const totalH = encData.totalH; + const encZ = this.enclosureLayerIndex >= 0 ? this.enclosureLayerIndex * Z_SPACING : 0; + + for (const c of cutouts) { + let mesh; + const color = c.isDado ? 0xf9e2af : 0xa6e3a1; + + if (c.surface === 'top') { + const geo = new THREE.PlaneGeometry(c.w * s, c.h * s); + const mat = new THREE.MeshBasicMaterial({ + color, transparent: true, opacity: 0.6, + side: THREE.DoubleSide, depthWrite: false, + }); + mesh = new THREE.Mesh(geo, mat); + const [px, py] = this._toPixel(c.x + c.w / 2, c.y + c.h / 2); + mesh.position.set(px, py, encZ + totalH * s + 0.5); + + } else if (c.surface === 'bottom') { + const geo = new THREE.PlaneGeometry(c.w * s, c.h * s); + const mat = new THREE.MeshBasicMaterial({ + color, transparent: true, opacity: 0.6, + side: THREE.DoubleSide, depthWrite: false, + }); + mesh = new THREE.Mesh(geo, mat); + const [px, py] = this._toPixel(c.x + c.w / 2, c.y + c.h / 2); + mesh.position.set(px, py, encZ - 0.5); + + } else if (c.surface === 'side') { + const side = encData.sides.find(sd => sd.num === c.sideNum); + if (!side) continue; + + const geo = new THREE.PlaneGeometry(c.w * s, c.h * s); + const mat = new THREE.MeshBasicMaterial({ + color, transparent: true, opacity: 0.6, + side: THREE.DoubleSide, depthWrite: false, + }); + mesh = new THREE.Mesh(geo, mat); + + // Position along the side edge + const sdx = side.endX - side.startX; + const sdy = side.endY - side.startY; + const sLen = Math.sqrt(sdx * sdx + sdy * sdy); + const ux = sdx / sLen, uy = sdy / sLen; + const midAlongSide = c.x + c.w / 2; + const mmX = side.startX + ux * midAlongSide; + const mmY = side.startY + uy * midAlongSide; + const [px, py] = this._toPixel(mmX, mmY); + + // Z = trayFloor + pcbT + y + h/2 + const zMM = trayFloor + pcbT + c.y + c.h / 2; + + // Offset outward to wall exterior + const offset = (cl + wt) * s; + const nx = Math.cos(side.angle); + const ny = -Math.sin(side.angle); + + mesh.position.set( + px + nx * offset, + py + ny * offset, + encZ + zMM * s + ); + + // Rotate to face outward along the wall + const wallAngle = Math.atan2( + this._toPixel(side.endX, side.endY)[1] - this._toPixel(side.startX, side.startY)[1], + this._toPixel(side.endX, side.endY)[0] - this._toPixel(side.startX, side.startY)[0] + ); + mesh.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, wallAngle, 0, 'ZYX')); + } + + if (mesh) { + mesh.userData.cutoutId = c.id; + mesh.userData.cutout = c; + this._cutoutVizGroup.add(mesh); + this._cutoutVizMeshes.push(mesh); + } + } + + this.scene.add(this._cutoutVizGroup); + } + + _disposeCutoutViz() { + if (this._cutoutVizGroup) { + this.scene.remove(this._cutoutVizGroup); + this._cutoutVizGroup.traverse(c => { + if (c.geometry) c.geometry.dispose(); + if (c.material) c.material.dispose(); + }); + this._cutoutVizGroup = null; + } + this._cutoutVizMeshes = []; + } + + // ===== Side Placement Mode ===== + // Enter mode where ghost cutouts follow mouse on a side wall. + // Returns a promise that resolves with array of {y} positions when user clicks to place. + enterSidePlacementMode(projectedCutouts, sideNum) { + return new Promise((resolve) => { + if (!this._encData) { resolve(null); return; } + const side = this._encData.sides.find(sd => sd.num === sideNum); + if (!side) { resolve(null); return; } + + const s = this._s; + const cl = this._encData.clearance; + const wt = this._encData.wallThickness; + const trayFloor = this._encData.trayFloor; + const pcbT = this._encData.pcbThickness; + const totalH = this._encData.totalH; + const encZ = this.enclosureLayerIndex >= 0 ? this.enclosureLayerIndex * Z_SPACING : 0; + + // Compute wall geometry + const [startPx, startPy] = this._toPixel(side.startX, side.startY); + const [endPx, endPy] = this._toPixel(side.endX, side.endY); + const wallDx = endPx - startPx; + const wallDy = endPy - startPy; + const wallLen = Math.sqrt(wallDx * wallDx + wallDy * wallDy); + const wallAngle = Math.atan2(wallDy, wallDx); + + const nx = Math.cos(side.angle); + const ny = -Math.sin(side.angle); + const offset = (cl + wt) * s; + + // Move camera to face the side + this.lookAtSide(sideNum); + this.highlightSide(sideNum); + + // Create invisible raycast plane covering the side wall + const planeW = wallLen * 2; + const planeH = totalH * s * 2; + const planeGeo = new THREE.PlaneGeometry(planeW, planeH); + const planeMat = new THREE.MeshBasicMaterial({ visible: false, side: THREE.DoubleSide }); + const planeMesh = new THREE.Mesh(planeGeo, planeMat); + const midX = (startPx + endPx) / 2 + nx * offset; + const midY = (startPy + endPy) / 2 + ny * offset; + planeMesh.position.set(midX, midY, encZ + totalH * s / 2); + planeMesh.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, wallAngle, 0, 'ZYX')); + this.scene.add(planeMesh); + + // Create ghost meshes + const ghostMeshes = []; + for (const pc of projectedCutouts) { + const geo = new THREE.PlaneGeometry(pc.width * s, pc.height * s); + const mat = new THREE.MeshBasicMaterial({ + color: 0xa6e3a1, transparent: true, opacity: 0.5, + side: THREE.DoubleSide, depthWrite: false, + }); + const mesh = new THREE.Mesh(geo, mat); + mesh.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, wallAngle, 0, 'ZYX')); + + // Position along wall at projected X + const ux = wallDx / wallLen, uy = wallDy / wallLen; + const t = pc.x + pc.width / 2; // center along side in mm + const mmX = side.startX + (ux / s) * t * s; // hmm, just use side coords + const posX = side.startX + (side.endX - side.startX) * (t / side.length); + const posY = side.startY + (side.endY - side.startY) * (t / side.length); + const [px, py] = this._toPixel(posX, posY); + + mesh.position.set(px + nx * offset, py + ny * offset, encZ + totalH * s / 2); + mesh.userData = { projectedCutout: pc }; + this.scene.add(mesh); + ghostMeshes.push(mesh); + } + + // Default Y (mm above PCB) = wall center + const wallHeight = totalH - trayFloor - pcbT; + let currentYMM = wallHeight / 2; + + const updateGhostZ = (zMM) => { + for (const gm of ghostMeshes) { + const fullZ = trayFloor + pcbT + zMM; + gm.position.z = encZ + fullZ * s; + } + }; + updateGhostZ(currentYMM); + + // Mouse move handler: update Z from raycast + const moveHandler = (e) => { + this._updateMouse(e); + this.raycaster.setFromCamera(this.mouse, this.camera); + const hits = this.raycaster.intersectObject(planeMesh); + if (hits.length > 0) { + const hitZ = hits[0].point.z; + // Convert back to mm + const zMM = (hitZ - encZ) / s; + // Y above PCB + const yAbovePCB = zMM - trayFloor - pcbT; + const maxH = Math.max(...projectedCutouts.map(pc => pc.height)); + const clamped = Math.max(0, Math.min(wallHeight - maxH, yAbovePCB - maxH / 2)); + currentYMM = clamped; + updateGhostZ(currentYMM); + } + }; + + const canvas = this.renderer.domElement; + + // Click handler: place and resolve + const clickHandler = (e) => { + cleanup(); + const results = projectedCutouts.map(pc => ({ + x: pc.x, + y: currentYMM, + width: pc.width, + height: pc.height, + })); + resolve(results); + }; + + // Escape handler: cancel + const escHandler = (e) => { + if (e.key === 'Escape') { + cleanup(); + resolve(null); + } + }; + + const cleanup = () => { + canvas.removeEventListener('mousemove', moveHandler); + canvas.removeEventListener('click', clickHandler); + document.removeEventListener('keydown', escHandler); + this.scene.remove(planeMesh); + planeGeo.dispose(); + planeMat.dispose(); + for (const gm of ghostMeshes) { + this.scene.remove(gm); + gm.geometry.dispose(); + gm.material.dispose(); + } + this.clearSideHighlight(); + }; + + canvas.addEventListener('mousemove', moveHandler); + canvas.addEventListener('click', clickHandler); + document.addEventListener('keydown', escHandler); + }); + } + + // Callbacks + onLayerSelect(cb) { this._onLayerSelect = cb; } + onCutoutSelect(cb) { this._onCutoutSelect = cb; } + onCutoutHover(cb) { this._onCutoutHover = cb; } + + dispose() { + if (this._animId) cancelAnimationFrame(this._animId); + if (this._resizeObserver) this._resizeObserver.disconnect(); + if (this._rectOverlay) { + this._rectOverlay.remove(); + this._rectOverlay = null; + } + this.clearSideHighlight(); + this._disposeCutoutViz(); + this.controls.dispose(); + this.renderer.dispose(); + if (this.renderer.domElement.parentNode) { + this.renderer.domElement.parentNode.removeChild(this.renderer.domElement); + } + } +} diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..6b0d3b1 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,1714 @@ +// Former — PCB Stencil & Enclosure Generator +import './style.css'; +import { Former3D } from './former3d.js'; + +// ===== Helpers ===== +const $ = (sel, ctx = document) => ctx.querySelector(sel); +const $$ = (sel, ctx = document) => [...ctx.querySelectorAll(sel)]; +const show = el => el.classList.add('active'); +const hide = el => el.classList.remove('active'); + +// Wait for Wails runtime +function wails() { return window.go?.main?.App; } + +// ===== State ===== +const state = { + stencil: { gerberPath: '', outlinePath: '' }, + enclosure: { gbrjobPath: '', gerberPaths: [], drillPath: '', npthPath: '', sourceDir: '' }, + preview: { activeSide: 0, sessionInfo: null, cutouts: [], boardRect: null }, + former: { layers: [], images: {}, scale: 1, offsetX: 0, offsetY: 0, cutoutType: 'cutout', dadoDepth: 0.5 }, +}; + +// ===== Loading ===== +function showLoading(msg = 'Processing...') { + const el = document.createElement('div'); + el.className = 'loading-overlay'; + el.id = 'loading'; + el.innerHTML = `
${msg}
`; + document.body.appendChild(el); +} + +function hideLoading() { + const el = $('#loading'); + if (el) el.remove(); +} + +// ===== Navigation ===== +function navigate(page) { + $$('.page').forEach(p => hide(p)); + const el = $(`#page-${page}`); + if (el) show(el); + + // Initialize page content + switch (page) { + case 'landing': initLanding(); break; + case 'stencil': initStencil(); break; + case 'enclosure': initEnclosure(); break; + case 'preview': initPreview(); break; + case 'former': initFormer(); break; + } +} + +// ===== Landing Page ===== +async function initLanding() { + const page = $('#page-landing'); + const projects = await wails()?.GetRecentProjects() || []; + + let logoSrc = '/api/logo.png'; + + let projectsHTML = ''; + if (projects.length > 0) { + projectsHTML = ` +
Recent Projects
+
+ ${projects.map(p => ` +
+ ${esc(p.name)} + ${p.type} + ${p.boardW > 0 ? p.boardW.toFixed(1) + ' × ' + p.boardH.toFixed(1) + ' mm' : ''} +
+ `).join('')} +
+ `; + } + + page.innerHTML = ` +
+ +
+
+

Former

+

PCB Stencil & Enclosure Generator

+
+
+
+

New Stencil

+

Generate solder paste stencils from gerber files

+
+
+

New Enclosure

+

Generate PCB enclosures from KiCad projects

+
+
+ ${projectsHTML} + `; +} + +// ===== Stencil Page ===== +function initStencil() { + const page = $('#page-stencil'); + state.stencil = { gerberPath: '', outlinePath: '' }; + + page.innerHTML = ` + +
+
Solder Paste Gerber
+
+ No file selected + +
+
+
+
Board Outline (Optional)
+
+ No file selected + + +
+
+
+
Parameters
+
+ Stencil Height (mm) + +
+
+ Wall Height (mm) + +
+
+ Wall Thickness (mm) + +
+
+ DPI + +
+
+
+
Export Formats
+
+ + + + +
+
+
+
+ +
+ `; +} + +async function selectStencilGerber() { + try { + const path = await wails().SelectFile('Select Solder Paste Gerber', '*.gbr;*.gtp;*.gbp'); + if (path) { + state.stencil.gerberPath = path; + $('#stencil-gerber-name').textContent = path.split('/').pop(); + $('#stencil-gerber-name').classList.add('has-file'); + } + } catch (e) { console.error(e); } +} + +async function selectStencilOutline() { + try { + const path = await wails().SelectFile('Select Board Outline Gerber', '*.gbr;*.gko;*.gm1'); + if (path) { + state.stencil.outlinePath = path; + $('#stencil-outline-name').textContent = path.split('/').pop(); + $('#stencil-outline-name').classList.add('has-file'); + } + } catch (e) { console.error(e); } +} + +function clearStencilOutline() { + state.stencil.outlinePath = ''; + const el = $('#stencil-outline-name'); + el.textContent = 'No file selected'; + el.classList.remove('has-file'); +} + +async function generateStencil() { + if (!state.stencil.gerberPath) { + alert('Please select a solder paste gerber file.'); + return; + } + + const exports = []; + if ($('#stencil-stl')?.checked) exports.push('stl'); + if ($('#stencil-scad')?.checked) exports.push('scad'); + if ($('#stencil-svg')?.checked) exports.push('svg'); + if ($('#stencil-png')?.checked) exports.push('png'); + + showLoading('Generating stencil...'); + try { + const result = await wails().GenerateStencil( + state.stencil.gerberPath, + state.stencil.outlinePath, + parseFloat($('#stencil-height')?.value) || 0, + parseFloat($('#stencil-wall-height')?.value) || 0, + parseFloat($('#stencil-wall-thick')?.value) || 0, + parseFloat($('#stencil-dpi')?.value) || 0, + exports, + ); + hideLoading(); + showStencilResult(result.files); + } catch (e) { + hideLoading(); + alert('Generation failed: ' + e); + } +} + +function showStencilResult(files) { + const page = $('#page-stencil-result'); + page.innerHTML = ` + +
+
Generated Files
+
${files.map(f => esc(f)).join('\n')}
+
+
+
+ + +
+ `; + $$('.page').forEach(p => hide(p)); + show(page); +} + +// ===== Enclosure Page ===== +function initEnclosure() { + const page = $('#page-enclosure'); + state.enclosure = { gbrjobPath: '', gerberPaths: [], drillPath: '', npthPath: '', sourceDir: '' }; + + page.innerHTML = ` + +
+
Gerber Job File (.gbrjob)
+
+ No file selected + +
+
+
+
Gerber Files
+

Select a folder to auto-discover, or add files individually.

+
+ No files selected +
+
+ + + +
+
+
+
+
PTH Drill File (Optional)
+
+ No file selected + + +
+
+
+
NPTH Drill File (Optional)
+
+ No file selected + + +
+
+
+
+
Parameters
+
+ Wall Thickness (mm) + +
+
+ Wall Height (mm) + +
+
+ Clearance (mm) + +
+
+ DPI + +
+
+
+
Export Formats
+
+ + + + +
+
+
+
+ +
+ `; +} + +async function selectGbrjob() { + try { + const path = await wails().SelectFile('Select Gerber Job File', '*.gbrjob'); + if (path) { + state.enclosure.gbrjobPath = path; + $('#enc-gbrjob-name').textContent = path.split('/').pop(); + $('#enc-gbrjob-name').classList.add('has-file'); + } + } catch (e) { console.error(e); } +} + +async function selectGerberFolder() { + try { + const dir = await wails().SelectFolder('Select Gerber Files Folder'); + if (dir) { + state.enclosure.sourceDir = dir; + const files = await wails().DiscoverGerberFiles(dir); + if (files && files.length > 0) { + state.enclosure.gerberPaths = files; + $('#enc-gerber-count').textContent = `${files.length} files found`; + $('#enc-gerber-count').classList.add('has-file'); + } else { + $('#enc-gerber-count').textContent = 'No gerber files found in folder'; + } + } + } catch (e) { console.error(e); } +} + +async function addGerberFile() { + try { + const path = await wails().SelectFile('Add Gerber File', '*.gbr;*.gbrjob;*.gtp;*.gbp;*.gko;*.gm1;*.gtl;*.gbl;*.gts;*.gbs'); + if (path) { + if (!state.enclosure.gerberPaths.includes(path)) { + state.enclosure.gerberPaths.push(path); + if (!state.enclosure.sourceDir) { + state.enclosure.sourceDir = path.substring(0, path.lastIndexOf('/')); + } + } + $('#enc-gerber-count').textContent = `${state.enclosure.gerberPaths.length} files selected`; + $('#enc-gerber-count').classList.add('has-file'); + } + } catch (e) { console.error(e); } +} + +function clearGerbers() { + state.enclosure.gerberPaths = []; + const el = $('#enc-gerber-count'); + el.textContent = 'No files selected'; + el.classList.remove('has-file'); +} + +async function selectDrill(type) { + try { + const path = await wails().SelectFile(`Select ${type.toUpperCase()} Drill File`, '*.drl;*.xln;*.txt'); + if (path) { + if (type === 'pth') { + state.enclosure.drillPath = path; + $('#enc-drill-name').textContent = path.split('/').pop(); + $('#enc-drill-name').classList.add('has-file'); + } else { + state.enclosure.npthPath = path; + $('#enc-npth-name').textContent = path.split('/').pop(); + $('#enc-npth-name').classList.add('has-file'); + } + } + } catch (e) { console.error(e); } +} + +function clearDrill(type) { + if (type === 'pth') { + state.enclosure.drillPath = ''; + const el = $('#enc-drill-name'); + el.textContent = 'No file selected'; + el.classList.remove('has-file'); + } else { + state.enclosure.npthPath = ''; + const el = $('#enc-npth-name'); + el.textContent = 'No file selected'; + el.classList.remove('has-file'); + } +} + +async function buildEnclosure() { + if (!state.enclosure.gbrjobPath) { + alert('Please select a Gerber Job file (.gbrjob)'); + return; + } + if (state.enclosure.gerberPaths.length === 0) { + alert('Please select gerber files (use Select Folder or Add File)'); + return; + } + + const exports = []; + if ($('#enc-stl')?.checked) exports.push('stl'); + if ($('#enc-scad')?.checked) exports.push('scad'); + if ($('#enc-svg')?.checked) exports.push('svg'); + if ($('#enc-png')?.checked) exports.push('png'); + + showLoading('Building enclosure session...'); + try { + await wails().BuildEnclosureSession( + state.enclosure.gbrjobPath, + state.enclosure.gerberPaths, + state.enclosure.drillPath, + state.enclosure.npthPath, + parseFloat($('#enc-wall-thick')?.value) || 0, + parseFloat($('#enc-wall-height')?.value) || 0, + parseFloat($('#enc-clearance')?.value) || 0, + parseFloat($('#enc-dpi')?.value) || 0, + exports, + ); + hideLoading(); + navigate('preview'); + } catch (e) { + hideLoading(); + alert('Session build failed: ' + e); + } +} + +// ===== Enclosure Preview Page ===== +async function initPreview() { + const page = $('#page-preview'); + const info = await wails()?.GetSessionInfo(); + if (!info?.hasSession) { + page.innerHTML = '
No session active. Go back and build one.
'; + return; + } + + state.preview.activeSide = info.sides?.length > 0 ? info.sides[0].num : 0; + state.preview.sessionInfo = info; + const cutouts = await wails()?.GetSideCutouts() || []; + state.preview.cutouts = cutouts; + + page.innerHTML = ` + +
+
Board Preview — ${info.boardW.toFixed(1)} × ${info.boardH.toFixed(1)} mm | ${info.sides?.length || 0} sides
+
+ +
+
+
+
Side Cutout Editor
+
+ Active: ${info.sides?.length > 0 ? esc(info.sides[0].label) : 'none'} +
+
+ ${(info.sides || []).map((s, i) => ` + + `).join('')} +
+
+ X (mm) + + +
+
+ Y (mm) + + +
+
+ Width (mm) + +
+
+ Height (mm) + +
+
+ Corner Radius (mm) + +
+
+ Board Layer + +
+
+ +
+ +
Cutouts:
+
+ ${renderCutouts(cutouts)} +
+
+ +
+
+ +
+
+
+ +
+ + +
+ `; + + // Draw board preview with side labels + drawBoardPreview('#preview-board-canvas', info); + // Draw side-face cutout canvas + drawSideFace(); +} + +function renderCutouts(cutouts) { + if (!cutouts || cutouts.length === 0) return '
No cutouts added
'; + return cutouts.map((c, i) => ` +
+ Side ${c.side} [${c.l || 'F'}] X=${c.x.toFixed(1)} Y=${c.y.toFixed(1)} W=${c.w.toFixed(1)} H=${c.h.toFixed(1)} R=${c.r.toFixed(1)} + +
+ `).join(''); +} + +function selectSide(num, label, btn) { + state.preview.activeSide = num; + $$('.side-tab').forEach(t => t.classList.remove('active')); + btn.classList.add('active'); + $('#side-active-label').textContent = `Active: ${label}`; + drawSideFace(); +} + +async function centerX() { + const w = parseFloat($('#cut-w')?.value) || 9.0; + try { + const sideLen = await wails().GetSideLength(state.preview.activeSide); + const cx = Math.max(0, (sideLen - w) / 2); + $('#cut-x').value = cx.toFixed(2); + } catch (e) { console.error(e); } +} + +async function centerY() { + const h = parseFloat($('#cut-h')?.value) || 3.26; + const info = await wails()?.GetSessionInfo(); + if (info) { + const cy = Math.max(0, (info.totalH - h) / 2); + $('#cut-y').value = cy.toFixed(2); + } +} + +function presetUSBC() { + $('#cut-w').value = '9.0'; + $('#cut-h').value = '3.26'; + $('#cut-r').value = '1.3'; +} + +async function addCutout() { + try { + await wails().AddSideCutout( + state.preview.activeSide, + parseFloat($('#cut-x')?.value) || 0, + parseFloat($('#cut-y')?.value) || 0, + parseFloat($('#cut-w')?.value) || 9.0, + parseFloat($('#cut-h')?.value) || 3.26, + parseFloat($('#cut-r')?.value) || 1.3, + $('#cut-layer')?.value || 'F', + ); + const cutouts = await wails().GetSideCutouts(); + state.preview.cutouts = cutouts; + $('#cutout-list').innerHTML = renderCutouts(cutouts); + drawSideFace(); + } catch (e) { console.error(e); } +} + +async function removeCutout(index) { + try { + await wails().RemoveSideCutout(index); + const cutouts = await wails().GetSideCutouts(); + state.preview.cutouts = cutouts; + $('#cutout-list').innerHTML = renderCutouts(cutouts); + drawSideFace(); + } catch (e) { console.error(e); } +} + +async function saveProfile() { + const name = prompt('Profile name:'); + if (name === null) return; + try { + await wails().SaveEnclosureProfile(name || ''); + alert('Profile saved!'); + } catch (e) { + alert('Save failed: ' + e); + } +} + +async function generateEnclosure() { + showLoading('Generating enclosure...'); + try { + const result = await wails().GenerateEnclosureOutputs(); + hideLoading(); + showEnclosureResult(result.files); + } catch (e) { + hideLoading(); + alert('Generation failed: ' + e); + } +} + +function showEnclosureResult(files) { + const page = $('#page-enclosure-result'); + page.innerHTML = ` + +
+
Generated Files
+
${files.map(f => esc(f)).join('\n')}
+
+
+
+ + +
+ `; + $$('.page').forEach(p => hide(p)); + show(page); +} + +// ===== Open Project ===== +async function openProject(path) { + showLoading('Opening project...'); + try { + await wails().OpenProject(path); + hideLoading(); + navigate('preview'); + } catch (e) { + hideLoading(); + alert('Failed to open project: ' + e); + } +} + +// ===== THE FORMER (3D) ===== +let former3d = null; // Former3D instance + +async function initFormer() { + const page = $('#page-former'); + const layers = await wails()?.GetFormerLayers() || []; + state.former.layers = layers; + state.former.selectedLayer = -1; + + // Dispose previous instance + if (former3d) { + former3d.dispose(); + former3d = null; + } + if (state.former._escHandler) { + document.removeEventListener('keydown', state.former._escHandler); + state.former._escHandler = null; + } + + page.innerHTML = ` +
+
+
+
+

Layers

+ +
+
+ ${layers.map((l, i) => ` +
+ + +
+ ${esc(l.name)} +
+ `).join('')} +
+ + + + +
+
Left-click: rotate. Right-click: zoom. Middle: pan.
+
+ + +
+ +
+
+
+ `; + + const wrap = $('#former-canvas-wrap'); + if (!wrap) return; + + // Create 3D scene + former3d = new Former3D(wrap); + + // Layer selection callback — update sidebar + former3d.onLayerSelect(index => { + state.former.selectedLayer = index; + const tools = $('#former-selection-tools'); + if (index >= 0 && index < layers.length) { + tools.style.display = 'block'; + $('#former-sel-name').textContent = layers[index].name; + // Highlight the row + $$('.former-layer-row').forEach(r => r.classList.remove('selected')); + const row = $(`#layer-row-${index}`); + if (row) row.classList.add('selected'); + } else { + tools.style.display = 'none'; + $$('.former-layer-row').forEach(r => r.classList.remove('selected')); + } + }); + + former3d.onCutoutSelect((el, selected) => { + console.log('Cutout element:', el.id, selected ? 'selected' : 'deselected'); + const count = former3d.cutouts.length; + const status = $('#former-cutout-status'); + if (status) status.textContent = `${count} element${count !== 1 ? 's' : ''} selected`; + }); + + // Placed cutout selection callback + former3d.onPlacedCutoutSelect(ids => { + const panel = $('#former-cutout-edit'); + if (!panel) return; + if (ids.length === 0) { + panel.style.display = 'none'; + return; + } + const cutouts = former3d.getSelectedCutouts(); + if (cutouts.length === 1) { + showCutoutEditPanel(cutouts[0]); + } else { + panel.style.display = 'block'; + panel.innerHTML = ` +
${cutouts.length} cutouts selected
+
+ +
+ `; + } + }); + + // Keyboard handler for cutout editing + escape + const keyHandler = e => { + if (e.key === 'Escape') { + if (former3d?.cutoutMode) { + formerExitCutoutMode(); + } else if (former3d?.selectedCutoutIds?.size > 0) { + former3d._deselectAllCutouts(); + } + return; + } + // Delete/Backspace: remove selected cutouts + if ((e.key === 'Delete' || e.key === 'Backspace') && former3d?.selectedCutoutIds?.size > 0) { + if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return; + e.preventDefault(); + deleteSelectedCutouts(); + return; + } + // Arrow keys: nudge selected cutouts 0.5mm + if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) && former3d?.selectedCutoutIds?.size > 0) { + if (e.target.tagName === 'INPUT') return; + e.preventDefault(); + nudgeSelectedCutouts(e.key); + return; + } + // Cmd/Ctrl+D: duplicate + if (e.key === 'd' && (e.metaKey || e.ctrlKey) && former3d?.selectedCutoutIds?.size > 0) { + e.preventDefault(); + duplicateSelectedCutouts(); + return; + } + }; + document.addEventListener('keydown', keyHandler); + state.former._escHandler = keyHandler; + + // Build image URLs and load layers into 3D scene + const imageUrls = layers.map((_, i) => `/api/layers/${i}.png?t=${Date.now()}`); + await former3d.loadLayers(layers, imageUrls); + + // Load 3D enclosure geometry if available + try { + const encData = await wails()?.GetEnclosure3DData(); + if (encData && encData.outlinePoints && former3d) { + const info = await wails()?.GetSessionInfo(); + if (info?.hasSession) { + former3d.loadEnclosureGeometry(encData, info.dpi, info.minX, info.maxY); + // Show existing cutouts + const cutouts = encData.cutouts || []; + if (cutouts.length > 0) { + former3d.refreshCutouts(cutouts, encData, info.dpi, info.minX, info.maxY); + } + } + } + } catch (e) { + console.warn('Could not load enclosure 3D data:', e); + } +} + +function toggleLayerVis(index) { + const layer = state.former.layers[index]; + if (!layer) return; + layer.visible = !layer.visible; + if (!layer.visible) layer.highlight = false; + wails()?.SetLayerVisibility(index, layer.visible); + if (former3d) former3d.setLayerVisibility(index, layer.visible); + updateLayerUI(); +} + +function toggleLayerHL(index) { + const layer = state.former.layers[index]; + if (!layer) return; + if (layer.highlight) { + layer.highlight = false; + wails()?.ToggleHighlight(index); + if (former3d) former3d.setLayerHighlight(-1, false); + } else { + state.former.layers.forEach(l => l.highlight = false); + layer.highlight = true; + layer.visible = true; + wails()?.ToggleHighlight(index); + if (former3d) { + former3d.setLayerVisibility(index, true); + former3d.setLayerHighlight(index, true); + } + } + updateLayerUI(); +} + +function updateLayerUI() { + const hasHL = state.former.layers.some(l => l.highlight && l.visible); + state.former.layers.forEach((l, i) => { + const visBtn = $(`#layer-vis-${i}`); + const hlBtn = $(`#layer-hl-${i}`); + const row = $(`#layer-row-${i}`); + const name = $(`#layer-name-${i}`); + if (visBtn) { + visBtn.textContent = l.visible ? '👁' : '○'; + visBtn.classList.toggle('active', l.visible); + } + if (hlBtn) hlBtn.classList.toggle('active', l.highlight); + if (row) row.classList.toggle('highlighted', l.highlight); + if (name) name.classList.toggle('dimmed', hasHL && !l.highlight && l.visible); + }); +} + +function resetFormerView() { + if (former3d) former3d.resetView(); +} + +function formerMoveZ(delta) { + if (former3d) former3d.moveSelectedZ(delta); +} + +async function formerSelectCutoutElement() { + state.former.cutoutType = 'cutout'; + await _enterElementSelection(false); +} + +async function formerSelectDadoElement() { + const depthStr = prompt('Dado/engrave depth (mm):', '0.5'); + if (depthStr === null) return; + state.former.dadoDepth = parseFloat(depthStr) || 0.5; + state.former.cutoutType = 'dado'; + await _enterElementSelection(true); +} + +async function _enterElementSelection(isDado) { + if (!former3d || state.former.selectedLayer < 0) return; + const index = state.former.selectedLayer; + const layer = state.former.layers[index]; + + // Show cutout tools, hide selection tools + const cutoutTools = $('#former-cutout-tools'); + const selTools = $('#former-selection-tools'); + if (cutoutTools) cutoutTools.style.display = 'block'; + if (selTools) selTools.style.display = 'none'; + const status = $('#former-cutout-status'); + if (status) status.textContent = '0 elements selected'; + + // Update cutout mode label + const modeLabel = cutoutTools?.querySelector('div:first-child'); + if (modeLabel) { + modeLabel.textContent = isDado ? 'Engrave Selection Mode' : 'Cutout Selection Mode'; + modeLabel.style.color = isDado ? '#f9e2af' : 'var(--accent)'; + } + const modeHint = cutoutTools?.querySelectorAll('div')[1]; + if (modeHint && isDado) { + modeHint.textContent = 'Click or drag-rectangle to select elements. Esc to exit.'; + } + + try { + const elements = await wails()?.GetLayerElements(index); + if (!elements || elements.length === 0) { + alert(`No graphic elements found on layer "${layer?.name || index}". This layer may not have selectable elements.`); + if (cutoutTools) cutoutTools.style.display = 'none'; + if (selTools) selTools.style.display = 'block'; + return; + } + former3d.enterCutoutMode(elements, index, isDado); + } catch (e) { + console.error('GetLayerElements failed:', e); + alert('Could not load layer elements: ' + e); + if (cutoutTools) cutoutTools.style.display = 'none'; + if (selTools) selTools.style.display = 'block'; + } +} + +function formerCutoutAll() { + if (!former3d || state.former.selectedLayer < 0) return; + const layer = state.former.layers[state.former.selectedLayer]; + console.log('Cutout all for layer:', layer?.name); + // Mark the entire layer as a cutout region + alert(`Marked entire "${layer?.name}" layer as cutout.`); +} + +async function formerExitCutoutMode() { + if (!former3d) return; + + const selected = [...former3d.cutouts]; + const isDado = state.former.cutoutType === 'dado'; + const depth = isDado ? state.former.dadoDepth : 0; + + former3d.exitCutoutMode(); + + if (selected.length > 0) { + const info = await wails()?.GetSessionInfo(); + const sides = info?.sides || []; + const result = await showSurfacePicker(sides); + + if (result) { + try { + if (result.surface === 'top' || result.surface === 'bottom') { + const plane = result.surface === 'top' ? 'lid' : 'tray'; + await wails()?.AddLidCutouts(selected, plane, isDado, depth); + console.log(`Added ${selected.length} ${isDado ? 'dado' : 'cutout'} elements to ${result.surface}`); + } else if (result.surface === 'side') { + const side = sides.find(s => s.num === result.sideNum); + if (side && info) { + const projected = selected.map(el => + projectElementToSide(el, side, info.dpi, info.minX, info.maxY) + ); + // Enter side placement mode for interactive Y positioning + const placements = await former3d.enterSidePlacementMode(projected, result.sideNum); + if (placements) { + for (const p of placements) { + await wails()?.AddCutout({ + id: '', surface: 'side', sideNum: result.sideNum, + x: p.x, y: p.y, w: p.width, h: p.height, + r: 0, isDado, depth, sourceLayer: '', + }); + } + console.log(`Added ${placements.length} side cutouts to side ${result.sideNum}`); + } + } + } + await refreshCutoutViz(); + } catch (e) { + console.error('Failed to save cutouts:', e); + alert('Failed to save cutouts: ' + e); + } + } + } + + // Restore UI + const cutoutTools = $('#former-cutout-tools'); + const selTools = $('#former-selection-tools'); + if (cutoutTools) cutoutTools.style.display = 'none'; + if (state.former.selectedLayer >= 0) { + if (selTools) selTools.style.display = 'block'; + } +} + +const surfacePickerColors = ['#ef4444','#3b82f6','#22c55e','#f59e0b','#8b5cf6','#ec4899','#14b8a6','#f97316']; + +function showSurfacePicker(sides) { + return new Promise(resolve => { + const overlay = document.createElement('div'); + overlay.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.6);z-index:10000;display:flex;align-items:center;justify-content:center;'; + const box = document.createElement('div'); + box.style.cssText = 'background:var(--bg-card,#1e1e2e);border:1px solid var(--border-light,#45475a);border-radius:12px;padding:24px;min-width:300px;text-align:center;'; + + let sidesHTML = ''; + if (sides && sides.length > 0) { + sidesHTML = ` +
Sides
+
+ ${sides.map((s, i) => { + const col = surfacePickerColors[i % surfacePickerColors.length]; + return ``; + }).join('')} +
+ `; + } + + box.innerHTML = ` +
Apply cutout to which surface?
+
+ + +
+ ${sidesHTML} +
+ +
+ `; + overlay.appendChild(box); + document.body.appendChild(overlay); + + const done = (result) => { overlay.remove(); resolve(result); }; + box.querySelector('#surface-top').onclick = () => done({ surface: 'top' }); + box.querySelector('#surface-bottom').onclick = () => done({ surface: 'bottom' }); + box.querySelector('#surface-cancel').onclick = () => done(null); + overlay.onclick = e => { if (e.target === overlay) done(null); }; + + // Side buttons with hover preview + box.querySelectorAll('.surface-side-btn').forEach(btn => { + const sideNum = parseInt(btn.dataset.side); + btn.addEventListener('mouseenter', () => { + if (former3d) { + former3d.highlightSide(sideNum); + former3d.lookAtSide(sideNum); + } + }); + btn.addEventListener('mouseleave', () => { + if (former3d) former3d.clearSideHighlight(); + }); + btn.onclick = () => done({ surface: 'side', sideNum }); + }); + }); +} + +function projectElementToSide(el, side, dpi, minX, maxY) { + const mmMinX = el.minX * (25.4 / dpi) + minX; + const mmMaxX = el.maxX * (25.4 / dpi) + minX; + const mmMinY = maxY - el.maxY * (25.4 / dpi); + const mmMaxY = maxY - el.minY * (25.4 / dpi); + + const cx = (mmMinX + mmMaxX) / 2; + const cy = (mmMinY + mmMaxY) / 2; + const w = mmMaxX - mmMinX; + const h = mmMaxY - mmMinY; + + const sdx = side.endX - side.startX; + const sdy = side.endY - side.startY; + const sLen = Math.sqrt(sdx * sdx + sdy * sdy); + const t = ((cx - side.startX) * sdx + (cy - side.startY) * sdy) / (sLen * sLen); + const posAlongSide = t * sLen; + + const ux = sdx / sLen, uy = sdy / sLen; + const projW = Math.abs(w * ux) + Math.abs(h * uy); + const projH = Math.abs(w * uy) + Math.abs(h * ux); + + return { x: posAlongSide - projW / 2, width: projW, height: projH }; +} + +async function refreshCutoutViz() { + if (!former3d) return; + try { + const cutouts = await wails()?.GetCutouts(); + const encData = await wails()?.GetEnclosure3DData(); + const info = await wails()?.GetSessionInfo(); + if (encData && info?.hasSession) { + former3d.refreshCutouts(cutouts || [], encData, info.dpi, info.minX, info.maxY); + } + } catch (e) { + console.warn('refreshCutoutViz failed:', e); + } +} + +function showCutoutEditPanel(cutout) { + const panel = $('#former-cutout-edit'); + if (!panel) return; + panel.style.display = 'block'; + + const surfaceLabel = cutout.surface === 'side' ? `Side ${cutout.sideNum}` : + cutout.surface === 'top' ? 'Top (Lid)' : 'Bottom (Tray)'; + + panel.innerHTML = ` +
Edit Cutout — ${surfaceLabel}
+
+ X + +
+
+ Y + +
+
+ W + +
+
+ H + +
+
+ R + +
+ ${cutout.isDado ? ` +
+ Depth + +
` : ''} +
+ + +
+ `; + + // Live update on input change + const debounceUpdate = (() => { + let timer; + return () => { + clearTimeout(timer); + timer = setTimeout(() => updateCutoutFromFields(cutout.id), 200); + }; + })(); + ['cedit-x', 'cedit-y', 'cedit-w', 'cedit-h', 'cedit-r', 'cedit-depth'].forEach(id => { + const el = $(`#${id}`); + if (el) el.addEventListener('input', debounceUpdate); + }); +} + +async function updateCutoutFromFields(cutoutId) { + try { + // Get current full cutout from backend, merge fields + const allCutouts = await wails()?.GetCutouts() || []; + const existing = allCutouts.find(c => c.id === cutoutId); + if (!existing) return; + existing.x = parseFloat($('#cedit-x')?.value) || 0; + existing.y = parseFloat($('#cedit-y')?.value) || 0; + existing.w = parseFloat($('#cedit-w')?.value) || 0; + existing.h = parseFloat($('#cedit-h')?.value) || 0; + existing.r = parseFloat($('#cedit-r')?.value) || 0; + const depthEl = $('#cedit-depth'); + if (depthEl) existing.depth = parseFloat(depthEl.value) || 0; + await wails()?.UpdateCutout(existing); + await refreshCutoutViz(); + } catch (e) { + console.error('updateCutout failed:', e); + } +} + +async function deleteSelectedCutouts() { + if (!former3d?.selectedCutoutIds) return; + const ids = [...former3d.selectedCutoutIds]; + for (const id of ids) { + try { await wails()?.RemoveCutout(id); } catch (e) { console.error(e); } + } + former3d.selectedCutoutIds = new Set(); + const panel = $('#former-cutout-edit'); + if (panel) panel.style.display = 'none'; + await refreshCutoutViz(); +} + +async function duplicateSelectedCutouts() { + if (!former3d?.selectedCutoutIds) return; + const ids = [...former3d.selectedCutoutIds]; + for (const id of ids) { + try { await wails()?.DuplicateCutout(id); } catch (e) { console.error(e); } + } + await refreshCutoutViz(); +} + +async function nudgeSelectedCutouts(key) { + if (!former3d?.selectedCutoutIds) return; + // Get fresh cutout data from backend + const allCutouts = await wails()?.GetCutouts() || []; + const selectedIds = [...former3d.selectedCutoutIds]; + const delta = 0.5; + for (const id of selectedIds) { + const c = allCutouts.find(x => x.id === id); + if (!c) continue; + if (key === 'ArrowLeft') c.x -= delta; + else if (key === 'ArrowRight') c.x += delta; + else if (key === 'ArrowUp') c.y += delta; + else if (key === 'ArrowDown') c.y -= delta; + try { await wails()?.UpdateCutout(c); } catch (e) { console.error(e); } + } + await refreshCutoutViz(); + // Update edit panel if single selection + if (selectedIds.length === 1) { + const fresh = await wails()?.GetCutouts() || []; + const updated = fresh.find(c => c.id === selectedIds[0]); + if (updated) showCutoutEditPanel(updated); + } +} + +function formerToggleGrid() { + if (!former3d) return; + const on = former3d.toggleGrid(); + const btn = $('#former-grid-btn'); + if (btn) btn.textContent = on ? 'Grid: On' : 'Grid: Off'; +} + +async function formerRenderAndView() { + if (!former3d) return; + showLoading('Rendering outputs...'); + try { + const result = await wails()?.RenderFromFormer(); + hideLoading(); + if (!result || !result.files || result.files.length === 0) { + alert('Render produced no output files.'); + return; + } + // Switch to solid view + former3d.enterSolidView(); + // Show render result panel, hide normal actions + const renderResult = $('#former-render-result'); + const normalActions = $('#former-actions-normal'); + const selTools = $('#former-selection-tools'); + const cutoutTools = $('#former-cutout-tools'); + if (renderResult) { + renderResult.style.display = 'block'; + const filesDiv = $('#former-render-files'); + if (filesDiv) filesDiv.innerHTML = result.files.map(f => esc(f.split('/').pop())).join('
'); + } + if (normalActions) normalActions.style.display = 'none'; + if (selTools) selTools.style.display = 'none'; + if (cutoutTools) cutoutTools.style.display = 'none'; + // Show nav button + const navBtn = $('#nav-open-output'); + if (navBtn) navBtn.style.display = ''; + } catch (e) { + hideLoading(); + alert('Render failed: ' + e); + } +} + +function formerReturnToEditor() { + if (!former3d) return; + former3d.exitSolidView(); + const renderResult = $('#former-render-result'); + const normalActions = $('#former-actions-normal'); + if (renderResult) renderResult.style.display = 'none'; + if (normalActions) normalActions.style.display = 'block'; +} + +async function openOutputFolder() { + try { + await wails()?.OpenOutputFolder(); + } catch (e) { + alert('Could not open output folder: ' + e); + } +} + +// ===== Auto-Align USB Port ===== +async function autoAlignUSB() { + try { + const paths = await wails().SelectMultipleFiles('Select Fab Layer Gerbers (F.Fab, B.Fab)', '*.gbr'); + if (!paths || paths.length === 0) return; + + showLoading('Detecting footprints...'); + const result = await wails().UploadAndDetectFootprints(paths); + hideLoading(); + + if (!result || !result.footprints || result.footprints.length === 0) { + alert('No footprints found in the selected Fab gerbers.'); + return; + } + + state.preview.alignMode = 'SELECT_FOOTPRINT'; + state.preview.footprints = result.footprints; + state.preview.hoverFP = null; + state.preview.selectedFP = null; + state.preview.hoverEdge = null; + state.preview.fabImgSrc = result.fabImageURL; + + // Redraw board with footprint overlay + drawBoardPreviewWithAlign(); + } catch (e) { + hideLoading(); + console.error(e); + alert('Auto-detect failed: ' + e); + } +} + +function drawBoardPreviewWithAlign() { + const canvas = $('#preview-board-canvas'); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + const info = state.preview.sessionInfo; + if (!info) return; + + const boardImg = new Image(); + boardImg.onload = () => { + const scale = Math.min(canvas.width / boardImg.width, canvas.height / boardImg.height) * 0.75; + const w = boardImg.width * scale; + const h = boardImg.height * scale; + const x = (canvas.width - w) / 2; + const y = (canvas.height - h) / 2; + + ctx.fillStyle = '#34353c'; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(boardImg, x, y, w, h); + + // Draw fab overlay if in align mode + if (state.preview.alignMode && state.preview.fabImgSrc) { + const fabImg = new Image(); + fabImg.onload = () => { + ctx.globalAlpha = 0.5; + ctx.drawImage(fabImg, x, y, w, h); + ctx.globalAlpha = 1.0; + drawAlignOverlays(ctx, x, y, w, h, scale, info); + }; + fabImg.src = state.preview.fabImgSrc; + } else { + drawSideLabels(ctx, x, y, w, h, scale, info); + } + }; + boardImg.src = `/api/board-preview.png?t=${Date.now()}`; +} + +function drawAlignOverlays(ctx, bx, by, bw, bh, scale, info) { + const dpi = info.dpi || 600; + const mmToPx = (mmX, mmY) => [ + bx + (mmX - info.minX) * dpi / 25.4 * scale, + by + (info.maxY - mmY) * dpi / 25.4 * scale + ]; + + if (state.preview.alignMode === 'SELECT_FOOTPRINT') { + (state.preview.footprints || []).forEach(fp => { + const [px1, py1] = mmToPx(fp.minX, fp.maxY); + const [px2, py2] = mmToPx(fp.maxX, fp.minY); + const fw = px2 - px1; + const fh = py2 - py1; + + ctx.beginPath(); + ctx.rect(px1, py1, fw, fh); + if (state.preview.hoverFP && state.preview.hoverFP.name === fp.name && + state.preview.hoverFP.centerX === fp.centerX) { + ctx.fillStyle = 'rgba(59, 130, 246, 0.4)'; + ctx.fill(); + ctx.strokeStyle = '#3b82f6'; + ctx.lineWidth = 2; + } else { + ctx.fillStyle = 'rgba(255, 255, 255, 0.1)'; + ctx.fill(); + ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)'; + ctx.lineWidth = 1; + } + ctx.stroke(); + }); + + // Instruction banner + ctx.fillStyle = 'rgba(37, 99, 235, 0.85)'; + ctx.fillRect(0, 0, 600, 28); + ctx.fillStyle = 'white'; + ctx.font = 'bold 12px sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText('Click to select the USB-C footprint. Press Escape to cancel.', 300, 14); + } else if (state.preview.alignMode === 'SELECT_EDGE' && state.preview.selectedFP) { + const fp = state.preview.selectedFP; + const [px1, py1] = mmToPx(fp.minX, fp.maxY); + const [px2, py2] = mmToPx(fp.maxX, fp.minY); + + const edges = [ + { id: 'top', x1: px1, y1: py1, x2: px2, y2: py1 }, + { id: 'bottom', x1: px1, y1: py2, x2: px2, y2: py2 }, + { id: 'left', x1: px1, y1: py1, x2: px1, y2: py2 }, + { id: 'right', x1: px2, y1: py1, x2: px2, y2: py2 } + ]; + + edges.forEach(e => { + ctx.beginPath(); + ctx.moveTo(e.x1, e.y1); + ctx.lineTo(e.x2, e.y2); + ctx.strokeStyle = (state.preview.hoverEdge === e.id) ? '#ef4444' : '#3b82f6'; + ctx.lineWidth = (state.preview.hoverEdge === e.id) ? 4 : 2; + ctx.stroke(); + }); + + ctx.fillStyle = 'rgba(37, 99, 235, 0.85)'; + ctx.fillRect(0, 0, 600, 28); + ctx.fillStyle = 'white'; + ctx.font = 'bold 12px sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText('Click the outermost edge of the connector lip.', 300, 14); + } +} + +function drawSideLabels(ctx, x, y, w, h, scale, info) { + const sides = info.sides || []; + const labelPad = 18; + ctx.font = 'bold 13px sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + sides.forEach(side => { + const color = sideColors[(side.num - 1) % sideColors.length]; + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineWidth = 2; + + if (side.startX !== undefined) { + const dpi = info.dpi || 600; + const px1 = x + (side.startX - info.minX) * dpi / 25.4 * scale; + const py1 = y + (info.maxY - side.startY) * dpi / 25.4 * scale; + const px2 = x + (side.endX - info.minX) * dpi / 25.4 * scale; + const py2 = y + (info.maxY - side.endY) * dpi / 25.4 * scale; + + ctx.beginPath(); + ctx.moveTo(px1, py1); + ctx.lineTo(px2, py2); + ctx.stroke(); + + const midPxX = (px1 + px2) / 2; + const midPxY = (py1 + py2) / 2; + const nx = Math.cos(side.angle); + const ny = -Math.sin(side.angle); + const lx = midPxX + nx * labelPad; + const ly = midPxY + ny * labelPad; + + ctx.beginPath(); + ctx.arc(lx, ly, 12, 0, Math.PI * 2); + ctx.fill(); + ctx.fillStyle = 'white'; + ctx.fillText(side.num, lx, ly + 1); + } + }); +} + +function setupBoardCanvasEvents() { + const canvas = $('#preview-board-canvas'); + if (!canvas) return; + + canvas.addEventListener('mousemove', e => { + if (!state.preview.alignMode) return; + const info = state.preview.sessionInfo; + if (!info) return; + + const rect = canvas.getBoundingClientRect(); + const pxX = (e.clientX - rect.left) * (canvas.width / rect.width); + const pxY = (e.clientY - rect.top) * (canvas.height / rect.height); + + const br = state.preview.boardRect; + if (!br) return; + + const dpi = info.dpi || 600; + const mmX = info.minX + (pxX - br.x) / br.scale * 25.4 / dpi; + const mmY = info.maxY - (pxY - br.y) / br.scale * 25.4 / dpi; + + if (state.preview.alignMode === 'SELECT_FOOTPRINT') { + state.preview.hoverFP = null; + for (const fp of (state.preview.footprints || [])) { + if (mmX >= fp.minX && mmX <= fp.maxX && mmY >= fp.minY && mmY <= fp.maxY) { + state.preview.hoverFP = fp; + break; + } + } + drawBoardPreviewWithAlign(); + } else if (state.preview.alignMode === 'SELECT_EDGE' && state.preview.selectedFP) { + const fp = state.preview.selectedFP; + const dists = [ + { id: 'top', d: Math.abs(mmY - fp.maxY) }, + { id: 'bottom', d: Math.abs(mmY - fp.minY) }, + { id: 'left', d: Math.abs(mmX - fp.minX) }, + { id: 'right', d: Math.abs(mmX - fp.maxX) } + ].sort((a, b) => a.d - b.d); + state.preview.hoverEdge = (dists[0].d < 3.0) ? dists[0].id : null; + drawBoardPreviewWithAlign(); + } + }); + + canvas.addEventListener('click', e => { + if (!state.preview.alignMode) return; + + if (state.preview.alignMode === 'SELECT_FOOTPRINT' && state.preview.hoverFP) { + state.preview.selectedFP = state.preview.hoverFP; + state.preview.alignMode = 'SELECT_EDGE'; + drawBoardPreviewWithAlign(); + } else if (state.preview.alignMode === 'SELECT_EDGE' && state.preview.hoverEdge && state.preview.selectedFP) { + applyAutoAlignment(state.preview.selectedFP, state.preview.hoverEdge); + state.preview.alignMode = null; + drawBoardPreview('#preview-board-canvas', state.preview.sessionInfo); + } + }); + + document.addEventListener('keydown', e => { + if (e.key === 'Escape' && state.preview.alignMode) { + state.preview.alignMode = null; + drawBoardPreview('#preview-board-canvas', state.preview.sessionInfo); + } + }); +} + +function applyAutoAlignment(fp, lip) { + const info = state.preview.sessionInfo; + if (!info) return; + + let bx = fp.centerX, by = fp.centerY; + if (lip === 'top') by = fp.maxY; + else if (lip === 'bottom') by = fp.minY; + else if (lip === 'left') bx = fp.minX; + else if (lip === 'right') bx = fp.maxX; + + let closestSide = null; + let minDist = Infinity; + let bestPosX = 0; + + (info.sides || []).forEach(s => { + if (s.startX === undefined) return; + const dx = s.endX - s.startX; + const dy = s.endY - s.startY; + const lenSq = dx * dx + dy * dy; + if (lenSq <= 0) return; + const t = Math.max(0, Math.min(1, ((bx - s.startX) * dx + (by - s.startY) * dy) / lenSq)); + const rx = s.startX + t * dx; + const ry = s.startY + t * dy; + const dist = Math.sqrt((bx - rx) ** 2 + (by - ry) ** 2); + if (dist < minDist) { + minDist = dist; + closestSide = s; + bestPosX = t * s.length; + } + }); + + if (closestSide) { + const cutW = 9.0; + const cutH = 3.26; + const cutR = 1.3; + const cutX = Math.max(0, bestPosX - cutW / 2); + + // Set form fields + if ($('#cut-w')) $('#cut-w').value = cutW.toFixed(2); + if ($('#cut-h')) $('#cut-h').value = cutH.toFixed(2); + if ($('#cut-r')) $('#cut-r').value = cutR.toFixed(2); + if ($('#cut-x')) $('#cut-x').value = cutX.toFixed(2); + if ($('#cut-y')) $('#cut-y').value = '0.00'; + + // Switch to correct side and add + state.preview.activeSide = closestSide.num; + $$('.side-tab').forEach(t => t.classList.remove('active')); + const tab = $(`.side-tab[data-side="${closestSide.num}"]`); + if (tab) tab.classList.add('active'); + $('#side-active-label').textContent = `Active: ${closestSide.label}`; + + addCutout(); + } +} + +// ===== Board Preview Canvas with Side Labels ===== +const sideColors = ['#ef4444','#3b82f6','#22c55e','#f59e0b','#8b5cf6','#ec4899','#14b8a6','#f97316']; + +function drawBoardPreview(canvasId, info) { + const canvas = $(canvasId); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + const img = new Image(); + img.onload = () => { + const scale = Math.min(canvas.width / img.width, canvas.height / img.height) * 0.75; + const w = img.width * scale; + const h = img.height * scale; + const x = (canvas.width - w) / 2; + const y = (canvas.height - h) / 2; + + ctx.fillStyle = '#34353c'; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(img, x, y, w, h); + + drawSideLabels(ctx, x, y, w, h, scale, info); + state.preview.boardRect = { x, y, w, h, scale }; + + // Setup events for auto-detect (only once) + if (!canvas._eventsSetup) { + canvas._eventsSetup = true; + setupBoardCanvasEvents(); + } + }; + img.src = `/api/board-preview.png?t=${Date.now()}`; +} + +// ===== Side-Face Cutout Canvas ===== +function drawSideFace() { + const canvas = $('#side-canvas'); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + const info = state.preview.sessionInfo; + if (!info) return; + + const side = (info.sides || []).find(s => s.num === state.preview.activeSide); + if (!side) return; + + const dims = { width: side.length, height: info.totalH }; + const scaleX = (canvas.width - 40) / dims.width; + const scaleY = (canvas.height - 30) / dims.height; + const sc = Math.min(scaleX, scaleY); + const offX = (canvas.width - dims.width * sc) / 2; + const offY = 10; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Wall face rectangle + ctx.fillStyle = '#45475a'; + ctx.strokeStyle = sideColors[(state.preview.activeSide - 1) % sideColors.length]; + ctx.lineWidth = 2; + ctx.fillRect(offX, offY, dims.width * sc, dims.height * sc); + ctx.strokeRect(offX, offY, dims.width * sc, dims.height * sc); + + // Side label + ctx.fillStyle = sideColors[(state.preview.activeSide - 1) % sideColors.length]; + ctx.font = 'bold 11px sans-serif'; + ctx.textAlign = 'left'; + ctx.fillText(side.label, offX, offY - 2); + + // Draw cutouts for this side + const cutouts = state.preview.cutouts || []; + ctx.fillStyle = '#1e1e2e'; + cutouts.forEach(c => { + if (c.side !== state.preview.activeSide) return; + drawRoundedRect(ctx, + offX + c.x * sc, + offY + (dims.height - c.y - c.h) * sc, + c.w * sc, c.h * sc, c.r * sc); + }); + + // mm grid labels + ctx.fillStyle = '#6c7086'; + ctx.font = '10px sans-serif'; + ctx.textAlign = 'center'; + const step = Math.ceil(dims.width / 10); + for (let mm = 0; mm <= dims.width; mm += step) { + ctx.fillText(mm + '', offX + mm * sc, offY + dims.height * sc + 14); + } +} + +function drawRoundedRect(ctx, x, y, w, h, r) { + r = Math.min(r, w / 2, h / 2); + ctx.beginPath(); + ctx.moveTo(x + r, y); + ctx.lineTo(x + w - r, y); + ctx.quadraticCurveTo(x + w, y, x + w, y + r); + ctx.lineTo(x + w, y + h - r); + ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); + ctx.lineTo(x + r, y + h); + ctx.quadraticCurveTo(x, y + h, x, y + h - r); + ctx.lineTo(x, y + r); + ctx.quadraticCurveTo(x, y, x + r, y); + ctx.closePath(); + ctx.fill(); +} + +// ===== Utility ===== +function esc(str) { + if (!str) return ''; + const d = document.createElement('div'); + d.textContent = str; + return d.innerHTML; +} + +// ===== Expose globals for onclick handlers ===== +Object.assign(window, { + navigate, openProject, + selectStencilGerber, selectStencilOutline, clearStencilOutline, generateStencil, + selectGbrjob, selectGerberFolder, addGerberFile, clearGerbers, + selectDrill, clearDrill, buildEnclosure, + selectSide, centerX, centerY, presetUSBC, addCutout, removeCutout, + saveProfile, generateEnclosure, autoAlignUSB, + toggleLayerVis, toggleLayerHL, resetFormerView, + formerMoveZ, formerSelectCutoutElement, formerSelectDadoElement, formerCutoutAll, formerExitCutoutMode, formerToggleGrid, + formerRenderAndView, formerReturnToEditor, openOutputFolder, + refreshCutoutViz, deleteSelectedCutouts, duplicateSelectedCutouts, +}); + +// ===== Init ===== +window.addEventListener('DOMContentLoaded', () => { + navigate('landing'); +}); diff --git a/frontend/src/style.css b/frontend/src/style.css new file mode 100644 index 0000000..ede9b93 --- /dev/null +++ b/frontend/src/style.css @@ -0,0 +1,713 @@ +/* Former — Dark Theme (Google AI Studio Match) */ +:root { + --bg-base: #131314; + --bg-surface: #1e1f20; + --bg-overlay: #282a2c; + --bg-input: #1e1f20; + --text-primary: #e3e3e3; + --text-secondary: #c4c7c5; + --text-subtle: #8e918f; + --accent: #e3e3e3; + --accent-hover: #ffffff; + --accent-dim: rgba(227, 227, 227, 0.1); + --success: #81c995; + --error: #f28b82; + --warning: #fdd663; + --border: #444746; + --border-light: #333638; + --radius: 12px; + --radius-sm: 8px; + --transition: 150ms ease; + --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'SF Mono', 'Menlo', 'Consolas', monospace; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font); + background: var(--bg-base); + color: var(--text-primary); + overflow: hidden; + height: 100vh; + -webkit-font-smoothing: antialiased; +} + +#app { + display: flex; + flex-direction: column; + height: 100vh; +} + +/* Navigation (includes macOS titlebar drag region) */ +#nav { + display: flex; + align-items: center; + padding: 0 16px 0 76px; /* left padding for macOS traffic lights */ + height: 44px; + flex-shrink: 0; + background: var(--bg-base); + border-bottom: 1px solid var(--border-light); + gap: 4px; + -webkit-app-region: drag; + -webkit-user-select: none; + user-select: none; +} + +.nav-btn { + background: none; + border: none; + color: var(--text-secondary); + font: inherit; + font-size: 13px; + font-weight: 500; + padding: 6px 12px; + border-radius: var(--radius-sm); + cursor: pointer; + transition: all var(--transition); +} + +.nav-btn:hover { + background: var(--bg-overlay); + color: var(--text-primary); +} + +.nav-brand { + font-weight: 500; + color: var(--text-primary); + font-size: 14px; + cursor: pointer; + -webkit-app-region: no-drag; + -webkit-user-select: none; + user-select: none; +} + +.nav-btn { + -webkit-app-region: no-drag; +} + +.nav-spacer { flex: 1; } + +/* Main content */ +#main { + flex: 1; + overflow-y: auto; + position: relative; +} + +.page { + display: none; + padding: 32px 24px; + max-width: 720px; + margin: 0 auto; + animation: fadeIn 200ms ease; +} + +.page.active { + display: block; +} + +.page-former.active { + display: flex; + max-width: none; + padding: 0; + height: 100%; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} + +/* Landing page */ +#page-landing { + position: relative; + overflow: hidden; +} + +.landing-bg-art { + position: relative; + width: 100%; + display: flex; + justify-content: center; + margin-top: -8px; + margin-bottom: -60px; + pointer-events: none; + z-index: 0; + -webkit-mask-image: linear-gradient(to bottom, rgba(0,0,0,1) 20%, rgba(0,0,0,0.5) 100%); + mask-image: linear-gradient(to bottom, rgba(0,0,0,1) 20%, rgba(0,0,0,0.2) 100%); +} + +.landing-bg-logo { + width: 50%; + height: auto; + opacity: 0.8; + filter: brightness(1.4); +} + +.landing-hero { + text-align: center; + padding: 0 0 32px; + position: relative; + z-index: 1; +} + +.landing-hero h1 { + font-size: 32px; + font-weight: 500; + letter-spacing: -0.5px; + margin-bottom: 8px; +} + +.landing-hero p { + color: var(--text-secondary); + font-size: 15px; +} + +.landing-actions { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; + margin-bottom: 40px; + position: relative; + z-index: 1; +} + +.action-card { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius); + padding: 24px; + cursor: pointer; + transition: all var(--transition); + text-align: left; +} + +.action-card:hover { + border-color: var(--border); + background: var(--bg-overlay); +} + +.action-card h3 { + font-size: 15px; + font-weight: 500; + margin-bottom: 6px; + color: var(--text-primary); +} + +.action-card p { + font-size: 13px; + color: var(--text-secondary); + line-height: 1.4; +} + +/* Section titles */ +.section-title { + font-size: 12px; + font-weight: 500; + color: var(--text-subtle); + text-transform: uppercase; + letter-spacing: 1px; + margin-bottom: 16px; +} + +/* Recent projects */ +.project-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.project-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-sm); + cursor: pointer; + transition: all var(--transition); +} + +.project-item:hover { + border-color: var(--border); + background: var(--bg-overlay); +} + +.project-name { + flex: 1; + font-size: 14px; + font-weight: 500; +} + +.project-meta { + font-size: 12px; + color: var(--text-subtle); +} + +.badge { + font-size: 10px; + padding: 4px 8px; + border-radius: 6px; + background: var(--bg-base); + border: 1px solid var(--border-light); + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; + font-weight: 600; +} + +/* Cards */ +.card { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius); + padding: 20px; + margin-bottom: 16px; +} + +.card-title { + font-size: 14px; + font-weight: 500; + margin-bottom: 16px; +} + +/* Form elements */ +.form-row { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 12px; +} + +.form-row:last-child { + margin-bottom: 0; +} + +.form-label { + font-size: 13px; + color: var(--text-secondary); + min-width: 140px; +} + +.form-input { + flex: 1; + background: var(--bg-input); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + color: var(--text-primary); + font: inherit; + font-size: 13px; + padding: 8px 12px; + outline: none; + transition: all var(--transition); +} + +.form-input:focus { + border-color: var(--text-secondary); + outline: 1px solid var(--text-secondary); +} + +.form-input::placeholder { + color: var(--text-subtle); +} + +select.form-input { + cursor: pointer; +} + +/* Buttons */ +.btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + border-radius: var(--radius-sm); + border: 1px solid var(--border); + background: var(--bg-surface); + color: var(--text-primary); + font: inherit; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all var(--transition); + white-space: nowrap; +} + +.btn:hover { + background: var(--bg-overlay); + border-color: var(--text-secondary); +} + +.btn-primary { + background: var(--text-primary); + border-color: var(--text-primary); + color: var(--bg-base); +} + +.btn-primary:hover { + background: var(--accent-hover); + border-color: var(--accent-hover); +} + +.btn-sm { + padding: 6px 12px; + font-size: 12px; +} + +.btn-danger { + color: var(--error); + border-color: var(--border); +} + +.btn-danger:hover { + background: rgba(242, 139, 130, 0.1); + border-color: var(--error); +} + +/* File picker row */ +.file-row { + display: flex; + align-items: center; + gap: 12px; +} + +.file-name { + flex: 1; + font-size: 13px; + color: var(--text-secondary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.file-name.has-file { + color: var(--text-primary); +} + +/* Checkbox row */ +.check-row { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.check-label { + display: flex; + align-items: center; + gap: 6px; + font-size: 13px; + cursor: pointer; +} + +.check-label input[type="checkbox"] { + accent-color: var(--text-primary); +} + +/* Action bar */ +.action-bar { + display: flex; + align-items: center; + gap: 8px; + margin-top: 20px; +} + +.action-bar .spacer { + flex: 1; +} + +/* Page header */ +.page-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 24px; +} + +.page-header h2 { + font-size: 18px; + font-weight: 500; +} + +/* Board preview canvas */ +.board-canvas-wrap { + background: var(--bg-base); + border: 1px solid var(--border-light); + border-radius: var(--radius); + padding: 0; + text-align: center; +} + +.board-canvas-wrap canvas { + max-width: 100%; + border-radius: var(--radius); +} + +/* Side buttons */ +.side-tabs { + display: flex; + gap: 6px; + flex-wrap: wrap; + margin-bottom: 16px; +} + +.side-tab { + padding: 6px 12px; + font-size: 12px; + font-weight: 500; + border-radius: var(--radius-sm); + border: 1px solid var(--border); + background: var(--bg-surface); + color: var(--text-secondary); + cursor: pointer; + transition: all var(--transition); +} + +.side-tab.active { + background: var(--text-primary); + border-color: var(--text-primary); + color: var(--bg-base); +} + +/* Cutout list */ +.cutout-list { + display: flex; + flex-direction: column; + gap: 4px; + margin-top: 8px; +} + +.cutout-item { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: var(--bg-base); + border: 1px solid var(--border-light); + border-radius: var(--radius-sm); + font-size: 12px; + font-family: var(--font-mono); +} + +.cutout-item .cutout-text { + flex: 1; + color: var(--text-secondary); +} + +/* Result page */ +.result-files { + font-family: var(--font-mono); + font-size: 13px; + line-height: 1.6; + color: var(--text-secondary); + background: var(--bg-base); + border: 1px solid var(--border-light); + padding: 16px; + border-radius: var(--radius-sm); + margin-bottom: 20px; +} + +/* Loading spinner */ +.spinner { + display: inline-block; + width: 20px; + height: 20px; + border: 2px solid var(--border); + border-top-color: var(--text-primary); + border-radius: 50%; + animation: spin 0.6s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +.loading-overlay { + position: fixed; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(19, 19, 20, 0.8); + z-index: 100; + flex-direction: column; + gap: 16px; +} + +.loading-overlay .spinner { + width: 32px; + height: 32px; + border-width: 3px; +} + +.loading-text { + font-size: 14px; + font-weight: 500; + color: var(--text-primary); +} + +/* ===== THE FORMER ===== */ +.former-container { + display: flex; + width: 100%; + height: 100%; +} + +.former-canvas-wrap { + flex: 1; + background: #000000; + position: relative; + overflow: hidden; +} + +.former-canvas-wrap canvas { + position: absolute; + top: 0; + left: 0; +} + +.former-sidebar { + width: 280px; + background: var(--bg-base); + border-left: 1px solid var(--border-light); + display: flex; + flex-direction: column; + overflow-y: auto; + flex-shrink: 0; +} + +.former-sidebar-header { + padding: 16px; + border-bottom: 1px solid var(--border-light); + display: flex; + align-items: center; + gap: 8px; +} + +.former-sidebar-header h3 { + flex: 1; + font-size: 14px; + font-weight: 500; +} + +.former-layers { + flex: 1; + overflow-y: auto; + padding: 8px; +} + +.former-layer-row { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 10px; + border-radius: var(--radius-sm); + transition: background var(--transition); +} + +.former-layer-row:hover { + background: var(--bg-surface); +} + +.former-layer-row.highlighted { + background: var(--bg-overlay); +} + +.former-layer-row.selected { + background: var(--bg-surface); + border-left: 2px solid var(--text-primary); + padding-left: 8px; +} + +.layer-vis-btn, +.layer-hl-btn { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + border: none; + border-radius: var(--radius-sm); + background: none; + color: var(--text-subtle); + cursor: pointer; + font-size: 14px; + transition: all var(--transition); +} + +.layer-vis-btn:hover, +.layer-hl-btn:hover { + background: var(--bg-overlay); + color: var(--text-primary); +} + +.layer-vis-btn.active { + color: var(--text-primary); +} + +.layer-hl-btn.active { + color: var(--warning); +} + +.layer-swatch { + width: 12px; + height: 12px; + border-radius: 2px; + flex-shrink: 0; +} + +.layer-name { + font-size: 13px; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.layer-name.dimmed { + color: var(--text-subtle); +} + +.former-actions { + padding: 16px; + border-top: 1px solid var(--border-light); +} + +/* Scrollbar styling */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: var(--border-light); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--border); +} + +/* Empty state */ +.empty-state { + text-align: center; + padding: 40px 0; + color: var(--text-subtle); + font-size: 14px; +} + +/* Preset buttons */ +.preset-row { + display: flex; + gap: 8px; + flex-wrap: wrap; +} \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..78e7e46 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + build: { + outDir: 'dist', + }, +}); diff --git a/gbrjob.go b/gbrjob.go new file mode 100644 index 0000000..7a8a229 --- /dev/null +++ b/gbrjob.go @@ -0,0 +1,108 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "strings" +) + +// GerberJob represents a KiCad .gbrjob file +type GerberJob struct { + Header struct { + GenerationSoftware struct { + Vendor string `json:"Vendor"` + Application string `json:"Application"` + Version string `json:"Version"` + } `json:"GenerationSoftware"` + } `json:"Header"` + GeneralSpecs struct { + ProjectId struct { + Name string `json:"Name"` + } `json:"ProjectId"` + Size struct { + X float64 `json:"X"` + Y float64 `json:"Y"` + } `json:"Size"` + BoardThickness float64 `json:"BoardThickness"` + } `json:"GeneralSpecs"` + FilesAttributes []struct { + Path string `json:"Path"` + FileFunction string `json:"FileFunction"` + FilePolarity string `json:"FilePolarity"` + } `json:"FilesAttributes"` +} + +// GerberJobResult contains the auto-discovered file assignments +type GerberJobResult struct { + ProjectName string + BoardWidth float64 // mm + BoardHeight float64 // mm + BoardThickness float64 // mm + EdgeCutsFile string // Profile + FabFile string // AssemblyDrawing,Top + CourtyardFile string // matches courtyard naming + SoldermaskFile string // matches mask naming +} + +// ParseGerberJob parses a .gbrjob file and returns auto-discovered file mappings +func ParseGerberJob(filename string) (*GerberJobResult, error) { + data, err := os.ReadFile(filename) + if err != nil { + return nil, fmt.Errorf("read gbrjob: %w", err) + } + + var job GerberJob + if err := json.Unmarshal(data, &job); err != nil { + return nil, fmt.Errorf("parse gbrjob JSON: %w", err) + } + + result := &GerberJobResult{ + ProjectName: job.GeneralSpecs.ProjectId.Name, + BoardWidth: job.GeneralSpecs.Size.X, + BoardHeight: job.GeneralSpecs.Size.Y, + BoardThickness: job.GeneralSpecs.BoardThickness, + } + + // Map FileFunction to our layer types + for _, f := range job.FilesAttributes { + fn := strings.ToLower(f.FileFunction) + path := f.Path + + switch { + case fn == "profile": + result.EdgeCutsFile = path + case strings.HasPrefix(fn, "assemblydrawing"): + // F.Fab = AssemblyDrawing,Top + if strings.Contains(fn, "top") { + result.FabFile = path + } + } + + // Also match by filename patterns for courtyard/mask + lp := strings.ToLower(path) + switch { + case strings.Contains(lp, "courtyard") || strings.Contains(lp, "courty"): + if strings.Contains(lp, "f_courty") || strings.Contains(lp, "f.courty") || strings.Contains(lp, "-f_courty") { + result.CourtyardFile = path + } + case strings.Contains(lp, "mask") || strings.Contains(lp, "f_mask") || strings.Contains(lp, "f.mask"): + if strings.Contains(lp, "f_mask") || strings.Contains(lp, "f.mask") || strings.Contains(lp, "-f_mask") { + result.SoldermaskFile = path + } + } + } + + fmt.Printf("GerberJob: project=%s, board=%.1fx%.1fmm, thickness=%.1fmm\n", + result.ProjectName, result.BoardWidth, result.BoardHeight, result.BoardThickness) + fmt.Printf(" EdgeCuts: %s\n", result.EdgeCutsFile) + fmt.Printf(" F.Fab: %s\n", result.FabFile) + fmt.Printf(" F.Courtyard: %s\n", result.CourtyardFile) + fmt.Printf(" F.Mask: %s\n", result.SoldermaskFile) + + if result.EdgeCutsFile == "" { + return nil, fmt.Errorf("no Edge.Cuts (Profile) layer found in gbrjob") + } + + return result, nil +} diff --git a/gerber.go b/gerber.go new file mode 100644 index 0000000..4029d8f --- /dev/null +++ b/gerber.go @@ -0,0 +1,1004 @@ +package main + +import ( + "bufio" + "image" + "image/color" + "image/draw" + "math" + "os" + "regexp" + "strconv" + "strings" +) + +// Aperture types +const ( + ApertureCircle = "C" + ApertureRect = "R" + ApertureObround = "O" + AperturePolygon = "P" +) + +type Aperture struct { + Type string + Modifiers []float64 +} + +type MacroPrimitive struct { + Code int + Modifiers []string // Store as strings to handle $1, $2, expressions like $1+$1 +} + +type Macro struct { + Name string + Primitives []MacroPrimitive +} + +type GerberState struct { + Apertures map[int]Aperture + Macros map[string]Macro + CurrentAperture int + X, Y float64 // Current coordinates in mm + FormatX, FormatY struct { + Integer, Decimal int + } + Units string // "MM" or "IN" + CurrentFootprint string // Stored from %TO.C,Footprint,...*% +} + +type GerberCommand struct { + Type string // "D01", "D02", "D03", "AD", "FS", etc. + X, Y *float64 + I, J *float64 + D *int + Footprint string +} + +type GerberFile struct { + Commands []GerberCommand + State GerberState +} + +// Footprint represents a component bounding area deduced from Gerber X2 attributes +type Footprint struct { + Name string `json:"name"` + MinX float64 `json:"minX"` + MinY float64 `json:"minY"` + MaxX float64 `json:"maxX"` + MaxY float64 `json:"maxY"` + CenterX float64 `json:"centerX"` + CenterY float64 `json:"centerY"` +} + +func ExtractFootprints(gf *GerberFile) []Footprint { + fps := make(map[string]*Footprint) + + for _, cmd := range gf.Commands { + if cmd.Footprint == "" { + continue + } + if cmd.X == nil || cmd.Y == nil { + continue + } + + fp, exists := fps[cmd.Footprint] + if !exists { + fp = &Footprint{ + Name: cmd.Footprint, + MinX: *cmd.X, + MaxX: *cmd.X, + MinY: *cmd.Y, + MaxY: *cmd.Y, + } + fps[cmd.Footprint] = fp + } else { + if *cmd.X < fp.MinX { + fp.MinX = *cmd.X + } + if *cmd.X > fp.MaxX { + fp.MaxX = *cmd.X + } + if *cmd.Y < fp.MinY { + fp.MinY = *cmd.Y + } + if *cmd.Y > fp.MaxY { + fp.MaxY = *cmd.Y + } + } + } + + var result []Footprint + for _, fp := range fps { + fp.CenterX = (fp.MinX + fp.MaxX) / 2.0 + fp.CenterY = (fp.MinY + fp.MaxY) / 2.0 + result = append(result, *fp) + } + return result +} + +func NewGerberFile() *GerberFile { + return &GerberFile{ + State: GerberState{ + Apertures: make(map[int]Aperture), + Macros: make(map[string]Macro), + Units: "MM", // Default, usually set by MO + }, + } +} + +// ParseGerber parses a simple RS-274X file +func ParseGerber(filename string) (*GerberFile, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + gf := NewGerberFile() + scanner := bufio.NewScanner(file) + + // Regex for coordinates: X123Y456D01 + reCoord := regexp.MustCompile(`([XYDIJ])([\d\.\-]+)`) + // Regex for Aperture Definition: %ADD10C,0.5*% or %ADD10RoundRect,0.25X-0.75X...*% + reAD := regexp.MustCompile(`%ADD(\d+)([A-Za-z0-9_]+),?([\d\.\-X]+)?\*%`) + // Regex for Format Spec: %FSLAX24Y24*% + reFS := regexp.MustCompile(`%FSLAX(\d)(\d)Y(\d)(\d)\*%`) + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + + // Handle Parameters + if strings.HasPrefix(line, "%") { + if strings.HasPrefix(line, "%FS") { + matches := reFS.FindStringSubmatch(line) + if len(matches) == 5 { + gf.State.FormatX.Integer, _ = strconv.Atoi(matches[1]) + gf.State.FormatX.Decimal, _ = strconv.Atoi(matches[2]) + gf.State.FormatY.Integer, _ = strconv.Atoi(matches[3]) + gf.State.FormatY.Decimal, _ = strconv.Atoi(matches[4]) + } + } else if strings.HasPrefix(line, "%AD") { + matches := reAD.FindStringSubmatch(line) + if len(matches) >= 3 { + dCode, _ := strconv.Atoi(matches[1]) + apType := matches[2] + var mods []float64 + if len(matches) > 3 && matches[3] != "" { + parts := strings.Split(matches[3], "X") + for _, p := range parts { + val, _ := strconv.ParseFloat(p, 64) + mods = append(mods, val) + } + } + gf.State.Apertures[dCode] = Aperture{Type: apType, Modifiers: mods} + } + } else if strings.HasPrefix(line, "%AM") { + // Parse Macro + name := strings.TrimPrefix(line, "%AM") + name = strings.TrimSuffix(name, "*") + + var primitives []MacroPrimitive + + for scanner.Scan() { + mLine := strings.TrimSpace(scanner.Text()) + // Skip comment lines (start with "0 ") + if strings.HasPrefix(mLine, "0 ") { + continue + } + // Skip empty lines + if mLine == "" { + continue + } + + // Check if this line ends the macro definition + // Standard allows ending with *% at end of last primitive OR a separate line with % + trimmedLine := strings.TrimSpace(mLine) + if trimmedLine == "%" { + break + } + + endsWithPercent := strings.HasSuffix(mLine, "*%") + + // Remove trailing *% or just * + mLine = strings.TrimSuffix(mLine, "*%") + mLine = strings.TrimSuffix(mLine, "*") + + // Parse primitive + parts := strings.Split(mLine, ",") + if len(parts) > 0 && parts[0] != "" { + code, err := strconv.Atoi(parts[0]) + if err == nil && code > 0 { + // Store modifiers as strings to handle $1, $2, expressions + var mods []string + for _, p := range parts[1:] { + mods = append(mods, strings.TrimSpace(p)) + } + primitives = append(primitives, MacroPrimitive{Code: code, Modifiers: mods}) + } + } + + // If line ended with *%, macro definition is complete + if endsWithPercent { + break + } + } + gf.State.Macros[name] = Macro{Name: name, Primitives: primitives} + } else if strings.HasPrefix(line, "%MO") { + if strings.Contains(line, "IN") { + gf.State.Units = "IN" + } else { + gf.State.Units = "MM" + } + } else if strings.HasPrefix(line, "%TO") { + parts := strings.Split(line, ",") + if len(parts) >= 2 && strings.HasPrefix(parts[0], "%TO.C") { + refDes := strings.TrimSuffix(parts[1], "*%") + if refDes != "" { + gf.State.CurrentFootprint = refDes + } + } + } else if strings.HasPrefix(line, "%TD") { + if strings.Contains(line, "%TD*%") || strings.Contains(line, "%TD,C*%") || strings.Contains(line, "%TD,Footprint*%") { + gf.State.CurrentFootprint = "" + } + } + continue + } + + // Handle Standard Commands + // Split by * + parts := strings.Split(line, "*") + for _, part := range parts { + part = strings.TrimSpace(part) + if part == "" { + continue + } + + // Check for G-codes + if strings.HasPrefix(part, "G") { + if part == "G01" { + // Linear interpolation (default) + gf.Commands = append(gf.Commands, GerberCommand{Type: "G01"}) + } else if part == "G02" { + // Clockwise circular interpolation + gf.Commands = append(gf.Commands, GerberCommand{Type: "G02"}) + } else if part == "G03" { + // Counter-clockwise circular interpolation + gf.Commands = append(gf.Commands, GerberCommand{Type: "G03"}) + } else if part == "G36" { + // Region fill start + gf.Commands = append(gf.Commands, GerberCommand{Type: "G36"}) + } else if part == "G37" { + // Region fill end + gf.Commands = append(gf.Commands, GerberCommand{Type: "G37"}) + } + continue + } + + // Handle Aperture Selection (e.g., D10*) + if strings.HasPrefix(part, "D") && len(part) >= 2 { + // Likely D10, D11 etc. + dCode, err := strconv.Atoi(part[1:]) + if err == nil && dCode >= 10 { + gf.Commands = append(gf.Commands, GerberCommand{Type: "APERTURE", D: &dCode}) + continue + } + } + + // Handle Coordinates and Draw/Flash commands + // X...Y...D01* + matches := reCoord.FindAllStringSubmatch(part, -1) + if len(matches) > 0 { + cmd := GerberCommand{Type: "MOVE", Footprint: gf.State.CurrentFootprint} + for _, m := range matches { + valStr := m[2] + + switch m[1] { + case "X": + v := gf.parseCoordinate(valStr, gf.State.FormatX) + cmd.X = &v + case "Y": + v := gf.parseCoordinate(valStr, gf.State.FormatY) + cmd.Y = &v + case "I": + v := gf.parseCoordinate(valStr, gf.State.FormatX) + cmd.I = &v + case "J": + v := gf.parseCoordinate(valStr, gf.State.FormatY) + cmd.J = &v + case "D": + val, _ := strconv.ParseFloat(valStr, 64) + d := int(val) + cmd.D = &d + if d == 1 { + cmd.Type = "DRAW" + } else if d == 2 { + cmd.Type = "MOVE" + } else if d == 3 { + cmd.Type = "FLASH" + } + } + } + gf.Commands = append(gf.Commands, cmd) + } + } + } + + return gf, nil +} + +func (gf *GerberFile) parseCoordinate(valStr string, fmtSpec struct{ Integer, Decimal int }) float64 { + if strings.Contains(valStr, ".") { + val, _ := strconv.ParseFloat(valStr, 64) + return val + } + val, _ := strconv.ParseFloat(valStr, 64) + divisor := math.Pow(10, float64(fmtSpec.Decimal)) + return val / divisor +} + +// evaluateMacroExpression evaluates a macro expression like "$1", "$1+$1", "0.5", etc. +// with variable substitution from aperture modifiers +func evaluateMacroExpression(expr string, params []float64) float64 { + expr = strings.TrimSpace(expr) + + // Handle simple addition (e.g., "$1+$1") + if strings.Contains(expr, "+") { + parts := strings.Split(expr, "+") + result := 0.0 + for _, part := range parts { + result += evaluateMacroExpression(strings.TrimSpace(part), params) + } + return result + } + + // Handle simple subtraction (e.g., "$1-$2") + if strings.Contains(expr, "-") && !strings.HasPrefix(expr, "-") { + parts := strings.Split(expr, "-") + if len(parts) == 2 { + left := evaluateMacroExpression(strings.TrimSpace(parts[0]), params) + right := evaluateMacroExpression(strings.TrimSpace(parts[1]), params) + return left - right + } + } + + // Handle variable substitution (e.g., "$1", "$2") + if strings.HasPrefix(expr, "$") { + varNum, err := strconv.Atoi(expr[1:]) + if err == nil && varNum > 0 && varNum <= len(params) { + return params[varNum-1] + } + return 0.0 + } + + // Handle literal numbers + val, _ := strconv.ParseFloat(expr, 64) + return val +} + +// rotatePoint rotates a point (x, y) around the origin by angleDegrees +func rotatePoint(x, y, angleDegrees float64) (float64, float64) { + if angleDegrees == 0 { + return x, y + } + angleRad := angleDegrees * math.Pi / 180.0 + cosA := math.Cos(angleRad) + sinA := math.Sin(angleRad) + return x*cosA - y*sinA, x*sinA + y*cosA +} + +type Bounds struct { + MinX, MinY, MaxX, MaxY float64 +} + +func (gf *GerberFile) CalculateBounds() Bounds { + minX, minY := 1e9, 1e9 + maxX, maxY := -1e9, -1e9 + + updateBounds := func(x, y float64) { + if x < minX { + minX = x + } + if y < minY { + minY = y + } + if x > maxX { + maxX = x + } + if y > maxY { + maxY = y + } + } + + curX, curY := 0.0, 0.0 + for _, cmd := range gf.Commands { + prevX, prevY := curX, curY + if cmd.X != nil { + curX = *cmd.X + } + if cmd.Y != nil { + curY = *cmd.Y + } + + if cmd.Type == "FLASH" { + updateBounds(curX, curY) + } else if cmd.Type == "DRAW" { + updateBounds(prevX, prevY) + updateBounds(curX, curY) + } + } + + if minX == 1e9 { + // No drawing commands found, default to 0,0 + minX, minY = 0, 0 + maxX, maxY = 10, 10 // Arbitrary small size + } + + // Add some padding + padding := 2.0 // mm + minX -= padding + minY -= padding + maxX += padding + maxY += padding + + return Bounds{MinX: minX, MinY: minY, MaxX: maxX, MaxY: maxY} +} + +// Render generates an image from the parsed Gerber commands +func (gf *GerberFile) Render(dpi float64, bounds *Bounds) image.Image { + var b Bounds + if bounds != nil { + b = *bounds + } else { + b = gf.CalculateBounds() + } + + widthMM := b.MaxX - b.MinX + heightMM := b.MaxY - b.MinY + + var scale float64 + if gf.State.Units == "IN" { + scale = dpi + } else { + scale = dpi / 25.4 + } + + imgWidth := int(widthMM * scale) + imgHeight := int(heightMM * scale) + + img := image.NewRGBA(image.Rect(0, 0, imgWidth, imgHeight)) + + // Fill black (stencil material) + draw.Draw(img, img.Bounds(), &image.Uniform{color.Black}, image.Point{}, draw.Src) + + // White for holes + white := &image.Uniform{color.White} + + // Helper to convert mm to pixels + toPix := func(x, y float64) (int, int) { + px := int((x - b.MinX) * scale) + py := int((heightMM - (y - b.MinY)) * scale) // Flip Y for image coords + return px, py + } + + curX, curY := 0.0, 0.0 + curDCode := 0 + interpolationMode := "G01" // Default linear + inRegion := false + var regionVertices [][2]int + + for _, cmd := range gf.Commands { + if cmd.Type == "APERTURE" { + curDCode = *cmd.D + continue + } + if cmd.Type == "G01" || cmd.Type == "G02" || cmd.Type == "G03" { + interpolationMode = cmd.Type + continue + } + if cmd.Type == "G36" { + inRegion = true + regionVertices = nil + continue + } + if cmd.Type == "G37" { + // End region: fill the collected polygon + if len(regionVertices) >= 3 { + drawFilledPolygon(img, regionVertices) + } + inRegion = false + regionVertices = nil + continue + } + + prevX, prevY := curX, curY + if cmd.X != nil { + curX = *cmd.X + } + if cmd.Y != nil { + curY = *cmd.Y + } + + // In region mode, collect contour vertices instead of drawing + if inRegion { + if cmd.Type == "MOVE" { + // D02 in region: start a new contour + px, py := toPix(curX, curY) + regionVertices = append(regionVertices, [2]int{px, py}) + } else if cmd.Type == "DRAW" { + if interpolationMode == "G01" { + // Linear segment: add endpoint + px, py := toPix(curX, curY) + regionVertices = append(regionVertices, [2]int{px, py}) + } else { + // Arc segment: sample points along the arc + iVal := 0.0 + jVal := 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + centerX := prevX + iVal + centerY := prevY + jVal + radius := math.Sqrt(iVal*iVal + jVal*jVal) + startAngle := math.Atan2(prevY-centerY, prevX-centerX) + endAngle := math.Atan2(curY-centerY, curX-centerX) + if interpolationMode == "G03" { + if endAngle <= startAngle { + endAngle += 2 * math.Pi + } + } else { + if startAngle <= endAngle { + startAngle += 2 * math.Pi + } + } + arcLen := math.Abs(endAngle-startAngle) * radius + steps := int(arcLen * scale * 2) + if steps < 10 { + steps = 10 + } + for s := 1; s <= steps; s++ { + t := float64(s) / float64(steps) + angle := startAngle + t*(endAngle-startAngle) + ax := centerX + radius*math.Cos(angle) + ay := centerY + radius*math.Sin(angle) + px, py := toPix(ax, ay) + regionVertices = append(regionVertices, [2]int{px, py}) + } + } + } + continue + } + + if cmd.Type == "FLASH" { + // Draw Aperture at curX, curY + ap, ok := gf.State.Apertures[curDCode] + if ok { + cx, cy := toPix(curX, curY) + gf.drawAperture(img, cx, cy, ap, scale, white) + } + } else if cmd.Type == "DRAW" { + ap, ok := gf.State.Apertures[curDCode] + if ok { + if interpolationMode == "G01" { + // Linear + x1, y1 := toPix(prevX, prevY) + x2, y2 := toPix(curX, curY) + gf.drawLine(img, x1, y1, x2, y2, ap, scale, white) + } else { + // Circular Interpolation (G02/G03) + iVal := 0.0 + jVal := 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + + centerX := prevX + iVal + centerY := prevY + jVal + + radius := math.Sqrt(iVal*iVal + jVal*jVal) + startAngle := math.Atan2(prevY-centerY, prevX-centerX) + endAngle := math.Atan2(curY-centerY, curX-centerX) + + // Adjust angles for G02 (CW) vs G03 (CCW) + if interpolationMode == "G03" { // CCW + if endAngle <= startAngle { + endAngle += 2 * math.Pi + } + } else { // G02 CW + if startAngle <= endAngle { + startAngle += 2 * math.Pi + } + } + + // Arc length approximation + arcLen := math.Abs(endAngle-startAngle) * radius + steps := int(arcLen * scale * 2) // 2x pixel density for smoothness + if steps < 10 { + steps = 10 + } + + for s := 0; s <= steps; s++ { + t := float64(s) / float64(steps) + angle := startAngle + t*(endAngle-startAngle) + px := centerX + radius*math.Cos(angle) + py := centerY + radius*math.Sin(angle) + + ix, iy := toPix(px, py) + gf.drawAperture(img, ix, iy, ap, scale, white) + } + } + } + } + } + + return img +} + +func (gf *GerberFile) drawAperture(img *image.RGBA, x, y int, ap Aperture, scale float64, c image.Image) { + switch ap.Type { + case ApertureCircle: // C + // Modifiers[0] is diameter + if len(ap.Modifiers) > 0 { + radius := int((ap.Modifiers[0] * scale) / 2) + drawCircle(img, x, y, radius) + } + return + case ApertureRect: // R + // Modifiers[0] is width, [1] is height + if len(ap.Modifiers) >= 2 { + w := int(ap.Modifiers[0] * scale) + h := int(ap.Modifiers[1] * scale) + r := image.Rect(x-w/2, y-h/2, x+w/2, y+h/2) + draw.Draw(img, r, c, image.Point{}, draw.Src) + } + return + case ApertureObround: // O + // Modifiers[0] is width, [1] is height + if len(ap.Modifiers) >= 2 { + w := int(ap.Modifiers[0] * scale) + h := int(ap.Modifiers[1] * scale) + // Draw Obround + // If w > h: Horizontal Pill. Central Rect is (w-h) x h. Two circles of dia h. + // If h > w: Vertical Pill. Central Rect is w x (h-w). Two circles of dia w. + // If w == h: Circle dia w. + + drawObround := func(target *image.RGBA, x, y, w, h int, color image.Image) { + if w == h { + radius := w / 2 + drawCircle(target, x, y, radius) + return + } + + if w > h { + // Horizontal + rectW := w - h + if rectW < 0 { + rectW = 0 + } // Should be impossible if w > h + + // Center Rect + r := image.Rect(x-rectW/2, y-h/2, x+rectW/2, y+h/2) + draw.Draw(target, r, color, image.Point{}, draw.Src) + + // Left Circle + drawCircle(target, x-rectW/2, y, h/2) + // Right Circle + drawCircle(target, x+rectW/2, y, h/2) + } else { + // Vertical + rectH := h - w + if rectH < 0 { + rectH = 0 + } + + // Center Rect + r := image.Rect(x-w/2, y-rectH/2, x+w/2, y+rectH/2) + draw.Draw(target, r, color, image.Point{}, draw.Src) + + // Top Circle (Y decreases upwards in image coords usually, but here we treat y as center) + // Note: In our coordinate system, y is center. + drawCircle(target, x, y-rectH/2, w/2) + // Bottom Circle + drawCircle(target, x, y+rectH/2, w/2) + } + } + drawObround(img, x, y, w, h, c) + } + return + case AperturePolygon: // P + // Modifiers: [0] diameter, [1] vertices, [2] rotation (optional) + if len(ap.Modifiers) >= 2 { + diameter := ap.Modifiers[0] + numVertices := int(ap.Modifiers[1]) + rotation := 0.0 + if len(ap.Modifiers) >= 3 { + rotation = ap.Modifiers[2] + } + + if numVertices >= 3 { + radius := (diameter * scale) / 2 + vertices := make([][2]int, numVertices) + for i := 0; i < numVertices; i++ { + angleDeg := rotation + float64(i)*360.0/float64(numVertices) + angleRad := angleDeg * math.Pi / 180.0 + px := int(radius * math.Cos(angleRad)) + py := int(radius * math.Sin(angleRad)) + vertices[i] = [2]int{x + px, y - py} + } + drawFilledPolygon(img, vertices) + } + } + return + } + + // Check for Macros + if macro, ok := gf.State.Macros[ap.Type]; ok { + for _, prim := range macro.Primitives { + switch prim.Code { + case 1: // Circle + // Mods: Exposure, Diameter, CenterX, CenterY + if len(prim.Modifiers) >= 4 { + exposure := evaluateMacroExpression(prim.Modifiers[0], ap.Modifiers) + if exposure == 0 { + break + } + dia := evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers) + cx := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + cy := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + + px := int(cx * scale) + py := int(cy * scale) + + radius := int((dia * scale) / 2) + drawCircle(img, x+px, y-py, radius) + } + case 4: // Outline (Polygon) + // Mods: Exposure, NumVertices, X1, Y1, ..., Xn, Yn, Rotation + if len(prim.Modifiers) >= 3 { + exposure := evaluateMacroExpression(prim.Modifiers[0], ap.Modifiers) + if exposure == 0 { + // Skip if exposure is off + break + } + numVertices := int(evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers)) + // Need at least numVertices * 2 coordinates + rotation + if len(prim.Modifiers) >= 2+numVertices*2+1 { + rotation := evaluateMacroExpression(prim.Modifiers[2+numVertices*2], ap.Modifiers) + + // Extract vertices + vertices := make([][2]int, numVertices) + for i := 0; i < numVertices; i++ { + vx := evaluateMacroExpression(prim.Modifiers[2+i*2], ap.Modifiers) + vy := evaluateMacroExpression(prim.Modifiers[2+i*2+1], ap.Modifiers) + + // Apply rotation + vx, vy = rotatePoint(vx, vy, rotation) + + px := int(vx * scale) + py := int(vy * scale) + + vertices[i] = [2]int{x + px, y - py} + } + + // Draw filled polygon using scanline algorithm + drawFilledPolygon(img, vertices) + } + } + case 5: // Regular Polygon + // Mods: Exposure, NumVertices, CenterX, CenterY, Diameter, Rotation + if len(prim.Modifiers) >= 6 { + exposure := evaluateMacroExpression(prim.Modifiers[0], ap.Modifiers) + if exposure == 0 { + break + } + numVertices := int(evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers)) + if numVertices >= 3 { + cx := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + cy := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + diameter := evaluateMacroExpression(prim.Modifiers[4], ap.Modifiers) + rotation := evaluateMacroExpression(prim.Modifiers[5], ap.Modifiers) + + radius := (diameter * scale) / 2 + pxCenter := int(cx * scale) + pyCenter := int(cy * scale) + + vertices := make([][2]int, numVertices) + for i := 0; i < numVertices; i++ { + angleDeg := rotation + float64(i)*360.0/float64(numVertices) + angleRad := angleDeg * math.Pi / 180.0 + px := int(radius * math.Cos(angleRad)) + py := int(radius * math.Sin(angleRad)) + vertices[i] = [2]int{x + pxCenter + px, y - pyCenter - py} + } + drawFilledPolygon(img, vertices) + } + } + case 20: // Vector Line + // Mods: Exposure, Width, StartX, StartY, EndX, EndY, Rotation + if len(prim.Modifiers) >= 7 { + exposure := evaluateMacroExpression(prim.Modifiers[0], ap.Modifiers) + if exposure == 0 { + // Skip if exposure is off + break + } + width := evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers) + startX := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + startY := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + endX := evaluateMacroExpression(prim.Modifiers[4], ap.Modifiers) + endY := evaluateMacroExpression(prim.Modifiers[5], ap.Modifiers) + rotation := evaluateMacroExpression(prim.Modifiers[6], ap.Modifiers) + + // Apply rotation to start and end points + startX, startY = rotatePoint(startX, startY, rotation) + endX, endY = rotatePoint(endX, endY, rotation) + + // Calculate the rectangle representing the line + // The line goes from (startX, startY) to (endX, endY) with width + dx := endX - startX + dy := endY - startY + length := math.Sqrt(dx*dx + dy*dy) + + if length > 0 { + // Perpendicular vector for width + perpX := -dy / length * width / 2 + perpY := dx / length * width / 2 + + // Four corners of the rectangle + vertices := [][2]int{ + {x + int((startX-perpX)*scale), y - int((startY-perpY)*scale)}, + {x + int((startX+perpX)*scale), y - int((startY+perpY)*scale)}, + {x + int((endX+perpX)*scale), y - int((endY+perpY)*scale)}, + {x + int((endX-perpX)*scale), y - int((endY-perpY)*scale)}, + } + + drawFilledPolygon(img, vertices) + } + } + case 21: // Center Line (Rect) + // Mods: Exposure, Width, Height, CenterX, CenterY, Rotation + if len(prim.Modifiers) >= 6 { + exposure := evaluateMacroExpression(prim.Modifiers[0], ap.Modifiers) + if exposure == 0 { + break + } + width := evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers) + height := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + cx := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + cy := evaluateMacroExpression(prim.Modifiers[4], ap.Modifiers) + rot := evaluateMacroExpression(prim.Modifiers[5], ap.Modifiers) + + // Calculate the four corners of the rectangle (centered at origin) + halfW := width / 2 + halfH := height / 2 + + // Four corners before rotation + corners := [][2]float64{ + {-halfW, -halfH}, + {halfW, -halfH}, + {halfW, halfH}, + {-halfW, halfH}, + } + + // Apply rotation and translation + vertices := make([][2]int, 4) + for i, corner := range corners { + // Rotate around origin + rx, ry := rotatePoint(corner[0], corner[1], rot) + // Translate to center position + rx += cx + ry += cy + // Convert to pixels + px := int(rx * scale) + py := int(ry * scale) + vertices[i] = [2]int{x + px, y - py} + } + + // Draw as polygon + drawFilledPolygon(img, vertices) + } + } + } + } +} + +func drawCircle(img *image.RGBA, x0, y0, r int) { + // Simple Bresenham or scanline + for y := -r; y <= r; y++ { + for x := -r; x <= r; x++ { + if x*x+y*y <= r*r { + img.Set(x0+x, y0+y, color.White) + } + } + } +} + +func drawFilledPolygon(img *image.RGBA, vertices [][2]int) { + if len(vertices) < 3 { + return + } + + // Find bounding box + minY, maxY := vertices[0][1], vertices[0][1] + for _, v := range vertices { + if v[1] < minY { + minY = v[1] + } + if v[1] > maxY { + maxY = v[1] + } + } + + // Scanline fill algorithm + for y := minY; y <= maxY; y++ { + // Find intersections with polygon edges + var intersections []int + + for i := 0; i < len(vertices); i++ { + j := (i + 1) % len(vertices) + y1, y2 := vertices[i][1], vertices[j][1] + x1, x2 := vertices[i][0], vertices[j][0] + + // Check if scanline intersects this edge + if (y1 <= y && y < y2) || (y2 <= y && y < y1) { + // Calculate x intersection + x := x1 + (y-y1)*(x2-x1)/(y2-y1) + intersections = append(intersections, x) + } + } + + // Sort intersections + for i := 0; i < len(intersections)-1; i++ { + for j := i + 1; j < len(intersections); j++ { + if intersections[i] > intersections[j] { + intersections[i], intersections[j] = intersections[j], intersections[i] + } + } + } + + // Fill between pairs of intersections + for i := 0; i < len(intersections)-1; i += 2 { + x1 := intersections[i] + x2 := intersections[i+1] + for x := x1; x <= x2; x++ { + if x >= 0 && x < img.Bounds().Max.X && y >= 0 && y < img.Bounds().Max.Y { + img.Set(x, y, color.White) + } + } + } + } +} + +func (gf *GerberFile) drawLine(img *image.RGBA, x1, y1, x2, y2 int, ap Aperture, scale float64, c image.Image) { + // Bresenham's line algorithm, but we need to stroke it with the aperture. + // For simplicity, if aperture is Circle, we draw a circle at each step (inefficient but works). + // If aperture is Rect, we draw rect at each step. + + // Optimized: Just draw a thick line if it's a circle aperture + + dx := float64(x2 - x1) + dy := float64(y2 - y1) + dist := math.Sqrt(dx*dx + dy*dy) + steps := int(dist) // 1 pixel steps + + if steps == 0 { + gf.drawAperture(img, x1, y1, ap, scale, c) + return + } + + for i := 0; i <= steps; i++ { + t := float64(i) / float64(steps) + x := int(float64(x1) + t*dx) + y := int(float64(y1) + t*dy) + gf.drawAperture(img, x, y, ap, scale, c) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..70ffe04 --- /dev/null +++ b/go.mod @@ -0,0 +1,36 @@ +module pcb-to-stencil + +go 1.23.0 + +require github.com/wailsapp/wails/v2 v2.11.0 + +require ( + github.com/bep/debounce v1.2.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect + github.com/labstack/echo/v4 v4.13.3 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/gosod v1.0.4 // indirect + github.com/leaanthony/slicer v1.6.0 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.49.1 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/tkrajina/go-reflector v0.5.8 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/wailsapp/go-webview2 v1.0.22 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..11f7d59 --- /dev/null +++ b/go.sum @@ -0,0 +1,81 @@ +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= +github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= +github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/gosod v1.0.4 h1:YLAbVyd591MRffDgxUOU1NwLhT9T1/YiwjKZpkNFeaI= +github.com/leaanthony/gosod v1.0.4/go.mod h1:GKuIL0zzPj3O1SdWQOdgURSuhkF+Urizzxh26t9f1cw= +github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= +github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= +github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= +github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tkrajina/go-reflector v0.5.8 h1:yPADHrwmUbMq4RGEyaOUpz2H90sRsETNVpjzo3DLVQQ= +github.com/tkrajina/go-reflector v0.5.8/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wailsapp/go-webview2 v1.0.22 h1:YT61F5lj+GGaat5OB96Aa3b4QA+mybD0Ggq6NZijQ58= +github.com/wailsapp/go-webview2 v1.0.22/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= +github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= +github.com/wailsapp/wails/v2 v2.11.0 h1:seLacV8pqupq32IjS4Y7V8ucab0WZwtK6VvUVxSBtqQ= +github.com/wailsapp/wails/v2 v2.11.0/go.mod h1:jrf0ZaM6+GBc1wRmXsM8cIvzlg0karYin3erahI4+0k= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/instance.go b/instance.go new file mode 100644 index 0000000..e449305 --- /dev/null +++ b/instance.go @@ -0,0 +1,225 @@ +package main + +import ( + "fmt" + "image" + "log" + "os" + "path/filepath" + "strings" + "time" +) + +// InstanceData holds the serializable state for a saved enclosure instance. +type InstanceData struct { + ID string `json:"id"` + Name string `json:"name,omitempty"` + CreatedAt time.Time `json:"createdAt"` + + // Source files (basenames relative to the project directory) + GerberFiles map[string]string `json:"gerberFiles"` + DrillPath string `json:"drillPath,omitempty"` + NPTHPath string `json:"npthPath,omitempty"` + + // Discovered layer filenames (keys into GerberFiles) + EdgeCutsFile string `json:"edgeCutsFile"` + CourtyardFile string `json:"courtyardFile,omitempty"` + SoldermaskFile string `json:"soldermaskFile,omitempty"` + FabFile string `json:"fabFile,omitempty"` + + // Configuration + Config EnclosureConfig `json:"config"` + Exports []string `json:"exports"` + + // Board display info + BoardW float64 `json:"boardW"` + BoardH float64 `json:"boardH"` + ProjectName string `json:"projectName,omitempty"` + + // Unified cutouts (new format) + Cutouts []Cutout `json:"cutouts,omitempty"` + + // Legacy cutout fields — kept for backward compatibility when loading old projects + SideCutouts []SideCutout `json:"sideCutouts,omitempty"` + LidCutouts []LidCutout `json:"lidCutouts,omitempty"` +} + +// MigrateCutouts returns the unified cutouts list, converting legacy fields if needed. +func (inst *InstanceData) MigrateCutouts() []Cutout { + if len(inst.Cutouts) > 0 { + return inst.Cutouts + } + // Migrate legacy side cutouts + var result []Cutout + for _, sc := range inst.SideCutouts { + result = append(result, Cutout{ + ID: randomID(), + Surface: "side", + SideNum: sc.Side, + X: sc.X, + Y: sc.Y, + Width: sc.Width, + Height: sc.Height, + CornerRadius: sc.CornerRadius, + SourceLayer: sc.Layer, + }) + } + // Migrate legacy lid cutouts + for _, lc := range inst.LidCutouts { + surface := "top" + if lc.Plane == "tray" { + surface = "bottom" + } + result = append(result, Cutout{ + ID: randomID(), + Surface: surface, + X: lc.MinX, + Y: lc.MinY, + Width: lc.MaxX - lc.MinX, + Height: lc.MaxY - lc.MinY, + IsDado: lc.IsDado, + Depth: lc.Depth, + }) + } + return result +} + +// restoreSessionFromDir rebuilds an EnclosureSession from an InstanceData, +// resolving all file paths relative to baseDir. +func restoreSessionFromDir(inst *InstanceData, baseDir string) (string, *EnclosureSession, error) { + outlineBasename, ok := inst.GerberFiles[inst.EdgeCutsFile] + if !ok { + return "", nil, fmt.Errorf("edge cuts file not found: %s", inst.EdgeCutsFile) + } + outlinePath := filepath.Join(baseDir, outlineBasename) + if _, err := os.Stat(outlinePath); err != nil { + return "", nil, fmt.Errorf("source files no longer available: %v", err) + } + + outlineGf, err := ParseGerber(outlinePath) + if err != nil { + return "", nil, fmt.Errorf("parse outline: %v", err) + } + + outlineBounds := outlineGf.CalculateBounds() + actualBoardW := outlineBounds.MaxX - outlineBounds.MinX + actualBoardH := outlineBounds.MaxY - outlineBounds.MinY + + ecfg := inst.Config + margin := ecfg.WallThickness + ecfg.Clearance + 5.0 + outlineBounds.MinX -= margin + outlineBounds.MinY -= margin + outlineBounds.MaxX += margin + outlineBounds.MaxY += margin + ecfg.OutlineBounds = &outlineBounds + + outlineImg := outlineGf.Render(ecfg.DPI, &outlineBounds) + + minBX, maxBX := outlineImg.Bounds().Max.X, -1 + var boardCenterY float64 + var boardCount int + _, boardMask := ComputeWallMask(outlineImg, ecfg.WallThickness+ecfg.Clearance, ecfg.DPI/25.4) + imgW, imgH := outlineImg.Bounds().Max.X, outlineImg.Bounds().Max.Y + for y := 0; y < imgH; y++ { + for x := 0; x < imgW; x++ { + if boardMask[y*imgW+x] { + if x < minBX { + minBX = x + } + if x > maxBX { + maxBX = x + } + boardCenterY += float64(y) + boardCount++ + } + } + } + if boardCount > 0 { + boardCenterY /= float64(boardCount) + } + + // Resolve gerber paths relative to baseDir and render ALL layers + resolvedGerbers := make(map[string]string) + allLayers := make(map[string]image.Image) + allGerbers := make(map[string]*GerberFile) + for origName, basename := range inst.GerberFiles { + fullPath := filepath.Join(baseDir, basename) + resolvedGerbers[origName] = fullPath + if strings.HasSuffix(strings.ToLower(origName), ".gbrjob") { + continue + } + if origName == inst.EdgeCutsFile { + allLayers[origName] = outlineImg + allGerbers[origName] = outlineGf + continue + } + if gf, err := ParseGerber(fullPath); err == nil { + allLayers[origName] = gf.Render(ecfg.DPI, &outlineBounds) + allGerbers[origName] = gf + } + } + + var courtyardImg, soldermaskImg image.Image + if inst.CourtyardFile != "" { + courtyardImg = allLayers[inst.CourtyardFile] + } + if inst.SoldermaskFile != "" { + soldermaskImg = allLayers[inst.SoldermaskFile] + } + if courtyardImg == nil && inst.FabFile != "" { + courtyardImg = allLayers[inst.FabFile] + } + + var drillHoles []DrillHole + if inst.DrillPath != "" { + if holes, err := ParseDrill(filepath.Join(baseDir, inst.DrillPath)); err == nil { + drillHoles = append(drillHoles, holes...) + } + } + if inst.NPTHPath != "" { + if holes, err := ParseDrill(filepath.Join(baseDir, inst.NPTHPath)); err == nil { + drillHoles = append(drillHoles, holes...) + } + } + var filteredHoles []DrillHole + for _, h := range drillHoles { + if h.Type != DrillTypeVia { + filteredHoles = append(filteredHoles, h) + } + } + + pixelToMM := 25.4 / ecfg.DPI + sessionID := randomID() + session := &EnclosureSession{ + Exports: inst.Exports, + OutlineGf: outlineGf, + OutlineImg: outlineImg, + CourtyardImg: courtyardImg, + SoldermaskImg: soldermaskImg, + DrillHoles: filteredHoles, + Config: ecfg, + OutlineBounds: outlineBounds, + BoardW: actualBoardW, + BoardH: actualBoardH, + TotalH: ecfg.WallHeight + ecfg.PCBThickness + 1.0, + MinBX: float64(minBX)*pixelToMM + outlineBounds.MinX, + MaxBX: float64(maxBX)*pixelToMM + outlineBounds.MinX, + BoardCenterY: outlineBounds.MaxY - boardCenterY*pixelToMM, + Sides: ExtractBoardSidesFromMask(boardMask, imgW, imgH, pixelToMM, &outlineBounds), + GerberFiles: inst.GerberFiles, + DrillPath: inst.DrillPath, + NPTHPath: inst.NPTHPath, + ProjectName: inst.ProjectName, + EdgeCutsFile: inst.EdgeCutsFile, + CourtyardFile: inst.CourtyardFile, + SoldermaskFile: inst.SoldermaskFile, + FabFile: inst.FabFile, + EnclosureWallImg: renderEnclosureWallImage(outlineImg, ecfg), + AllLayerImages: allLayers, + AllLayerGerbers: allGerbers, + SourceDir: baseDir, + } + + log.Printf("Restored session %s from %s (%s)", sessionID, baseDir, inst.ProjectName) + return sessionID, session, nil +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..cb4083d --- /dev/null +++ b/main.go @@ -0,0 +1,113 @@ +package main + +import ( + "context" + "embed" + "flag" + "fmt" + "log" + "os" + "time" + + "github.com/wailsapp/wails/v2" + "github.com/wailsapp/wails/v2/pkg/options" + "github.com/wailsapp/wails/v2/pkg/options/assetserver" + "github.com/wailsapp/wails/v2/pkg/options/mac" +) + +//go:embed all:frontend/dist +var assets embed.FS + +//go:embed static/vectors/Former.svg +var formerLogoSVG []byte + +func main() { + // CLI flags + flagHeight := flag.Float64("height", DefaultStencilHeight, "Stencil height in mm") + flagWallHeight := flag.Float64("wall-height", DefaultWallHeight, "Wall height in mm") + flagWallThickness := flag.Float64("wall-thickness", DefaultWallThickness, "Wall thickness in mm") + flagDPI := flag.Float64("dpi", DefaultDPI, "DPI for rendering") + flagKeepPNG := flag.Bool("keep-png", false, "Save intermediate PNG file") + + flag.Parse() + + // If files are passed as arguments, run in CLI mode + if flag.NArg() > 0 { + cfg := Config{ + StencilHeight: *flagHeight, + WallHeight: *flagWallHeight, + WallThickness: *flagWallThickness, + DPI: *flagDPI, + KeepPNG: *flagKeepPNG, + } + runCLI(cfg, flag.Args()) + return + } + + // Ensure working directories exist + os.MkdirAll("temp", 0755) + ensureFormerDirs() + + runGUI() +} + +func runCLI(cfg Config, args []string) { + if len(args) < 1 { + fmt.Println("Usage: former [options] [outline_file]") + fmt.Println(" former (no args = launch GUI)") + flag.PrintDefaults() + os.Exit(1) + } + gerberPath := args[0] + var outlinePath string + if len(args) > 1 { + outlinePath = args[1] + } + _, _, _, err := processPCB(gerberPath, outlinePath, cfg, []string{"stl"}) + if err != nil { + log.Fatalf("Error: %v", err) + } + fmt.Println("Success! Happy printing.") +} + +func runGUI() { + imageServer := NewImageServer() + app := NewApp(imageServer) + + err := wails.Run(&options.App{ + Title: "Former", + Width: 960, + Height: 720, + MinWidth: 640, + MinHeight: 480, + AssetServer: &assetserver.Options{ + Assets: assets, + Handler: imageServer, + }, + OnStartup: app.startup, + OnBeforeClose: func(ctx context.Context) (prevent bool) { + // Force-exit after brief grace period to prevent ghost PIDs on macOS + go func() { + time.Sleep(500 * time.Millisecond) + os.Exit(0) + }() + return false + }, + Bind: []interface{}{ + app, + }, + Mac: &mac.Options{ + TitleBar: mac.TitleBarHiddenInset(), + About: &mac.AboutInfo{ + Title: "Former", + Message: "PCB Stencil & Enclosure Generator", + }, + WebviewIsTransparent: true, + WindowIsTranslucent: false, + }, + }) + + if err != nil { + log.Fatal(err) + } +} diff --git a/scad.go b/scad.go new file mode 100644 index 0000000..419afdf --- /dev/null +++ b/scad.go @@ -0,0 +1,1069 @@ +package main + +import ( + "fmt" + "math" + "os" +) + +// snapToLine rounds a dimension to the nearest quarter-multiple of lineWidth. +// If lineWidth is 0, the value is returned unchanged. +func snapToLine(v, lineWidth float64) float64 { + if lineWidth <= 0 { + return v + } + unit := lineWidth / 4.0 + return math.Round(v/unit) * unit +} + +func WriteSCAD(filename string, triangles [][3]Point) error { + // Fallback/legacy mesh WriteSCAD + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + fmt.Fprintf(f, "// Generated by pcb-to-stencil\npolyhedron(\n points=[\n") + for i, t := range triangles { + fmt.Fprintf(f, " [%f, %f, %f], [%f, %f, %f], [%f, %f, %f]", t[0].X, t[0].Y, t[0].Z, t[1].X, t[1].Y, t[1].Z, t[2].X, t[2].Y, t[2].Z) + if i < len(triangles)-1 { + fmt.Fprintf(f, ",\n") + } else { + fmt.Fprintf(f, "\n") + } + } + fmt.Fprintf(f, " ],\n faces=[\n") + for i := 0; i < len(triangles); i++ { + idx := i * 3 + fmt.Fprintf(f, " [%d, %d, %d]", idx, idx+1, idx+2) + if i < len(triangles)-1 { + fmt.Fprintf(f, ",\n") + } else { + fmt.Fprintf(f, "\n") + } + } + fmt.Fprintf(f, " ]\n);\n") + return nil +} + +// approximateArc returns intermediate arc points from (x1,y1) to (x2,y2), +// excluding the start point, including the end point. +func approximateArc(x1, y1, x2, y2, iVal, jVal float64, mode string) [][2]float64 { + centerX := x1 + iVal + centerY := y1 + jVal + radius := math.Sqrt(iVal*iVal + jVal*jVal) + startAngle := math.Atan2(y1-centerY, x1-centerX) + endAngle := math.Atan2(y2-centerY, x2-centerX) + if mode == "G03" { + if endAngle <= startAngle { + endAngle += 2 * math.Pi + } + } else { + if startAngle <= endAngle { + startAngle += 2 * math.Pi + } + } + arcLen := math.Abs(endAngle-startAngle) * radius + steps := int(arcLen * 8) + if steps < 4 { + steps = 4 + } + if steps > 128 { + steps = 128 + } + pts := make([][2]float64, steps) + for s := 0; s < steps; s++ { + t := float64(s+1) / float64(steps) + a := startAngle + t*(endAngle-startAngle) + pts[s] = [2]float64{centerX + radius*math.Cos(a), centerY + radius*math.Sin(a)} + } + return pts +} + +// writeApertureFlash2D writes a 2D aperture shape centered at (x, y) into a SCAD file. +// gf is needed to resolve macro apertures. lw is the nozzle line width for snapping. +func writeApertureFlash2D(f *os.File, gf *GerberFile, ap Aperture, x, y, lw float64, indent string) { + switch ap.Type { + case "C": + if len(ap.Modifiers) > 0 { + r := snapToLine(ap.Modifiers[0]/2, lw) + fmt.Fprintf(f, "%stranslate([%f, %f]) circle(r=%f);\n", indent, x, y, r) + } + case "R": + if len(ap.Modifiers) >= 2 { + w, h := snapToLine(ap.Modifiers[0], lw), snapToLine(ap.Modifiers[1], lw) + fmt.Fprintf(f, "%stranslate([%f, %f]) square([%f, %f], center=true);\n", indent, x, y, w, h) + } + case "O": + if len(ap.Modifiers) >= 2 { + w, h := snapToLine(ap.Modifiers[0], lw), snapToLine(ap.Modifiers[1], lw) + r := math.Min(w, h) / 2 + fmt.Fprintf(f, "%stranslate([%f, %f]) hull() {\n", indent, x, y) + if w >= h { + d := (w - h) / 2 + fmt.Fprintf(f, "%s translate([%f, 0]) circle(r=%f);\n", indent, d, r) + fmt.Fprintf(f, "%s translate([%f, 0]) circle(r=%f);\n", indent, -d, r) + } else { + d := (h - w) / 2 + fmt.Fprintf(f, "%s translate([0, %f]) circle(r=%f);\n", indent, d, r) + fmt.Fprintf(f, "%s translate([0, %f]) circle(r=%f);\n", indent, -d, r) + } + fmt.Fprintf(f, "%s}\n", indent) + } + case "P": + if len(ap.Modifiers) >= 2 { + dia, numV := ap.Modifiers[0], int(ap.Modifiers[1]) + r := snapToLine(dia/2, lw) + rot := 0.0 + if len(ap.Modifiers) >= 3 { + rot = ap.Modifiers[2] + } + fmt.Fprintf(f, "%stranslate([%f, %f]) rotate([0, 0, %f]) circle(r=%f, $fn=%d);\n", + indent, x, y, rot, r, numV) + } + default: + // Macro aperture – compute bounding box from primitives and emit a simple square. + if gf == nil { + return + } + macro, ok := gf.State.Macros[ap.Type] + if !ok { + return + } + minX, minY := math.Inf(1), math.Inf(1) + maxX, maxY := math.Inf(-1), math.Inf(-1) + trackPt := func(px, py, radius float64) { + if px-radius < minX { minX = px - radius } + if px+radius > maxX { maxX = px + radius } + if py-radius < minY { minY = py - radius } + if py+radius > maxY { maxY = py + radius } + } + for _, prim := range macro.Primitives { + switch prim.Code { + case 1: // Circle + if len(prim.Modifiers) >= 4 { + dia := evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers) + cx := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + cy := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + trackPt(cx, cy, dia/2) + } + case 4: // Outline polygon + if len(prim.Modifiers) >= 3 { + numV := int(evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers)) + for i := 0; i < numV && 2+i*2+1 < len(prim.Modifiers); i++ { + vx := evaluateMacroExpression(prim.Modifiers[2+i*2], ap.Modifiers) + vy := evaluateMacroExpression(prim.Modifiers[2+i*2+1], ap.Modifiers) + trackPt(vx, vy, 0) + } + } + case 20: // Vector line + if len(prim.Modifiers) >= 7 { + w := evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers) + sx := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + sy := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + ex := evaluateMacroExpression(prim.Modifiers[4], ap.Modifiers) + ey := evaluateMacroExpression(prim.Modifiers[5], ap.Modifiers) + trackPt(sx, sy, w/2) + trackPt(ex, ey, w/2) + } + case 21: // Center line rect + if len(prim.Modifiers) >= 6 { + w := evaluateMacroExpression(prim.Modifiers[1], ap.Modifiers) + h := evaluateMacroExpression(prim.Modifiers[2], ap.Modifiers) + cx := evaluateMacroExpression(prim.Modifiers[3], ap.Modifiers) + cy := evaluateMacroExpression(prim.Modifiers[4], ap.Modifiers) + trackPt(cx, cy, math.Max(w, h)/2) + } + } + } + if !math.IsInf(minX, 1) { + w := snapToLine(maxX-minX, lw) + h := snapToLine(maxY-minY, lw) + cx := (minX + maxX) / 2 + cy := (minY + maxY) / 2 + fmt.Fprintf(f, "%stranslate([%f, %f]) square([%f, %f], center=true);\n", + indent, x+cx, y+cy, w, h) + } + } +} + +// writeMacroPrimitive2D emits a single macro primitive as 2D SCAD geometry. +func writeMacroPrimitive2D(f *os.File, prim MacroPrimitive, params []float64, indent string) { + switch prim.Code { + case 1: // Circle: Exposure, Diameter, CenterX, CenterY + if len(prim.Modifiers) >= 4 { + exposure := evaluateMacroExpression(prim.Modifiers[0], params) + if exposure == 0 { + return + } + dia := evaluateMacroExpression(prim.Modifiers[1], params) + cx := evaluateMacroExpression(prim.Modifiers[2], params) + cy := evaluateMacroExpression(prim.Modifiers[3], params) + fmt.Fprintf(f, "%stranslate([%f, %f]) circle(r=%f);\n", indent, cx, cy, dia/2) + } + case 4: // Outline (Polygon): Exposure, NumVertices, X1,Y1,...,Xn,Yn, Rotation + if len(prim.Modifiers) >= 3 { + exposure := evaluateMacroExpression(prim.Modifiers[0], params) + if exposure == 0 { + return + } + numV := int(evaluateMacroExpression(prim.Modifiers[1], params)) + if len(prim.Modifiers) < 2+numV*2+1 { + return + } + rot := evaluateMacroExpression(prim.Modifiers[2+numV*2], params) + fmt.Fprintf(f, "%srotate([0, 0, %f]) polygon(points=[\n", indent, rot) + for i := 0; i < numV; i++ { + vx := evaluateMacroExpression(prim.Modifiers[2+i*2], params) + vy := evaluateMacroExpression(prim.Modifiers[2+i*2+1], params) + comma := "," + if i == numV-1 { + comma = "" + } + fmt.Fprintf(f, "%s [%f, %f]%s\n", indent, vx, vy, comma) + } + fmt.Fprintf(f, "%s]);\n", indent) + } + case 5: // Regular Polygon: Exposure, NumVertices, CenterX, CenterY, Diameter, Rotation + if len(prim.Modifiers) >= 6 { + exposure := evaluateMacroExpression(prim.Modifiers[0], params) + if exposure == 0 { + return + } + numV := int(evaluateMacroExpression(prim.Modifiers[1], params)) + cx := evaluateMacroExpression(prim.Modifiers[2], params) + cy := evaluateMacroExpression(prim.Modifiers[3], params) + dia := evaluateMacroExpression(prim.Modifiers[4], params) + rot := evaluateMacroExpression(prim.Modifiers[5], params) + fmt.Fprintf(f, "%stranslate([%f, %f]) rotate([0, 0, %f]) circle(r=%f, $fn=%d);\n", + indent, cx, cy, rot, dia/2, numV) + } + case 20: // Vector Line: Exposure, Width, StartX, StartY, EndX, EndY, Rotation + if len(prim.Modifiers) >= 7 { + exposure := evaluateMacroExpression(prim.Modifiers[0], params) + if exposure == 0 { + return + } + width := evaluateMacroExpression(prim.Modifiers[1], params) + sx := evaluateMacroExpression(prim.Modifiers[2], params) + sy := evaluateMacroExpression(prim.Modifiers[3], params) + ex := evaluateMacroExpression(prim.Modifiers[4], params) + ey := evaluateMacroExpression(prim.Modifiers[5], params) + rot := evaluateMacroExpression(prim.Modifiers[6], params) + // hull() of two squares at start/end for a rectangle with the given width + fmt.Fprintf(f, "%srotate([0, 0, %f]) hull() {\n", indent, rot) + fmt.Fprintf(f, "%s translate([%f, %f]) square([0.001, %f], center=true);\n", indent, sx, sy, width) + fmt.Fprintf(f, "%s translate([%f, %f]) square([0.001, %f], center=true);\n", indent, ex, ey, width) + fmt.Fprintf(f, "%s}\n", indent) + } + case 21: // Center Line (Rect): Exposure, Width, Height, CenterX, CenterY, Rotation + if len(prim.Modifiers) >= 6 { + exposure := evaluateMacroExpression(prim.Modifiers[0], params) + if exposure == 0 { + return + } + w := evaluateMacroExpression(prim.Modifiers[1], params) + h := evaluateMacroExpression(prim.Modifiers[2], params) + cx := evaluateMacroExpression(prim.Modifiers[3], params) + cy := evaluateMacroExpression(prim.Modifiers[4], params) + rot := evaluateMacroExpression(prim.Modifiers[5], params) + fmt.Fprintf(f, "%stranslate([%f, %f]) rotate([0, 0, %f]) square([%f, %f], center=true);\n", + indent, cx, cy, rot, w, h) + } + } +} + +// writeApertureLinearDraw2D writes a 2D stroke between two points using hull() of the aperture. +func writeApertureLinearDraw2D(f *os.File, ap Aperture, x1, y1, x2, y2 float64, indent string) { + switch ap.Type { + case "C": + if len(ap.Modifiers) > 0 { + r := ap.Modifiers[0] / 2 + fmt.Fprintf(f, "%shull() {\n", indent) + fmt.Fprintf(f, "%s translate([%f, %f]) circle(r=%f);\n", indent, x1, y1, r) + fmt.Fprintf(f, "%s translate([%f, %f]) circle(r=%f);\n", indent, x2, y2, r) + fmt.Fprintf(f, "%s}\n", indent) + } + case "R": + if len(ap.Modifiers) >= 2 { + w, h := ap.Modifiers[0], ap.Modifiers[1] + fmt.Fprintf(f, "%shull() {\n", indent) + fmt.Fprintf(f, "%s translate([%f, %f]) square([%f, %f], center=true);\n", indent, x1, y1, w, h) + fmt.Fprintf(f, "%s translate([%f, %f]) square([%f, %f], center=true);\n", indent, x2, y2, w, h) + fmt.Fprintf(f, "%s}\n", indent) + } + default: + if len(ap.Modifiers) > 0 { + r := ap.Modifiers[0] / 2 + fmt.Fprintf(f, "%shull() {\n", indent) + fmt.Fprintf(f, "%s translate([%f, %f]) circle(r=%f);\n", indent, x1, y1, r) + fmt.Fprintf(f, "%s translate([%f, %f]) circle(r=%f);\n", indent, x2, y2, r) + fmt.Fprintf(f, "%s}\n", indent) + } + } +} + +// writeGerberShapes2D writes a 2D SCAD union body representing all drawn shapes +// from the Gerber file. Call this inside a union() block. +func writeGerberShapes2D(f *os.File, gf *GerberFile, lw float64, indent string) { + curX, curY := 0.0, 0.0 + curDCode := 0 + interpolationMode := "G01" + inRegion := false + var regionPts [][2]float64 + + for _, cmd := range gf.Commands { + if cmd.Type == "APERTURE" { + if cmd.D != nil { + curDCode = *cmd.D + } + continue + } + if cmd.Type == "G01" || cmd.Type == "G02" || cmd.Type == "G03" { + interpolationMode = cmd.Type + continue + } + if cmd.Type == "G36" { + inRegion = true + regionPts = nil + continue + } + if cmd.Type == "G37" { + if len(regionPts) >= 3 { + fmt.Fprintf(f, "%spolygon(points=[\n", indent) + for i, pt := range regionPts { + fmt.Fprintf(f, "%s [%f, %f]", indent, pt[0], pt[1]) + if i < len(regionPts)-1 { + fmt.Fprintf(f, ",") + } + fmt.Fprintf(f, "\n") + } + fmt.Fprintf(f, "%s]);\n", indent) + } + inRegion = false + regionPts = nil + continue + } + + prevX, prevY := curX, curY + if cmd.X != nil { + curX = *cmd.X + } + if cmd.Y != nil { + curY = *cmd.Y + } + + if inRegion { + switch cmd.Type { + case "MOVE": + regionPts = append(regionPts, [2]float64{curX, curY}) + case "DRAW": + if interpolationMode == "G01" { + regionPts = append(regionPts, [2]float64{curX, curY}) + } else { + iVal, jVal := 0.0, 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + arcPts := approximateArc(prevX, prevY, curX, curY, iVal, jVal, interpolationMode) + regionPts = append(regionPts, arcPts...) + } + } + continue + } + + ap, ok := gf.State.Apertures[curDCode] + if !ok { + continue + } + switch cmd.Type { + case "FLASH": + writeApertureFlash2D(f, gf, ap, curX, curY, lw, indent) + case "DRAW": + if interpolationMode == "G01" { + writeApertureLinearDraw2D(f, ap, prevX, prevY, curX, curY, indent) + } else { + iVal, jVal := 0.0, 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + arcPts := approximateArc(prevX, prevY, curX, curY, iVal, jVal, interpolationMode) + all := append([][2]float64{{prevX, prevY}}, arcPts...) + for i := 0; i < len(all)-1; i++ { + writeApertureLinearDraw2D(f, ap, all[i][0], all[i][1], all[i+1][0], all[i+1][1], indent) + } + } + } + } +} + +// WriteStencilSCAD generates native parametric OpenSCAD for a solder paste stencil. +// Instead of a rasterised mesh, it uses CSG primitives (circles, squares, hulls, +// polygons) so the result prints cleanly at any nozzle size. +func WriteStencilSCAD(filename string, gf *GerberFile, outlineGf *GerberFile, cfg Config, bounds *Bounds) error { + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + fmt.Fprintf(f, "// Generated by pcb-to-stencil (Native SCAD)\n") + fmt.Fprintf(f, "$fn = 60;\n\n") + lw := cfg.LineWidth + fmt.Fprintf(f, "stencil_height = %f; // mm – solder paste layer thickness\n", snapToLine(cfg.StencilHeight, lw)) + fmt.Fprintf(f, "wall_height = %f; // mm – alignment frame height\n", snapToLine(cfg.WallHeight, lw)) + fmt.Fprintf(f, "wall_thickness = %f; // mm – alignment frame wall thickness\n", snapToLine(cfg.WallThickness, lw)) + if lw > 0 { + fmt.Fprintf(f, "// line_width = %f; // mm – all dimensions snapped to multiples/fractions of this\n", lw) + } + fmt.Fprintf(f, "\n") + + var outlineVerts [][2]float64 + if outlineGf != nil { + outlineVerts = ExtractPolygonFromGerber(outlineGf) + } + + centerX := (bounds.MinX + bounds.MaxX) / 2.0 + centerY := (bounds.MinY + bounds.MaxY) / 2.0 + + // Board outline module (2D) + if len(outlineVerts) > 0 { + fmt.Fprintf(f, "module board_outline() {\n polygon(points=[\n") + for i, v := range outlineVerts { + fmt.Fprintf(f, " [%f, %f]", v[0], v[1]) + if i < len(outlineVerts)-1 { + fmt.Fprintf(f, ",") + } + fmt.Fprintf(f, "\n") + } + fmt.Fprintf(f, " ]);\n}\n\n") + } else { + // Fallback: bounding rectangle + fmt.Fprintf(f, "module board_outline() {\n") + fmt.Fprintf(f, " translate([%f, %f]) square([%f, %f]);\n", + bounds.MinX, bounds.MinY, bounds.MaxX-bounds.MinX, bounds.MaxY-bounds.MinY) + fmt.Fprintf(f, "}\n\n") + } + + // Paste pad openings module (2D union of all aperture shapes) + fmt.Fprintf(f, "module paste_pads() {\n union() {\n") + writeGerberShapes2D(f, gf, cfg.LineWidth, " ") + fmt.Fprintf(f, " }\n}\n\n") + + // Main body – centred at origin for easy placement on the print bed + fmt.Fprintf(f, "translate([%f, %f, 0]) {\n", -centerX, -centerY) + fmt.Fprintf(f, " difference() {\n") + fmt.Fprintf(f, " union() {\n") + fmt.Fprintf(f, " // Thin stencil plate\n") + fmt.Fprintf(f, " linear_extrude(height=stencil_height)\n") + fmt.Fprintf(f, " board_outline();\n") + fmt.Fprintf(f, " // Alignment wall – keeps stencil registered to the PCB edge\n") + fmt.Fprintf(f, " linear_extrude(height=wall_height)\n") + fmt.Fprintf(f, " difference() {\n") + fmt.Fprintf(f, " offset(r=wall_thickness) board_outline();\n") + fmt.Fprintf(f, " board_outline();\n") + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, " // Paste pad cutouts (punched through the stencil plate)\n") + fmt.Fprintf(f, " translate([0, 0, -0.1])\n") + fmt.Fprintf(f, " linear_extrude(height=stencil_height + 0.2)\n") + fmt.Fprintf(f, " paste_pads();\n") + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, "}\n") + + return nil +} + +// ExtractPolygonFromGerber traces the Edge.Cuts gerber to form a continuous 2D polygon +func ExtractPolygonFromGerber(gf *GerberFile) [][2]float64 { + var strokes [][][2]float64 + var currentStroke [][2]float64 + curX, curY := 0.0, 0.0 + interpolationMode := "G01" + + for _, cmd := range gf.Commands { + if cmd.Type == "G01" || cmd.Type == "G02" || cmd.Type == "G03" { + interpolationMode = cmd.Type + continue + } + + prevX, prevY := curX, curY + if cmd.X != nil { + curX = *cmd.X + } + if cmd.Y != nil { + curY = *cmd.Y + } + + if cmd.Type == "MOVE" { + if len(currentStroke) > 0 { + strokes = append(strokes, currentStroke) + currentStroke = nil + } + } else if cmd.Type == "DRAW" { + if len(currentStroke) == 0 { + currentStroke = append(currentStroke, [2]float64{prevX, prevY}) + } + + if interpolationMode == "G01" { + currentStroke = append(currentStroke, [2]float64{curX, curY}) + } else { + iVal, jVal := 0.0, 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + centerX, centerY := prevX+iVal, prevY+jVal + radius := math.Sqrt(iVal*iVal + jVal*jVal) + startAngle := math.Atan2(prevY-centerY, prevX-centerX) + endAngle := math.Atan2(curY-centerY, curX-centerX) + if interpolationMode == "G03" { + if endAngle <= startAngle { + endAngle += 2 * math.Pi + } + } else { + if startAngle <= endAngle { + startAngle += 2 * math.Pi + } + } + arcLen := math.Abs(endAngle-startAngle) * radius + steps := int(arcLen * 10) + if steps < 5 { + steps = 5 + } + for s := 1; s <= steps; s++ { + t := float64(s) / float64(steps) + a := startAngle + t*(endAngle-startAngle) + ax, ay := centerX+radius*math.Cos(a), centerY+radius*math.Sin(a) + currentStroke = append(currentStroke, [2]float64{ax, ay}) + } + } + } + } + if len(currentStroke) > 0 { + strokes = append(strokes, currentStroke) + } + + if len(strokes) == 0 { + return nil + } + + // Stitch strokes into closed loops + var loops [][][2]float64 + used := make([]bool, len(strokes)) + epsilon := 0.05 // 0.05mm tolerance + + for startIdx := 0; startIdx < len(strokes); startIdx++ { + if used[startIdx] { + continue + } + used[startIdx] = true + path := append([][2]float64{}, strokes[startIdx]...) + + for { + endPt := path[len(path)-1] + startPt := path[0] + found := false + + for j := 0; j < len(strokes); j++ { + if used[j] { + continue + } + s := strokes[j] + sStart := s[0] + sEnd := s[len(s)-1] + + dist := func(a, b [2]float64) float64 { + dx, dy := a[0]-b[0], a[1]-b[1] + return math.Sqrt(dx*dx + dy*dy) + } + + if dist(endPt, sStart) < epsilon { + path = append(path, s[1:]...) + used[j] = true + found = true + break + } else if dist(endPt, sEnd) < epsilon { + for k := len(s) - 2; k >= 0; k-- { + path = append(path, s[k]) + } + used[j] = true + found = true + break + } else if dist(startPt, sEnd) < epsilon { + // prepend + newPath := append([][2]float64{}, s[:len(s)-1]...) + path = append(newPath, path...) + used[j] = true + found = true + break + } else if dist(startPt, sStart) < epsilon { + // reversed prepend + var newPath [][2]float64 + for k := len(s) - 1; k > 0; k-- { + newPath = append(newPath, s[k]) + } + path = append(newPath, path...) + used[j] = true + found = true + break + } + } + if !found { + break + } + } + loops = append(loops, path) + } + + // Find the longest loop (the main board outline) + var bestLoop [][2]float64 + maxLen := 0.0 + for _, l := range loops { + loopLen := 0.0 + for i := 0; i < len(l)-1; i++ { + dx := l[i+1][0] - l[i][0] + dy := l[i+1][1] - l[i][1] + loopLen += math.Sqrt(dx*dx + dy*dy) + } + if loopLen > maxLen { + maxLen = loopLen + bestLoop = l + } + } + + // Always ensure path is closed + if len(bestLoop) > 2 { + first := bestLoop[0] + last := bestLoop[len(bestLoop)-1] + if math.Abs(first[0]-last[0]) > epsilon || math.Abs(first[1]-last[1]) > epsilon { + bestLoop = append(bestLoop, first) + } + } + + return bestLoop +} + +// WriteNativeSCAD generates native parametrically defined CSG OpenSCAD code +func WriteNativeSCAD(filename string, isTray bool, outlineVertices [][2]float64, cfg EnclosureConfig, holes []DrillHole, cutouts []SideCutout, lidCutouts []LidCutout, sides []BoardSide, minBX, maxBX, boardCenterY float64) error { + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + fmt.Fprintf(f, "// Generated by pcb-to-stencil (Native SCAD)\n") + fmt.Fprintf(f, "$fn = 60;\n\n") + + // 1. Output the Board Polygon Module + fmt.Fprintf(f, "module board_polygon() {\n polygon(points=[\n") + for i, v := range outlineVertices { + fmt.Fprintf(f, " [%f, %f]", v[0], v[1]) + if i < len(outlineVertices)-1 { + fmt.Fprintf(f, ",\n") + } + } + fmt.Fprintf(f, "\n ]);\n}\n\n") + + // Dimensions + clearance := cfg.Clearance + wt := cfg.WallThickness + lidThick := wt + snapHeight := 2.5 + trayFloor := 1.5 + pcbT := cfg.PCBThickness + totalH := cfg.WallHeight + pcbT + trayFloor + lipH := pcbT + 1.5 + + // Create Peg and Socket helper + fmt.Fprintf(f, "module mounting_pegs(isSocket) {\n") + for _, h := range holes { + if h.Type == DrillTypeMounting { + r := (h.Diameter / 2.0) - 0.15 + if isTray { + // We subtract sockets from the tray floor + r = (h.Diameter / 2.0) + 0.1 + fmt.Fprintf(f, " translate([%f, %f, -1]) cylinder(r=%f, h=%f);\n", h.X, h.Y, r, trayFloor+2) + } else { + fmt.Fprintf(f, " translate([%f, %f, 0]) cylinder(r=%f, h=%f);\n", h.X, h.Y, r, totalH-lidThick) + } + } + } + fmt.Fprintf(f, "}\n\n") + + // Print Side Cutouts module + fmt.Fprintf(f, "module side_cutouts() {\n") + for _, c := range cutouts { + var bs *BoardSide + for i := range sides { + if sides[i].Num == c.Side { + bs = &sides[i] + break + } + } + if bs == nil { + continue + } + + // Cutouts are relative to board. UI specifies c.Y from bottom, so c.Y adds to Z. + z := c.Height/2 + trayFloor + pcbT + c.Y + wallDepth := 2*(clearance+2*wt) + 2.0 // just enough to cut through walls + w, d, h := c.Width, wallDepth, c.Height + + dx := bs.EndX - bs.StartX + dy := bs.EndY - bs.StartY + length := math.Sqrt(dx*dx + dy*dy) + if length > 0 { + dx /= length + dy /= length + } + + midX := bs.StartX + dx*(c.X+w/2) + midY := bs.StartY + dy*(c.X+w/2) + + rotDeg := (bs.Angle * 180.0 / math.Pi) - 90.0 + + if c.CornerRadius > 0 { + r := c.CornerRadius + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) {\n", midX, midY, z, rotDeg) + fmt.Fprintf(f, " hull() {\n") + fmt.Fprintf(f, " translate([%f, 0, %f]) rotate([90, 0, 0]) cylinder(r=%f, h=%f, center=true);\n", w/2-r, h/2-r, r, d) + fmt.Fprintf(f, " translate([%f, 0, %f]) rotate([90, 0, 0]) cylinder(r=%f, h=%f, center=true);\n", -(w/2 - r), h/2-r, r, d) + fmt.Fprintf(f, " translate([%f, 0, %f]) rotate([90, 0, 0]) cylinder(r=%f, h=%f, center=true);\n", w/2-r, -(h/2 - r), r, d) + fmt.Fprintf(f, " translate([%f, 0, %f]) rotate([90, 0, 0]) cylinder(r=%f, h=%f, center=true);\n", -(w/2 - r), -(h/2 - r), r, d) + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, " }\n") + } else { + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", midX, midY, z, rotDeg, w, d, h) + } + } + fmt.Fprintf(f, "}\n\n") + + // Print Pry Slots Module + fmt.Fprintf(f, "module pry_slots() {\n") + pryW := 8.0 + pryD := 1.5 + fmt.Fprintf(f, " translate([%f, %f, 0]) cube([%f, %f, %f], center=true);\n", minBX-clearance-wt+pryD/2, boardCenterY, pryD*2, pryW, snapHeight*3) + fmt.Fprintf(f, " translate([%f, %f, 0]) cube([%f, %f, %f], center=true);\n", maxBX+clearance+wt-pryD/2, boardCenterY, pryD*2, pryW, snapHeight*3) + fmt.Fprintf(f, "}\n\n") + + // Print Pry Clips Module + fmt.Fprintf(f, "module pry_clips() {\n") + clipH := 0.8 + clipZ := trayFloor + snapHeight - clipH/2.0 + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([%f, %f, %f], center=true);\n", minBX-clearance-wt-0.5, boardCenterY, clipZ, 1.0, pryW, clipH) + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([%f, %f, %f], center=true);\n", maxBX+clearance+wt+0.5, boardCenterY, clipZ, 1.0, pryW, clipH) + fmt.Fprintf(f, "}\n\n") + + // Lid/Tray Cutouts Module + fmt.Fprintf(f, "module lid_cutouts() {\n") + for _, lc := range lidCutouts { + cx := (lc.MinX + lc.MaxX) / 2.0 + cy := (lc.MinY + lc.MaxY) / 2.0 + w := lc.MaxX - lc.MinX + h := lc.MaxY - lc.MinY + if w < 0.01 || h < 0.01 { + continue + } + if lc.Plane == "lid" { + if lc.IsDado && lc.Depth > 0 { + // Dado on lid: cut from top surface downward + fmt.Fprintf(f, " // Lid dado (depth=%.2f)\n", lc.Depth) + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([%f, %f, %f], center=true);\n", + cx, cy, totalH-lc.Depth/2.0, w, h, lc.Depth+0.1) + } else { + // Through-cut on lid + fmt.Fprintf(f, " // Lid through-cut\n") + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([%f, %f, %f], center=true);\n", + cx, cy, totalH-lidThick/2.0, w, h, lidThick+0.2) + } + } else if lc.Plane == "tray" { + if lc.IsDado && lc.Depth > 0 { + // Dado on tray: cut from bottom surface upward + fmt.Fprintf(f, " // Tray dado (depth=%.2f)\n", lc.Depth) + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([%f, %f, %f], center=true);\n", + cx, cy, lc.Depth/2.0-0.05, w, h, lc.Depth+0.1) + } else { + // Through-cut on tray floor + fmt.Fprintf(f, " // Tray through-cut\n") + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([%f, %f, %f], center=true);\n", + cx, cy, trayFloor/2.0, w, h, trayFloor+0.2) + } + } + } + fmt.Fprintf(f, "}\n\n") + + // cutoutMid returns the midpoint XY and rotation angle for a side cutout, + // matching the geometry used in side_cutouts(). + cutoutMid := func(c SideCutout) (midX, midY, rotDeg float64, ok bool) { + for i := range sides { + if sides[i].Num != c.Side { + continue + } + bs := &sides[i] + dx := bs.EndX - bs.StartX + dy := bs.EndY - bs.StartY + if l := math.Sqrt(dx*dx + dy*dy); l > 0 { + dx /= l + dy /= l + } + midX = bs.StartX + dx*(c.X+c.Width/2) + midY = bs.StartY + dy*(c.X+c.Width/2) + rotDeg = (bs.Angle*180.0/math.Pi) - 90.0 + ok = true + return + } + return + } + + centerX := cfg.OutlineBounds.MinX + (cfg.OutlineBounds.MaxX-cfg.OutlineBounds.MinX)/2.0 + centerY := cfg.OutlineBounds.MinY + (cfg.OutlineBounds.MaxY-cfg.OutlineBounds.MinY)/2.0 + fmt.Fprintf(f, "translate([%f, %f, 0]) {\n", -centerX, -centerY) + + if isTray { + // --- TRAY --- + fmt.Fprintf(f, "// --- TRAY ---\n") + fmt.Fprintf(f, "difference() {\n") + fmt.Fprintf(f, " union() {\n") + fmt.Fprintf(f, " // Tray Floor (extends to clearance + 2*wt so it is flush with enclosure outside)\n") + fmt.Fprintf(f, " linear_extrude(height=%f) offset(r=%f) board_polygon();\n", trayFloor, clearance+2*wt) + fmt.Fprintf(f, " // Tray Inner Wall (thickness wt)\n") + fmt.Fprintf(f, " translate([0,0,%f]) linear_extrude(height=%f) difference() {\n", trayFloor, snapHeight) + fmt.Fprintf(f, " offset(r=%f) board_polygon();\n", clearance+wt) + fmt.Fprintf(f, " offset(r=%f) board_polygon();\n", clearance) + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, " }\n") + + fmt.Fprintf(f, " // Subtract Lip Recess (for easy opening)\n") + fmt.Fprintf(f, " translate([0,0,-1]) linear_extrude(height=%f) difference() {\n", trayFloor+lipH+0.5) + fmt.Fprintf(f, " offset(r=%f) board_polygon();\n", clearance+2*wt+1.0) + fmt.Fprintf(f, " offset(r=%f) board_polygon();\n", clearance+2*wt-0.5) // Assuming lipCut is 0.5mm + fmt.Fprintf(f, " }\n") + + // Remove peg holes from floor + for _, hole := range holes { + if hole.Type != DrillTypeMounting { + continue + } + socketRadius := (hole.Diameter / 2.0) + 0.1 + fmt.Fprintf(f, " translate([%f,%f,-1]) cylinder(h=%f, r=%f, $fn=32);\n", hole.X, hole.Y, trayFloor+2, socketRadius) + } + fmt.Fprintf(f, " side_cutouts();\n") + fmt.Fprintf(f, " lid_cutouts();\n") + // Board dado on tray: layer-aware groove on each side with port cutouts. + { + trayWallDepth := 2*(clearance+wt) + 2.0 + type trayDadoInfo struct { + hasF bool + hasB bool + fPortTop float64 + bPortBot float64 + } + trayDadoSides := make(map[int]*trayDadoInfo) + for _, c := range cutouts { + di, ok := trayDadoSides[c.Side] + if !ok { + di = &trayDadoInfo{fPortTop: 0, bPortBot: 1e9} + trayDadoSides[c.Side] = di + } + portBot := trayFloor + pcbT + c.Y + portTop := portBot + c.Height + if c.Layer == "F" { + di.hasF = true + if portTop > di.fPortTop { + di.fPortTop = portTop + } + } else { + di.hasB = true + if portBot < di.bPortBot { + di.bPortBot = portBot + } + } + } + trayH := trayFloor + snapHeight + wt + pcbT + 2.0 + for _, bs := range sides { + di, ok := trayDadoSides[bs.Num] + if !ok { + continue + } + midX := (bs.StartX + bs.EndX) / 2.0 + midY := (bs.StartY + bs.EndY) / 2.0 + rotDeg := (bs.Angle*180.0/math.Pi) - 90.0 + dadoLen := bs.Length + 1.0 + if di.hasF { + // F-layer: dado above ports (toward lid), same direction as enclosure + dadoBot := di.fPortTop + dadoH := trayH - dadoBot + if dadoH > 0.1 { + fmt.Fprintf(f, " // Board dado (F-layer) on side %d\n", bs.Num) + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", + midX, midY, dadoBot+dadoH/2.0, rotDeg, dadoLen, trayWallDepth, dadoH) + } + } + if di.hasB { + // B-layer: dado below ports (toward floor) + dadoBot := trayFloor + 0.3 + dadoH := di.bPortBot - dadoBot + if dadoH > 0.1 { + fmt.Fprintf(f, " // Board dado (B-layer) on side %d\n", bs.Num) + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", + midX, midY, dadoBot+dadoH/2.0, rotDeg, dadoLen, trayWallDepth, dadoH) + } + } + } + } + fmt.Fprintf(f, "}\n") + fmt.Fprintf(f, "pry_clips();\n\n") + + } else { + // --- ENCLOSURE --- + fmt.Fprintf(f, "// --- ENCLOSURE ---\n") + fmt.Fprintf(f, "difference() {\n") + fmt.Fprintf(f, " union() {\n") + fmt.Fprintf(f, " // Outer Enclosure block (accommodates Tray Wall + Enclosure Wall)\n") + fmt.Fprintf(f, " translate([0,0,%f]) linear_extrude(height=%f) offset(r=%f) board_polygon();\n", trayFloor, totalH-trayFloor, clearance+2*wt) + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, " // Subtract Inner Cavity (Base clearance around board)\n") + fmt.Fprintf(f, " translate([0,0,-1]) linear_extrude(height=%f) offset(r=%f) board_polygon();\n", totalH-lidThick+1, clearance) + fmt.Fprintf(f, " // Subtract Tray Recess (Accommodates Tray Wall)\n") + fmt.Fprintf(f, " translate([0,0,-1]) linear_extrude(height=%f) offset(r=%f) board_polygon();\n", trayFloor+snapHeight+0.2, clearance+wt+0.15) + + fmt.Fprintf(f, " // Vertical relief slots for the tray clips to slide into\n") + reliefClipZ := trayFloor + snapHeight + reliefH := reliefClipZ + 1.0 + reliefZ := trayFloor - 1.0 + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([1.5, %f, %f], center=true);\n", minBX-clearance-wt-0.25, boardCenterY, reliefZ, pryW+1.0, reliefH) + fmt.Fprintf(f, " translate([%f, %f, %f]) cube([1.5, %f, %f], center=true);\n", maxBX+clearance+wt+0.25, boardCenterY, reliefZ, pryW+1.0, reliefH) + + fmt.Fprintf(f, " pry_slots();\n") + + // Port cutouts – only these go through the full wall to the outside + fmt.Fprintf(f, " side_cutouts();\n") + fmt.Fprintf(f, " lid_cutouts();\n") + + wallDepth := 2*(clearance+2*wt) + 2.0 + lidBottom := totalH - lidThick + + // Inner wall ring helper – used to limit slots and dado to the + // inner rim only (outer wall stays solid, only ports break through). + // Inner wall spans from offset(clearance) to offset(clearance+wt). + fmt.Fprintf(f, " // --- Entry slots & board dado (inner wall only) ---\n") + fmt.Fprintf(f, " intersection() {\n") + fmt.Fprintf(f, " // Clamp to inner wall ring\n") + fmt.Fprintf(f, " translate([0,0,%f]) linear_extrude(height=%f) difference() {\n", trayFloor-1, totalH+2) + fmt.Fprintf(f, " offset(r=%f) board_polygon();\n", clearance+wt+0.5) + fmt.Fprintf(f, " offset(r=%f) board_polygon();\n", clearance-0.5) + fmt.Fprintf(f, " }\n") + fmt.Fprintf(f, " union() {\n") + + // Port entry slots – vertical channel from port to lid/floor, + // only in the inner wall so the outer wall stays solid. + for _, c := range cutouts { + mX, mY, mRot, ok := cutoutMid(c) + if !ok { + continue + } + zTopCut := trayFloor + pcbT + c.Y + c.Height + + if c.Layer == "F" { + // F-layer: ports on top of board, slot from port top toward lid (plate) + slotH := lidBottom - zTopCut + if slotH > 0.1 { + fmt.Fprintf(f, " // Port entry slot (F-layer, open toward plate)\n") + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", + mX, mY, zTopCut+slotH/2.0, mRot, c.Width, wallDepth, slotH) + } + } else { + // B-layer: ports under board, slot from floor up to port bottom + zBotCut := trayFloor + pcbT + c.Y + slotH := zBotCut - (trayFloor + 0.3) + if slotH > 0.1 { + slotBot := trayFloor + 0.3 + fmt.Fprintf(f, " // Port entry slot (B-layer, open toward rim)\n") + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", + mX, mY, slotBot+slotH/2.0, mRot, c.Width, wallDepth, slotH) + } + } + } + + // Board dado – full-length groove at PCB height, inner wall only. + // For F-layer: dado sits below ports (board under ports), from tray floor to port bottom. + // For B-layer: dado sits above ports (board over ports), from port top to lid. + // Collect per-side: lowest port bottom (F) or highest port top (B). + type dadoInfo struct { + hasF bool + hasB bool + fPortTop float64 // highest port-top on this side (F-layer) + bPortBot float64 // lowest port-bottom on this side (B-layer) + } + dadoSides := make(map[int]*dadoInfo) + for _, c := range cutouts { + di, ok := dadoSides[c.Side] + if !ok { + di = &dadoInfo{fPortTop: 0, bPortBot: 1e9} + dadoSides[c.Side] = di + } + portBot := trayFloor + pcbT + c.Y + portTop := portBot + c.Height + if c.Layer == "F" { + di.hasF = true + if portTop > di.fPortTop { + di.fPortTop = portTop + } + } else { + di.hasB = true + if portBot < di.bPortBot { + di.bPortBot = portBot + } + } + } + for _, bs := range sides { + di, ok := dadoSides[bs.Num] + if !ok { + continue + } + midX := (bs.StartX + bs.EndX) / 2.0 + midY := (bs.StartY + bs.EndY) / 2.0 + rotDeg := (bs.Angle*180.0/math.Pi) - 90.0 + dadoLen := bs.Length + 1.0 + if di.hasF { + // F-layer: ports on top of board, dado above ports (toward lid/plate) + dadoBot := di.fPortTop + dadoH := lidBottom - dadoBot + if dadoH > 0.1 { + fmt.Fprintf(f, " // Board dado (F-layer) on side %d\n", bs.Num) + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", + midX, midY, dadoBot+dadoH/2.0, rotDeg, dadoLen, wallDepth, dadoH) + } + } + if di.hasB { + // B-layer: ports under board, dado below ports (toward open rim) + dadoBot := trayFloor + 0.3 + dadoH := di.bPortBot - dadoBot + if dadoH > 0.1 { + fmt.Fprintf(f, " // Board dado (B-layer) on side %d\n", bs.Num) + fmt.Fprintf(f, " translate([%f, %f, %f]) rotate([0, 0, %f]) cube([%f, %f, %f], center=true);\n", + midX, midY, dadoBot+dadoH/2.0, rotDeg, dadoLen, wallDepth, dadoH) + } + } + } + + fmt.Fprintf(f, " } // end union\n") + fmt.Fprintf(f, " } // end intersection\n") + fmt.Fprintf(f, "}\n") + fmt.Fprintf(f, "mounting_pegs(false);\n") + } + + fmt.Fprintf(f, "}\n") // Close the top-level translate + + return nil +} diff --git a/session.go b/session.go new file mode 100644 index 0000000..9c2c45d --- /dev/null +++ b/session.go @@ -0,0 +1,362 @@ +package main + +import ( + "fmt" + "image" + "image/color" + "image/draw" + "image/png" + "io" + "log" + "os" + "path/filepath" + "strings" +) + +// EnclosureSession holds all state for an active enclosure editing session +type EnclosureSession struct { + Exports []string + OutlineGf *GerberFile + OutlineImg image.Image + CourtyardImg image.Image + SoldermaskImg image.Image + DrillHoles []DrillHole + Config EnclosureConfig + OutlineBounds Bounds + BoardW float64 + BoardH float64 + TotalH float64 + MinBX float64 + MaxBX float64 + BoardCenterY float64 + Sides []BoardSide + FabImg image.Image + EnclosureWallImg image.Image // 2D top-down view of enclosure walls + AllLayerImages map[string]image.Image // all rendered gerber layers keyed by original filename + AllLayerGerbers map[string]*GerberFile // parsed gerber files keyed by original filename + SourceDir string // original directory of the gerber files + + // Persistence metadata + GerberFiles map[string]string + DrillPath string + NPTHPath string + ProjectName string + EdgeCutsFile string + CourtyardFile string + SoldermaskFile string + FabFile string +} + + +// BuildEnclosureSession creates a session from uploaded files and configuration. +// This is used by both the initial upload and by instance restore. +func BuildEnclosureSession( + gbrjobPath string, + gerberPaths map[string]string, // original filename -> saved path + drillPath, npthPath string, + ecfg EnclosureConfig, + exports []string, +) (string, *EnclosureSession, error) { + + // Parse gbrjob + jobResult, err := ParseGerberJob(gbrjobPath) + if err != nil { + return "", nil, fmt.Errorf("parse gbrjob: %v", err) + } + + pcbThickness := jobResult.BoardThickness + if pcbThickness == 0 { + pcbThickness = DefaultPCBThickness + } + ecfg.PCBThickness = pcbThickness + + // Find outline + outlinePath, ok := gerberPaths[jobResult.EdgeCutsFile] + if !ok { + return "", nil, fmt.Errorf("Edge.Cuts file '%s' not found in uploaded gerbers", jobResult.EdgeCutsFile) + } + + // Parse outline + outlineGf, err := ParseGerber(outlinePath) + if err != nil { + return "", nil, fmt.Errorf("parse outline: %v", err) + } + + outlineBounds := outlineGf.CalculateBounds() + actualBoardW := outlineBounds.MaxX - outlineBounds.MinX + actualBoardH := outlineBounds.MaxY - outlineBounds.MinY + + margin := ecfg.WallThickness + ecfg.Clearance + 5.0 + outlineBounds.MinX -= margin + outlineBounds.MinY -= margin + outlineBounds.MaxX += margin + outlineBounds.MaxY += margin + ecfg.OutlineBounds = &outlineBounds + + outlineImg := outlineGf.Render(ecfg.DPI, &outlineBounds) + + // Compute board mask + minBX, _, maxBX, _ := outlineImg.Bounds().Max.X, outlineImg.Bounds().Max.Y, -1, -1 + var boardCenterY float64 + var boardCount int + + _, boardMask := ComputeWallMask(outlineImg, ecfg.WallThickness+ecfg.Clearance, ecfg.DPI/25.4) + imgW, imgH := outlineImg.Bounds().Max.X, outlineImg.Bounds().Max.Y + for y := 0; y < imgH; y++ { + for x := 0; x < imgW; x++ { + if boardMask[y*imgW+x] { + if x < minBX { + minBX = x + } + if x > maxBX { + maxBX = x + } + boardCenterY += float64(y) + boardCount++ + } + } + } + if boardCount > 0 { + boardCenterY /= float64(boardCount) + } + + // Parse drill files + var drillHoles []DrillHole + if drillPath != "" { + if holes, err := ParseDrill(drillPath); err == nil { + drillHoles = append(drillHoles, holes...) + } + } + if npthPath != "" { + if holes, err := ParseDrill(npthPath); err == nil { + drillHoles = append(drillHoles, holes...) + } + } + + var filteredHoles []DrillHole + for _, h := range drillHoles { + if h.Type != DrillTypeVia { + filteredHoles = append(filteredHoles, h) + } + } + + // Render layer images + var courtyardImg image.Image + if courtPath, ok := gerberPaths[jobResult.CourtyardFile]; ok && jobResult.CourtyardFile != "" { + if courtGf, err := ParseGerber(courtPath); err == nil { + courtyardImg = courtGf.Render(ecfg.DPI, &outlineBounds) + } + } + + var soldermaskImg image.Image + if maskPath, ok := gerberPaths[jobResult.SoldermaskFile]; ok && jobResult.SoldermaskFile != "" { + if maskGf, err := ParseGerber(maskPath); err == nil { + soldermaskImg = maskGf.Render(ecfg.DPI, &outlineBounds) + } + } + + // Fab fallback for courtyard + if courtyardImg == nil && jobResult.FabFile != "" { + if fabPath, ok := gerberPaths[jobResult.FabFile]; ok { + if fabGf, err := ParseGerber(fabPath); err == nil { + courtyardImg = fabGf.Render(ecfg.DPI, &outlineBounds) + } + } + } + + pixelToMM := 25.4 / ecfg.DPI + + // Render ALL uploaded gerber layers + allLayers := make(map[string]image.Image) + allGerbers := make(map[string]*GerberFile) + for origName, fullPath := range gerberPaths { + if strings.HasSuffix(strings.ToLower(origName), ".gbrjob") { + continue + } + // Skip edge cuts — already rendered as outlineImg + if origName == jobResult.EdgeCutsFile { + allLayers[origName] = outlineImg + allGerbers[origName] = outlineGf + continue + } + gf, err := ParseGerber(fullPath) + if err != nil { + log.Printf("Warning: could not parse %s: %v", origName, err) + continue + } + allLayers[origName] = gf.Render(ecfg.DPI, &outlineBounds) + allGerbers[origName] = gf + } + + // Build basenames map for persistence + gerberBasenames := make(map[string]string) + for origName, fullPath := range gerberPaths { + gerberBasenames[origName] = filepath.Base(fullPath) + } + + sessionID := randomID() + session := &EnclosureSession{ + Exports: exports, + OutlineGf: outlineGf, + OutlineImg: outlineImg, + CourtyardImg: courtyardImg, + SoldermaskImg: soldermaskImg, + DrillHoles: filteredHoles, + Config: ecfg, + OutlineBounds: outlineBounds, + BoardW: actualBoardW, + BoardH: actualBoardH, + TotalH: ecfg.WallHeight + ecfg.PCBThickness + 1.0, + MinBX: float64(minBX)*pixelToMM + outlineBounds.MinX, + MaxBX: float64(maxBX)*pixelToMM + outlineBounds.MinX, + BoardCenterY: outlineBounds.MaxY - boardCenterY*pixelToMM, + Sides: ExtractBoardSidesFromMask(boardMask, imgW, imgH, pixelToMM, &outlineBounds), + GerberFiles: gerberBasenames, + DrillPath: filepath.Base(drillPath), + NPTHPath: filepath.Base(npthPath), + ProjectName: jobResult.ProjectName, + EdgeCutsFile: jobResult.EdgeCutsFile, + CourtyardFile: jobResult.CourtyardFile, + SoldermaskFile: jobResult.SoldermaskFile, + FabFile: jobResult.FabFile, + EnclosureWallImg: renderEnclosureWallImage(outlineImg, ecfg), + AllLayerImages: allLayers, + AllLayerGerbers: allGerbers, + } + + log.Printf("Created session %s for project %s (%.1f x %.1f mm)", sessionID, jobResult.ProjectName, actualBoardW, actualBoardH) + return sessionID, session, nil +} + +// UploadFabAndExtractFootprints processes fab gerber files and returns footprint data +func UploadFabAndExtractFootprints(session *EnclosureSession, fabPaths []string) ([]Footprint, image.Image) { + var allFootprints []Footprint + var fabGfList []*GerberFile + + for _, path := range fabPaths { + gf, err := ParseGerber(path) + if err == nil { + allFootprints = append(allFootprints, ExtractFootprints(gf)...) + fabGfList = append(fabGfList, gf) + } + } + + // Composite fab images + var fabImg image.Image + if len(fabGfList) > 0 { + bounds := session.OutlineBounds + imgW := int((bounds.MaxX - bounds.MinX) * session.Config.DPI / 25.4) + imgH := int((bounds.MaxY - bounds.MinY) * session.Config.DPI / 25.4) + if imgW > 0 && imgH > 0 { + composite := image.NewRGBA(image.Rect(0, 0, imgW, imgH)) + draw.Draw(composite, composite.Bounds(), &image.Uniform{color.Transparent}, image.Point{}, draw.Src) + + for _, gf := range fabGfList { + layerImg := gf.Render(session.Config.DPI, &bounds) + if rgba, ok := layerImg.(*image.RGBA); ok { + for y := 0; y < imgH; y++ { + for x := 0; x < imgW; x++ { + if r, _, _, _ := rgba.At(x, y).RGBA(); r > 0x7FFF { + composite.Set(x, y, color.RGBA{0, 255, 255, 180}) + } + } + } + } + } + fabImg = composite + } + } + + return allFootprints, fabImg +} + +// GenerateEnclosureOutputs produces all requested output files for the enclosure +func GenerateEnclosureOutputs(session *EnclosureSession, cutouts []Cutout, outputDir string) ([]string, error) { + os.MkdirAll(outputDir, 0755) + + // Split unified cutouts into legacy types for STL/SCAD generation + sideCutouts, lidCutouts := SplitCutouts(cutouts) + + id := randomID() + var generatedFiles []string + + wantsType := func(t string) bool { + for _, e := range session.Exports { + if e == t { + return true + } + } + return false + } + + if len(session.Exports) == 0 { + session.Exports = []string{"stl"} + } + + // STL + if wantsType("stl") { + result := GenerateEnclosure(session.OutlineImg, session.DrillHoles, session.Config, session.CourtyardImg, session.SoldermaskImg, sideCutouts, session.Sides) + encPath := filepath.Join(outputDir, id+"_enclosure.stl") + trayPath := filepath.Join(outputDir, id+"_tray.stl") + WriteSTL(encPath, result.EnclosureTriangles) + WriteSTL(trayPath, result.TrayTriangles) + generatedFiles = append(generatedFiles, encPath, trayPath) + } + + // SCAD + if wantsType("scad") { + scadPathEnc := filepath.Join(outputDir, id+"_enclosure.scad") + scadPathTray := filepath.Join(outputDir, id+"_tray.scad") + outlinePoly := ExtractPolygonFromGerber(session.OutlineGf) + WriteNativeSCAD(scadPathEnc, false, outlinePoly, session.Config, session.DrillHoles, sideCutouts, lidCutouts, session.Sides, session.MinBX, session.MaxBX, session.BoardCenterY) + WriteNativeSCAD(scadPathTray, true, outlinePoly, session.Config, session.DrillHoles, sideCutouts, lidCutouts, session.Sides, session.MinBX, session.MaxBX, session.BoardCenterY) + generatedFiles = append(generatedFiles, scadPathEnc, scadPathTray) + } + + // SVG + if wantsType("svg") && session.OutlineGf != nil { + svgPath := filepath.Join(outputDir, id+"_outline.svg") + WriteSVG(svgPath, session.OutlineGf, &session.OutlineBounds) + generatedFiles = append(generatedFiles, svgPath) + } + + // PNG + if wantsType("png") && session.OutlineImg != nil { + pngPath := filepath.Join(outputDir, id+"_outline.png") + if f, err := os.Create(pngPath); err == nil { + png.Encode(f, session.OutlineImg) + f.Close() + generatedFiles = append(generatedFiles, pngPath) + } + } + + return generatedFiles, nil +} + +// SaveOutlineImage saves the outline image as PNG to a file +func SaveOutlineImage(session *EnclosureSession, path string) error { + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + return png.Encode(f, session.OutlineImg) +} + +// CopyFile copies a file from src to dst +func CopyFile(src, dst string) error { + s, err := os.Open(src) + if err != nil { + return err + } + defer s.Close() + + d, err := os.Create(dst) + if err != nil { + return err + } + defer d.Close() + + _, err = io.Copy(d, s) + return err +} diff --git a/static/showcase.png b/static/showcase.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6fe627b65317d496d78262eae90808dc26cb1d GIT binary patch literal 695787 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%0DRTv~-agfit6& z4k!7bYC6bN(_7p+mB?rs#XZ2}JTByP{cmlE^L;Bn1+T)(WwVDHggfeCWT;_TYJsWT z95DB;P}DUc@zgq_t4JeO%xUj;eCk*k5uC5*k~K9Y9VCu{clnz@$#3$>tfZXuKj>YH zS93ev&o{n*F$VZBhJ(rs>LjZkWgk`ky(mM?y51TrKBcWojdkI_V0)Jh?O*BM zd8%bd!4|)aF_bT3HYIf8ORVxJ)hBrATm%thL zl{F#4&pM-FT4ie6j=kr3P`L4jyg})FVik0$_6Kg3RmLT)I7X8%)Ig_9<*d&Q&yN6lF9oij*8`u z)}rCHH4mxEugQku1`EM-h|L2k3zz8)4!DAEJWU74t^aPjq9SHEg&(U&4`Ac2#Au@$ zaAJw(-OB0Zdu!krO@WIHLO-R;fqvE54qcDI2?Ke(q;}U0F;A4kCaE>$Vo~JV&#gKa z_p}PnaOK&R-~s?Lc~G@$*DAY9y6t_*slQNO&k*juA-1Ln96E%zfvh$ok+vfes*Y!0 z6r;$sO?^hq2C%dG>L=xF4yLO6@=3K$>qgYOghq+Xli`*|am{$|pr8@>w+_J0e)4RC z=kc%CkZc<39};+su9UTBz3`RD7fi1A*(vmlGJv_@--tD-16C1W)1UV`q8$R;m3hQF zTldCNfhe1&8zNs5cxKHQz9t^*VcG>u=+lm|vq@)A{MbGi9-?>T&BFEl%N#tiHIm%c zIA3?q1GH~ut_>_QPluIQIiffC7k%ZpC&4}O?d@9G%@)3Nl`ahTJ{d#qI z__1bhz!laVYW#CX3bORyDk%I5j!N(&((4VoGWhVAG5pHKPYm8IVU8FC_UuI~w-9=5 z2_Uol3Bde!Sl@va!-cT=Z3{E24*yevzjkiT-aX)4)6Gz?I;PuQpV-q&z*TXMY6R+= z-HW$xP?T#521#>H2Y!XBbv#c;j zjVk>(tv+HhJG$2t4r(q*zZ~;HY$HM|E!Z+NN6I0>A0}xLAX$+%a!q|7qeroDrIn?2 zO8bQK|544=;2hilsL{_jECM$Xsrwylb+Ie?V7M{PS>@9PxhX0e&CDK|AIivnW6Dm$ z8fH4xyk}oxlrsyZQI_x_+BYoe-l|9%ExL!cW$QBZ8$Y`2Y@U;LoRu5Xx(nX0G9~Q2 z`p9+@w5CVrd3;HMjRuw>&}G~Y19xA@qg~_+p7WqgnWyS-T;VmZ*A3{V*A08c#+dA0QKcci=SMt90_p6_=QLUVTl48lPrX8PjGh8!Yt1&*7 zqmuew+I&E5UCZ-5YwAAp;;ng^ki)zmV*dmhGq9z3*iVvzEXxO*p<@mrscMRR67OjM3uUawEy5{SimjIE{qtbzy*Fq1>j ztKituRMAlnnGu+EhAz)Wo%j!{TyH(exKlxXA z0$K4dsNepw%E%=-Nw)F38^74=Bw@!eJe+!H*E7v^WrvA>G>F7}D2L-*VL8fFfjf35KOMR?Vf zrVpsNxF43qM!ryd%56TtJ0yNEy*&N3F@$&{KeaY`UicTyTlW%=?AIb!^ODl3?D(;N z!n)n&!GVw!aC=zyUg5sMZ;5<5px}=>CNkRg1PBwD*ll^Y*$OcgPnzF0?|A^gx zU4KCx4ta1$*!D1uw5>UQS0+1%njrDr;Q|UW&@_;J^N@T#q^qAV=zad0%4-V-`xR)H zSwF1aD>%AgVl=fyGo(3YYqGxz3|*F*9-lq;uqJHGOC`%q-U^%smwT5~C-$Abgf*g6 zm%_*+&1ymWBI{c=#g7WVY?g6i9;;=qntF3eK6NNk23O5=5@M|4fqIL5^7Cg^0Lw_bm zFg)dwvnRqgtbU|*Oq6sDlM@T&pgS(4-nd5AkUig!BLeB@$zZLL)3G0Z4;s@rZ^5K^b4m(*+ov@ms;=y942L&UJL;I-s3Z4(HmO%H-Qm<&>DIDeLv!5)r`_i56x0%%MO1&b zCj`Tc5jHmR+j6xug7 z0!WFv6I@{{?%wrQd;F7Ne08!pxv>-Xi1*1krA|N_a*uR**URk{tA^k@QB)8}S~Ep( z*^L_0R77*dM==bI&C%z-m=pU+hJ*xZk8bn(xb^DwsUVA3kROghq6z0WTPh==Izbqr zWRS6cgb;MykGYQV+fHm0U(x2}!3U|{W6m9SI4;BXVgi}e&P;_-$D=~^N^-WtVb_vw z%O9bF9S72H&(wZGBj306$}YR?uF%7E_K`o$?4?sLq+(;^rl$H1ulZy>MAwAAn{*RF zEug=qF`myM?4pRUF>0MbMZE<0`=tajUIOkau zlajvU{fE-y<$xfJGsL5b!I$<9(wi$X%s)z0N7d!7Did=&h95J}U+U!v4BhE+0yJq#qatB{)Y15_ik8Z<>en%Z0Nm(DX;y zF{p+vNNdE@esAi0R9lz%_2oBpbo(274t)$2co=x#4w5=kkha*rH?o!-bPcC1rC`=G zZ8Eo)t??><@wrr6FW7osDj@Wpq4 za!f=@B7QAfh*vW#T;vd58v4ecuyH4<%r~b~_nu;aWL)RZ_*90n#IB{9X5mgRovDK- z&(+%p$ihrQngnvQ6S-sxHc`0a9qky}tF$tsvv;+KGinFP zZa>|%`oX3IO^3DZNBq`}xVFQOepxMCV#PYyS4o zy>sHmo&Ur<&Y$rfU;q9lsMlS`6v|qtH8L!+Mqr^+AWOPP&u4Y=?G*_BSwkMxNfS8CaK21PReH}ax0(?`)2p1i=|F4T<@A% zCT-1+-2S3vxFfRj%hBt+at?}QY_=Qg^VHUtr`*u6_*q+Ha(mSigL65D#-?W*S7AUL zXEGHffPY zEg7m)7=`u@Y23`60)TJsME43XfHuZ=oHr(dw}~t-fz_-%L|g9i_m{xnL}@!G5+UMV z@@y`gy&(6QCu7tEZ7j~#8pY{ZgFC>)#HtC#LJ0XVmjytxdcKicF{v0-P6#ou=f_@E z|7C2G5pmEN8QC!5B;%ih8abd}2T}luXjP+_4{K+Vw0&5Q@wpJimr(= zI!^h*pI@i2Sw4Gjvl^kuh`Ad80J$Cc&Tpse@I?mX6N8y#O;+jyvI5*~sYqW_zY;-M zDqSG@M50<@czEo`Y#&66a7@U;QNc`;j;{B~(?@N#_uCJC`WlXh>wJa3x2X;d0vTb? zP;$72&Bn`fZ|g~37$3f1f&EUDwg6*ELq>&t`o0^{z4+}PqeDvw*OW^9p2YP<77?H$ zD8j)^-~-ixT9M$(Os0xw;A;ra9ITrTF?GP_kTRARdoO1Yq2aNKxKYSXCCy#hG(6Ts zFBx_>kI#nAeg{2g?=A9j2&Dyzn`gy#Q6>AlS9^nP@QT=mN)M!b-6-H~oGkvF*a@ zvz?{G{04WjI%(X{<%QMI{V$RVlG*5Um;2(K^~KGV3fCy7w;Qw{p8vo5#s8&=@D0%u zK0sm(S`-zpWQb)Td)(%+i^bTz-PRCas* z=ipUseyb&&$kT|xa-O#Pe@jEbHhac?RbM9rpR>unF%KmUv2ocrv&g!xZ(8?>4rJ2c zSV7@sS7@JBXbA_OKNr-?ySDH!N#3)_Lc+w~9$Q|nQ>FCsex&y-@|lg@YYSsa&>J9+ zMxmL$l9C;eQB@W-bADag|1JLit5c2>J&|}~_lvq%089j+p%MgFyVS=AB$83v2HrgM zJKZ+*rf{bWG2@JPF-71~^Pz&VXnR3OPUj)Nsc<2jhA5z9Y^Q`BmlzNvH4vGP zF_@Pdk|sE5ycac;15(lYzvz0asI~)c+c&s7l;G~}7M$XR7I!I7+}%U*;!p?`97=&g zC{7z7xVuYncXzqj`;K$&z31EaF%QWYdHAoa%=MddCbxckS1-^D`4@n{Yo9W<2%iYx z7jJ2?x#NV!7@@`jLuvy6swfkxRw0^JkJJ$YsWBlGFF_$_E0j|%*`4%SKcnPryxqT3 zx@QX)pJXDbcRkg6>ODaD6Uhabo_(6EPS_uNY~oWnhd;lu(K{(fN#d^IH)9i0yYGT0 zl1H2IIYW?`c&sj$Pv|njKLY3i$mg_(s#qdpF=gaW-aonwX5gV@Sex4kwk8DahL$cg z7{ge(S1IIMMLX`H$jEmbw5lDXogW`gbX<=o+muu{z}^3^NSGu7T^> zO|LdHnbE8iotJ+clQ&C%F*#!JS2>yP6d(K#$B8cGk+?SPKahS_v@aYtPQ`o1+{_Qo zUZqs*;iFGNVMqN*cvy_Ip06A(6~I*vPBZ(XUUDwlonZh~}{&BE2s@9@4Q24STxez2O?`Rjk0{(Ep)3mF9W zeq)u0k&04H-~9(tJDIg1sa|qR8!g@PYIKp)DmykOc4n#B`JW`X@I&U92HsR$FOi&# z{fF%%#$17sQQj|b3dTKEre6fLemPc>?s#V=kt$!-o=h9Yj*Zb%fHEl2-&JuQ3&Kxs z{o$x`5#?sJTvxu%$1>G3J)xj|YT=&V(?o&bE2=C+hYvH}>FNYJ<^&=(E%uZNoa)0d zS}P_);IXOmMdU+^kl6;AoVl#=U;DvInrj@nVxJ{WvYy5Lg)^6tWI;BJFPMq%l=xI} z{!B?Si&Ir6-|o}*=2*Wd3rYO4TnPMhV8wMhcVTOed8yasopQY+%S^nwjsh3@w&cwC z>HpdK{`Z6bj`B7N035vB5KwP3)?lj3W}R4fLSzMdC}8uJ%wB{N~{-& z2Rva7j;Dy-pABx6$KT|!|e!lr|&8~g$94Avw`Cjjm-p;+Ek!Sq1yUp34TsMj3(qHO@VM|%8?B4>X&ApMG2u@0u0kMhULl^x@A5f)dmR&oasDbfk~F5VG9 z9bkk?kK}_Ea{uN-`kXaz53MhCHb#b)IwqhO*r$tZ!@2r}9*JHafOVJTfD+{}_FIlx z5l-(2U_mx>z&F1(&3hJ%N=a*s)T-#^vvLeR>O&JPeX$VUe_26JP6O>J^<2Agce3di z1JDI33Nv28GdM5i(WrG!4$*5O9#MIO2gR3Pum1`(1JfOiOW(&G(9JO9db|&CkN0f= zR3!E=RBI5nM*UWWoc-qgf)#U>$W#2IQaq!cqNCP!mZ_ahZ$s6;x`AP-fI7#y z!zB)dx=WW>53aA1%q2}?wvzxU9W)04EAei@eMcOFu7;F^+c zdA034W7P87us9J$JRJUf(_@F>%dtw*Dvh~8+Bi9!m7^i*f)D;;fM&?qU;$kiojG1$ z1(&P0xFuZJIg@mhWNXY%@jEsLvCVN2=PK(&v@B7byr9mWrJm`Rpqy(B37_((={0?2 zqc3~fSQo)}XFB0D2Pho|_FU~cC8HO~F{8m>_lOXKBV~R+&zEZRI6H6+|1o!VF+~Fy zDgCcG`M>`zr=jQSq2wX_c?5gTUpf_2ch?YR4fQLdqcRlq%XH$frQ8rleMG+?`aH@` z5LXs%|1^QsK*B7-S)FoI;SJ#k>z_g7(RS@@+O2z1l#{fnI-VNHj0C@Mdehb*rR4n$ zp@ZtsI5Bz2Tpc}CSOh|K_jhD4KH(?6+oAgg>rDB_KP5+U*6x@uWAr;<`QgmluyDXU zexyj!F!jP&zH8?RVS$mnQG|uvW}79C=(7>G-4wv&NEehwio&L}$}&c}+5Q`hG^+~h zaAh%!%{X69&wB& z1_)~9$+!*<4qmro%wp<$4U3A3A~)X?`)}X5qrnrNR7^pHq<8C5JR9_G$7j*B8wc)> z%@5&+^c(&2dTTb%mKoypvwl%+$LAoBgZT+Xs=Eir;yW`I& zOr$XdK;Cs5BQIOv(o4`w=cd|>?bBx9*j~2woyr59XVjuJuk1Rg5Am+y|NC8rlP`oe zXVoez0J4v>v=kpD)`5`u_XcpFWpNnN#^LzygBME6qLqH_T7o-4GffOtsA2k6Sswn; z2;m7T+E7+=y4?ng)bII*l7GR!xR&XD{6)GgRQU{^{p;P3-cf{FSPPsg#X|DRYN9i| z>;^4!J=gKtG`DHd?tUkk6{3#~!*(af`gV+WXw>-8A1yl8%9fIH>iyw~-3M2u*)CvC z$6rO_6nwD8s%!yU%E|xA0$Ai*AcMUnJzW~>uv$U!oahSfa(jq4BBZqz6S7}yHU>pD z$y3x@|IX_t|Am5Cq~DoJz;9P=A9v;XmpOKx0g=?>)x3?X@ z1#KuG^1}}#*MxjDT)>hC&j>F3eT$967GcS&>?|jD1bho7XV)mC);qp=So-L1p{#?C7)03~3M&qU5 z?FqnLvOGOz;8&(5pu^@6_|vvN5B8uflV51fWBRVG<9sAZH+RyF-9Wl{({t`&)X+w~ zFD7}03l9UlcUr4dd5Yr2$mx1GPX;if63V9wumI|8v4S(u-)8*K1klPWrvnrO>mY53 z!hy&KV{WQ*pD8T_Ns-yIJC^BYYfH=DW`Ab1Di>sMkEwi9f#ma6C_?rJUvB-EL3`JG zc7W`)_KiHv=`!m}md}|}L~PBL+aR=qV)y?=Py}?p**$HC`*jdVm0u85zpyG?Mt_W?$;gN1MceC#&3~Wl7q% zl6~mE+NDds5Urx-qr+plgY&&#>|p-3KpZ&srBRo2&mI#5Sz4`^NqQqG`at19(O6Rb#0Tn&I8Z)vJK zTQ}3po`#WJ`o_Y9_n*ABVBxa|?F;W(X5Z|u40gJH@11OsJQ7l#eZ7Nhi@GdP7dG@- zgo$~I);|?X7%i?MnzoM8B#7QWK)HPbdsh1Itrf}$%u+kY`W$3d1si>B)$q6S(?5D2 zO`d>c&k^>d|6x0|r3^p>M07mDo~HfVF4!)8QWW|8gVL~27%z$U_!`P5xxo0+)CaNR z(|d2J(gJ*r5ux71Pzz@z&I_-zd*^7K%!rkOU}*4&c3!C z0)u?G(essLRxA$5=3CMd)GrOZGlGS?mwLZz$~j;2{;$9bz^MAyU+4w#O@+*pY-`wf zeED3OAN%F@=E*k)=QOGXdd1KBJ6BF@5;D9sNb#~Dw;j*09E}*&5ME0= z6HEvnee`Ta(oT!Tk>0UuANuAID}u$SXu(hG;SD2_5j#Q!B)Y56@*{^Th5zT!eTTvU zAl(_wLrL_MKos{0NMgr%lDt*+-7W{6Dz?)ll7^H?%65|Q{ve9>f*Xmzo3i?{e(6>k zU5!YAh#CdxZ7@3m3ZN-CrMWB4vO!&$+~HH1E@_aY`}rN+oB#qY!<@bY^B;qh)5*_T z4gMB8XQGIvE&scWK=*?y-buT_mI<}y5kzy(hji^L-f%&LlXBVa4>#0Ml4CY7r*|>x z)@TE03F%eC0K#LuBs{ISm#^pVA@YI&raIV|OwkO2v9XE756<|IrwibiofFAfOG`_P ze6Uo4C!Ng)Y^F`m#4*R~RgeYarx1qRJ(532OkX>g`^M&rINDVXC3|kSG@~Ww*nk$bZZ*4pWt0{W6y$t$6zQkL6O8#zXyd zhD*)d;Ijvrj|~e9AK~+Q7A{bm2v|@Jy%3VOG?!zgIVPf2U_e^6?gP(C(L4;&$-oa3 zqj@pq+n>rz0hKyy`u(<@BNNo;nZt$zM{Vm)kSo6_|vo5btV(<u z=1>Wy9OJ1QfUsCAo9IX*N&hpzK~N}kNoQ;0u~z=}D=0s1Qsp$&^Lw?hS_Rb5MJ_wN z=apoSw`Sg3COn#ew`WH@#=Js!aV(1A0-zJjxZ3u6s7GsrePWo71+H@NlJA01*yy&O zArgRRAv1b1OMA34(va|&BeDRr31B7t8G%2Q0?-PkaYlaI6rSVE-7yC)wzj`zh)V^f zcg+`J;e!UM@gv+RQI`O~1{{~ZSwDKHQ~-Lj*-8%%h73Xx7S+j@VvHm`(m1kgRr ze*8yAN^^@M9Q}Y3oZPB}xZZr2&C^M{2sM(i!aXZb>a$B4Q4VL@l7wCaQ0-^{z7ypa z#~jNhqAK+lri5X_*J?VB%&JBYs-H_%Op`wSLk$?;3?q8?|Gf|Y_ra%h8qS6aZ+iW5 zFVHSeh5&EgM&!0WVNlitZ#~mj1dUeY;3M)g0=3P5w6T{hS&C0XEbs{qR36v7AV;qH zCr=r8syhfvOAFMaIYkjq@A&C2&A-5DgN+NX6T_Ob`N7TQa;SD_d`` z&ibY9Zg~jY*CM@}WyDLq{$yP(V-9F(ypYU%K4q`h7&dgDf5#D7Wdh?CLggw( zakf5pUMA@Gq6{1hEor46S?S{sx-+u4_otmUlN4&&s-^0T!(`*E*|j$(W>~&=@okg; zQqE4az_W3Oy4x+$4iRtX4{_~`RWh5}I$vgKs3&bI zX=g3{ZAi0(=wReZMYRpCPR9QyH!Gn7{0=b6PXxOG3W$y+!aOZ#p;SEkW zZN3q~{cyiyeb>w}e19?1hUOWZR-cn%BU#*Plw*+=bT}?7j2UU&tle87A~^YHY)34}x;Z0CxZmpMF!4SU4X_st2rS09ZVtaX zNJKeRCL>@!7Y3NWj5{0T=KP+Px^cC+vVQyOIiqV(`Fkq&*TE@Jk1P6^&5`pW4Hr>X z5nQ?$5B`3v!ba}6z&h}J)s8kSLOv!y1qe76xa{m!(#znyk=Hz5!bxB^4)%y^Op}qz zM+Kx!OsS33`bq0In080fe>C2{d@#U@A(x}$SAFS)XAC{x6CeqNhFvgR^w?m0XOheL z+Bb;H@B_g4dCc;w^G5XnH1dWpkcZF?XqkRSqwK_`&6IOSI~7t(dVS{i&OX^%{de-# z9*MY?B=%3_6M89sBwnP9bVAjeRnpw7A5gREFB(^SX`e!utqt;y2h9!uLc_tmuxB=(j3hVDbWEdoY|V46=6{H#gs2S8 z;};9oe4scgLY?iz#ILh_wwBlf{R$t|Zt#@RW;^hGw)TxZi(PcEAlnvM#!j)3eJhjE zSF7@5-<&cVPEg(b1~j!~OXsIJ%7-Btr}ZBj7b9K>E*^*k5V^AYywCTtp0az)8%ub5 zAJ`f0fMfAa9I-V9v7G7!LN6c+?k6GXB6m$kR_HB)k`gI{2KzPL8|R;cEX!{?2SL6v zCzf05nPyi|^87Om;^xrvu*^?ptvZlONJMpV*UouP@56++60dgIK!>2-%hcw_JQDyO ziz3QwaR{<)BuvNfBf&x-BE2__tB>s%#A^s+oYp`Jnl#+s@RuoBA767X3p;+|(qB}g zkAi5#48Hrq*L3e?yxexHq#kPB#iU~j+1N-+{;#!LWrw$Okhyd5){Fyt8)_L{NXR^) z{GS3xn-3l-HX0ZRIcna?trfB#u_8TQe8`M3|7+R!kEhiLUFrApq^vA|GBBp-ab03C zugS#|H&<};@|1sU*`%GYK6y>kQvQJGwo?s#&DL|K##Z^l?21vYrxv5ptd8J>*sycY+@9V0BnuYIX8yVMIYir**&6*Z zM9bvcDX4FLE4_)4~3A1Lv9*{~Su)>xzoXEEEGkjf5|H5TKXedqSQd3UJu)CX8EEs0{d;@z3Qxz=a z>xS)o+OGWF7c2d%lCINEa!`cm@_r`2l{gR4N!)-UGqoAijaORtb$?SMPr(B_1m&<^ zpe&K3Gnli?1+&tlD?fBhrDrDKh|ZZb4Cg#BXw6`U_TZ?v(u|Eb>u!8Qp`LhyOghxY zGBrrZhbiCm%J!Mgvtt5KKQ~De!e_A25O zwYrAr>>tpv@Oa4#2mWqJNG?AMSYSW{2iM=>YRmNiI#a2OlK2jVeR`>e(<%|az?xM} zymi(?paw6MNyvL>J)jjUE?E0_PD4?mO;tQw8hmiHedad1S}H*Kt?H*v5L4Hj?A|%i zbCRUpm-!7O2ahrIrMjR|VpD1Wo6g}l^SxGW+vXJu+FRD{d_l0~IS0(QTD#`+piNu` zTrB!9vD+)E8ta4>NeuAb2M}97Z*vZxuzB+UAWyIBjU{~WuuL9&=>5!UGZbI%;DH)Y z*oi*+fvd1h+$y8=i#yf47?qUYxB4Rlz-Dd!+U|eQI%Sg4bJ4&8qrvBv;Wtv@n&E@g z3N;7%8rM!OZh!EM0~?1cv_PB}vw~YsSDGP=(;O$~pFf#pEtcpX*L=4u+YEdesL=c` za&jT+pd}namQ^9TuMOfIblnk11$>UAR~iO?-=A%bRAX&>l^ImLqi1fmW_}bdm*ZBo|be! zA$v)*W;>B=&osdAnc<~BB5bRyMxPMANJt9gXq|MKga3Mo^{}rZ{6aeTWyV}Xd)UT9 z+KB={64W(qcsLyE|10bzbkY!RO{~iFY~m2DuQV<(qx8g%bplO&GM6%2b~JX1Z<*|l27x$p>{{oRO@7rcDOHrcsQ984iKp*AOw*rp47mBR^42sfB; zo|GwjYBm{27B+B+t)@XrLZB*yk+3!+{oDQLFt33>Aw+py@Vr5!M>wI>%CE(Ka|Ieg zNkym&1x$T2-3~@@Dk60Ov966Ncv7ZNxdFyLM17v?j_i1~M*7DW)&yuJ>=ua0V+d)t zzx&#%+Lwg1_SOK&28Q(0nn~FxS5ZzS;{x)%b3iAchn+afCU)#q=Q{N&(RM0R*Qe|) zJEUs)aF;&697y(#C#au&T^-^8=6|EC4(lri?*Q+G*)ffo6$s^z|z%h^qnj-kkXd*%=7C|8bp*YnsCj6 z^&6o3YX;+<5Odse|AyIL9WC2kmmg_3hV#FT-*2dNmIu)OWI-AkA`^JW=7KNRL*9BR zg1dwE_v)WmWrYV#pVOLak+cKyzIe!Ri01jaM={KSt?dkCg?!yR2sJ7}S$*%mgsuIN z90$g|I`;8t8g=MxqnX7rj}P>~I4u9ccHl#)w#kR*@4j3W4XxJ^{zS#d%(fb(m7ONx zZPdsGS6HvdKh3{@U}Rvskd=^9S=Vpzdw}X!+O@}k&=Cjer+ZAb*<|uPN>Ad`LdH?P zcyk4(^&@+!z49333Cf9M#7tKnJ^}xU&$smhsoO0!cg|jbDc*v2R(9&~v{cp8!n_ zm=62Fp@p8~ud!!@w9TSn<0u6oq} zCo6*h%^m-n5kf;GQHUU0Efu+ASnXb^^7RF+5?Hh-1ZJMJfle->?yTpXq2xI3OvZ>A z$j7j+BKxNabdpk-KQh{V5_ooh@NKhf>ERT1vk}@HVibvJd!a)@%*YbG*aJBj@90B; zgLd-055@9|ZScv;U^mpSuzKiSfA1q#!Kiu$%49S8w)$yMX8dO-WD8!I%s{C(MzLWL zK4@wGn05>~y(FrD{pYPy7J=>?p;3cn_yHlf>-sPFiKkxmzFvrU%V!abdfl8JMu}yp zPG-De*+rR|-Li7vyC#JEDJk1E$|i`Q^W0Sc|MN^NM2e>Br)jb3*3HAZH-$IdKaA4! z+650-ST0uQwcHUhO+UZgvSqNij#zludo+SWVP8C*Pb)ryz@5B7_+hy7m zYCZH%Oewz7=bB}Z$9&G2fr!pdF_1V{I-+1Gqb`^-w>Z%+>NdNW*6n`l$MT+|ZSbPU zJ+oKGV{Ul5Umj`74TTnq>6+9JDaUW!rweNpXMY26AA_VQGj8&Lt7`?zjhY7x?ioOh zdX80R6c0xvQm50`p?qpaQ~+``IqEI$0(Sm&y7u56VszuQq0eU>63!*)GjPS%k>{EzlJV5YHg zJh+H#iaQ#uRL5-kD#{ny$DHh(y<;PFdTMlEfB)`fBxe4MoCfj~iw0u&uRF`Xacfkk zJ&PwM+6CM_Yb3V(mg3%1uTIVA@4uOf9W4Z(%=a8XO{ugcLt#{#$!0ZoT%*>XwNUg_ zk-_6jr?yD+T(b%DC)ZS2t}dn!?KS^cihRl-{pC^~1v6Ov8B))6Ob&B#_c$8Z9BanI znOqyi^P5!gOx5#@7(h+f_3r-7--~N017_H3u8fAQB)p14x1u~fz(O{!CQ&(Rs-iQg zMcKSFI)eyhvH7v%LJ$S+dN(tGR$-L-Wx<|1R5;R_HsuvH^r?Ha(!!d~D((bD6l(^v zTI-ZT)?3{gJ_=x0-QZ$Dt1g^|>!LaFy!zncghh{0KxlB%rX{=YsDw?T^Szn$aPK5D z;qZk4PDhFKdCcNr__iSj`I0I9_nittU#)xZQ6(z?OXCKl-ZC;L6<9tzro_g)j;-|SbmqC?NjKE*5TQOw1{O^Q(LRqlofe%`LQEv zbxYpb02#aLUmE(O$pTkzM%>z73Eo%{lNCBH7Hmw@669QKI9kMpjLOg!=-w;I1rVh~ zEpDG%c1%{tWYBOJ4Hsm!WF2z9pa@5m zhVP%{k+-j!1-5)<_nm0I^#-R#o&_)K@_C1y1yZ^51unOxsDv!f zAes<2KUwmbF6X+yEA+0`bxqTBXqMadnYHbfp$h>Bv~kuhPTNj$mcfE1z4UrH8Bwf# z)4(})r<;K)&2a6t^`-k!%{>Ifs`X}oBQ-%cN!}qa8bw=6~@5x?;Q3a zc@Pc|aEhJf(|UY_g1%beni!F0zDr{A27n%1+{oQp_^KOA;_b2h5m0%_#wLa6&CEv2 zRH8oSmZyp3$^p;t3ZNgwe-+JrQ%zo9yqjR33+OqE?wi;PG`hgX(CPB~hN={aM9YU8 z;g36GP@IY~+I!(AV!1KspLnNg?v{DT0}6HF6z;MCC88$fT@gg)9&aDj{)-y6qBjI) z@uF{j5k^0}{Ns8W{Zjd_RX^jRA?I787OgfnNoWt^_H_Ssb zd@T|0LUA!{E0k+!XyLI$D2shU#o5Y#Idt@R=?@XG#(rnV#oHCHS>W&NuZ0{cy6ThQ z06x_~Fa zNAP>g+>2axa&P)dfbA+9U#g03t{mVUJ6^DR+7xJm2jDP(TM%M zWMqX58~d$c{uwg0_wMwgwWw9{C#fC-lFEs7;}+=GfUyC~hyQMSo=%YPIyTPRE4WuT z7WRqI6P%l;+rLFrF~B)>OSR{QwrWLvsaG*_i76}oMsb!IIb&#({PL&ESJkH#bYM%z z$i#zrg1R0iJ~X->bqMDQyh0(Mz&f7fkW=-}`E0)HLSz-!dUFq9Rp|Q8X&O~UL4Hzc zen)L#g&F#>Hz5|#){yQBR(_<)KS*_^F9}V`roG9WmjP$d^eh@R7zC4P1Mm0ZkMtxz zMEiVsy0v~vnUQsX=P~4Zt_R@n6@Fv&md5o-1z644({Z52`Z<4nFiZ(94$eB2xLr@FST_}5r~v{E+kAhChwKOh`ApHE!RQ}H=8DS4* zaa^4T0C5n}wh9cY$DX?-uldlP*{K@*bzvBir(TUY36?6r&-7tC7m|WgFRVK)_=*|qJg1!b99&r60AgFwhj<Hj&~z0uVv zKU{^f|8qMqX@e`gRD79Aheg3`Q(ZnFM}}5F5`h0_`cI~g8i?MCu*aqcc_V~Y@lfH1 zylP}Y<=WQ9w8^r;St7j+0-MG%PF&(qAh}eqHiG4)Xx6{vQ-Ive+zd~d$Lly5%$)*6 z`_{|W-WPyNKZ(+#Bd)^AKh*!!Su@xi0B7hfcL14*QF;bqm7Xte9$W%Ps)lmvi7kLX z+Pq%b1TQu$x7tX#x44$sc3{_Dh_Yw7M84%f-(6kGOlXL*|7cO-D0>_J+#~AWaI`&u z9i+NAUuHa5Ln~pCkP+}bTOwli6ASK8(q}S1$xpmi(h3@f#I2|hQUISa09^y$chd?q z0J!m7)B{Va5KgwHck)xALQjOUs3dHSLu4_Cr{hegxU*3(q zY}HC`3SZQS|Gnn;x=n%qyM~CI@L>c%^P^|$YdX2Mk92}HhY!pQVaV^pFyanMI&)71 z+$6gCR*g&IFtFb$2b_s3sOCvHBf76L$EYGXs=f&A%ugCSbFb9pWZK=+E`&HOf57_t z4%+G#%?(c&qHfEN3g;|PF^3c?-V+Qc%(}wKW!U&m2vDLq8Aw&g$KpPu#lwO0#lQO7ek0I_O#u2oJRlK-<{?6a7^rAhPWO*PnWtlC4d&E&;eVH_bsjUA zNpMr(y>p{yS9lsIE?X{S%C8x*U1h7Cz>94AV?YRt+=bm zxj-Um#77`1u8F)~PaTAO79q1EcXygDs66<#^c9Rm-He+5G(^w1F5ud^CI7Sv;I zG(_{&jMw$05O8_iyj@)HLFPUL<7Be;=hR|3fxCvEyG8lUT})smd9>Y6&7DFIs*{!8 zji+1CCgcL)_K{5j03(hIW&c9~ZDYn`=6}_8IiYbq>>h@~bO{f;ETUVaLbNYz-u&&7 zl5=DQytn<3V!}8InFZ~MBK%eL!6(PHX(Xvk;fKhU%6Sn4y>3D4WJ!5hv0jUoI~rS+ z4>M*hNo&HkQJWgu>w7yYYbuXwUwq;i%1w6?tXth^R&~O_?IxDb$zAJz0Vqz$HdY|R zIv>X@Z`xADquxY$ul%LFRTUA8UP`xc;EGCS^kNG7y>?-^%xw?*_nk=pLe7D?gm$k! z^2>j$maG{v70-7LE4;JoKsGAam|8!^^gg3#G(UcFV!#d^+_}$b&qkXrLF-Qg8qOdlmyNI0t%0#>qgRr}Z;MIy6cA`mX09P3DKB z#5ZSRnc^_I6FTJ7xXW3zJVVEDEfs$h!n;9~Z{=;MZF252gYZVKN9C|S?4yT_h-*Rs9Jtz2_&Sa(n#LIFHeda@ z{`@hKCQssnP<(pM^THOu=dAH%ZL|a~tzO+v_Cbkxl*3qIWfM!En7e<@s)}K{0g4tx zy5jI==#_TJt1+#9PA+%jq*SglqZH}VJeE1gmp~1&ti#>__%8FcJQ;CFvu+*K9*eI- zL|Ca&QBE;@GPjYe;|f*S!p%4QS9;x-?NHb&qigW*E0V~ ztr975*3?X>ah6mv_9VEn@`NP5Ir^UA2uZu%{6NBA3blFz6IVr<4~XGY#blc_Z`6Y& z&87;reP%giT@yCQ2$f21%(%$O$uBzNzwz4%J9&_tP?i0}mz^Ysh4`%o3w#9&*4dLp zedqXZA#rqWDox@*aC`fShYCbrjP)+=K0t4eP^LJ>AJ=@xI$bl6zaObfl~}MFz=1bD ztLn|5C5LylfDNw1FW_|ozEFvdJ{_}LW$!({8~gy^L6++W?8giJK*q7Y&&Pl_~=X8ao$GXTU zwYu}=%ZDD$`VrNCM6I{h2={glSFdh=x?ndOZBE6=V%ooh$w8QfFJmT-*&0rfH{v6I z@PW_EZ_vo{ZcY-mT-kK%ug=mCJP;z9BFN*8^F|bL(FtlP-M4IuqE1mr{ht8xFb+yp zBFYUM%iE8kPY0H@CYAW7>nhhHQYWBymiOlpBanj@DO3Mb?oY# z7B`L#DwdBo~<>%HJBIi2Wk0sNtKn2q$Qv_iQS@pvvascheIt@uA0s^Uv7j*W==QuNo~G!al0+BO^<&T8y zVCb-gO_t^>cAYLbHk zD!)tiH6}shzZdrnIa2x!m%m{mCwhlThL(+DZu>GZJBc=YM)mbJ?knNnc7AqkFj?PRQl5O zcxj_-)Gq-EESM5RD;NS%5Y4*}Tlm2?q{)gqg?CI4KrPSQcBj9qJvkWD=IjpxeX_FK zh+EbOAX#n0*J0C6Ui}4cW^)L4cIx&I(OBhp(&Ekdq#|f0D6lP!88*l(7#lUcyFhxu zD-?qqoKPr`q|8~}4x*3OM21radt>evCbyO!?zn=mxj&qJ>=4%)p>8xnhHJckC0pO8 zQU&J5E@J}pSGVB*%doZ0Nbbzu&ka>h@9#0X6}9Aq}q6qFy$3O~~`db#`Cgszgzsg~Hx zdPU{rs)j9GC%*y&DJ#nfM0Th2Gqs35L|>&~Ex~23&KLXBTV|VVrt6)V2(-At$G$rW zlhFd0su>ak%WM@IPVh* z#^7|}(X)vo{pi7tKzq#p^^EG#jvOrQReK@1WEq!!3lJ=;#$fuNEQ}RXa0Ctf>eWX= z=J38-h{PiX-+bNcAnGi4dLD1S+;=X8t#WSxg;I%KSneXz1Y6&ckXOF?L8vu zv+lVS%wkweBlgTtF1$-5^^Q?)BtLzOcM?$gS{L9GXV$=l*uyhI>OGrnZw3%kbfhRK zEiV{h49dEnP$o&Sjq2s1rOViF!JBUpQ2+5tKV%?5g&t??b$V%oRxZL&nRD+?fuML= z!ZXV(c0wfW*pRG3q|U(+tpDlayzLTB9o#z9u)Hq}y{fRRt*;k(SR)8`5OZ6)?b?)$ zr;lJvzavI>ZH?ihTQgdX_^R?DQN&Sh_UY~5CY7Ll{9l;^a_!B6pg)7}ceHOU#Hw`8+2aFs zMzWo?kCiI&AFKVem)j2Qux-HoY0CoM#6dRUv~7>iH}*brpa92?RUpP{k$k^u1z&Zf zK=~RQ|4Zk+HgURjLk4oahvR)qDw%2j!6z9tLXDU`i z!;VV6xZTb`%L<@1NmO(nS&YHJKsIGsC6{}(%hcFgNwJbyy}I~rxaSd8o9k(*tQCyeR7 zB%*Uv4GDUZ?Y???`M)>Iox6`?RovejN6807gRkSrER4G7@!oD$-c%A;s6B8_r_4W+ z=WSpgEG}qU{GQR8e%1PH_Z^wp^`I2GAmv}R$O9(b(Ma%18>7G;9q(ro&}aDQ`1iij-Pq5u z{TTGqh-JCP-3(@hXn+fMhPFM&JdK<@;sX-v0n}cXQxsD5bq-KBk;Cm3sPWG7paHt= z`FcD#fUWNEjY2u;neFLB{La~ZYC|-aMwXPU-SCzOV=&+?oJplhZZ{rT*+H*N0+oTY zZ{>M>ac0qNu_X!PdcUPnK=0erAdY2E^)Od3C%OYeCuMTt@kHZEqukBLg~d~Z$f*+H zk0pdk&A;tW^=$@Pc_cEWUSsTn@XLkD3DU^9rBi5YZ2aK)U^ejzl{9D^Di`-jsuX-UquRLRz}Cn?_L>~$rAd+i~hs| z=`5_Eb&OIYCGz)ff0}eB-)Mv7I3!{TT7Bh?%ytQ;pdWH@`JqP9wpp&I=O0I zTI6`T7l{g2GK!OdS|ygBEIpI+Hyf6|POHaPLMayKX_FZXblgiqs2Csx9U!ofga@;6 zsU<+2q)1CqTz2zXBA~5ibsvSKmgNP`37zY_Tlww%=n^C`Q-^DntH6o$mJ7?_;}|2h zYZnn)9_nEc#ntVe3cOuFV%ky-HRqOTn z_ee+vrA-zDkFK=b3qbMhmu^O|H5;l&{2&VUO)arA*}*y)>XXkrNrrc3V&{O~F`{-= z=({1pKi8CWo^gbKFgRGpc8uHsYyTt628(D~`X605j?VuTt%eA#tUx5IrBGa$2#uz~`IZ!2Wa|Gdted19t3z8_QGWBcEf}DXqCg5Fp$ng2Ikz-@{QYbe5Vo+h_^G@A5mv~?)jA@mTqT6Do+xD?lzSOk zYJs5vC!Z-@aC$~uiVW=}QQ_i9h#JQKpA)!{bAI3KisjS3A|;PaORh5Pc6AbEM)JS8;n&8FX`mqTk;^YOQ8bCoGplbhpto za=Ck$vhEaqly;5mG!**m&u@GF`u}3uE8z1 z4Gswm5Zpb4KycSV2MYw(V1tFh32v9~R^6)mopWmUpZ?ihU2pB)Ywh*iGjuMff3+0z zftXz_$IV8I7*@Jh;tgvx?^K-^W{j`6WL9Olv@&5Gkus9E^NA7_!ev=Cm`=KnzVqBF8b3ku2OKa|4G$nHOcZ8cRkQk&%4WD35yz%GU+=vIb` zqKIM&f0ExQhdYTWl1K!PC?goL! znA+)r^^RtKcO4D0UpBO!|7R@f0kyszAzNTzD#{+CH@aWV3ItN+_HjF%~O)~?su zh4(}U$ zjW_VvT~}1EYGz+t(YwE;>abo;oJf|cXjrCG(Hj^4Vnf8MaWB^XBx}5OjKQcz>uY@_ zo=bd#;W38uA)0I~05D&|BE;Wkwx7;WE^7!+DQFf_i~#S|@9(_ouHmI8 zOWP5Gi>42b+gm?PFdW#zx^pmm^D}*9CHM<&6hK1##@dSQ$j6YSWq8-XVp#jUP861- zuFem#gUINSq)mW}*J&Ape7ruryA-aCP7G?DX&dAxLGXC|EpT*RZcNq-wA9Nqf`hz; z

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 z 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

-oLl);~@^MppFRWVw7Nq83uGdeaX&YGVaY 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 literal 0 HcmV?d00001 diff --git a/static/vectors b/static/vectors new file mode 160000 index 0000000..d1fdfca --- /dev/null +++ b/static/vectors @@ -0,0 +1 @@ +Subproject commit d1fdfca1265d2c295318beec03966301cc5a4d5a diff --git a/stencil_process.go b/stencil_process.go new file mode 100644 index 0000000..1b408ad --- /dev/null +++ b/stencil_process.go @@ -0,0 +1,403 @@ +package main + +import ( + "fmt" + "image" + "image/png" + "log" + "os" + "path/filepath" + "strings" +) + +// Config holds stencil generation parameters +type Config struct { + StencilHeight float64 + WallHeight float64 + WallThickness float64 + LineWidth float64 + DPI float64 + KeepPNG bool +} + +// Default values +const ( + DefaultStencilHeight = 0.16 + DefaultWallHeight = 2.0 + DefaultWallThickness = 1.0 + DefaultDPI = 1000.0 +) + +// ComputeWallMask generates a mask for the wall based on the outline image. +func ComputeWallMask(img image.Image, thicknessMM float64, pixelToMM float64) ([]int, []bool) { + bounds := img.Bounds() + w := bounds.Max.X + h := bounds.Max.Y + size := w * h + + dx := []int{0, 0, 1, -1} + dy := []int{1, -1, 0, 0} + + isOutline := make([]bool, size) + outlineQueue := []int{} + for i := 0; i < size; i++ { + cx := i % w + cy := i / w + c := img.At(cx, cy) + r, _, _, _ := c.RGBA() + if r > 10000 { + isOutline[i] = true + outlineQueue = append(outlineQueue, i) + } + } + + gapClosingMM := 0.5 + gapClosingPixels := int(gapClosingMM / pixelToMM) + if gapClosingPixels < 1 { + gapClosingPixels = 1 + } + + dist := make([]int, size) + for i := 0; i < size; i++ { + if isOutline[i] { + dist[i] = 0 + } else { + dist[i] = -1 + } + } + + dilatedOutline := make([]bool, size) + copy(dilatedOutline, isOutline) + + dQueue := make([]int, len(outlineQueue)) + copy(dQueue, outlineQueue) + + for len(dQueue) > 0 { + idx := dQueue[0] + dQueue = dQueue[1:] + d := dist[idx] + if d >= gapClosingPixels { + continue + } + cx := idx % w + cy := idx / w + for i := 0; i < 4; i++ { + nx, ny := cx+dx[i], cy+dy[i] + if nx >= 0 && nx < w && ny >= 0 && ny < h { + nIdx := ny*w + nx + if dist[nIdx] == -1 { + dist[nIdx] = d + 1 + dilatedOutline[nIdx] = true + dQueue = append(dQueue, nIdx) + } + } + } + } + + isOutside := make([]bool, size) + if !dilatedOutline[0] { + isOutside[0] = true + fQueue := []int{0} + for len(fQueue) > 0 { + idx := fQueue[0] + fQueue = fQueue[1:] + cx := idx % w + cy := idx / w + for i := 0; i < 4; i++ { + nx, ny := cx+dx[i], cy+dy[i] + if nx >= 0 && nx < w && ny >= 0 && ny < h { + nIdx := ny*w + nx + if !isOutside[nIdx] && !dilatedOutline[nIdx] { + isOutside[nIdx] = true + fQueue = append(fQueue, nIdx) + } + } + } + } + } + + for i := 0; i < size; i++ { + if isOutside[i] { + dist[i] = 0 + } else { + dist[i] = -1 + } + } + + oQueue := []int{} + for i := 0; i < size; i++ { + if isOutside[i] { + oQueue = append(oQueue, i) + } + } + + isOutsideExpanded := make([]bool, size) + copy(isOutsideExpanded, isOutside) + + for len(oQueue) > 0 { + idx := oQueue[0] + oQueue = oQueue[1:] + d := dist[idx] + if d >= gapClosingPixels { + continue + } + cx := idx % w + cy := idx / w + for i := 0; i < 4; i++ { + nx, ny := cx+dx[i], cy+dy[i] + if nx >= 0 && nx < w && ny >= 0 && ny < h { + nIdx := ny*w + nx + if dist[nIdx] == -1 { + dist[nIdx] = d + 1 + isOutsideExpanded[nIdx] = true + oQueue = append(oQueue, nIdx) + } + } + } + } + + isBoard := make([]bool, size) + for i := 0; i < size; i++ { + isBoard[i] = !isOutsideExpanded[i] + } + + thicknessPixels := int(thicknessMM / pixelToMM) + if thicknessPixels < 1 { + thicknessPixels = 1 + } + + for i := 0; i < size; i++ { + if isBoard[i] { + dist[i] = 0 + } else { + dist[i] = -1 + } + } + + wQueue := []int{} + for i := 0; i < size; i++ { + if isBoard[i] { + wQueue = append(wQueue, i) + } + } + + wallDist := make([]int, size) + for i := range wallDist { + wallDist[i] = -1 + } + + for len(wQueue) > 0 { + idx := wQueue[0] + wQueue = wQueue[1:] + d := dist[idx] + if d >= thicknessPixels { + continue + } + cx := idx % w + cy := idx / w + for i := 0; i < 4; i++ { + nx, ny := cx+dx[i], cy+dy[i] + if nx >= 0 && nx < w && ny >= 0 && ny < h { + nIdx := ny*w + nx + if dist[nIdx] == -1 { + dist[nIdx] = d + 1 + wallDist[nIdx] = d + 1 + wQueue = append(wQueue, nIdx) + } + } + } + } + + return wallDist, isBoard +} + +func GenerateMeshFromImages(stencilImg, outlineImg image.Image, cfg Config) [][3]Point { + pixelToMM := 25.4 / cfg.DPI + bounds := stencilImg.Bounds() + width := bounds.Max.X + height := bounds.Max.Y + var triangles [][3]Point + + var wallDist []int + var boardMask []bool + if outlineImg != nil { + wallDist, boardMask = ComputeWallMask(outlineImg, cfg.WallThickness, pixelToMM) + } + + for y := 0; y < height; y++ { + var startX = -1 + var currentHeight = 0.0 + + for x := 0; x < width; x++ { + sc := stencilImg.At(x, y) + sr, sg, sb, _ := sc.RGBA() + isStencilSolid := sr < 10000 && sg < 10000 && sb < 10000 + + isWall := false + isInsideBoard := true + if wallDist != nil { + idx := y*width + x + isWall = wallDist[idx] >= 0 + if boardMask != nil { + isInsideBoard = boardMask[idx] + } + } + + h := 0.0 + if isWall { + h = cfg.WallHeight + } else if isStencilSolid { + if isInsideBoard { + h = cfg.WallHeight + } + } + + if h > 0 { + if startX == -1 { + startX = x + currentHeight = h + } else if h != currentHeight { + stripLen := x - startX + AddBox(&triangles, float64(startX)*pixelToMM, float64(y)*pixelToMM, + float64(stripLen)*pixelToMM, pixelToMM, currentHeight) + startX = x + currentHeight = h + } + } else { + if startX != -1 { + stripLen := x - startX + AddBox(&triangles, float64(startX)*pixelToMM, float64(y)*pixelToMM, + float64(stripLen)*pixelToMM, pixelToMM, currentHeight) + startX = -1 + currentHeight = 0.0 + } + } + } + if startX != -1 { + stripLen := width - startX + AddBox(&triangles, float64(startX)*pixelToMM, float64(y)*pixelToMM, + float64(stripLen)*pixelToMM, pixelToMM, currentHeight) + } + } + return triangles +} + +// processPCB handles stencil generation from gerber files +func processPCB(gerberPath, outlinePath string, cfg Config, exports []string) ([]string, image.Image, image.Image, error) { + baseName := strings.TrimSuffix(gerberPath, filepath.Ext(gerberPath)) + var generatedFiles []string + + wantsType := func(t string) bool { + for _, e := range exports { + if e == t { + return true + } + } + return false + } + + if len(exports) == 0 { + exports = []string{"stl"} + } + + fmt.Printf("Parsing %s...\n", gerberPath) + gf, err := ParseGerber(gerberPath) + if err != nil { + return nil, nil, nil, fmt.Errorf("error parsing gerber: %v", err) + } + + var outlineGf *GerberFile + if outlinePath != "" { + fmt.Printf("Parsing outline %s...\n", outlinePath) + outlineGf, err = ParseGerber(outlinePath) + if err != nil { + return nil, nil, nil, fmt.Errorf("error parsing outline gerber: %v", err) + } + } + + bounds := gf.CalculateBounds() + if outlineGf != nil { + outlineBounds := outlineGf.CalculateBounds() + if outlineBounds.MinX < bounds.MinX { + bounds.MinX = outlineBounds.MinX + } + if outlineBounds.MinY < bounds.MinY { + bounds.MinY = outlineBounds.MinY + } + if outlineBounds.MaxX > bounds.MaxX { + bounds.MaxX = outlineBounds.MaxX + } + if outlineBounds.MaxY > bounds.MaxY { + bounds.MaxY = outlineBounds.MaxY + } + } + + margin := cfg.WallThickness + 5.0 + bounds.MinX -= margin + bounds.MinY -= margin + bounds.MaxX += margin + bounds.MaxY += margin + + fmt.Println("Rendering to internal image...") + img := gf.Render(cfg.DPI, &bounds) + + var outlineImg image.Image + if outlineGf != nil { + outlineImg = outlineGf.Render(cfg.DPI, &bounds) + } + + if cfg.KeepPNG { + pngPath := strings.TrimSuffix(gerberPath, filepath.Ext(gerberPath)) + ".png" + f, err := os.Create(pngPath) + if err != nil { + log.Printf("Warning: Could not create PNG file: %v", err) + } else { + if err := png.Encode(f, img); err != nil { + log.Printf("Warning: Could not encode PNG: %v", err) + } + f.Close() + } + } + + var triangles [][3]Point + if wantsType("stl") { + fmt.Println("Generating mesh...") + triangles = GenerateMeshFromImages(img, outlineImg, cfg) + } + + if wantsType("stl") { + outputFilename := baseName + ".stl" + fmt.Printf("Saving to %s (%d triangles)...\n", outputFilename, len(triangles)) + if err := WriteSTL(outputFilename, triangles); err != nil { + return nil, nil, nil, fmt.Errorf("error writing stl: %v", err) + } + generatedFiles = append(generatedFiles, outputFilename) + } + + if wantsType("svg") { + outputFilename := baseName + ".svg" + if err := WriteSVG(outputFilename, gf, &bounds); err != nil { + return nil, nil, nil, fmt.Errorf("error writing svg: %v", err) + } + generatedFiles = append(generatedFiles, outputFilename) + } + + if wantsType("png") { + outputFilename := baseName + ".png" + if f, err := os.Create(outputFilename); err == nil { + png.Encode(f, img) + f.Close() + generatedFiles = append(generatedFiles, outputFilename) + } + } + + if wantsType("scad") { + outputFilename := baseName + ".scad" + if err := WriteStencilSCAD(outputFilename, gf, outlineGf, cfg, &bounds); err != nil { + return nil, nil, nil, fmt.Errorf("error writing scad: %v", err) + } + generatedFiles = append(generatedFiles, outputFilename) + } + + return generatedFiles, img, outlineImg, nil +} diff --git a/stl.go b/stl.go new file mode 100644 index 0000000..b09de51 --- /dev/null +++ b/stl.go @@ -0,0 +1,85 @@ +package main + +import ( + "encoding/binary" + "math" + "os" +) + +// --- STL Types and Helpers --- + +type Point struct { + X, Y, Z float64 +} + +func WriteSTL(filename string, triangles [][3]Point) error { + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + header := make([]byte, 80) + copy(header, "Generated by pcb-to-stencil") + if _, err := f.Write(header); err != nil { + return err + } + + count := uint32(len(triangles)) + if err := binary.Write(f, binary.LittleEndian, count); err != nil { + return err + } + + buf := make([]byte, 50) + for _, t := range triangles { + binary.LittleEndian.PutUint32(buf[0:4], math.Float32bits(0)) + binary.LittleEndian.PutUint32(buf[4:8], math.Float32bits(0)) + binary.LittleEndian.PutUint32(buf[8:12], math.Float32bits(0)) + + binary.LittleEndian.PutUint32(buf[12:16], math.Float32bits(float32(t[0].X))) + binary.LittleEndian.PutUint32(buf[16:20], math.Float32bits(float32(t[0].Y))) + binary.LittleEndian.PutUint32(buf[20:24], math.Float32bits(float32(t[0].Z))) + + binary.LittleEndian.PutUint32(buf[24:28], math.Float32bits(float32(t[1].X))) + binary.LittleEndian.PutUint32(buf[28:32], math.Float32bits(float32(t[1].Y))) + binary.LittleEndian.PutUint32(buf[32:36], math.Float32bits(float32(t[1].Z))) + + binary.LittleEndian.PutUint32(buf[36:40], math.Float32bits(float32(t[2].X))) + binary.LittleEndian.PutUint32(buf[40:44], math.Float32bits(float32(t[2].Y))) + binary.LittleEndian.PutUint32(buf[44:48], math.Float32bits(float32(t[2].Z))) + + binary.LittleEndian.PutUint16(buf[48:50], 0) + + if _, err := f.Write(buf); err != nil { + return err + } + } + return nil +} + +func AddBox(triangles *[][3]Point, x, y, w, h, zHeight float64) { + x0, y0 := x, y + x1, y1 := x+w, y+h + z0, z1 := 0.0, zHeight + + p000 := Point{x0, y0, z0} + p100 := Point{x1, y0, z0} + p110 := Point{x1, y1, z0} + p010 := Point{x0, y1, z0} + p001 := Point{x0, y0, z1} + p101 := Point{x1, y0, z1} + p111 := Point{x1, y1, z1} + p011 := Point{x0, y1, z1} + + addQuad := func(a, b, c, d Point) { + *triangles = append(*triangles, [3]Point{a, b, c}) + *triangles = append(*triangles, [3]Point{c, d, a}) + } + + addQuad(p000, p010, p110, p100) // Bottom + addQuad(p101, p111, p011, p001) // Top + addQuad(p000, p100, p101, p001) // Front + addQuad(p100, p110, p111, p101) // Right + addQuad(p110, p010, p011, p111) // Back + addQuad(p010, p000, p001, p011) // Left +} diff --git a/storage.go b/storage.go new file mode 100644 index 0000000..63c3901 --- /dev/null +++ b/storage.go @@ -0,0 +1,274 @@ +package main + +import ( + "encoding/json" + "fmt" + "image" + "image/png" + "os" + "path/filepath" + "sort" + "strings" + "time" +) + +func formerBaseDir() string { + home, _ := os.UserHomeDir() + return filepath.Join(home, "former") +} + +func formerSessionsDir() string { + return filepath.Join(formerBaseDir(), "sessions") +} + +func formerProfilesDir() string { + return filepath.Join(formerBaseDir(), "profiles") +} + +func ensureFormerDirs() { + os.MkdirAll(formerSessionsDir(), 0755) + os.MkdirAll(formerProfilesDir(), 0755) +} + +// ProjectEntry represents a saved project on disk +type ProjectEntry struct { + Path string + Type string // "session" or "profile" + Data InstanceData + ModTime time.Time +} + +// SaveSession persists an enclosure session to ~/former/sessions/ +func SaveSession(inst InstanceData, sourceDir string, thumbnail image.Image) (string, error) { + ensureFormerDirs() + name := sanitizeDirName(inst.ProjectName) + if name == "" { + name = "untitled" + } + id := inst.ID + if len(id) > 8 { + id = id[:8] + } + projectDir := filepath.Join(formerSessionsDir(), fmt.Sprintf("%s-%s", name, id)) + if err := saveProject(projectDir, inst, sourceDir); err != nil { + return "", err + } + if thumbnail != nil { + SaveThumbnail(projectDir, thumbnail) + } + return projectDir, nil +} + +// SaveProfile persists an enclosure session as a named profile to ~/former/profiles/ +func SaveProfile(inst InstanceData, name string, sourceDir string, thumbnail image.Image) (string, error) { + ensureFormerDirs() + dirLabel := sanitizeDirName(name) + if dirLabel == "" { + dirLabel = "untitled" + } + id := inst.ID + if len(id) > 8 { + id = id[:8] + } + projectDir := filepath.Join(formerProfilesDir(), fmt.Sprintf("%s-%s", dirLabel, id)) + inst.Name = name + if err := saveProject(projectDir, inst, sourceDir); err != nil { + return "", err + } + if thumbnail != nil { + SaveThumbnail(projectDir, thumbnail) + } + return projectDir, nil +} + +func saveProject(projectDir string, inst InstanceData, sourceDir string) error { + os.MkdirAll(projectDir, 0755) + + // Copy gerber files using original filenames + newGerberFiles := make(map[string]string) + for origName, savedBasename := range inst.GerberFiles { + srcPath := filepath.Join(sourceDir, savedBasename) + dstPath := filepath.Join(projectDir, origName) + if err := CopyFile(srcPath, dstPath); err != nil { + // Fallback: try using origName directly + srcPath = filepath.Join(sourceDir, origName) + if err2 := CopyFile(srcPath, dstPath); err2 != nil { + return fmt.Errorf("copy %s: %v", origName, err) + } + } + newGerberFiles[origName] = origName + } + inst.GerberFiles = newGerberFiles + + // Copy drill files + if inst.DrillPath != "" { + srcPath := filepath.Join(sourceDir, inst.DrillPath) + ext := filepath.Ext(inst.DrillPath) + if ext == "" { + ext = ".drl" + } + dstName := "drill" + ext + dstPath := filepath.Join(projectDir, dstName) + if CopyFile(srcPath, dstPath) == nil { + inst.DrillPath = dstName + } + } + if inst.NPTHPath != "" { + srcPath := filepath.Join(sourceDir, inst.NPTHPath) + ext := filepath.Ext(inst.NPTHPath) + if ext == "" { + ext = ".drl" + } + dstName := "npth" + ext + dstPath := filepath.Join(projectDir, dstName) + if CopyFile(srcPath, dstPath) == nil { + inst.NPTHPath = dstName + } + } + + // Write former.json + data, err := json.MarshalIndent(inst, "", " ") + if err != nil { + return err + } + return os.WriteFile(filepath.Join(projectDir, "former.json"), data, 0644) +} + +// ListProjects returns all saved projects sorted by modification time (newest first). +// Pass limit=0 for no limit. +func ListProjects(limit int) ([]ProjectEntry, error) { + ensureFormerDirs() + var entries []ProjectEntry + + sessEntries, _ := listProjectsInDir(formerSessionsDir(), "session") + entries = append(entries, sessEntries...) + + profEntries, _ := listProjectsInDir(formerProfilesDir(), "profile") + entries = append(entries, profEntries...) + + sort.Slice(entries, func(i, j int) bool { + return entries[i].ModTime.After(entries[j].ModTime) + }) + + if limit > 0 && len(entries) > limit { + entries = entries[:limit] + } + return entries, nil +} + +func listProjectsInDir(dir, projType string) ([]ProjectEntry, error) { + dirEntries, err := os.ReadDir(dir) + if err != nil { + return nil, err + } + + var entries []ProjectEntry + for _, de := range dirEntries { + if !de.IsDir() { + continue + } + jsonPath := filepath.Join(dir, de.Name(), "former.json") + info, err := os.Stat(jsonPath) + if err != nil { + continue + } + raw, err := os.ReadFile(jsonPath) + if err != nil { + continue + } + var inst InstanceData + if err := json.Unmarshal(raw, &inst); err != nil { + continue + } + entries = append(entries, ProjectEntry{ + Path: filepath.Join(dir, de.Name()), + Type: projType, + Data: inst, + ModTime: info.ModTime(), + }) + } + return entries, nil +} + +// LoadProject reads former.json from a project directory +func LoadProject(projectDir string) (*InstanceData, error) { + raw, err := os.ReadFile(filepath.Join(projectDir, "former.json")) + if err != nil { + return nil, err + } + var inst InstanceData + if err := json.Unmarshal(raw, &inst); err != nil { + return nil, err + } + return &inst, nil +} + +// UpdateProjectCutouts writes updated cutouts to an existing project's former.json +func UpdateProjectCutouts(projectDir string, cutouts []Cutout) error { + if projectDir == "" { + return nil + } + inst, err := LoadProject(projectDir) + if err != nil { + return err + } + inst.Cutouts = cutouts + // Clear legacy fields so they don't conflict + inst.SideCutouts = nil + inst.LidCutouts = nil + data, err := json.MarshalIndent(inst, "", " ") + if err != nil { + return err + } + return os.WriteFile(filepath.Join(projectDir, "former.json"), data, 0644) +} + +// TouchProject updates the mtime of a project's former.json +func TouchProject(projectDir string) { + jsonPath := filepath.Join(projectDir, "former.json") + now := time.Now() + os.Chtimes(jsonPath, now, now) +} + +// DeleteProject removes a project directory entirely +func DeleteProject(projectDir string) error { + return os.RemoveAll(projectDir) +} + +// RestoreProject loads and rebuilds a session from a project directory +func RestoreProject(projectDir string) (string, *EnclosureSession, *InstanceData, error) { + inst, err := LoadProject(projectDir) + if err != nil { + return "", nil, nil, err + } + sid, session, err := restoreSessionFromDir(inst, projectDir) + if err != nil { + return "", nil, nil, err + } + TouchProject(projectDir) + return sid, session, inst, nil +} + +// SaveThumbnail saves a preview image to the project directory +func SaveThumbnail(projectDir string, img image.Image) error { + f, err := os.Create(filepath.Join(projectDir, "thumbnail.png")) + if err != nil { + return err + } + defer f.Close() + return png.Encode(f, img) +} + +func sanitizeDirName(name string) string { + name = strings.Map(func(r rune) rune { + if r == '/' || r == '\\' || r == ':' || r == '*' || r == '?' || r == '"' || r == '<' || r == '>' || r == '|' { + return '-' + } + return r + }, name) + name = strings.TrimSpace(name) + if len(name) > 50 { + name = name[:50] + } + return name +} diff --git a/svg.go b/svg.go new file mode 100644 index 0000000..6dbd0a0 --- /dev/null +++ b/svg.go @@ -0,0 +1,182 @@ +package main + +import ( + "fmt" + "math" + "os" +) + +func WriteSVG(filename string, gf *GerberFile, bounds *Bounds) error { + b := *bounds + + widthMM := b.MaxX - b.MinX + heightMM := b.MaxY - b.MinY + + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + // Use mm directly for SVG + fmt.Fprintf(f, ``, + widthMM, heightMM, widthMM, heightMM) + fmt.Fprintf(f, "\n\n") + + // Note: SVG Y-axis points down. We need to invert Y: (heightMM - (y - b.MinY)) + toSVGX := func(x float64) float64 { return x - b.MinX } + toSVGY := func(y float64) float64 { return heightMM - (y - b.MinY) } + + curX, curY := 0.0, 0.0 + curDCode := 0 + interpolationMode := "G01" // Default linear + inRegion := false + var regionVertices [][2]float64 + + for _, cmd := range gf.Commands { + if cmd.Type == "APERTURE" { + curDCode = *cmd.D + continue + } + if cmd.Type == "G01" || cmd.Type == "G02" || cmd.Type == "G03" { + interpolationMode = cmd.Type + continue + } + if cmd.Type == "G36" { + inRegion = true + regionVertices = nil + continue + } + if cmd.Type == "G37" { + if len(regionVertices) >= 3 { + fmt.Fprintf(f, `\n") + } + inRegion = false + regionVertices = nil + continue + } + + prevX, prevY := curX, curY + if cmd.X != nil { + curX = *cmd.X + } + if cmd.Y != nil { + curY = *cmd.Y + } + + if inRegion { + if cmd.Type == "MOVE" || (cmd.Type == "DRAW" && interpolationMode == "G01") { + regionVertices = append(regionVertices, [2]float64{curX, curY}) + } else if cmd.Type == "DRAW" && (interpolationMode == "G02" || interpolationMode == "G03") { + iVal, jVal := 0.0, 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + arcPts := approximateArc(prevX, prevY, curX, curY, iVal, jVal, interpolationMode) + for _, pt := range arcPts { + regionVertices = append(regionVertices, pt) + } + } + continue + } + + if cmd.Type == "FLASH" { + ap, ok := gf.State.Apertures[curDCode] + if ok { + writeSVGAperture(f, toSVGX(curX), toSVGY(curY), ap, false) + } + } else if cmd.Type == "DRAW" { + ap, ok := gf.State.Apertures[curDCode] + if ok { + // Basic stroke representation for lines + w := 0.1 // default + if len(ap.Modifiers) > 0 { + w = ap.Modifiers[0] + } + + if interpolationMode == "G01" { + fmt.Fprintf(f, ``+"\n", + toSVGX(prevX), toSVGY(prevY), toSVGX(curX), toSVGY(curY), w) + } else { + iVal, jVal := 0.0, 0.0 + if cmd.I != nil { + iVal = *cmd.I + } + if cmd.J != nil { + jVal = *cmd.J + } + + // SVG path arc (Y-axis inverted: G02 CW -> CCW in SVG, G03 CCW -> CW in SVG) + r := math.Sqrt(iVal*iVal + jVal*jVal) + acx, acy := prevX+iVal, prevY+jVal + sa := math.Atan2(prevY-acy, prevX-acx) + ea := math.Atan2(curY-acy, curX-acx) + var arcSpan float64 + if interpolationMode == "G03" { + if ea <= sa { ea += 2 * math.Pi } + arcSpan = ea - sa + } else { + if sa <= ea { sa += 2 * math.Pi } + arcSpan = sa - ea + } + largeArc := 0 + if arcSpan > math.Pi { largeArc = 1 } + sweep := 1 // G03 CCW Gerber -> CW SVG + if interpolationMode == "G02" { sweep = 0 } + + fmt.Fprintf(f, `` + "\n", + toSVGX(prevX), toSVGY(prevY), r, r, largeArc, sweep, toSVGX(curX), toSVGY(curY), w) + } + } + } + } + fmt.Fprintf(f, "\n\n") + return nil +} + +func writeSVGAperture(f *os.File, cx, cy float64, ap Aperture, isMacro bool) { + switch ap.Type { + case "C": + if len(ap.Modifiers) > 0 { + r := ap.Modifiers[0] / 2 + fmt.Fprintf(f, ``+"\n", cx, cy, r) + } + case "R": + if len(ap.Modifiers) >= 2 { + w, h := ap.Modifiers[0], ap.Modifiers[1] + fmt.Fprintf(f, ``+"\n", cx-w/2, cy-h/2, w, h) + } + case "O": + if len(ap.Modifiers) >= 2 { + w, h := ap.Modifiers[0], ap.Modifiers[1] + r := w / 2 + if h < w { + r = h / 2 + } + fmt.Fprintf(f, ``+"\n", cx-w/2, cy-h/2, w, h, r, r) + } + case "P": + if len(ap.Modifiers) >= 2 { + dia, numV := ap.Modifiers[0], int(ap.Modifiers[1]) + r := dia / 2 + rot := 0.0 + if len(ap.Modifiers) >= 3 { + rot = ap.Modifiers[2] + } + fmt.Fprintf(f, ``+"\n") + } + } +} diff --git a/svg_render_darwin.go b/svg_render_darwin.go new file mode 100644 index 0000000..a4cfba2 --- /dev/null +++ b/svg_render_darwin.go @@ -0,0 +1,117 @@ +package main + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework AppKit -framework CoreGraphics + +#import +#import + +// Renders SVG data to raw RGBA pixels using macOS native NSImage. +// Returns NULL on failure. Caller must free() the returned pixels. +unsigned char* nativeRenderSVG(const void* svgBytes, int svgLen, int targetW, int targetH) { + @autoreleasepool { + NSData *data = [NSData dataWithBytesNoCopy:(void*)svgBytes length:svgLen freeWhenDone:NO]; + NSImage *svgImage = [[NSImage alloc] initWithData:data]; + if (!svgImage) return NULL; + + int w = targetW; + int h = targetH; + int rowBytes = w * 4; + int totalBytes = rowBytes * h; + + NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:w + pixelsHigh:h + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSDeviceRGBColorSpace + bytesPerRow:rowBytes + bitsPerPixel:32]; + + [NSGraphicsContext saveGraphicsState]; + NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:rep]; + [NSGraphicsContext setCurrentContext:ctx]; + + // Start with fully transparent background + [[NSColor clearColor] set]; + NSRectFill(NSMakeRect(0, 0, w, h)); + + // Draw SVG, preserving alpha + [svgImage drawInRect:NSMakeRect(0, 0, w, h) + fromRect:NSZeroRect + operation:NSCompositingOperationSourceOver + fraction:1.0]; + + [NSGraphicsContext restoreGraphicsState]; + + unsigned char* result = (unsigned char*)malloc(totalBytes); + if (result) { + memcpy(result, [rep bitmapData], totalBytes); + } + return result; + } +} +*/ +import "C" + +import ( + "image" + "image/color" + "unsafe" +) + +// renderSVGNative uses macOS NSImage to render SVG data to an image.Image +// with full transparency support. +func renderSVGNative(svgData []byte, width, height int) image.Image { + if len(svgData) == 0 { + return nil + } + + pixels := C.nativeRenderSVG( + unsafe.Pointer(&svgData[0]), + C.int(len(svgData)), + C.int(width), + C.int(height), + ) + if pixels == nil { + return nil + } + defer C.free(unsafe.Pointer(pixels)) + + rawLen := width * height * 4 + raw := unsafe.Slice((*byte)(unsafe.Pointer(pixels)), rawLen) + + img := image.NewNRGBA(image.Rect(0, 0, width, height)) + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + i := (y*width + x) * 4 + r, g, b, a := raw[i], raw[i+1], raw[i+2], raw[i+3] + + // NSImage gives premultiplied alpha — convert to straight + if a > 0 && a < 255 { + scale := 255.0 / float64(a) + r = clampByte(float64(r) * scale) + g = clampByte(float64(g) * scale) + b = clampByte(float64(b) * scale) + } + + img.SetNRGBA(x, y, color.NRGBA{R: r, G: g, B: b, A: a}) + } + } + + return img +} + +func clampByte(v float64) uint8 { + if v > 255 { + return 255 + } + if v < 0 { + return 0 + } + return uint8(v) +} diff --git a/svg_render_other.go b/svg_render_other.go new file mode 100644 index 0000000..452e3e7 --- /dev/null +++ b/svg_render_other.go @@ -0,0 +1,11 @@ +//go:build !darwin + +package main + +import "image" + +// renderSVGNative is a no-op on non-macOS platforms. +// Returns nil, causing callers to fall back to Fyne's built-in renderer. +func renderSVGNative(svgData []byte, width, height int) image.Image { + return nil +} diff --git a/util.go b/util.go new file mode 100644 index 0000000..037ca77 --- /dev/null +++ b/util.go @@ -0,0 +1,12 @@ +package main + +import ( + "crypto/rand" + "encoding/hex" +) + +func randomID() string { + b := make([]byte, 16) + rand.Read(b) + return hex.EncodeToString(b) +} diff --git a/wails.json b/wails.json new file mode 100644 index 0000000..b1fb2a1 --- /dev/null +++ b/wails.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://wails.io/schemas/config.v2.json", + "name": "Former", + "outputfilename": "Former", + "frontend:install": "npm install", + "frontend:build": "npm run build", + "frontend:dev:watcher": "npm run dev", + "frontend:dev:serverUrl": "auto", + "author": { + "name": "" + } +}