From 5087b050521a2a7dd8a14e6a2b8aae0d45a61fba Mon Sep 17 00:00:00 2001 From: Rishabh Gupta Date: Fri, 6 Sep 2024 23:40:12 +0530 Subject: [PATCH 1/5] feat: pcb_keepout added --- lib/components/index.ts | 1 + .../primitive-components/Keepout.ts | 54 +++++++++++++++++++ lib/components/primitive-components/Trace.ts | 3 +- lib/fiber/intrinsic-jsx.ts | 1 + lib/utils/createComponentsFromSoup.ts | 20 +++++++ package.json | 2 +- 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 lib/components/primitive-components/Keepout.ts diff --git a/lib/components/index.ts b/lib/components/index.ts index 4a8e05c4..d482c8d7 100644 --- a/lib/components/index.ts +++ b/lib/components/index.ts @@ -20,3 +20,4 @@ export { PlatedHole } from "./primitive-components/PlatedHole" export { Constraint } from "./primitive-components/Constraint" export { Hole } from "./primitive-components/Hole" export { SilkscreenText } from "./primitive-components/SilkscreenText" +export { KeepOut } from "./primitive-components/Keepout" diff --git a/lib/components/primitive-components/Keepout.ts b/lib/components/primitive-components/Keepout.ts new file mode 100644 index 00000000..2141ab1f --- /dev/null +++ b/lib/components/primitive-components/Keepout.ts @@ -0,0 +1,54 @@ +import { PrimitiveComponent } from "../base-components/PrimitiveComponent" +import { pcbKeepoutProps } from "@tscircuit/props" +import type { RenderPhaseFn } from "../base-components/Renderable" +import type { PCBKeepout } from "@tscircuit/soup" +import { decomposeTSR } from "transformation-matrix" + +export class KeepOut extends PrimitiveComponent { + pcb_keepout_id: string | null = null + + isPcbPrimitive = true + + get config() { + return { + zodProps: pcbKeepoutProps, + } + } + + doInitialPcbPrimitiveRender(): void { + const { db } = this.project! + const { _parsedProps: props } = this + const position = this.getGlobalPcbPosition() + const decomposedMat = decomposeTSR(this.computePcbGlobalTransform()) + const isRotated90 = + Math.abs(decomposedMat.rotation.angle * (180 / Math.PI) - 90) < 0.01 + + let pcb_keepout: PCBKeepout | null = null + if (props.shape === "circle") { + pcb_keepout = db.pcb_keepout.insert({ + layer: ["top"], + shape: "circle", + // @ts-ignore: no idea why this is triggering + radius: props.radius, + center: { + x: position.x, + y: position.y, + }, + }) + } else if (props.shape === "rect") { + pcb_keepout = db.pcb_keepout.insert({ + layer: ["top"], + shape: "rect", + ...(isRotated90 + ? { width: props.height, height: props.width } + : { width: props.width, height: props.height }), + // @ts-ignore: no idea why this is triggering + x: position.x, + y: position.y, + }) + } + if (pcb_keepout) { + this.pcb_keepout_id = pcb_keepout.pcb_keepout_id + } + } +} diff --git a/lib/components/primitive-components/Trace.ts b/lib/components/primitive-components/Trace.ts index ef02cfea..9599a51b 100644 --- a/lib/components/primitive-components/Trace.ts +++ b/lib/components/primitive-components/Trace.ts @@ -294,7 +294,8 @@ export class Trace extends PrimitiveComponent { elm.type === "pcb_hole" || elm.type === "source_port" || elm.type === "pcb_port" || - elm.type === "source_trace", + elm.type === "source_trace" || + elm.type === "pcb_keepout", ) const source_trace = db.source_trace.get(this.source_trace_id!)! diff --git a/lib/fiber/intrinsic-jsx.ts b/lib/fiber/intrinsic-jsx.ts index 7868d4f6..17e75a9f 100644 --- a/lib/fiber/intrinsic-jsx.ts +++ b/lib/fiber/intrinsic-jsx.ts @@ -21,6 +21,7 @@ declare global { schematictext: Props.SchematicTextProps smtpad: Props.SmtPadProps platedhole: Props.PlatedHoleProps + keepout: Props.PcbKeepoutProps hole: Props.HoleProps port: Props.PortProps group: Props.GroupProps diff --git a/lib/utils/createComponentsFromSoup.ts b/lib/utils/createComponentsFromSoup.ts index a7ca82e6..1b861204 100644 --- a/lib/utils/createComponentsFromSoup.ts +++ b/lib/utils/createComponentsFromSoup.ts @@ -3,6 +3,7 @@ import type { PrimitiveComponent } from "../components/base-components/Primitive import { SmtPad } from "lib/components/primitive-components/SmtPad" import { SilkscreenPath } from "lib/components/primitive-components/SilkscreenPath" import { PlatedHole } from "lib/components/primitive-components/PlatedHole" +import { KeepOut } from "lib/components/primitive-components/Keepout" export const createComponentsFromSoup = ( soup: AnySoupElement[], @@ -53,6 +54,25 @@ export const createComponentsFromSoup = ( }), ) } + } else if (elm.type === "pcb_keepout" && elm.shape === "circle") { + components.push( + new KeepOut({ + pcbX: elm.center.x, + pcbY: elm.center.y, + shape: "circle", + radius: elm.radius, + }), + ) + } else if (elm.type === "pcb_keepout" && elm.shape === "rect") { + components.push( + new KeepOut({ + pcbX: elm.x, + pcbY: elm.y, + shape: "rect", + width: elm.width, + height: elm.height, + }), + ) } } return components diff --git a/package.json b/package.json index bb5ebd29..e984a3cd 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tscircuit/infgrid-ijump-astar": "^0.0.9", "@tscircuit/props": "^0.0.62", "@tscircuit/soup": "^0.0.66", - "@tscircuit/soup-util": "0.0.18", + "@tscircuit/soup-util": "^0.0.21", "footprinter": "^0.0.44", "react": "^18.3.1", "react-reconciler": "^0.29.2", From 4b2bd3dc835080b47a54cbba7540dc479e7365fd Mon Sep 17 00:00:00 2001 From: Rishabh Gupta Date: Fri, 6 Sep 2024 23:52:22 +0530 Subject: [PATCH 2/5] type fix --- lib/components/primitive-components/Keepout.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/components/primitive-components/Keepout.ts b/lib/components/primitive-components/Keepout.ts index 2141ab1f..83dc195e 100644 --- a/lib/components/primitive-components/Keepout.ts +++ b/lib/components/primitive-components/Keepout.ts @@ -16,17 +16,19 @@ export class KeepOut extends PrimitiveComponent { } doInitialPcbPrimitiveRender(): void { - const { db } = this.project! + const { db } = this.root! const { _parsedProps: props } = this - const position = this.getGlobalPcbPosition() - const decomposedMat = decomposeTSR(this.computePcbGlobalTransform()) + const position = this._getGlobalPcbPositionBeforeLayout() + const decomposedMat = decomposeTSR( + this._computePcbGlobalTransformBeforeLayout(), + ) const isRotated90 = Math.abs(decomposedMat.rotation.angle * (180 / Math.PI) - 90) < 0.01 let pcb_keepout: PCBKeepout | null = null if (props.shape === "circle") { pcb_keepout = db.pcb_keepout.insert({ - layer: ["top"], + layer: ["top"], shape: "circle", // @ts-ignore: no idea why this is triggering radius: props.radius, @@ -37,12 +39,12 @@ export class KeepOut extends PrimitiveComponent { }) } else if (props.shape === "rect") { pcb_keepout = db.pcb_keepout.insert({ - layer: ["top"], + layer: ["top"], shape: "rect", ...(isRotated90 ? { width: props.height, height: props.width } : { width: props.width, height: props.height }), - // @ts-ignore: no idea why this is triggering + // @ts-ignore: no idea why this is triggering x: position.x, y: position.y, }) From 90548e60edbd07b5eb9a80727f2e3fcce04581d0 Mon Sep 17 00:00:00 2001 From: Rishabh Gupta Date: Sat, 7 Sep 2024 00:09:27 +0530 Subject: [PATCH 3/5] depedency update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e984a3cd..e2361a0d 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tscircuit/infgrid-ijump-astar": "^0.0.9", "@tscircuit/props": "^0.0.62", "@tscircuit/soup": "^0.0.66", - "@tscircuit/soup-util": "^0.0.21", + "@tscircuit/soup-util": "^0.0.22", "footprinter": "^0.0.44", "react": "^18.3.1", "react-reconciler": "^0.29.2", From c4a804c68a3907eb90cf102b32e4e985743eeb08 Mon Sep 17 00:00:00 2001 From: Rishabh Gupta Date: Sat, 7 Sep 2024 01:47:54 +0530 Subject: [PATCH 4/5] update after soup change --- lib/components/index.ts | 2 +- lib/components/primitive-components/Keepout.ts | 12 +++++++----- lib/utils/createComponentsFromSoup.ts | 10 +++++----- package.json | 4 ++-- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/components/index.ts b/lib/components/index.ts index d482c8d7..088d7077 100644 --- a/lib/components/index.ts +++ b/lib/components/index.ts @@ -20,4 +20,4 @@ export { PlatedHole } from "./primitive-components/PlatedHole" export { Constraint } from "./primitive-components/Constraint" export { Hole } from "./primitive-components/Hole" export { SilkscreenText } from "./primitive-components/SilkscreenText" -export { KeepOut } from "./primitive-components/Keepout" +export { Keepout } from "./primitive-components/Keepout" diff --git a/lib/components/primitive-components/Keepout.ts b/lib/components/primitive-components/Keepout.ts index 83dc195e..56ec8607 100644 --- a/lib/components/primitive-components/Keepout.ts +++ b/lib/components/primitive-components/Keepout.ts @@ -4,7 +4,7 @@ import type { RenderPhaseFn } from "../base-components/Renderable" import type { PCBKeepout } from "@tscircuit/soup" import { decomposeTSR } from "transformation-matrix" -export class KeepOut extends PrimitiveComponent { +export class Keepout extends PrimitiveComponent { pcb_keepout_id: string | null = null isPcbPrimitive = true @@ -28,7 +28,7 @@ export class KeepOut extends PrimitiveComponent { let pcb_keepout: PCBKeepout | null = null if (props.shape === "circle") { pcb_keepout = db.pcb_keepout.insert({ - layer: ["top"], + layers: ["top"], shape: "circle", // @ts-ignore: no idea why this is triggering radius: props.radius, @@ -39,14 +39,16 @@ export class KeepOut extends PrimitiveComponent { }) } else if (props.shape === "rect") { pcb_keepout = db.pcb_keepout.insert({ - layer: ["top"], + layers: ["top"], shape: "rect", ...(isRotated90 ? { width: props.height, height: props.width } : { width: props.width, height: props.height }), // @ts-ignore: no idea why this is triggering - x: position.x, - y: position.y, + center: { + x: position.x, + y: position.y, + }, }) } if (pcb_keepout) { diff --git a/lib/utils/createComponentsFromSoup.ts b/lib/utils/createComponentsFromSoup.ts index 1b861204..6eabd4db 100644 --- a/lib/utils/createComponentsFromSoup.ts +++ b/lib/utils/createComponentsFromSoup.ts @@ -3,7 +3,7 @@ import type { PrimitiveComponent } from "../components/base-components/Primitive import { SmtPad } from "lib/components/primitive-components/SmtPad" import { SilkscreenPath } from "lib/components/primitive-components/SilkscreenPath" import { PlatedHole } from "lib/components/primitive-components/PlatedHole" -import { KeepOut } from "lib/components/primitive-components/Keepout" +import { Keepout } from "lib/components/primitive-components/Keepout" export const createComponentsFromSoup = ( soup: AnySoupElement[], @@ -56,7 +56,7 @@ export const createComponentsFromSoup = ( } } else if (elm.type === "pcb_keepout" && elm.shape === "circle") { components.push( - new KeepOut({ + new Keepout({ pcbX: elm.center.x, pcbY: elm.center.y, shape: "circle", @@ -65,9 +65,9 @@ export const createComponentsFromSoup = ( ) } else if (elm.type === "pcb_keepout" && elm.shape === "rect") { components.push( - new KeepOut({ - pcbX: elm.x, - pcbY: elm.y, + new Keepout({ + pcbX: elm.center.x, + pcbY: elm.center.y, shape: "rect", width: elm.width, height: elm.height, diff --git a/package.json b/package.json index e2361a0d..759c0f88 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ "@lume/kiwi": "^0.4.3", "@tscircuit/infgrid-ijump-astar": "^0.0.9", "@tscircuit/props": "^0.0.62", - "@tscircuit/soup": "^0.0.66", - "@tscircuit/soup-util": "^0.0.22", + "@tscircuit/soup": "^0.0.67", + "@tscircuit/soup-util": "^0.0.23", "footprinter": "^0.0.44", "react": "^18.3.1", "react-reconciler": "^0.29.2", From 19b60fa274733059bbc3a3cb7c18b0abcd60a59d Mon Sep 17 00:00:00 2001 From: Rishabh Gupta Date: Sun, 8 Sep 2024 17:03:36 +0530 Subject: [PATCH 5/5] updated lockfile --- bun.lockb | Bin 122177 -> 123019 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 66ec48a8c59f14adeee74e5ff86ee061c054860a..517ac95c47a1ff98a27b2be9f485862b1edf8061 100755 GIT binary patch delta 18485 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 delta 18279 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