|
1 | 1 | import type { |
2 | 2 | AnyCircuitElement, |
3 | | - PcbCourtyardRect, |
| 3 | + PcbCourtyardOutline, |
4 | 4 | PcbSilkscreenPath, |
5 | 5 | } from "circuit-json" |
6 | 6 | import { length } from "circuit-json" |
7 | 7 | import { z } from "zod" |
8 | 8 | import { rectpad } from "../helpers/rectpad" |
| 9 | +import { createRectUnionOutline } from "src/helpers/rect-union-outline" |
9 | 10 | import { silkscreenRef, type SilkscreenRef } from "../helpers/silkscreenRef" |
10 | 11 | import { base_def } from "../helpers/zod/base_def" |
11 | 12 | import { u_curve } from "../helpers/u-curve" |
@@ -101,24 +102,37 @@ export const tssop = ( |
101 | 102 | ], |
102 | 103 | } |
103 | 104 |
|
104 | | - const courtyardPadding = 0.25 |
105 | | - const silkXs = silkscreenBorder.route.map((pt) => pt.x) |
106 | | - const silkYs = silkscreenBorder.route.map((pt) => pt.y) |
107 | | - const padXExtent = parameters.legsoutside |
108 | | - ? parameters.w / 2 + parameters.pl |
109 | | - : parameters.w / 2 |
110 | | - const crtMinX = Math.min(-padXExtent, ...silkXs) - courtyardPadding |
111 | | - const crtMaxX = Math.max(padXExtent, ...silkXs) + courtyardPadding |
112 | | - const crtMinY = Math.min(...silkYs) - courtyardPadding |
113 | | - const crtMaxY = Math.max(...silkYs) + courtyardPadding |
114 | | - const courtyard: PcbCourtyardRect = { |
115 | | - type: "pcb_courtyard_rect", |
116 | | - pcb_courtyard_rect_id: "", |
| 105 | + const roundToCourtyardGrid = (value: number) => |
| 106 | + Math.round(value / 0.01) * 0.01 |
| 107 | + const pinRowSpanY = |
| 108 | + (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw |
| 109 | + const pinToeHalfSpanX = |
| 110 | + parameters.w / 2 + (parameters.legsoutside ? parameters.pl : 0) |
| 111 | + const courtyardStepInnerHalfX = roundToCourtyardGrid(parameters.w / 2 + 0.25) |
| 112 | + const courtyardStepOuterHalfX = roundToCourtyardGrid(pinToeHalfSpanX + 0.18) |
| 113 | + const courtyardStepInnerHalfY = roundToCourtyardGrid(pinRowSpanY / 2 + 0.25) |
| 114 | + const courtyardStepOuterHalfY = roundToCourtyardGrid( |
| 115 | + courtyardStepInnerHalfY + 0.35, |
| 116 | + ) |
| 117 | + const courtyard: PcbCourtyardOutline = { |
| 118 | + type: "pcb_courtyard_outline", |
| 119 | + pcb_courtyard_outline_id: "", |
117 | 120 | pcb_component_id: "", |
118 | | - center: { x: (crtMinX + crtMaxX) / 2, y: (crtMinY + crtMaxY) / 2 }, |
119 | | - width: crtMaxX - crtMinX, |
120 | | - height: crtMaxY - crtMinY, |
121 | 121 | layer: "top", |
| 122 | + outline: createRectUnionOutline([ |
| 123 | + { |
| 124 | + minX: -courtyardStepOuterHalfX, |
| 125 | + maxX: courtyardStepOuterHalfX, |
| 126 | + minY: -courtyardStepInnerHalfY, |
| 127 | + maxY: courtyardStepInnerHalfY, |
| 128 | + }, |
| 129 | + { |
| 130 | + minX: -courtyardStepInnerHalfX, |
| 131 | + maxX: courtyardStepInnerHalfX, |
| 132 | + minY: -courtyardStepOuterHalfY, |
| 133 | + maxY: courtyardStepOuterHalfY, |
| 134 | + }, |
| 135 | + ]), |
122 | 136 | } |
123 | 137 |
|
124 | 138 | return { |
|
0 commit comments