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,47 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import { printSExpr, type PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { quoteSExprString } from "../utils/quoteSExprString"
4
-
5
- export class Layers extends SxClass {
6
- static override token = "layers"
7
- token = "layers"
8
-
9
- private _names: string[] = []
10
-
11
- constructor(names: Array<string | number> = []) {
12
- super()
13
- this.names = names
14
- }
15
-
16
- static override fromSexprPrimitives(
17
- primitiveSexprs: PrimitiveSExpr[],
18
- ): Layers {
19
- const names = primitiveSexprs.map((primitive) =>
20
- typeof primitive === "string" || typeof primitive === "number"
21
- ? String(primitive)
22
- : printSExpr(primitive),
23
- )
24
- return new Layers(names)
25
- }
26
-
27
- get names(): string[] {
28
- return [...this._names]
29
- }
30
-
31
- set names(values: Array<string | number>) {
32
- this._names = values.map((value) => String(value))
33
- }
34
-
35
- override getString(): string {
36
- const rendered = this._names
37
- .map((name) => {
38
- if (/^[^\s()"]+$/u.test(name) && !["nil", "#t", "#f"].includes(name)) {
39
- return name
40
- }
41
- return quoteSExprString(name)
42
- })
43
- .join(" ")
44
- return `(layers ${rendered})`
45
- }
46
- }
47
- SxClass.register(Layers)
@@ -1,61 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { SchematicSymbol } from "./Symbol"
4
-
5
- const SUPPORTED_ARRAY_TOKENS = new Set(["symbol"])
6
-
7
- export class LibSymbols extends SxClass {
8
- static override token = "lib_symbols"
9
- static override parentToken = "kicad_sch"
10
- override token = "lib_symbols"
11
-
12
- private _symbols: SchematicSymbol[] = []
13
-
14
- static override fromSexprPrimitives(
15
- primitiveSexprs: PrimitiveSExpr[],
16
- ): LibSymbols {
17
- const libSymbols = new LibSymbols()
18
-
19
- const { propertyMap, arrayPropertyMap } =
20
- SxClass.parsePrimitivesToClassProperties(primitiveSexprs, this.token)
21
-
22
- const unsupportedSingularTokens = Object.keys(propertyMap).filter(
23
- (token) => !SUPPORTED_ARRAY_TOKENS.has(token),
24
- )
25
- if (unsupportedSingularTokens.length > 0) {
26
- throw new Error(
27
- `Unsupported child tokens inside lib_symbols expression: ${unsupportedSingularTokens.join(", ")}`,
28
- )
29
- }
30
-
31
- const unsupportedArrayTokens = Object.keys(arrayPropertyMap).filter(
32
- (token) => !SUPPORTED_ARRAY_TOKENS.has(token),
33
- )
34
- if (unsupportedArrayTokens.length > 0) {
35
- throw new Error(
36
- `Unsupported repeated child tokens inside lib_symbols expression: ${unsupportedArrayTokens.join(", ")}`,
37
- )
38
- }
39
-
40
- const symbols = (arrayPropertyMap.symbol as SchematicSymbol[]) ?? []
41
- if (!symbols.length && propertyMap.symbol) {
42
- symbols.push(propertyMap.symbol as SchematicSymbol)
43
- }
44
- libSymbols._symbols = symbols
45
-
46
- return libSymbols
47
- }
48
-
49
- get symbols(): SchematicSymbol[] {
50
- return [...this._symbols]
51
- }
52
-
53
- set symbols(value: SchematicSymbol[]) {
54
- this._symbols = [...value]
55
- }
56
-
57
- override getChildren(): SxClass[] {
58
- return [...this._symbols]
59
- }
60
- }
61
- SxClass.register(LibSymbols)
@@ -1,90 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { At, type AtInput } from "./At"
4
- import { Uuid } from "./Uuid"
5
-
6
- const SUPPORTED_TOKENS = new Set(["at", "uuid"])
7
-
8
- export interface NoConnectConstructorParams {
9
- at?: AtInput
10
- uuid?: string | Uuid
11
- }
12
-
13
- export class NoConnect extends SxClass {
14
- static override token = "no_connect"
15
- static override parentToken = "kicad_sch"
16
- override token = "no_connect"
17
-
18
- private _sxAt?: At
19
- private _sxUuid?: Uuid
20
-
21
- constructor(params: NoConnectConstructorParams = {}) {
22
- super()
23
-
24
- if (params.at !== undefined) {
25
- this.at = params.at
26
- }
27
-
28
- if (params.uuid !== undefined) {
29
- this.uuid = params.uuid
30
- }
31
- }
32
-
33
- static override fromSexprPrimitives(
34
- primitiveSexprs: PrimitiveSExpr[],
35
- ): NoConnect {
36
- const noConnect = new NoConnect()
37
-
38
- const { propertyMap, arrayPropertyMap } =
39
- SxClass.parsePrimitivesToClassProperties(primitiveSexprs, this.token)
40
-
41
- if (Object.keys(arrayPropertyMap).length > 0) {
42
- const tokens = Object.keys(arrayPropertyMap).join(", ")
43
- throw new Error(
44
- `no_connect does not support repeated child tokens: ${tokens}`,
45
- )
46
- }
47
-
48
- const unsupportedTokens = Object.keys(propertyMap).filter(
49
- (token) => !SUPPORTED_TOKENS.has(token),
50
- )
51
- if (unsupportedTokens.length > 0) {
52
- throw new Error(
53
- `Unsupported child tokens inside no_connect expression: ${unsupportedTokens.join(", ")}`,
54
- )
55
- }
56
-
57
- noConnect._sxAt = propertyMap.at as At | undefined
58
- noConnect._sxUuid = propertyMap.uuid as Uuid | undefined
59
-
60
- return noConnect
61
- }
62
-
63
- get at(): At | undefined {
64
- return this._sxAt
65
- }
66
-
67
- set at(value: AtInput | undefined) {
68
- this._sxAt = value !== undefined ? At.from(value) : undefined
69
- }
70
-
71
- get uuid(): Uuid | undefined {
72
- return this._sxUuid
73
- }
74
-
75
- set uuid(value: Uuid | string | undefined) {
76
- if (value === undefined) {
77
- this._sxUuid = undefined
78
- return
79
- }
80
- this._sxUuid = value instanceof Uuid ? value : new Uuid(value)
81
- }
82
-
83
- override getChildren(): SxClass[] {
84
- const children: SxClass[] = []
85
- if (this._sxAt) children.push(this._sxAt)
86
- if (this._sxUuid) children.push(this._sxUuid)
87
- return children
88
- }
89
- }
90
- SxClass.register(NoConnect)
@@ -1,8 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import { SxPrimitiveBoolean } from "../base-classes/SxPrimitiveBoolean"
3
-
4
- export class OnBoard extends SxPrimitiveBoolean {
5
- static override token = "on_board"
6
- token = "on_board"
7
- }
8
- SxClass.register(OnBoard)
@@ -1,50 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { printSExpr } from "../parseToPrimitiveSExpr"
4
- import { toStringValue } from "../utils/toStringValue"
5
-
6
- export class PadChamfer extends SxClass {
7
- static override token = "chamfer"
8
- static override parentToken = "pad"
9
- token = "chamfer"
10
-
11
- private _corners: string[] = []
12
-
13
- constructor(corners: string[]) {
14
- super()
15
- this.corners = corners
16
- }
17
-
18
- static override fromSexprPrimitives(
19
- primitiveSexprs: PrimitiveSExpr[],
20
- ): PadChamfer {
21
- const corners = primitiveSexprs.map((primitive) => {
22
- const corner = toStringValue(primitive)
23
- if (corner === undefined) {
24
- return printSExpr(primitive)
25
- }
26
- return corner
27
- })
28
- return new PadChamfer(corners)
29
- }
30
-
31
- get corners(): string[] {
32
- return [...this._corners]
33
- }
34
-
35
- set corners(values: string[]) {
36
- this._corners = values.map((value) => String(value))
37
- }
38
-
39
- override getChildren(): SxClass[] {
40
- return []
41
- }
42
-
43
- override getString(): string {
44
- if (this._corners.length === 0) {
45
- return "(chamfer)"
46
- }
47
- return `(chamfer ${this._corners.join(" ")})`
48
- }
49
- }
50
- SxClass.register(PadChamfer)
@@ -1,9 +0,0 @@
1
- import { SxPrimitiveNumber } from "../base-classes/SxPrimitiveNumber"
2
- import { SxClass } from "../base-classes/SxClass"
3
-
4
- export class PadChamferRatio extends SxPrimitiveNumber {
5
- static override token = "chamfer_ratio"
6
- static override parentToken = "pad"
7
- token = "chamfer_ratio"
8
- }
9
- SxClass.register(PadChamferRatio)
@@ -1,9 +0,0 @@
1
- import { SxPrimitiveNumber } from "../base-classes/SxPrimitiveNumber"
2
- import { SxClass } from "../base-classes/SxClass"
3
-
4
- export class PadClearance extends SxPrimitiveNumber {
5
- static override token = "clearance"
6
- static override parentToken = "pad"
7
- token = "clearance"
8
- }
9
- SxClass.register(PadClearance)
@@ -1,9 +0,0 @@
1
- import { SxPrimitiveNumber } from "../base-classes/SxPrimitiveNumber"
2
- import { SxClass } from "../base-classes/SxClass"
3
-
4
- export class PadDieLength extends SxPrimitiveNumber {
5
- static override token = "die_length"
6
- static override parentToken = "pad"
7
- token = "die_length"
8
- }
9
- SxClass.register(PadDieLength)
@@ -1,145 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { printSExpr } from "../parseToPrimitiveSExpr"
4
- import { toNumberValue } from "../utils/toNumberValue"
5
- import { PadDrillOffset } from "./PadDrillOffset"
6
-
7
- export class PadDrill extends SxClass {
8
- static override token = "drill"
9
- static override parentToken = "pad"
10
- token = "drill"
11
-
12
- private _oval = false
13
- private _diameter: number
14
- private _width?: number
15
- private _sxOffset?: PadDrillOffset
16
-
17
- constructor({
18
- oval = false,
19
- diameter,
20
- width,
21
- offset,
22
- }: {
23
- oval?: boolean
24
- diameter: number
25
- width?: number
26
- offset?: PadDrillOffset | { x: number; y: number }
27
- }) {
28
- super()
29
- this._oval = oval
30
- this._diameter = diameter
31
- this._width = width
32
- if (offset instanceof PadDrillOffset) {
33
- this._sxOffset = offset
34
- } else if (offset) {
35
- this._sxOffset = new PadDrillOffset(offset.x, offset.y)
36
- }
37
- }
38
-
39
- static override fromSexprPrimitives(
40
- primitiveSexprs: PrimitiveSExpr[],
41
- ): PadDrill {
42
- const remaining = [...primitiveSexprs]
43
- let oval = false
44
- if (remaining[0] === "oval") {
45
- oval = true
46
- remaining.shift()
47
- }
48
-
49
- const diameter = toNumberValue(remaining.shift())
50
- if (diameter === undefined) {
51
- throw new Error("drill requires a diameter value")
52
- }
53
-
54
- let width: number | undefined
55
- const potentialWidth = toNumberValue(remaining[0])
56
- if (potentialWidth !== undefined) {
57
- width = potentialWidth
58
- remaining.shift()
59
- }
60
-
61
- const drill = new PadDrill({ oval, diameter, width })
62
-
63
- for (const primitive of remaining) {
64
- if (!Array.isArray(primitive)) {
65
- throw new Error(
66
- `drill encountered unexpected primitive child: ${JSON.stringify(primitive)}`,
67
- )
68
- }
69
- const parsed = SxClass.parsePrimitiveSexpr(primitive, {
70
- parentToken: this.token,
71
- })
72
- if (!(parsed instanceof PadDrillOffset)) {
73
- throw new Error(
74
- `drill encountered unsupported child token: ${printSExpr(primitive)}`,
75
- )
76
- }
77
- if (drill._sxOffset) {
78
- throw new Error("drill does not support multiple offset children")
79
- }
80
- drill._sxOffset = parsed
81
- }
82
-
83
- return drill
84
- }
85
-
86
- get oval(): boolean {
87
- return this._oval
88
- }
89
-
90
- set oval(value: boolean) {
91
- this._oval = value
92
- }
93
-
94
- get diameter(): number {
95
- return this._diameter
96
- }
97
-
98
- set diameter(value: number) {
99
- this._diameter = value
100
- }
101
-
102
- get width(): number | undefined {
103
- return this._width
104
- }
105
-
106
- set width(value: number | undefined) {
107
- this._width = value
108
- }
109
-
110
- get offset(): PadDrillOffset | undefined {
111
- return this._sxOffset
112
- }
113
-
114
- set offset(value: PadDrillOffset | { x: number; y: number } | undefined) {
115
- if (value === undefined) {
116
- this._sxOffset = undefined
117
- return
118
- }
119
- this._sxOffset =
120
- value instanceof PadDrillOffset
121
- ? value
122
- : new PadDrillOffset(value.x, value.y)
123
- }
124
-
125
- override getChildren(): SxClass[] {
126
- return this._sxOffset ? [this._sxOffset] : []
127
- }
128
-
129
- override getString(): string {
130
- const tokens: string[] = []
131
- if (this._oval) tokens.push("oval")
132
- tokens.push(String(this._diameter))
133
- if (this._width !== undefined) tokens.push(String(this._width))
134
-
135
- if (!this._sxOffset) {
136
- return `(drill ${tokens.join(" ")})`
137
- }
138
-
139
- const lines = [`(drill ${tokens.join(" ")}`]
140
- lines.push(this._sxOffset.getStringIndented())
141
- lines.push(")")
142
- return lines.join("\n")
143
- }
144
- }
145
- SxClass.register(PadDrill)
@@ -1,54 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { toNumberValue } from "../utils/toNumberValue"
4
-
5
- export class PadDrillOffset extends SxClass {
6
- static override token = "offset"
7
- static override parentToken = "drill"
8
- token = "offset"
9
-
10
- private _x: number
11
- private _y: number
12
-
13
- constructor(x: number, y: number) {
14
- super()
15
- this._x = x
16
- this._y = y
17
- }
18
-
19
- static override fromSexprPrimitives(
20
- primitiveSexprs: PrimitiveSExpr[],
21
- ): PadDrillOffset {
22
- const x = toNumberValue(primitiveSexprs[0])
23
- const y = toNumberValue(primitiveSexprs[1])
24
- if (x === undefined || y === undefined) {
25
- throw new Error("drill offset requires x and y numeric values")
26
- }
27
- return new PadDrillOffset(x, y)
28
- }
29
-
30
- get x(): number {
31
- return this._x
32
- }
33
-
34
- set x(value: number) {
35
- this._x = value
36
- }
37
-
38
- get y(): number {
39
- return this._y
40
- }
41
-
42
- set y(value: number) {
43
- this._y = value
44
- }
45
-
46
- override getChildren(): SxClass[] {
47
- return []
48
- }
49
-
50
- override getString(): string {
51
- return `(offset ${this._x} ${this._y})`
52
- }
53
- }
54
- SxClass.register(PadDrillOffset)
@@ -1,71 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { printSExpr } from "../parseToPrimitiveSExpr"
4
- import { quoteSExprString } from "../utils/quoteSExprString"
5
- import { toStringValue } from "../utils/toStringValue"
6
-
7
- export type PadLayersInput = PadLayers | string[]
8
-
9
- export class PadLayers extends SxClass {
10
- static override token = "layers"
11
- static override parentToken = "pad"
12
- token = "layers"
13
-
14
- private _layers: string[] = []
15
-
16
- constructor(layers: string[]) {
17
- super()
18
- this.layers = layers
19
- }
20
-
21
- static from(input: PadLayersInput): PadLayers {
22
- if (input instanceof PadLayers) {
23
- return input
24
- }
25
- return new PadLayers(input)
26
- }
27
-
28
- static override fromSexprPrimitives(
29
- primitiveSexprs: PrimitiveSExpr[],
30
- ): PadLayers {
31
- const layers = primitiveSexprs.map((primitive) => {
32
- const value = toStringValue(primitive)
33
- if (value === undefined) {
34
- return printSExpr(primitive)
35
- }
36
- return value
37
- })
38
- return new PadLayers(layers)
39
- }
40
-
41
- get layers(): string[] {
42
- return [...this._layers]
43
- }
44
-
45
- set layers(values: string[]) {
46
- this._layers = values.map((value) => String(value))
47
- }
48
-
49
- override getChildren(): SxClass[] {
50
- return []
51
- }
52
-
53
- override getString(): string {
54
- if (this._layers.length === 0) {
55
- return "(layers)"
56
- }
57
- const rendered = this._layers
58
- .map((layer) => {
59
- if (
60
- /^[^\s()"]+$/u.test(layer) &&
61
- !["nil", "#t", "#f"].includes(layer)
62
- ) {
63
- return layer
64
- }
65
- return quoteSExprString(layer)
66
- })
67
- .join(" ")
68
- return `(layers ${rendered})`
69
- }
70
- }
71
- SxClass.register(PadLayers)
@@ -1,56 +0,0 @@
1
- import { SxClass } from "../base-classes/SxClass"
2
- import type { PrimitiveSExpr } from "../parseToPrimitiveSExpr"
3
- import { quoteSExprString } from "../utils/quoteSExprString"
4
- import { toNumberValue } from "../utils/toNumberValue"
5
- import { toStringValue } from "../utils/toStringValue"
6
-
7
- export class PadNet extends SxClass {
8
- static override token = "net"
9
- static override parentToken = "pad"
10
- token = "net"
11
-
12
- private _id: number
13
- private _name: string
14
-
15
- constructor(id: number, name: string) {
16
- super()
17
- this._id = id
18
- this._name = name
19
- }
20
-
21
- static override fromSexprPrimitives(
22
- primitiveSexprs: PrimitiveSExpr[],
23
- ): PadNet {
24
- const id = toNumberValue(primitiveSexprs[0])
25
- const name = toStringValue(primitiveSexprs[1])
26
- if (id === undefined || name === undefined) {
27
- throw new Error("pad net requires numeric id and string name")
28
- }
29
- return new PadNet(id, name)
30
- }
31
-
32
- get id(): number {
33
- return this._id
34
- }
35
-
36
- set id(value: number) {
37
- this._id = value
38
- }
39
-
40
- get name(): string {
41
- return this._name
42
- }
43
-
44
- set name(value: string) {
45
- this._name = value
46
- }
47
-
48
- override getChildren(): SxClass[] {
49
- return []
50
- }
51
-
52
- override getString(): string {
53
- return `(net ${this._id} ${quoteSExprString(this._name)})`
54
- }
55
- }
56
- SxClass.register(PadNet)