From a02af2746c320a67536d124a02b2efcab6d9e194 Mon Sep 17 00:00:00 2001 From: Abse2001 Date: Sun, 16 Nov 2025 14:24:33 +0200 Subject: [PATCH] Add transistor support to subcircuit inflators --- .../Group/Subcircuit/Subcircuit.ts | 4 ++ .../inflators/inflateSourceTransistor.ts | 43 ++++++++++++++++ .../subcircuit-circuit-json07-pcb.snap.svg | 1 + .../subcircuit-circuit-json07.test.tsx | 49 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceTransistor.ts create mode 100644 tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json07-pcb.snap.svg create mode 100644 tests/features/subcircuit-circuit-json/subcircuit-circuit-json07.test.tsx diff --git a/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts b/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts index c08fc0814..ee894f26f 100644 --- a/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts +++ b/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts @@ -11,6 +11,7 @@ import { inflateSourceCapacitor } from "./inflators/inflateSourceCapacitor" import { inflateSourceInductor } from "./inflators/inflateSourceInductor" import { inflateSourceDiode } from "./inflators/inflateSourceDiode" import { inflateSourceTrace } from "./inflators/inflateSourceTrace" +import { inflateSourceTransistor } from "./inflators/inflateSourceTransistor" export class Subcircuit extends Group { constructor(props: z.input) { @@ -77,6 +78,9 @@ export class Subcircuit extends Group { case "simple_chip": inflateSourceChip(sourceComponent, inflationCtx) break + case "simple_transistor": + inflateSourceTransistor(sourceComponent, inflationCtx) + break default: throw new Error( `No inflator implemented for source component ftype: "${sourceComponent.ftype}"`, diff --git a/lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceTransistor.ts b/lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceTransistor.ts new file mode 100644 index 000000000..a4d3adcc9 --- /dev/null +++ b/lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceTransistor.ts @@ -0,0 +1,43 @@ +import type { + SourceSimpleTransistor, + PcbComponent, + CadComponent, +} from "circuit-json" +import { Transistor } from "lib/components/normal-components/Transistor" +import { inflatePcbComponent } from "./inflatePcbComponent" +import type { InflatorContext } from "../InflatorFn" + +export function inflateSourceTransistor( + sourceElm: SourceSimpleTransistor, + inflatorContext: InflatorContext, +) { + const { injectionDb, subcircuit, groupsMap } = inflatorContext + + const pcbElm = injectionDb.pcb_component.getWhere({ + source_component_id: sourceElm.source_component_id, + }) as PcbComponent | null + + const cadElm = injectionDb.cad_component.getWhere({ + source_component_id: sourceElm.source_component_id, + }) as CadComponent | null + + const transistor = new Transistor({ + name: sourceElm.name, + type: sourceElm.transistor_type, + }) + + if (pcbElm) { + inflatePcbComponent(pcbElm, { + ...inflatorContext, + normalComponent: transistor, + }) + } + + // Add the transistor to its group if it has one, otherwise add to subcircuit + if (sourceElm.source_group_id && groupsMap?.has(sourceElm.source_group_id)) { + const group = groupsMap.get(sourceElm.source_group_id)! + group.add(transistor) + } else { + subcircuit.add(transistor) + } +} diff --git a/tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json07-pcb.snap.svg b/tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json07-pcb.snap.svg new file mode 100644 index 000000000..56f910414 --- /dev/null +++ b/tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json07-pcb.snap.svg @@ -0,0 +1 @@ +Q1R1 \ No newline at end of file diff --git a/tests/features/subcircuit-circuit-json/subcircuit-circuit-json07.test.tsx b/tests/features/subcircuit-circuit-json/subcircuit-circuit-json07.test.tsx new file mode 100644 index 000000000..8d0b45b81 --- /dev/null +++ b/tests/features/subcircuit-circuit-json/subcircuit-circuit-json07.test.tsx @@ -0,0 +1,49 @@ +import { test, expect } from "bun:test" +import { getTestFixture } from "tests/fixtures/get-test-fixture" +import { renderToCircuitJson } from "tests/fixtures/renderToCircuitJson" + +/** + * This test verifies that a subcircuit can inflate a transistor component + */ +test("subcircuit-circuit-json07", async () => { + const { circuit } = await getTestFixture() + + const subcircuitCircuitJson = await renderToCircuitJson( + + + + + , + ) + + circuit.add( + + + + , + ) + + await circuit.renderUntilSettled() + + const circuitJson = await circuit.getCircuitJson() + + const Q1 = circuitJson.find( + (element) => + element.type === "source_component" && + (element as any).ftype === "simple_transistor" && + (element as any).name === "Q1", + ) as any + + expect(Q1).toBeDefined() + expect(Q1?.transistor_type).toBe("npn") + + const pcbTrace = circuitJson.find((c) => c.type === "pcb_trace") + + expect(pcbTrace).toBeDefined() + expect(circuit).toMatchPcbSnapshot(import.meta.path) +})