kicadts 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/index.d.ts +4466 -0
  2. package/dist/index.js +14253 -0
  3. package/package.json +5 -2
  4. package/.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc +0 -111
  5. package/.github/workflows/bun-formatcheck.yml +0 -26
  6. package/.github/workflows/bun-pver-release.yml +0 -70
  7. package/.github/workflows/bun-test.yml +0 -32
  8. package/.github/workflows/bun-typecheck.yml +0 -26
  9. package/.vscode/settings.json +0 -16
  10. package/AGENTS.md +0 -31
  11. package/TODO.md +0 -46
  12. package/biome.json +0 -93
  13. package/bunfig.toml +0 -5
  14. package/lib/index.ts +0 -1
  15. package/lib/sexpr/base-classes/SxClass.ts +0 -164
  16. package/lib/sexpr/base-classes/SxPrimitiveBoolean.ts +0 -35
  17. package/lib/sexpr/base-classes/SxPrimitiveNumber.ts +0 -26
  18. package/lib/sexpr/base-classes/SxPrimitiveString.ts +0 -26
  19. package/lib/sexpr/classes/At.ts +0 -53
  20. package/lib/sexpr/classes/Bus.ts +0 -103
  21. package/lib/sexpr/classes/BusEntry.ts +0 -169
  22. package/lib/sexpr/classes/Color.ts +0 -29
  23. package/lib/sexpr/classes/Dnp.ts +0 -8
  24. package/lib/sexpr/classes/EmbeddedFonts.ts +0 -68
  25. package/lib/sexpr/classes/ExcludeFromSim.ts +0 -8
  26. package/lib/sexpr/classes/FieldsAutoplaced.ts +0 -8
  27. package/lib/sexpr/classes/Footprint.ts +0 -849
  28. package/lib/sexpr/classes/FootprintAttr.ts +0 -104
  29. package/lib/sexpr/classes/FootprintAutoplaceCost180.ts +0 -9
  30. package/lib/sexpr/classes/FootprintAutoplaceCost90.ts +0 -9
  31. package/lib/sexpr/classes/FootprintClearance.ts +0 -9
  32. package/lib/sexpr/classes/FootprintDescr.ts +0 -44
  33. package/lib/sexpr/classes/FootprintLocked.ts +0 -32
  34. package/lib/sexpr/classes/FootprintModel.ts +0 -142
  35. package/lib/sexpr/classes/FootprintNetTiePadGroups.ts +0 -52
  36. package/lib/sexpr/classes/FootprintPad.ts +0 -857
  37. package/lib/sexpr/classes/FootprintPath.ts +0 -44
  38. package/lib/sexpr/classes/FootprintPlaced.ts +0 -32
  39. package/lib/sexpr/classes/FootprintPrivateLayers.ts +0 -56
  40. package/lib/sexpr/classes/FootprintSheetfile.ts +0 -44
  41. package/lib/sexpr/classes/FootprintSheetname.ts +0 -44
  42. package/lib/sexpr/classes/FootprintSolderMaskMargin.ts +0 -9
  43. package/lib/sexpr/classes/FootprintSolderPasteMargin.ts +0 -9
  44. package/lib/sexpr/classes/FootprintSolderPasteRatio.ts +0 -9
  45. package/lib/sexpr/classes/FootprintTags.ts +0 -44
  46. package/lib/sexpr/classes/FootprintTedit.ts +0 -21
  47. package/lib/sexpr/classes/FootprintThermalGap.ts +0 -9
  48. package/lib/sexpr/classes/FootprintThermalWidth.ts +0 -9
  49. package/lib/sexpr/classes/FootprintZoneConnect.ts +0 -9
  50. package/lib/sexpr/classes/FpArc.ts +0 -312
  51. package/lib/sexpr/classes/FpCircle.ts +0 -314
  52. package/lib/sexpr/classes/FpLine.ts +0 -316
  53. package/lib/sexpr/classes/FpPoly.ts +0 -286
  54. package/lib/sexpr/classes/FpPolyFill.ts +0 -48
  55. package/lib/sexpr/classes/FpPolyLocked.ts +0 -40
  56. package/lib/sexpr/classes/FpRect.ts +0 -314
  57. package/lib/sexpr/classes/FpText.ts +0 -375
  58. package/lib/sexpr/classes/FpTextBox.ts +0 -450
  59. package/lib/sexpr/classes/GrLine.ts +0 -264
  60. package/lib/sexpr/classes/GrLineAngle.ts +0 -32
  61. package/lib/sexpr/classes/GrLineEnd.ts +0 -61
  62. package/lib/sexpr/classes/GrLineLocked.ts +0 -40
  63. package/lib/sexpr/classes/GrLineStart.ts +0 -61
  64. package/lib/sexpr/classes/GrText.ts +0 -228
  65. package/lib/sexpr/classes/Image.ts +0 -283
  66. package/lib/sexpr/classes/InBom.ts +0 -8
  67. package/lib/sexpr/classes/Junction.ts +0 -166
  68. package/lib/sexpr/classes/KicadPcb.ts +0 -361
  69. package/lib/sexpr/classes/KicadSch.ts +0 -397
  70. package/lib/sexpr/classes/KicadSchGenerator.ts +0 -32
  71. package/lib/sexpr/classes/KicadSchGeneratorVersion.ts +0 -30
  72. package/lib/sexpr/classes/KicadSchVersion.ts +0 -22
  73. package/lib/sexpr/classes/Label.ts +0 -176
  74. package/lib/sexpr/classes/Layer.ts +0 -51
  75. package/lib/sexpr/classes/Layers.ts +0 -47
  76. package/lib/sexpr/classes/LibSymbols.ts +0 -61
  77. package/lib/sexpr/classes/NoConnect.ts +0 -90
  78. package/lib/sexpr/classes/OnBoard.ts +0 -8
  79. package/lib/sexpr/classes/PadChamfer.ts +0 -50
  80. package/lib/sexpr/classes/PadChamferRatio.ts +0 -9
  81. package/lib/sexpr/classes/PadClearance.ts +0 -9
  82. package/lib/sexpr/classes/PadDieLength.ts +0 -9
  83. package/lib/sexpr/classes/PadDrill.ts +0 -145
  84. package/lib/sexpr/classes/PadDrillOffset.ts +0 -54
  85. package/lib/sexpr/classes/PadLayers.ts +0 -71
  86. package/lib/sexpr/classes/PadNet.ts +0 -56
  87. package/lib/sexpr/classes/PadOptions.ts +0 -181
  88. package/lib/sexpr/classes/PadPinFunction.ts +0 -9
  89. package/lib/sexpr/classes/PadPinType.ts +0 -9
  90. package/lib/sexpr/classes/PadPrimitiveGrArc.ts +0 -272
  91. package/lib/sexpr/classes/PadPrimitiveGrCircle.ts +0 -298
  92. package/lib/sexpr/classes/PadPrimitiveGrLine.ts +0 -126
  93. package/lib/sexpr/classes/PadPrimitives.ts +0 -291
  94. package/lib/sexpr/classes/PadRectDelta.ts +0 -57
  95. package/lib/sexpr/classes/PadRoundrectRratio.ts +0 -9
  96. package/lib/sexpr/classes/PadSize.ts +0 -69
  97. package/lib/sexpr/classes/PadSolderMaskMargin.ts +0 -9
  98. package/lib/sexpr/classes/PadSolderPasteMargin.ts +0 -9
  99. package/lib/sexpr/classes/PadSolderPasteMarginRatio.ts +0 -9
  100. package/lib/sexpr/classes/PadTeardrops.ts +0 -210
  101. package/lib/sexpr/classes/PadThermalBridgeAngle.ts +0 -9
  102. package/lib/sexpr/classes/PadThermalGap.ts +0 -9
  103. package/lib/sexpr/classes/PadThermalWidth.ts +0 -9
  104. package/lib/sexpr/classes/PadZoneConnect.ts +0 -9
  105. package/lib/sexpr/classes/Paper.ts +0 -119
  106. package/lib/sexpr/classes/PcbGeneral.ts +0 -82
  107. package/lib/sexpr/classes/PcbGeneralLegacyTeardrops.ts +0 -44
  108. package/lib/sexpr/classes/PcbGeneralThickness.ts +0 -9
  109. package/lib/sexpr/classes/PcbGenerator.ts +0 -16
  110. package/lib/sexpr/classes/PcbGeneratorVersion.ts +0 -16
  111. package/lib/sexpr/classes/PcbLayerDefinition.ts +0 -106
  112. package/lib/sexpr/classes/PcbLayers.ts +0 -34
  113. package/lib/sexpr/classes/PcbNet.ts +0 -56
  114. package/lib/sexpr/classes/PcbVersion.ts +0 -9
  115. package/lib/sexpr/classes/Property.ts +0 -301
  116. package/lib/sexpr/classes/PropertyHide.ts +0 -9
  117. package/lib/sexpr/classes/PropertyUnlocked.ts +0 -9
  118. package/lib/sexpr/classes/Pts.ts +0 -67
  119. package/lib/sexpr/classes/RenderCache.ts +0 -221
  120. package/lib/sexpr/classes/SchematicText.ts +0 -171
  121. package/lib/sexpr/classes/Segment.ts +0 -243
  122. package/lib/sexpr/classes/SegmentEnd.ts +0 -59
  123. package/lib/sexpr/classes/SegmentLocked.ts +0 -33
  124. package/lib/sexpr/classes/SegmentNet.ts +0 -64
  125. package/lib/sexpr/classes/SegmentStart.ts +0 -59
  126. package/lib/sexpr/classes/Setup/PcbPlotParams.ts +0 -689
  127. package/lib/sexpr/classes/Setup/PcbPlotParamsBase.ts +0 -9
  128. package/lib/sexpr/classes/Setup/PcbPlotParamsNumericProperties.ts +0 -105
  129. package/lib/sexpr/classes/Setup/PcbPlotParamsStringPropertiesA.ts +0 -104
  130. package/lib/sexpr/classes/Setup/PcbPlotParamsStringPropertiesB.ts +0 -105
  131. package/lib/sexpr/classes/Setup/Setup.ts +0 -574
  132. package/lib/sexpr/classes/Setup/SetupPropertyTypes.ts +0 -119
  133. package/lib/sexpr/classes/Setup/Stackup.ts +0 -135
  134. package/lib/sexpr/classes/Setup/StackupLayer.ts +0 -233
  135. package/lib/sexpr/classes/Setup/StackupLayerProperties.ts +0 -80
  136. package/lib/sexpr/classes/Setup/StackupProperties.ts +0 -40
  137. package/lib/sexpr/classes/Setup/base.ts +0 -165
  138. package/lib/sexpr/classes/Setup/index.ts +0 -14
  139. package/lib/sexpr/classes/Setup/setupMultiValueProperties.ts +0 -53
  140. package/lib/sexpr/classes/Setup/setupNumericProperties.ts +0 -151
  141. package/lib/sexpr/classes/Setup/setupPropertyHandlers.ts +0 -90
  142. package/lib/sexpr/classes/Setup/setupStringProperties.ts +0 -75
  143. package/lib/sexpr/classes/Sheet.ts +0 -287
  144. package/lib/sexpr/classes/SheetFill.ts +0 -44
  145. package/lib/sexpr/classes/SheetInstances.ts +0 -168
  146. package/lib/sexpr/classes/SheetInstancesRoot.ts +0 -165
  147. package/lib/sexpr/classes/SheetPin.ts +0 -125
  148. package/lib/sexpr/classes/SheetProperty.ts +0 -115
  149. package/lib/sexpr/classes/SheetSize.ts +0 -44
  150. package/lib/sexpr/classes/Stroke.ts +0 -58
  151. package/lib/sexpr/classes/StrokeType.ts +0 -34
  152. package/lib/sexpr/classes/Symbol.ts +0 -1666
  153. package/lib/sexpr/classes/TextEffects.ts +0 -461
  154. package/lib/sexpr/classes/TitleBlock.ts +0 -369
  155. package/lib/sexpr/classes/Unit.ts +0 -28
  156. package/lib/sexpr/classes/Uuid.ts +0 -8
  157. package/lib/sexpr/classes/Via.ts +0 -363
  158. package/lib/sexpr/classes/ViaNet.ts +0 -60
  159. package/lib/sexpr/classes/Width.ts +0 -8
  160. package/lib/sexpr/classes/Wire.ts +0 -111
  161. package/lib/sexpr/classes/Xy.ts +0 -33
  162. package/lib/sexpr/classes/Zone.ts +0 -39
  163. package/lib/sexpr/index.ts +0 -130
  164. package/lib/sexpr/parseKicadSexpr.ts +0 -5
  165. package/lib/sexpr/parseToPrimitiveSExpr.ts +0 -245
  166. package/lib/sexpr/utils/indentLines.ts +0 -3
  167. package/lib/sexpr/utils/parseYesNo.ts +0 -12
  168. package/lib/sexpr/utils/quoteSExprString.ts +0 -8
  169. package/lib/sexpr/utils/strokeFromArgs.ts +0 -18
  170. package/lib/sexpr/utils/toNumberValue.ts +0 -13
  171. package/lib/sexpr/utils/toStringValue.ts +0 -11
  172. package/scripts/download-references.ts +0 -68
  173. package/tests/fixtures/expectEqualPrimitiveSExpr.ts +0 -199
  174. package/tests/fixtures/png-matcher.ts +0 -109
  175. package/tests/fixtures/preload.ts +0 -1
  176. package/tests/sexpr/KicadPcbDemos.test.ts +0 -48
  177. package/tests/sexpr/KicadSchDemos.test.ts +0 -49
  178. package/tests/sexpr/classes/Footprint.test.ts +0 -277
  179. package/tests/sexpr/classes/FootprintPad.test.ts +0 -78
  180. package/tests/sexpr/classes/FpArc.test.ts +0 -45
  181. package/tests/sexpr/classes/FpCircle.test.ts +0 -39
  182. package/tests/sexpr/classes/FpPoly.test.ts +0 -43
  183. package/tests/sexpr/classes/FpRect.test.ts +0 -40
  184. package/tests/sexpr/classes/FpTextBox.test.ts +0 -84
  185. package/tests/sexpr/classes/Image.test.ts +0 -58
  186. package/tests/sexpr/classes/KicadSch.test.ts +0 -95
  187. package/tests/sexpr/classes/Paper.test.ts +0 -30
  188. package/tests/sexpr/classes/Property.test.ts +0 -48
  189. package/tests/sexpr/classes/Setup.test.ts +0 -188
  190. package/tests/sexpr/classes/Sheet.test.ts +0 -107
  191. package/tests/sexpr/classes/Stroke.test.ts +0 -15
  192. package/tests/sexpr/classes/Symbol.test.ts +0 -96
  193. package/tests/sexpr/classes/TextEffects.test.ts +0 -56
  194. package/tests/sexpr/classes/TitleBlock.test.ts +0 -40
  195. package/tsconfig.json +0 -35
