From 479f17179e4c4d9db46a0ccf884e3bf627fa6650 Mon Sep 17 00:00:00 2001 From: gunitesh Date: Sat, 23 May 2026 22:31:09 +0530 Subject: [PATCH 1/2] feat: implement pdip/pdip8 footprint --- src/fn/index.ts | 1 + src/fn/pdip.ts | 11 +++++++++++ src/footprinter.ts | 3 +++ tests/__snapshots__/pdip.snap.svg | 1 + tests/__snapshots__/pdip8.snap.svg | 1 + tests/pdip.test.ts | 15 +++++++++++++++ 6 files changed, 32 insertions(+) create mode 100644 src/fn/pdip.ts create mode 100644 tests/__snapshots__/pdip.snap.svg create mode 100644 tests/__snapshots__/pdip8.snap.svg create mode 100644 tests/pdip.test.ts diff --git a/src/fn/index.ts b/src/fn/index.ts index 94c0370e..20740cb1 100644 --- a/src/fn/index.ts +++ b/src/fn/index.ts @@ -81,3 +81,4 @@ export { sot343 } from "./sot343" export { m2host } from "./m2host" export { mountedpcbmodule } from "./mountedpcbmodule" export { to92l } from "./to92l" +export { pdip } from "./pdip" diff --git a/src/fn/pdip.ts b/src/fn/pdip.ts new file mode 100644 index 00000000..d9d9c867 --- /dev/null +++ b/src/fn/pdip.ts @@ -0,0 +1,11 @@ +import type { AnyCircuitElement } from "circuit-json" +import { dip, extendDipDef } from "./dip" + +export const pdip_def = extendDipDef({ w: "300mil", p: "2.54mm" }) + +export const pdip = ( + raw_params: any, +): { circuitJson: AnyCircuitElement[]; parameters: any } => { + const parameters = pdip_def.parse(raw_params) + return dip({ ...parameters, dip: true } as any) +} diff --git a/src/footprinter.ts b/src/footprinter.ts index fa51a3b4..e602e6f4 100644 --- a/src/footprinter.ts +++ b/src/footprinter.ts @@ -40,6 +40,9 @@ export type Footprinter = { dip: ( num_pins?: number, ) => FootprinterParamsBuilder<"w" | "p" | "id" | "od" | "wide" | "narrow"> + pdip: ( + num_pins?: number, + ) => FootprinterParamsBuilder<"w" | "p" | "id" | "od" | "wide" | "narrow"> cap: () => FootprinterParamsBuilder res: () => FootprinterParamsBuilder diode: () => FootprinterParamsBuilder diff --git a/tests/__snapshots__/pdip.snap.svg b/tests/__snapshots__/pdip.snap.svg new file mode 100644 index 00000000..8c18a6a1 --- /dev/null +++ b/tests/__snapshots__/pdip.snap.svg @@ -0,0 +1 @@ +{REF}{pin1}{pin2}{pin3}{pin4}{pin5}{pin6} \ No newline at end of file diff --git a/tests/__snapshots__/pdip8.snap.svg b/tests/__snapshots__/pdip8.snap.svg new file mode 100644 index 00000000..6c2830c3 --- /dev/null +++ b/tests/__snapshots__/pdip8.snap.svg @@ -0,0 +1 @@ +{REF}{pin1}{pin2}{pin3}{pin4}{pin5}{pin6}{pin7}{pin8} \ No newline at end of file diff --git a/tests/pdip.test.ts b/tests/pdip.test.ts new file mode 100644 index 00000000..ae97e278 --- /dev/null +++ b/tests/pdip.test.ts @@ -0,0 +1,15 @@ +import { test, expect } from "bun:test" +import { convertCircuitJsonToPcbSvg } from "circuit-to-svg" +import { fp } from "../src/footprinter" + +test("pdip8", () => { + const soup = fp.string("pdip8").circuitJson() + const svgContent = convertCircuitJsonToPcbSvg(soup) + expect(svgContent).toMatchSvgSnapshot(import.meta.path, "pdip8") +}) + +test("pdip", () => { + const soup = fp.string("pdip").circuitJson() + const svgContent = convertCircuitJsonToPcbSvg(soup) + expect(svgContent).toMatchSvgSnapshot(import.meta.path, "pdip") +}) From 5161c64c29501d0928fb91e429f89812a1181b39 Mon Sep 17 00:00:00 2001 From: gunitesh Date: Thu, 28 May 2026 14:44:14 +0530 Subject: [PATCH 2/2] test: add KiCad parity test for pdip8 --- .../kicad-parity/__snapshots__/pdip8.snap.svg | 1 + .../pdip8_boolean_difference.snap.svg | 3 +++ tests/kicad-parity/pdip8_kicad_parity.test.ts | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 tests/kicad-parity/__snapshots__/pdip8.snap.svg create mode 100644 tests/kicad-parity/__snapshots__/pdip8_boolean_difference.snap.svg create mode 100644 tests/kicad-parity/pdip8_kicad_parity.test.ts diff --git a/tests/kicad-parity/__snapshots__/pdip8.snap.svg b/tests/kicad-parity/__snapshots__/pdip8.snap.svg new file mode 100644 index 00000000..17a842ee --- /dev/null +++ b/tests/kicad-parity/__snapshots__/pdip8.snap.svg @@ -0,0 +1 @@ +{REF}Diff: 0.00%{pin1}{pin2}{pin3}{pin4}{pin5}{pin6}{pin7}{pin8} \ No newline at end of file diff --git a/tests/kicad-parity/__snapshots__/pdip8_boolean_difference.snap.svg b/tests/kicad-parity/__snapshots__/pdip8_boolean_difference.snap.svg new file mode 100644 index 00000000..d4260e91 --- /dev/null +++ b/tests/kicad-parity/__snapshots__/pdip8_boolean_difference.snap.svg @@ -0,0 +1,3 @@ +DIP-8_W7.62mm - Alignment Analysis (Footprinter vs KiCad)pdip8KiCad: DIP-8_W7.62mmPerfect alignment = complete overlap \ No newline at end of file diff --git a/tests/kicad-parity/pdip8_kicad_parity.test.ts b/tests/kicad-parity/pdip8_kicad_parity.test.ts new file mode 100644 index 00000000..118dc014 --- /dev/null +++ b/tests/kicad-parity/pdip8_kicad_parity.test.ts @@ -0,0 +1,25 @@ +import { expect, test } from "bun:test" +import { compareFootprinterVsKicad } from "../fixtures/compareFootprinterVsKicad" +import { convertCircuitJsonToPcbSvg } from "circuit-to-svg" + +test("parity/pdip8", async () => { + const { + avgRelDiff, + combinedFootprintElements, + booleanDifferenceSvg, + courtyardDiffPercent, + } = await compareFootprinterVsKicad( + "pdip8", + "Package_DIP.pretty/DIP-8_W7.62mm.circuit.json", + ) + + const svgContent = convertCircuitJsonToPcbSvg(combinedFootprintElements, { + showCourtyards: true, + }) + expect(courtyardDiffPercent).toBeLessThan(0.5) + expect(svgContent).toMatchSvgSnapshot(import.meta.path, "pdip8") + expect(booleanDifferenceSvg).toMatchSvgSnapshot( + import.meta.path, + "pdip8_boolean_difference", + ) +})