From e6b481ce23d98e7d82fedf03484b4ce406646fc6 Mon Sep 17 00:00:00 2001 From: Abse2001 Date: Thu, 30 Jul 2026 23:07:01 +0200 Subject: [PATCH] Fix SOT-25 pad-row width handling --- src/fn/sot23.ts | 29 ++++++++++--------- tests/__snapshots__/C156283_sot25.snap.svg | 1 + .../sot23_3_micrometer_units.snap.svg | 2 +- .../sot23_w3_h1.5_p0.95mm.snap.svg | 2 +- tests/sot25.test.ts | 19 ++++++++++++ 5 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 tests/__snapshots__/C156283_sot25.snap.svg diff --git a/src/fn/sot23.ts b/src/fn/sot23.ts index de150734..9981f8e4 100644 --- a/src/fn/sot23.ts +++ b/src/fn/sot23.ts @@ -50,7 +50,7 @@ const sot23_5CourtyardOutline = [ export const sot23_def = base_def.extend({ fn: z.string(), num_pins: z.number().default(3), - w: z.string().default("1.92mm"), + w: z.string().default("2.275mm"), h: z.string().default("2.74mm"), pl: z.string().default("1.325mm"), pw: z.string().default("0.6mm"), @@ -111,13 +111,13 @@ export const getCcwSot23Coords = (parameters: { const { pn, w, h, pl, p } = parameters if (pn === 1) { - return { x: -1.1375, y: p } + return { x: -w / 2, y: p } } if (pn === 2) { - return { x: -1.1375, y: -p } + return { x: -w / 2, y: -p } } - return { x: 1.1375, y: 0 } + return { x: w / 2, y: 0 } } export const sot23_3 = (parameters: z.infer) => { @@ -127,7 +127,7 @@ export const sot23_3 = (parameters: z.infer) => { const pl = Number.parseFloat(parameters.pl) const pw = Number.parseFloat(parameters.pw) const p = Number.parseFloat(parameters.p) - const cornerRadius = Math.min(pl, pw) / 8 + const cornerRadius = parameters.rounded ?? Math.min(pl, pw) / 8 for (let i = 0; i < parameters.num_pins; i++) { const { x, y } = getCcwSot23Coords({ @@ -158,38 +158,41 @@ export const sot23_3 = (parameters: z.infer) => { } export const getCcwSot235Coords = (parameters: { + w: number h: number p: number pn: number }) => { - const { p, h, pn } = parameters + const { w, p, h, pn } = parameters if (pn === 1) { - return { x: -1.1375, y: p } + return { x: -w / 2, y: p } } if (pn === 2) { - return { x: -1.1375, y: 0 } + return { x: -w / 2, y: 0 } } if (pn === 3) { - return { x: -1.1375, y: -p } + return { x: -w / 2, y: -p } } if (pn === 4) { - return { x: 1.1375, y: -p } + return { x: w / 2, y: -p } } if (pn === 5) { - return { x: 1.1375, y: p } + return { x: w / 2, y: p } } throw new Error("Invalid pin number") } export const sot23_5 = (parameters: z.infer) => { const pads: AnyCircuitElement[] = [] + const w = Number.parseFloat(parameters.w) const h = Number.parseFloat(parameters.h) const p = Number.parseFloat(parameters.p) const pl = Number.parseFloat(parameters.pl) const pw = Number.parseFloat(parameters.pw) - const cornerRadius = Math.min(pl, pw) / 8 + const cornerRadius = parameters.rounded ?? Math.min(pl, pw) / 8 for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getCcwSot235Coords({ + w, h, p, pn: i, @@ -222,7 +225,7 @@ export const sot23_5 = (parameters: z.infer) => { stroke_width: 0.05, } const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3) - const pin1Position = getCcwSot235Coords({ h, p, pn: 1 }) + const pin1Position = getCcwSot235Coords({ w, h, p, pn: 1 }) pin1Position.x = pin1Position.x - pw * 1.5 const triangleHeight = 0.3 // Adjust triangle size as needed const triangleWidth = 0.4 // Adjust triangle width as needed diff --git a/tests/__snapshots__/C156283_sot25.snap.svg b/tests/__snapshots__/C156283_sot25.snap.svg new file mode 100644 index 00000000..74d104b8 --- /dev/null +++ b/tests/__snapshots__/C156283_sot25.snap.svg @@ -0,0 +1 @@ +{REF} \ No newline at end of file diff --git a/tests/__snapshots__/sot23_3_micrometer_units.snap.svg b/tests/__snapshots__/sot23_3_micrometer_units.snap.svg index c4c986de..9a31711e 100644 --- a/tests/__snapshots__/sot23_3_micrometer_units.snap.svg +++ b/tests/__snapshots__/sot23_3_micrometer_units.snap.svg @@ -1 +1 @@ -{REF} \ No newline at end of file +{REF} \ No newline at end of file diff --git a/tests/__snapshots__/sot23_w3_h1.5_p0.95mm.snap.svg b/tests/__snapshots__/sot23_w3_h1.5_p0.95mm.snap.svg index 000739ff..6aeebeaf 100644 --- a/tests/__snapshots__/sot23_w3_h1.5_p0.95mm.snap.svg +++ b/tests/__snapshots__/sot23_w3_h1.5_p0.95mm.snap.svg @@ -1 +1 @@ -{REF} \ No newline at end of file +{REF} \ No newline at end of file diff --git a/tests/sot25.test.ts b/tests/sot25.test.ts index 823c14c1..715268ef 100644 --- a/tests/sot25.test.ts +++ b/tests/sot25.test.ts @@ -7,3 +7,22 @@ test("sot25", () => { const svgContent = convertCircuitJsonToPcbSvg(circuitJson) expect(svgContent).toMatchSvgSnapshot(import.meta.path, "sot25") }) + +test("C156283 SOT-25 uses its measured pad-row span", () => { + const circuitJson = fp + .string( + "sot25_w2.794mm_p0.9525mm_pw0.6223mm_pl1.1049mm_rounded0_pin1location(rightside,bottom)", + ) + .circuitJson() + const pads = circuitJson.filter( + (element) => + element.type === "pcb_smtpad" && element.shape === "rotated_rect", + ) + + expect(pads).toHaveLength(5) + expect(pads.every((pad) => pad.corner_radius === 0)).toBe(true) + expect(pads.every((pad) => Math.abs(pad.x) === 1.397)).toBe(true) + + const svgContent = convertCircuitJsonToPcbSvg(circuitJson) + expect(svgContent).toMatchSvgSnapshot(import.meta.path, "C156283_sot25") +})