From 515fcccaee13cfe650c658a97a74c1239dec83e3 Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Wed, 12 Nov 2025 17:54:15 +0200 Subject: [PATCH] feat: Add support for inductors in subcircuit circuitJson --- .../Group/Subcircuit/Subcircuit.ts | 4 ++ .../inflators/inflateSourceInductor.ts | 43 +++++++++++++++++++ .../subcircuit-circuit-json04-pcb.snap.svg | 1 + .../subcircuit-circuit-json04.test.tsx | 41 ++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceInductor.ts create mode 100644 tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json04-pcb.snap.svg create mode 100644 tests/features/subcircuit-circuit-json/subcircuit-circuit-json04.test.tsx diff --git a/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts b/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts index 8cfb412ec..df3d91604 100644 --- a/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts +++ b/lib/components/primitive-components/Group/Subcircuit/Subcircuit.ts @@ -8,6 +8,7 @@ import { inflateSourceGroup } from "./inflators/inflateSourceGroup" import type { InflatorContext, SourceGroupId } from "./InflatorFn" import { inflateSourceChip } from "./inflators/inflateSourceChip" import { inflateSourceCapacitor } from "./inflators/inflateSourceCapacitor" +import { inflateSourceInductor } from "./inflators/inflateSourceInductor" export class Subcircuit extends Group { constructor(props: z.input) { @@ -65,6 +66,9 @@ export class Subcircuit extends Group { case "simple_capacitor": inflateSourceCapacitor(sourceComponent, inflationCtx) break + case "simple_inductor": + inflateSourceInductor(sourceComponent, inflationCtx) + break case "simple_chip": inflateSourceChip(sourceComponent, inflationCtx) break diff --git a/lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceInductor.ts b/lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceInductor.ts new file mode 100644 index 000000000..335aa0efb --- /dev/null +++ b/lib/components/primitive-components/Group/Subcircuit/inflators/inflateSourceInductor.ts @@ -0,0 +1,43 @@ +import type { + SourceSimpleInductor, + PcbComponent, + CadComponent, +} from "circuit-json" +import { Inductor } from "lib/components/normal-components/Inductor" +import { inflatePcbComponent } from "./inflatePcbComponent" +import type { InflatorContext } from "../InflatorFn" + +export function inflateSourceInductor( + sourceElm: SourceSimpleInductor, + 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 inductor = new Inductor({ + name: sourceElm.name, + inductance: (sourceElm as any).inductance, + }) + + if (pcbElm) { + inflatePcbComponent(pcbElm, { + ...inflatorContext, + normalComponent: inductor, + }) + } + + // Add the inductor 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(inductor) + } else { + subcircuit.add(inductor) + } +} diff --git a/tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json04-pcb.snap.svg b/tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json04-pcb.snap.svg new file mode 100644 index 000000000..70074e083 --- /dev/null +++ b/tests/features/subcircuit-circuit-json/__snapshots__/subcircuit-circuit-json04-pcb.snap.svg @@ -0,0 +1 @@ +L1R1 \ No newline at end of file diff --git a/tests/features/subcircuit-circuit-json/subcircuit-circuit-json04.test.tsx b/tests/features/subcircuit-circuit-json/subcircuit-circuit-json04.test.tsx new file mode 100644 index 000000000..63135ab36 --- /dev/null +++ b/tests/features/subcircuit-circuit-json/subcircuit-circuit-json04.test.tsx @@ -0,0 +1,41 @@ +import { test, expect } from "bun:test" +import { getTestFixture } from "tests/fixtures/get-test-fixture" +import { renderToCircuitJson } from "tests/fixtures/renderToCircuitJson" + +test("subcircuit-circuit-json04 - inductor inflation", async () => { + const { circuit } = await getTestFixture() + + const subcircuitCircuitJson = await renderToCircuitJson( + + + + + , + ) + + circuit.add( + + + + , + ) + + await circuit.renderUntilSettled() + + const circuitJson = await circuit.getCircuitJson() + + const L1 = circuitJson.find( + (c) => + c.type === "source_component" && + c.name === "L1" && + c.ftype === "simple_inductor", + ) + expect(L1).toBeDefined() + + expect(circuit).toMatchPcbSnapshot(import.meta.path) +})