Support courtyard elements + silkscreen circles in footprint TSX#21
Support courtyard elements + silkscreen circles in footprint TSX#21Mukedlii wants to merge 11 commits intotscircuit:mainfrom
Conversation
| for (const courtyardCircle of courtyardCircles) { | ||
| elementStrings.push( | ||
| `<courtyardcircle pcbX="${mmStr(courtyardCircle.center.x)}" pcbY="${mmStr(courtyardCircle.center.y)}" radius="${mmStr(courtyardCircle.radius)}" />`, | ||
| ) | ||
| } |
There was a problem hiding this comment.
Missing null safety for courtyardCircle.center. The code directly accesses courtyardCircle.center.x and courtyardCircle.center.y without optional chaining, which will throw a runtime error if center is undefined or null.
This is inconsistent with the silkscreen circle implementation (lines 75-76) which safely uses silkscreenCircle.center?.x ?? 0.
Fix:
for (const courtyardCircle of courtyardCircles) {
const pcbX = courtyardCircle.center?.x ?? 0
const pcbY = courtyardCircle.center?.y ?? 0
elementStrings.push(
`<courtyardcircle pcbX="${mmStr(pcbX)}" pcbY="${mmStr(pcbY)}" radius="${mmStr(courtyardCircle.radius)}" />`,
)
}| for (const courtyardCircle of courtyardCircles) { | |
| elementStrings.push( | |
| `<courtyardcircle pcbX="${mmStr(courtyardCircle.center.x)}" pcbY="${mmStr(courtyardCircle.center.y)}" radius="${mmStr(courtyardCircle.radius)}" />`, | |
| ) | |
| } | |
| for (const courtyardCircle of courtyardCircles) { | |
| const pcbX = courtyardCircle.center?.x ?? 0 | |
| const pcbY = courtyardCircle.center?.y ?? 0 | |
| elementStrings.push( | |
| `<courtyardcircle pcbX="${mmStr(pcbX)}" pcbY="${mmStr(pcbY)}" radius="${mmStr(courtyardCircle.radius)}" />`, | |
| ) | |
| } | |
Spotted by Graphite Agent
Is this helpful? React 👍 or 👎 to let us know.
| ? ` color="${courtyardRect.color}"` | ||
| : "" | ||
| elementStrings.push( | ||
| `<courtyardrect pcbX="${mmStr(courtyardRect.center.x)}" pcbY="${mmStr(courtyardRect.center.y)}" width="${mmStr(courtyardRect.width)}" height="${mmStr(courtyardRect.height)}"${colorAttr} />`, |
There was a problem hiding this comment.
Missing null-safety checks on courtyardRect.center, width, and height properties. This is inconsistent with the defensive pattern used for circles (e.g., lines 75-76, 111-112 use optional chaining center?.x ?? 0).
If courtyardRect.center is undefined or null, this will throw: Cannot read property 'x' of undefined.
Fix:
const pcbX = courtyardRect.center?.x ?? 0
const pcbY = courtyardRect.center?.y ?? 0
const width = mmStr(courtyardRect.width ?? 0)
const height = mmStr(courtyardRect.height ?? 0)
const colorAttr = courtyardRect.color
? ` color="${courtyardRect.color}"`
: ""
elementStrings.push(
`<courtyardrect pcbX="${mmStr(pcbX)}" pcbY="${mmStr(pcbY)}" width="${width}" height="${height}"${colorAttr} />`,
)| `<courtyardrect pcbX="${mmStr(courtyardRect.center.x)}" pcbY="${mmStr(courtyardRect.center.y)}" width="${mmStr(courtyardRect.width)}" height="${mmStr(courtyardRect.height)}"${colorAttr} />`, | |
| const pcbX = courtyardRect.center?.x ?? 0 | |
| const pcbY = courtyardRect.center?.y ?? 0 | |
| const width = mmStr(courtyardRect.width ?? 0) | |
| const height = mmStr(courtyardRect.height ?? 0) | |
| const colorAttr = courtyardRect.color | |
| ? ` color="${courtyardRect.color}"` | |
| : "" | |
| elementStrings.push( | |
| `<courtyardrect pcbX="${mmStr(pcbX)}" pcbY="${mmStr(pcbY)}" width="${width}" height="${height}"${colorAttr} />`, | |
| ) | |
Spotted by Graphite Agent
Is this helpful? React 👍 or 👎 to let us know.
Adds footprint TSX generation support for:
• pcb_silkscreen_circle → emits <silkscreencircle ... /> (includes optional strokeWidth)
• Courtyard elements: • pcb_courtyard_circle → <courtyardcircle ... />
• pcb_courtyard_rect → <courtyardrect ... /> (supports optional color)
• pcb_courtyard_outline →
Also adds a test:
• tests/test7-support-courtyard-and-circles.test.tsx
If you want, a 1-liner at the end:
Test: bun test