@@ -3,40 +3,83 @@ import type { Padstack } from "lib"
33import type { DsnPcb } from "lib"
44import {
55 createCircularPadstack ,
6+ createPolygonPadstack ,
67 createRectangularPadstack ,
78} from "./create-padstack"
89import { type PadstackNameArgs , getPadstackName } from "./get-padstack-name"
10+ import { getPolygonSmtPadGeometry } from "./get-polygon-smt-pad-geometry"
911
10- export function createAndAddPadstackFromPcbSmtPad (
11- pcb : DsnPcb ,
12- pad : PcbSmtPad ,
13- processedPadstacks : Set < string > ,
14- ) : string {
12+ export function createAndAddPadstackFromPcbSmtPad ( {
13+ pcb,
14+ pad,
15+ processedPadstacks,
16+ } : {
17+ pcb : DsnPcb
18+ pad : PcbSmtPad
19+ processedPadstacks : Set < string >
20+ } ) : string {
1521 const isCircle = pad . shape === "circle"
22+ const isPolygon = pad . shape === "polygon"
23+ const polygonPadGeometry = isPolygon
24+ ? getPolygonSmtPadGeometry ( pad )
25+ : undefined
26+
27+ let shape : PadstackNameArgs [ "shape" ] = "rect"
28+ let outerDiameter : number | undefined
29+ let holeDiameter : number | undefined
30+ let width : number | undefined
31+ let height : number | undefined
32+ let customDescriptor : string | undefined
33+
34+ if ( isCircle ) {
35+ shape = "circle"
36+ outerDiameter = pad . radius * 1000 * 2 // Radius to diameter
37+ holeDiameter = pad . radius * 1000 * 2 // Radius to diameter
38+ } else if ( isPolygon ) {
39+ shape = "polygon"
40+ width = polygonPadGeometry ?. widthUm
41+ height = polygonPadGeometry ?. heightUm
42+ customDescriptor = `${ polygonPadGeometry ?. widthUm } x${ polygonPadGeometry ?. heightUm } _${ polygonPadGeometry ?. relativePointsUm . join ( "_" ) } `
43+ } else {
44+ width = ( pad as { width : number } ) . width * 1000
45+ height = ( pad as { height : number } ) . height * 1000
46+ }
47+
1648 const padstackParams : PadstackNameArgs = {
17- shape : isCircle ? "circle" : "rect" ,
18- outerDiameter : isCircle ? pad . radius * 1000 * 2 : undefined , // Radius to diameter
19- holeDiameter : isCircle ? pad . radius * 1000 * 2 : undefined , // Radius to diameter
20- width : isCircle ? undefined : ( pad as { width : number } ) . width * 1000 ,
21- height : isCircle ? undefined : ( pad as { height : number } ) . height * 1000 ,
49+ shape,
50+ outerDiameter,
51+ holeDiameter,
52+ width,
53+ height,
2254 layer : pad . layer as PcbSmtPad [ "layer" ] ,
55+ customDescriptor,
2356 }
2457
2558 const padstackName = getPadstackName ( padstackParams )
2659
2760 if ( ! processedPadstacks . has ( padstackName ) ) {
28- const padstack : Padstack = isCircle
29- ? createCircularPadstack (
30- padstackName ,
31- padstackParams . outerDiameter ! ,
32- padstackParams . holeDiameter ! ,
33- )
34- : createRectangularPadstack (
35- padstackName ,
36- padstackParams . width ! ,
37- padstackParams . height ! ,
38- pad . layer ,
39- )
61+ let padstack : Padstack
62+
63+ if ( isCircle ) {
64+ padstack = createCircularPadstack (
65+ padstackName ,
66+ padstackParams . outerDiameter ! ,
67+ padstackParams . holeDiameter ! ,
68+ )
69+ } else if ( isPolygon ) {
70+ padstack = createPolygonPadstack ( {
71+ name : padstackName ,
72+ coordinates : polygonPadGeometry ! . relativePointsUm ,
73+ layer : pad . layer ,
74+ } )
75+ } else {
76+ padstack = createRectangularPadstack (
77+ padstackName ,
78+ padstackParams . width ! ,
79+ padstackParams . height ! ,
80+ pad . layer ,
81+ )
82+ }
4083
4184 pcb . library . padstacks . push ( padstack )
4285 processedPadstacks . add ( padstackName )
0 commit comments