@@ -1,314 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { Layer } from "./Layer"
4
- import { Stroke } from "./Stroke"
5
- import { Uuid } from "./Uuid"
6
- import { Width } from "./Width"
7
- import { toNumberValue } from "../utils/toNumberValue"
8
- import { toStringValue } from "../utils/toStringValue"
9
-
10
- export interface FpCircleConstructorParams {
11
- center?: FpCircleCenter | { x: number; y: number }
12
- end?: FpCircleEnd | { x: number; y: number }
13
- layer?: Layer | string | string[]
14
- width?: number | Width
15
- stroke?: Stroke
16
- fill?: boolean | FpCircleFill
17
- uuid?: string | Uuid
18
- locked?: boolean
19
- }
20
-
21
- export class FpCircle extends SxClass {
22
- static override token = "fp_circle"
23
- token = "fp_circle"
24
-
25
- private _sxCenter?: FpCircleCenter
26
- private _sxEnd?: FpCircleEnd
27
- private _sxLayer?: Layer
28
- private _sxWidth?: Width
29
- private _sxStroke?: Stroke
30
- private _sxFill?: FpCircleFill
31
- private _sxUuid?: Uuid
32
- private _locked = false
33
-
34
- constructor(params: FpCircleConstructorParams = {}) {
35
- super()
36
- if (params.center !== undefined) this.center = params.center
37
- if (params.end !== undefined) this.end = params.end
38
- if (params.layer !== undefined) this.layer = params.layer
39
- if (params.width !== undefined) this.width = params.width
40
- if (params.stroke !== undefined) this.stroke = params.stroke
41
- if (params.fill !== undefined) this.fill = params.fill
42
- if (params.uuid !== undefined) this.uuid = params.uuid
43
- if (params.locked !== undefined) this.locked = params.locked
44
- }
45
-
46
- static override fromSexprPrimitives(
47
- primitiveSexprs: PrimitiveSExpr[],
48
- ): FpCircle {
49
- const circle = new FpCircle()
50
-
51
- const { propertyMap } = SxClass.parsePrimitivesToClassProperties(
52
- primitiveSexprs,
53
- this.token,
54
- )
55
-
56
- circle._sxCenter = propertyMap.center as FpCircleCenter | undefined
57
- circle._sxEnd = propertyMap.end as FpCircleEnd | undefined
58
- circle._sxLayer = propertyMap.layer as Layer | undefined
59
- circle._sxWidth = propertyMap.width as Width | undefined
60
- circle._sxStroke = propertyMap.stroke as Stroke | undefined
61
- circle._sxFill = propertyMap.fill as FpCircleFill | undefined
62
- circle._sxUuid = propertyMap.uuid as Uuid | undefined
63
-
64
- for (const primitive of primitiveSexprs) {
65
- if (primitive === "locked") {
66
- circle._locked = true
67
- }
68
- }
69
-
70
- return circle
71
- }
72
-
73
- get center(): FpCircleCenter | undefined {
74
- return this._sxCenter
75
- }
76
-
77
- set center(value: FpCircleCenter | { x: number; y: number } | undefined,) {
78
- if (value === undefined) {
79
- this._sxCenter = undefined
80
- return
81
- }
82
- if (value instanceof FpCircleCenter) {
83
- this._sxCenter = value
84
- return
85
- }
86
- this._sxCenter = new FpCircleCenter(value.x, value.y)
87
- }
88
-
89
- get end(): FpCircleEnd | undefined {
90
- return this._sxEnd
91
- }
92
-
93
- set end(value: FpCircleEnd | { x: number; y: number } | undefined) {
94
- if (value === undefined) {
95
- this._sxEnd = undefined
96
- return
97
- }
98
- if (value instanceof FpCircleEnd) {
99
- this._sxEnd = value
100
- return
101
- }
102
- this._sxEnd = new FpCircleEnd(value.x, value.y)
103
- }
104
-
105
- get layer(): Layer | undefined {
106
- return this._sxLayer
107
- }
108
-
109
- set layer(value: Layer | string | string[] | undefined) {
110
- if (value === undefined) {
111
- this._sxLayer = undefined
112
- return
113
- }
114
- if (value instanceof Layer) {
115
- this._sxLayer = value
116
- return
117
- }
118
- const names = Array.isArray(value) ? value : [value]
119
- this._sxLayer = new Layer(names)
120
- }
121
-
122
- get width(): number | undefined {
123
- return this._sxWidth?.value
124
- }
125
-
126
- set width(value: number | Width | undefined) {
127
- if (value === undefined) {
128
- this._sxWidth = undefined
129
- return
130
- }
131
- if (value instanceof Width) {
132
- this._sxWidth = value
133
- return
134
- }
135
- this._sxWidth = new Width(value)
136
- }
137
-
138
- get widthClass(): Width | undefined {
139
- return this._sxWidth
140
- }
141
-
142
- get stroke(): Stroke | undefined {
143
- return this._sxStroke
144
- }
145
-
146
- set stroke(value: Stroke | undefined) {
147
- this._sxStroke = value
148
- }
149
-
150
- get fill(): boolean | undefined {
151
- return this._sxFill?.filled
152
- }
153
-
154
- set fill(value: boolean | FpCircleFill | undefined) {
155
- if (value === undefined) {
156
- this._sxFill = undefined
157
- return
158
- }
159
- if (value instanceof FpCircleFill) {
160
- this._sxFill = value
161
- return
162
- }
163
- this._sxFill = new FpCircleFill(value)
164
- }
165
-
166
- get fillClass(): FpCircleFill | undefined {
167
- return this._sxFill
168
- }
169
-
170
- get uuid(): string | undefined {
171
- return this._sxUuid?.value
172
- }
173
-
174
- set uuid(value: string | Uuid | undefined) {
175
- if (value === undefined) {
176
- this._sxUuid = undefined
177
- return
178
- }
179
- if (value instanceof Uuid) {
180
- this._sxUuid = value
181
- return
182
- }
183
- this._sxUuid = new Uuid(value)
184
- }
185
-
186
- get uuidClass(): Uuid | undefined {
187
- return this._sxUuid
188
- }
189
-
190
- get locked(): boolean {
191
- return this._locked
192
- }
193
-
194
- set locked(value: boolean) {
195
- this._locked = value
196
- }
197
-
198
- override getChildren(): SxClass[] {
199
- const children: SxClass[] = []
200
- if (this._sxCenter) children.push(this._sxCenter)
201
- if (this._sxEnd) children.push(this._sxEnd)
202
- if (this._sxLayer) children.push(this._sxLayer)
203
- if (this._sxWidth) children.push(this._sxWidth)
204
- if (this._sxStroke) children.push(this._sxStroke)
205
- if (this._sxFill) children.push(this._sxFill)
206
- if (this._sxUuid) children.push(this._sxUuid)
207
- return children
208
- }
209
-
210
- override getString(): string {
211
- const lines = ["(fp_circle"]
212
- const push = (value?: SxClass) => {
213
- if (!value) return
214
- lines.push(value.getStringIndented())
215
- }
216
-
217
- push(this._sxCenter)
218
- push(this._sxEnd)
219
- push(this._sxLayer)
220
- push(this._sxWidth)
221
- push(this._sxStroke)
222
- push(this._sxFill)
223
- push(this._sxUuid)
224
-
225
- if (this._locked) {
226
- lines.push(" locked")
227
- }
228
-
229
- lines.push(")")
230
- return lines.join("\n")
231
- }
232
- }
233
- SxClass.register(FpCircle)
234
-
235
- export class FpCircleCenter extends SxClass {
236
- static override token = "center"
237
- static override parentToken = "fp_circle"
238
- token = "center"
239
-
240
- x: number
241
- y: number
242
-
243
- constructor(x: number, y: number) {
244
- super()
245
- this.x = x
246
- this.y = y
247
- }
248
-
249
- static override fromSexprPrimitives(
250
- primitiveSexprs: PrimitiveSExpr[],
251
- ): FpCircleCenter {
252
- const x = toNumberValue(primitiveSexprs[0]) ?? 0
253
- const y = toNumberValue(primitiveSexprs[1]) ?? 0
254
- return new FpCircleCenter(x, y)
255
- }
256
-
257
- override getString(): string {
258
- return `(center ${this.x} ${this.y})`
259
- }
260
- }
261
- SxClass.register(FpCircleCenter)
262
-
263
- export class FpCircleEnd extends SxClass {
264
- static override token = "end"
265
- static override parentToken = "fp_circle"
266
- token = "end"
267
-
268
- x: number
269
- y: number
270
-
271
- constructor(x: number, y: number) {
272
- super()
273
- this.x = x
274
- this.y = y
275
- }
276
-
277
- static override fromSexprPrimitives(
278
- primitiveSexprs: PrimitiveSExpr[],
279
- ): FpCircleEnd {
280
- const x = toNumberValue(primitiveSexprs[0]) ?? 0
281
- const y = toNumberValue(primitiveSexprs[1]) ?? 0
282
- return new FpCircleEnd(x, y)
283
- }
284
-
285
- override getString(): string {
286
- return `(end ${this.x} ${this.y})`
287
- }
288
- }
289
- SxClass.register(FpCircleEnd)
290
-
291
- export class FpCircleFill extends SxClass {
292
- static override token = "fill"
293
- static override parentToken = "fp_circle"
294
- token = "fill"
295
-
296
- filled: boolean
297
-
298
- constructor(filled: boolean) {
299
- super()
300
- this.filled = filled
301
- }
302
-
303
- static override fromSexprPrimitives(
304
- primitiveSexprs: PrimitiveSExpr[],
305
- ): FpCircleFill {
306
- const state = toStringValue(primitiveSexprs[0])
307
- return new FpCircleFill(state === "yes")
308
- }
309
-
310
- override getString(): string {
311
- return `(fill ${this.filled ? "yes" : "no"})`
312
- }
313
- }
314
- SxClass.register(FpCircleFill)
@@ -1,316 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { Layer } from "./Layer"
4
- import { Stroke } from "./Stroke"
5
- import { Uuid } from "./Uuid"
6
- import { Width } from "./Width"
7
-
8
- const SUPPORTED_SINGLE_TOKENS = new Set([
9
- "start",
10
- "end",
11
- "layer",
12
- "width",
13
- "stroke",
14
- "uuid",
15
- ])
16
-
17
- export interface FpLineConstructorParams {
18
- start?: FpLineStart | { x: number; y: number }
19
- end?: FpLineEnd | { x: number; y: number }
20
- layer?: Layer | string | string[]
21
- width?: number
22
- stroke?: Stroke
23
- uuid?: Uuid | string
24
- locked?: boolean
25
- }
26
-
27
- export class FpLine extends SxClass {
28
- static override token = "fp_line"
29
- static override parentToken = "footprint"
30
- override token = "fp_line"
31
-
32
- private _sxStart?: FpLineStart
33
- private _sxEnd?: FpLineEnd
34
- private _sxLayer?: Layer
35
- private _sxWidth?: Width
36
- private _sxStroke?: Stroke
37
- private _sxUuid?: Uuid
38
- private _locked = false
39
-
40
- constructor(params: FpLineConstructorParams = {}) {
41
- super()
42
- if (params.start !== undefined) this.start = params.start
43
- if (params.end !== undefined) this.end = params.end
44
- if (params.layer !== undefined) this.layer = params.layer
45
- if (params.width !== undefined) this.width = params.width
46
- if (params.stroke !== undefined) this.stroke = params.stroke
47
- if (params.uuid !== undefined) this.uuid = params.uuid
48
- if (params.locked !== undefined) this.locked = params.locked
49
- }
50
-
51
- static override fromSexprPrimitives(
52
- primitiveSexprs: PrimitiveSExpr[],
53
- ): FpLine {
54
- const fpLine = new FpLine()
55
-
56
- const structuredPrimitives: PrimitiveSExpr[] = []
57
-
58
- for (const primitive of primitiveSexprs) {
59
- if (typeof primitive === "string") {
60
- if (primitive === "locked") {
61
- if (fpLine._locked) {
62
- throw new Error("fp_line encountered duplicate locked flags")
63
- }
64
- fpLine._locked = true
65
- continue
66
- }
67
- throw new Error(`fp_line encountered unsupported flag "${primitive}"`)
68
- }
69
-
70
- if (!Array.isArray(primitive) || primitive.length === 0) {
71
- throw new Error(
72
- `fp_line encountered invalid child expression: ${JSON.stringify(primitive)}`,
73
- )
74
- }
75
-
76
- structuredPrimitives.push(primitive)
77
- }
78
-
79
- const { propertyMap, arrayPropertyMap } =
80
- SxClass.parsePrimitivesToClassProperties(structuredPrimitives, this.token)
81
-
82
- for (const token of Object.keys(propertyMap)) {
83
- if (!SUPPORTED_SINGLE_TOKENS.has(token)) {
84
- throw new Error(
85
- `fp_line encountered unsupported child token "${token}"`,
86
- )
87
- }
88
- }
89
-
90
- for (const [token, entries] of Object.entries(arrayPropertyMap)) {
91
- if (!SUPPORTED_SINGLE_TOKENS.has(token)) {
92
- throw new Error(
93
- `fp_line encountered unsupported child token "${token}"`,
94
- )
95
- }
96
- if (entries.length > 1) {
97
- throw new Error(
98
- `fp_line does not support repeated child token "${token}"`,
99
- )
100
- }
101
- }
102
-
103
- fpLine._sxStart =
104
- (arrayPropertyMap.start?.[0] as FpLineStart | undefined) ??
105
- (propertyMap.start as FpLineStart | undefined)
106
- fpLine._sxEnd =
107
- (arrayPropertyMap.end?.[0] as FpLineEnd | undefined) ??
108
- (propertyMap.end as FpLineEnd | undefined)
109
- fpLine._sxLayer =
110
- (arrayPropertyMap.layer?.[0] as Layer | undefined) ??
111
- (propertyMap.layer as Layer | undefined)
112
- fpLine._sxWidth =
113
- (arrayPropertyMap.width?.[0] as Width | undefined) ??
114
- (propertyMap.width as Width | undefined)
115
- fpLine._sxStroke =
116
- (arrayPropertyMap.stroke?.[0] as Stroke | undefined) ??
117
- (propertyMap.stroke as Stroke | undefined)
118
- fpLine._sxUuid =
119
- (arrayPropertyMap.uuid?.[0] as Uuid | undefined) ??
120
- (propertyMap.uuid as Uuid | undefined)
121
-
122
- if (!fpLine._sxStart) {
123
- throw new Error("fp_line requires a start child token")
124
- }
125
- if (!fpLine._sxEnd) {
126
- throw new Error("fp_line requires an end child token")
127
- }
128
- if (!fpLine._sxLayer) {
129
- throw new Error("fp_line requires a layer child token")
130
- }
131
-
132
- return fpLine
133
- }
134
-
135
- get start(): FpLineStart | undefined {
136
- return this._sxStart
137
- }
138
-
139
- set start(value: FpLineStart | { x: number; y: number } | undefined) {
140
- if (value === undefined) {
141
- this._sxStart = undefined
142
- return
143
- }
144
- this._sxStart =
145
- value instanceof FpLineStart ? value : new FpLineStart(value.x, value.y)
146
- }
147
-
148
- get end(): FpLineEnd | undefined {
149
- return this._sxEnd
150
- }
151
-
152
- set end(value: FpLineEnd | { x: number; y: number } | undefined) {
153
- if (value === undefined) {
154
- this._sxEnd = undefined
155
- return
156
- }
157
- this._sxEnd =
158
- value instanceof FpLineEnd ? value : new FpLineEnd(value.x, value.y)
159
- }
160
-
161
- get layer(): Layer | undefined {
162
- return this._sxLayer
163
- }
164
-
165
- set layer(value: Layer | string | Array<string | number> | undefined) {
166
- if (value === undefined) {
167
- this._sxLayer = undefined
168
- return
169
- }
170
- if (value instanceof Layer) {
171
- this._sxLayer = value
172
- return
173
- }
174
- const names = Array.isArray(value) ? value : [value]
175
- this._sxLayer = new Layer(names)
176
- }
177
-
178
- get width(): number | undefined {
179
- return this._sxWidth?.value
180
- }
181
-
182
- set width(value: number | undefined) {
183
- this._sxWidth = value === undefined ? undefined : new Width(value)
184
- }
185
-
186
- get stroke(): Stroke | undefined {
187
- return this._sxStroke
188
- }
189
-
190
- set stroke(value: Stroke | undefined) {
191
- this._sxStroke = value
192
- }
193
-
194
- get uuid(): Uuid | undefined {
195
- return this._sxUuid
196
- }
197
-
198
- set uuid(value: Uuid | string | undefined) {
199
- if (value === undefined) {
200
- this._sxUuid = undefined
201
- return
202
- }
203
- this._sxUuid = value instanceof Uuid ? value : new Uuid(value)
204
- }
205
-
206
- get locked(): boolean {
207
- return this._locked
208
- }
209
-
210
- set locked(value: boolean) {
211
- this._locked = value
212
- }
213
-
214
- override getChildren(): SxClass[] {
215
- const children: SxClass[] = []
216
- if (this._sxStart) children.push(this._sxStart)
217
- if (this._sxEnd) children.push(this._sxEnd)
218
- if (this._sxStroke) {
219
- children.push(this._sxStroke)
220
- } else if (this._sxWidth) {
221
- children.push(this._sxWidth)
222
- }
223
- if (this._sxLayer) children.push(this._sxLayer)
224
- if (this._sxUuid) children.push(this._sxUuid)
225
- if (this._locked) children.push(new FpLineLocked())
226
- return children
227
- }
228
- }
229
- SxClass.register(FpLine)
230
-
231
- export class FpLineStart extends SxClass {
232
- static override token = "start"
233
- static override parentToken = "fp_line"
234
- override token = "start"
235
-
236
- constructor(
237
- public x: number,
238
- public y: number,
239
- ) {
240
- super()
241
- }
242
-
243
- static override fromSexprPrimitives(
244
- primitiveSexprs: PrimitiveSExpr[],
245
- ): FpLineStart {
246
- const [rawX, rawY] = primitiveSexprs
247
- const x = Number(rawX)
248
- const y = Number(rawY)
249
- if (!Number.isFinite(x) || !Number.isFinite(y)) {
250
- throw new Error("fp_line start expects numeric coordinates")
251
- }
252
- return new FpLineStart(x, y)
253
- }
254
-
255
- override getChildren(): SxClass[] {
256
- return []
257
- }
258
-
259
- override getString(): string {
260
- return `(start ${this.x} ${this.y})`
261
- }
262
- }
263
- SxClass.register(FpLineStart)
264
-
265
- export class FpLineEnd extends SxClass {
266
- static override token = "end"
267
- static override parentToken = "fp_line"
268
- override token = "end"
269
-
270
- constructor(
271
- public x: number,
272
- public y: number,
273
- ) {
274
- super()
275
- }
276
-
277
- static override fromSexprPrimitives(
278
- primitiveSexprs: PrimitiveSExpr[],
279
- ): FpLineEnd {
280
- const [rawX, rawY] = primitiveSexprs
281
- const x = Number(rawX)
282
- const y = Number(rawY)
283
- if (!Number.isFinite(x) || !Number.isFinite(y)) {
284
- throw new Error("fp_line end expects numeric coordinates")
285
- }
286
- return new FpLineEnd(x, y)
287
- }
288
-
289
- override getChildren(): SxClass[] {
290
- return []
291
- }
292
-
293
- override getString(): string {
294
- return `(end ${this.x} ${this.y})`
295
- }
296
- }
297
- SxClass.register(FpLineEnd)
298
-
299
- class FpLineLocked extends SxClass {
300
- static override token = "locked"
301
- static override parentToken = "fp_line"
302
- override token = "locked"
303
-
304
- static override fromSexprPrimitives(): FpLineLocked {
305
- return new FpLineLocked()
306
- }
307
-
308
- override getChildren(): SxClass[] {
309
- return []
310
- }
311
-
312
- override getString(): string {
313
- return "locked"
314
- }
315
- }
316
- SxClass.register(FpLineLocked)