diff --git a/lib/components/primitive-components/Trace/Trace.ts b/lib/components/primitive-components/Trace/Trace.ts
index c1a6b2153..f70c9441c 100644
--- a/lib/components/primitive-components/Trace/Trace.ts
+++ b/lib/components/primitive-components/Trace/Trace.ts
@@ -62,6 +62,13 @@ export class Trace
this._portsRoutedOnPcb = []
}
+ /**
+ * Get the explicit trace thickness, supporting 'width' as an alias for 'thickness'
+ */
+ _getExplicitTraceThickness(): number | undefined {
+ return this._parsedProps.thickness ?? this._parsedProps.width
+ }
+
get config() {
return {
zodProps: traceProps,
@@ -276,7 +283,7 @@ export class Trace
{ db },
) ?? props.maxLength,
display_name: displayName,
- min_trace_thickness: props.thickness,
+ min_trace_thickness: this._getExplicitTraceThickness(),
})
this.source_trace_id = trace.source_trace_id
diff --git a/lib/components/primitive-components/Trace/Trace_doInitialPcbManualTraceRender.ts b/lib/components/primitive-components/Trace/Trace_doInitialPcbManualTraceRender.ts
index 685bd841a..73911c553 100644
--- a/lib/components/primitive-components/Trace/Trace_doInitialPcbManualTraceRender.ts
+++ b/lib/components/primitive-components/Trace/Trace_doInitialPcbManualTraceRender.ts
@@ -10,7 +10,7 @@ export function Trace_doInitialPcbManualTraceRender(trace: Trace) {
const { _parsedProps: props } = trace
const subcircuit = trace.getSubcircuit()
- if (!props.pcbPath || props.pcbPath.length === 0) return
+ if (!props.pcbPath) return
const { allPortsFound, ports, portsWithSelectors } =
trace._findConnectedPorts()
@@ -57,7 +57,9 @@ export function Trace_doInitialPcbManualTraceRender(trace: Trace) {
const layer = anchorPort.getAvailablePcbLayers()[0] || "top"
const width =
- props.thickness ?? trace.getSubcircuit()._parsedProps.minTraceWidth ?? 0.16
+ trace._getExplicitTraceThickness() ??
+ trace.getSubcircuit()._parsedProps.minTraceWidth ??
+ 0.16
const anchorPos = anchorPort._getGlobalPcbPositionAfterLayout()
const otherPos = otherPort._getGlobalPcbPositionAfterLayout()
diff --git a/lib/components/primitive-components/Trace/Trace_doInitialPcbTraceRender.ts b/lib/components/primitive-components/Trace/Trace_doInitialPcbTraceRender.ts
index b2a262d86..15fa473fa 100644
--- a/lib/components/primitive-components/Trace/Trace_doInitialPcbTraceRender.ts
+++ b/lib/components/primitive-components/Trace/Trace_doInitialPcbTraceRender.ts
@@ -277,7 +277,9 @@ export function Trace_doInitialPcbTraceRender(trace: Trace) {
const pcbPortB = "pcb_port_id" in b ? b.pcb_port_id : null
const minTraceWidth =
- trace.getSubcircuit()._parsedProps.minTraceWidth ?? 0.16
+ trace._getExplicitTraceThickness() ??
+ trace.getSubcircuit()._parsedProps.minTraceWidth ??
+ 0.16
const ijump = new MultilayerIjump({
OBSTACLE_MARGIN: minTraceWidth * 2,
diff --git a/lib/utils/autorouting/SimpleRouteJson.ts b/lib/utils/autorouting/SimpleRouteJson.ts
index b33be75d8..3f40f5275 100644
--- a/lib/utils/autorouting/SimpleRouteJson.ts
+++ b/lib/utils/autorouting/SimpleRouteJson.ts
@@ -32,6 +32,7 @@ export type Obstacle = {
export interface SimpleRouteConnection {
name: string
source_trace_id?: string
+ width?: number // Trace width/thickness, falls back to minTraceWidth if not specified
pointsToConnect: Array<{
x: number
y: number
diff --git a/lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts b/lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts
index 74b527317..990198fc3 100644
--- a/lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts
+++ b/lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts
@@ -187,6 +187,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
connMap.getNetConnectedToId(trace.source_trace_id) ??
"",
source_trace_id: trace.source_trace_id,
+ width: trace.min_trace_thickness,
pointsToConnect: [
{
x: portA.x!,
diff --git a/package.json b/package.json
index d114e5790..c5ba8f117 100644
--- a/package.json
+++ b/package.json
@@ -42,7 +42,7 @@
"@tscircuit/matchpack": "^0.0.16",
"@tscircuit/math-utils": "^0.0.29",
"@tscircuit/miniflex": "^0.0.4",
- "@tscircuit/props": "0.0.371",
+ "@tscircuit/props": "0.0.378",
"@tscircuit/schematic-autolayout": "^0.0.6",
"@tscircuit/schematic-match-adapt": "^0.0.16",
"@tscircuit/schematic-trace-solver": "^0.0.41",
diff --git a/tests/components/primitive-components/__snapshots__/trace-pcb-path-thickness-with-empty-array.test.tsx-selectors-thickness-pcb.snap.svg b/tests/components/primitive-components/__snapshots__/trace-pcb-path-thickness-with-empty-array.test.tsx-selectors-thickness-pcb.snap.svg
new file mode 100644
index 000000000..980cf415f
--- /dev/null
+++ b/tests/components/primitive-components/__snapshots__/trace-pcb-path-thickness-with-empty-array.test.tsx-selectors-thickness-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/components/primitive-components/__snapshots__/trace-width-alias-pcb.snap.svg b/tests/components/primitive-components/__snapshots__/trace-width-alias-pcb.snap.svg
new file mode 100644
index 000000000..980cf415f
--- /dev/null
+++ b/tests/components/primitive-components/__snapshots__/trace-width-alias-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/components/primitive-components/trace-pcb-path-thickness-with-empty-array.test.tsx b/tests/components/primitive-components/trace-pcb-path-thickness-with-empty-array.test.tsx
new file mode 100644
index 000000000..a4150feee
--- /dev/null
+++ b/tests/components/primitive-components/trace-pcb-path-thickness-with-empty-array.test.tsx
@@ -0,0 +1,41 @@
+import { test, expect } from "bun:test"
+import { getTestFixture } from "tests/fixtures/get-test-fixture"
+
+test("trace pcbPath selectors can set thickness", async () => {
+ const { circuit } = getTestFixture()
+
+ circuit.add(
+
+
+
+
+ ,
+ )
+
+ await circuit.renderUntilSettled()
+
+ const pcbTrace = circuit.db.pcb_trace.list()[0]
+ expect(pcbTrace).toBeDefined()
+ if (!pcbTrace) throw new Error("Expected trace to be routed")
+ expect(
+ pcbTrace.route
+ .filter((segment) => segment.route_type === "wire")
+ .every((segment) => segment.width === 0.5),
+ ).toBe(true)
+
+ await expect(circuit).toMatchPcbSnapshot(
+ `${import.meta.path}-selectors-thickness`,
+ )
+})
diff --git a/tests/components/primitive-components/trace-width-alias.test.tsx b/tests/components/primitive-components/trace-width-alias.test.tsx
new file mode 100644
index 000000000..c114a6e77
--- /dev/null
+++ b/tests/components/primitive-components/trace-width-alias.test.tsx
@@ -0,0 +1,38 @@
+import { test, expect } from "bun:test"
+import { getTestFixture } from "tests/fixtures/get-test-fixture"
+
+test("trace width prop works as alias for thickness", async () => {
+ const { circuit } = getTestFixture()
+
+ circuit.add(
+
+
+
+
+ ,
+ )
+
+ await circuit.renderUntilSettled()
+
+ const pcbTrace = circuit.db.pcb_trace.list()[0]
+ expect(pcbTrace).toBeDefined()
+ if (!pcbTrace) throw new Error("Expected trace to be routed")
+ expect(
+ pcbTrace.route
+ .filter((segment) => segment.route_type === "wire")
+ .every((segment) => segment.width === 0.5),
+ ).toBe(true)
+
+ await expect(circuit).toMatchPcbSnapshot(import.meta.path)
+})