app
Adom Footprint
Public Made by Adomby adom
KiCad footprint creator with layer HUD viewer and delivery to KiCad/Fusion 360
← Commit history
Use generic 3rd party fab wording
12 files changed
+16−16
Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "adom-footprint"-version = "1.0.25"+version = "1.0.26" dependencies = [ "anyhow", "clap",
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-footprint"-version = "1.0.25"+version = "1.0.26" edition = "2021" description = "Create, preview, lint, and deliver KiCad footprints (.kicad_mod) with interactive FpView viewer"
SKILL.md+2−2@@ -79,13 +79,13 @@ The interactive HTML5 footprint viewer includes: - Pad hover highlighting (teal #00b8b1) - Rich tooltips: pad number, name, size, shape, layer - Toggle layers: Grid, Solder blobs, Labels-- Solder blob visualization (300um dots at 0.25mm pitch for InstaPCB jetting)+- Solder blob visualization (300um dots at 0.25mm pitch for 3rd party fab jetting) - Sticky click-to-pin tooltips - Cursor coordinates (mm) ## Lint checks -The linter validates against KiCad and InstaPCB design rules:+The linter validates against KiCad and 3rd party fab design rules: - Courtyard present and 0.25mm minimum clearance - Fabrication outline on F.Fab layer - Pin 1 marker on silkscreen
VERSION+1−1@@ -1 +1 @@-1.0.25+1.0.26
bin/adom-footprint⋯ 1 unchanged line ⋯
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-footprint",- "version": "1.0.25",+ "version": "1.0.26", "type": "app", "description": "KiCad footprint creator with layer HUD viewer and delivery to KiCad/Fusion 360", "dependencies": {
page.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-footprint",- "version": "1.0.25",+ "version": "1.0.26", "type": "app", "description": "KiCad footprint creator with layer HUD viewer and delivery to KiCad/Fusion 360", "dependencies": {
src/fp_render.rs+1−1@@ -4,7 +4,7 @@ //! silkscreen, drill holes and pad numbers come back and the colours are exact: //! Courtyard #FF26E2 (magenta, dashed) · Fab #6e7681 (grey) · Silk #00cccc //! (cyan) · Copper pads #C83434/#ef5350 (red) · Drill dark w/ #666 ring · white-//! pad numbers. Paste apertures + the InstaPCB dots layer on top of all of it.+//! pad numbers. Paste apertures + the paste dots layer on top of all of it. use regex::Regex; use std::fmt::Write as _;
src/main.rs+1−1@@ -67,7 +67,7 @@ enum Cmd { write: bool, }, /// Export a self-contained, INTERACTIVE HTML package (pan/zoom + a Layers- /// panel with the InstaPCB paste-dot overlay) for embedding in an iframe —+ /// panel with the paste-dot overlay) for embedding in an iframe — /// e.g. a wiki component page. No server, no external assets. Embed { #[arg(long)]
src/paste.rs+1−1@@ -94,7 +94,7 @@ pub fn paste_apertures(kicad_mod: &str) -> Vec<Aperture> { let has_paste = block.contains("F.Paste") || !block.contains("(layers"); // default smd → paste // The exposed thermal pad still gets jetted paste (in the via gaps) even // when the source omits F.Paste — the paddle needs solder to bond, and- // Adom jets paste directly (no stencil), so F.Paste in the file isn't a+ // the 3rd party fab jets paste directly (no stencil), so F.Paste in the file isn't a // prerequisite. Matches the exposed-pad test in heatsink_vias(). let square = { let r = w / h.max(0.001); (0.6..=1.67).contains(&r) }; let is_exposed_pad = w.min(h) >= 1.8 && square;
src/render.rs+5−5@@ -21,10 +21,10 @@ const OY: f64 = 105.0; const MARGIN: f64 = 1.0; /// Render the footprint to a themed SVG, cropped to `bbox` (footprint-local mm).-/// CLEAN by default — NO InstaPCB paste-dot overlay. John's standing rule: the+/// CLEAN by default — NO paste-dot overlay. John's standing rule: the /// default footprint render (cards, thumbnails, preview, the live app's initial-/// view) must show the bare footprint; the InstaPCB paste layer is opt-in. Use-/// `render_footprint_svg_with_paste` only where InstaPCB is the point (`embed`).+/// view) must show the bare footprint; the paste layer is opt-in. Use+/// `render_footprint_svg_with_paste` only where paste is the point (`embed`). pub fn render_footprint_svg(kicad_mod: &str, _bbox: (f64, f64, f64, f64)) -> Result<String> { let normalized = normalize_legacy(kicad_mod); let fp = crate::fp_render::parse(&normalized);@@ -32,8 +32,8 @@ pub fn render_footprint_svg(kicad_mod: &str, _bbox: (f64, f64, f64, f64)) -> Res Ok(svg) } -/// Same render, PLUS the InstaPCB paste apertures + 300 µm jetted-dot overlay.-/// Only the `embed` flow (the interactive InstaPCB layer panel) uses this.+/// Same render, PLUS the paste apertures + 300 µm jetted-dot overlay.+/// Only the `embed` flow (the interactive paste layer panel) uses this. pub fn render_footprint_svg_with_paste(kicad_mod: &str, _bbox: (f64, f64, f64, f64)) -> Result<String> { let normalized = normalize_legacy(kicad_mod); let fp = crate::fp_render::parse(&normalized);
src/server.rs+1−1@@ -373,7 +373,7 @@ fn route(method: &Method, url: &str, body: &str) -> Response<std::io::Cursor<Vec .map(String::from) .or_else(|| crate::first_footprint_name(km)) .unwrap_or_else(|| "footprint".to_string());- // Bake the paste group so the live Layers panel's InstaPCB+ // Bake the paste group so the live Layers panel's paste // toggle can show/hide it — but the client defaults it OFF // (app.html: paste-dots is opt-in), so the initial view is clean. match crate::render::render_footprint_svg_with_paste(km, crate::bbox_from_mod(km)) {