@tobisk/pcbs 1.0.0

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 (168) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +186 -0
  3. package/dist/src/cli/cli.d.ts +6 -0
  4. package/dist/src/cli/cli.js +87 -0
  5. package/dist/src/cli/cli.js.map +1 -0
  6. package/dist/src/cli/codegen.d.ts +25 -0
  7. package/dist/src/cli/codegen.js +170 -0
  8. package/dist/src/cli/codegen.js.map +1 -0
  9. package/dist/src/cli/commands/export.d.ts +13 -0
  10. package/dist/src/cli/commands/export.js +301 -0
  11. package/dist/src/cli/commands/export.js.map +1 -0
  12. package/dist/src/cli/commands/lib.d.ts +10 -0
  13. package/dist/src/cli/commands/lib.js +158 -0
  14. package/dist/src/cli/commands/lib.js.map +1 -0
  15. package/dist/src/cli/commands/parts.d.ts +4 -0
  16. package/dist/src/cli/commands/parts.js +104 -0
  17. package/dist/src/cli/commands/parts.js.map +1 -0
  18. package/dist/src/cli/commands/setup.d.ts +4 -0
  19. package/dist/src/cli/commands/setup.js +86 -0
  20. package/dist/src/cli/commands/setup.js.map +1 -0
  21. package/dist/src/cli/commands/synth.d.ts +4 -0
  22. package/dist/src/cli/commands/synth.js +75 -0
  23. package/dist/src/cli/commands/synth.js.map +1 -0
  24. package/dist/src/cli/commands/types.d.ts +1 -0
  25. package/dist/src/cli/commands/types.js +140 -0
  26. package/dist/src/cli/commands/types.js.map +1 -0
  27. package/dist/src/cli/commands/validate.d.ts +5 -0
  28. package/dist/src/cli/commands/validate.js +105 -0
  29. package/dist/src/cli/commands/validate.js.map +1 -0
  30. package/dist/src/cli/config.d.ts +9 -0
  31. package/dist/src/cli/config.js +80 -0
  32. package/dist/src/cli/config.js.map +1 -0
  33. package/dist/src/cli/env.d.ts +4 -0
  34. package/dist/src/cli/env.js +166 -0
  35. package/dist/src/cli/env.js.map +1 -0
  36. package/dist/src/cli/search-jlc.d.ts +0 -0
  37. package/dist/src/cli/search-jlc.js +23 -0
  38. package/dist/src/cli/search-jlc.js.map +1 -0
  39. package/dist/src/cli/synthesis.d.ts +11 -0
  40. package/dist/src/cli/synthesis.js +120 -0
  41. package/dist/src/cli/synthesis.js.map +1 -0
  42. package/dist/src/cli/utils/bom.d.ts +19 -0
  43. package/dist/src/cli/utils/bom.js +130 -0
  44. package/dist/src/cli/utils/bom.js.map +1 -0
  45. package/dist/src/cli/utils/cpl.d.ts +18 -0
  46. package/dist/src/cli/utils/cpl.js +101 -0
  47. package/dist/src/cli/utils/cpl.js.map +1 -0
  48. package/dist/src/cli/utils.d.ts +11 -0
  49. package/dist/src/cli/utils.js +136 -0
  50. package/dist/src/cli/utils.js.map +1 -0
  51. package/dist/src/generate-kicad-types.d.ts +1 -0
  52. package/dist/src/generate-kicad-types.js +137 -0
  53. package/dist/src/generate-kicad-types.js.map +1 -0
  54. package/dist/src/synth/3d/Kicad3DModel.d.ts +81 -0
  55. package/dist/src/synth/3d/Kicad3DModel.js +250 -0
  56. package/dist/src/synth/3d/Kicad3DModel.js.map +1 -0
  57. package/dist/src/synth/3d/booleans.d.ts +10 -0
  58. package/dist/src/synth/3d/booleans.js +30 -0
  59. package/dist/src/synth/3d/booleans.js.map +1 -0
  60. package/dist/src/synth/3d/fillet.d.ts +14 -0
  61. package/dist/src/synth/3d/fillet.js +47 -0
  62. package/dist/src/synth/3d/fillet.js.map +1 -0
  63. package/dist/src/synth/3d/index.d.ts +7 -0
  64. package/dist/src/synth/3d/index.js +14 -0
  65. package/dist/src/synth/3d/index.js.map +1 -0
  66. package/dist/src/synth/3d/occ-loader.d.ts +5 -0
  67. package/dist/src/synth/3d/occ-loader.js +77 -0
  68. package/dist/src/synth/3d/occ-loader.js.map +1 -0
  69. package/dist/src/synth/3d/occ.d.ts +3 -0
  70. package/dist/src/synth/3d/occ.js +31 -0
  71. package/dist/src/synth/3d/occ.js.map +1 -0
  72. package/dist/src/synth/3d/primitives.d.ts +38 -0
  73. package/dist/src/synth/3d/primitives.js +58 -0
  74. package/dist/src/synth/3d/primitives.js.map +1 -0
  75. package/dist/src/synth/3d/stepWriter.d.ts +7 -0
  76. package/dist/src/synth/3d/stepWriter.js +72 -0
  77. package/dist/src/synth/3d/stepWriter.js.map +1 -0
  78. package/dist/src/synth/3d/transforms.d.ts +18 -0
  79. package/dist/src/synth/3d/transforms.js +74 -0
  80. package/dist/src/synth/3d/transforms.js.map +1 -0
  81. package/dist/src/synth/3d/types.d.ts +54 -0
  82. package/dist/src/synth/3d/types.js +21 -0
  83. package/dist/src/synth/3d/types.js.map +1 -0
  84. package/dist/src/synth/3d/vrmlWriter.d.ts +5 -0
  85. package/dist/src/synth/3d/vrmlWriter.js +171 -0
  86. package/dist/src/synth/3d/vrmlWriter.js.map +1 -0
  87. package/dist/src/synth/Component.d.ts +67 -0
  88. package/dist/src/synth/Component.js +185 -0
  89. package/dist/src/synth/Component.js.map +1 -0
  90. package/dist/src/synth/Composable.d.ts +73 -0
  91. package/dist/src/synth/Composable.js +128 -0
  92. package/dist/src/synth/Composable.js.map +1 -0
  93. package/dist/src/synth/KicadFootprint.d.ts +97 -0
  94. package/dist/src/synth/KicadFootprint.js +312 -0
  95. package/dist/src/synth/KicadFootprint.js.map +1 -0
  96. package/dist/src/synth/KicadLibrary.d.ts +66 -0
  97. package/dist/src/synth/KicadLibrary.js +162 -0
  98. package/dist/src/synth/KicadLibrary.js.map +1 -0
  99. package/dist/src/synth/KicadSymbol.d.ts +71 -0
  100. package/dist/src/synth/KicadSymbol.js +190 -0
  101. package/dist/src/synth/KicadSymbol.js.map +1 -0
  102. package/dist/src/synth/Layout.d.ts +37 -0
  103. package/dist/src/synth/Layout.js +58 -0
  104. package/dist/src/synth/Layout.js.map +1 -0
  105. package/dist/src/synth/Markers.d.ts +35 -0
  106. package/dist/src/synth/Markers.js +48 -0
  107. package/dist/src/synth/Markers.js.map +1 -0
  108. package/dist/src/synth/Module.d.ts +56 -0
  109. package/dist/src/synth/Module.js +65 -0
  110. package/dist/src/synth/Module.js.map +1 -0
  111. package/dist/src/synth/Net.d.ts +23 -0
  112. package/dist/src/synth/Net.js +95 -0
  113. package/dist/src/synth/Net.js.map +1 -0
  114. package/dist/src/synth/Registry.d.ts +36 -0
  115. package/dist/src/synth/Registry.js +75 -0
  116. package/dist/src/synth/Registry.js.map +1 -0
  117. package/dist/src/synth/Schematic.d.ts +36 -0
  118. package/dist/src/synth/Schematic.js +51 -0
  119. package/dist/src/synth/Schematic.js.map +1 -0
  120. package/dist/src/synth/index.d.ts +21 -0
  121. package/dist/src/synth/index.js +46 -0
  122. package/dist/src/synth/index.js.map +1 -0
  123. package/dist/src/synth/kicad-types-placeholder.d.ts +6 -0
  124. package/dist/src/synth/kicad-types-placeholder.js +7 -0
  125. package/dist/src/synth/kicad-types-placeholder.js.map +1 -0
  126. package/dist/src/synth/types.d.ts +111 -0
  127. package/dist/src/synth/types.js +23 -0
  128. package/dist/src/synth/types.js.map +1 -0
  129. package/dist/src/tests/3d-model.test.d.ts +1 -0
  130. package/dist/src/tests/3d-model.test.js +282 -0
  131. package/dist/src/tests/3d-model.test.js.map +1 -0
  132. package/dist/src/tests/codegen.test.d.ts +1 -0
  133. package/dist/src/tests/codegen.test.js +80 -0
  134. package/dist/src/tests/codegen.test.js.map +1 -0
  135. package/dist/src/tests/dmx_node.test.d.ts +1 -0
  136. package/dist/src/tests/dmx_node.test.js +42 -0
  137. package/dist/src/tests/dmx_node.test.js.map +1 -0
  138. package/dist/src/tests/dnc.test.d.ts +1 -0
  139. package/dist/src/tests/dnc.test.js +100 -0
  140. package/dist/src/tests/dnc.test.js.map +1 -0
  141. package/dist/src/tests/kicad-lib.test.d.ts +1 -0
  142. package/dist/src/tests/kicad-lib.test.js +465 -0
  143. package/dist/src/tests/kicad-lib.test.js.map +1 -0
  144. package/dist/src/tests/layout.test.d.ts +1 -0
  145. package/dist/src/tests/layout.test.js +92 -0
  146. package/dist/src/tests/layout.test.js.map +1 -0
  147. package/dist/src/tests/migration.test.d.ts +1 -0
  148. package/dist/src/tests/migration.test.js +58 -0
  149. package/dist/src/tests/migration.test.js.map +1 -0
  150. package/dist/src/tests/net_merging.test.d.ts +1 -0
  151. package/dist/src/tests/net_merging.test.js +97 -0
  152. package/dist/src/tests/net_merging.test.js.map +1 -0
  153. package/dist/src/tests/occ-minimal.test.d.ts +1 -0
  154. package/dist/src/tests/occ-minimal.test.js +14 -0
  155. package/dist/src/tests/occ-minimal.test.js.map +1 -0
  156. package/dist/src/tests/placement.test.d.ts +1 -0
  157. package/dist/src/tests/placement.test.js +130 -0
  158. package/dist/src/tests/placement.test.js.map +1 -0
  159. package/dist/src/tests/synthesis.test.d.ts +1 -0
  160. package/dist/src/tests/synthesis.test.js +88 -0
  161. package/dist/src/tests/synthesis.test.js.map +1 -0
  162. package/dist/src/types/kicad-library.d.ts +6 -0
  163. package/dist/src/types/kicad-library.js +7 -0
  164. package/dist/src/types/kicad-library.js.map +1 -0
  165. package/dist/src/types/kicad-library.ts +61770 -0
  166. package/package.json +57 -0
  167. package/scripts/patch-opencascade.ts +18 -0
  168. package/scripts/wasm-stub.js +1 -0
@@ -0,0 +1,97 @@
1
+ import type { Model3DLink } from "./3d/types";
2
+ export type PadType = "smd" | "thru_hole" | "np_thru_hole";
3
+ export type PadShape = "roundrect" | "circle" | "rect" | "oval";
4
+ export type FootprintLayer = "F.Cu" | "B.Cu" | "F.SilkS" | "B.SilkS" | "F.Fab" | "B.Fab" | "F.Mask" | "B.Mask" | "F.Paste" | "B.Paste" | "Edge.Cuts";
5
+ export type TextJustify = "left" | "right" | "top" | "bottom";
6
+ export interface FootprintPadOptions {
7
+ number: string;
8
+ type: PadType;
9
+ shape: PadShape;
10
+ x: number;
11
+ y: number;
12
+ width: number;
13
+ height: number;
14
+ layers?: string[];
15
+ /** Roundrect radius ratio (0–1), only used when shape is "roundrect" */
16
+ roundrectRatio?: number;
17
+ /** Drill diameter for through-hole pads */
18
+ drill?: number;
19
+ /** Drill X offset from pad center */
20
+ drillOffsetX?: number;
21
+ /** Drill Y offset from pad center */
22
+ drillOffsetY?: number;
23
+ }
24
+ export interface FootprintLineOptions {
25
+ x1: number;
26
+ y1: number;
27
+ x2: number;
28
+ y2: number;
29
+ layer?: FootprintLayer;
30
+ width?: number;
31
+ }
32
+ export interface FootprintRectOptions {
33
+ x1: number;
34
+ y1: number;
35
+ x2: number;
36
+ y2: number;
37
+ layer?: FootprintLayer;
38
+ width?: number;
39
+ }
40
+ export interface FootprintTextOptions {
41
+ text: string;
42
+ x: number;
43
+ y: number;
44
+ layer?: FootprintLayer;
45
+ fontSize?: number;
46
+ thickness?: number;
47
+ justify?: TextJustify;
48
+ }
49
+ /**
50
+ * Programmatically builds a KiCad footprint (.kicad_mod) file.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const fp = new KicadFootprint({ name: "MyModule" });
55
+ * fp.addPad({ number: "1", type: "smd", shape: "roundrect", x: 0, y: 0, width: 1.5, height: 0.8 });
56
+ * fp.addLine({ x1: -2, y1: -1, x2: 2, y2: -1 });
57
+ * fs.writeFileSync("MyModule.kicad_mod", fp.serialize());
58
+ * ```
59
+ */
60
+ export declare class KicadFootprint {
61
+ readonly name: string;
62
+ /** Default layer for the footprint */
63
+ readonly layer: FootprintLayer;
64
+ /** Footprint attribute: through_hole or smd */
65
+ readonly attr: "through_hole" | "smd";
66
+ private _pads;
67
+ private _lines;
68
+ private _rects;
69
+ private _texts;
70
+ private _model3d?;
71
+ constructor(options: {
72
+ name: string;
73
+ layer?: FootprintLayer;
74
+ attr?: "through_hole" | "smd";
75
+ });
76
+ addPad(options: FootprintPadOptions): this;
77
+ addLine(options: FootprintLineOptions): this;
78
+ addRect(options: FootprintRectOptions): this;
79
+ addText(options: FootprintTextOptions): this;
80
+ /**
81
+ * Link a 3D model file to this footprint.
82
+ * The path should be relative to the footprint file.
83
+ */
84
+ set3DModel(link: Model3DLink): this;
85
+ serialize(): string;
86
+ /**
87
+ * Write the footprint to a `.pretty` directory.
88
+ * Creates the directory if it doesn't exist.
89
+ * @returns The full path to the written file.
90
+ */
91
+ writeFile(prettyDir: string): string;
92
+ private _serializeProperty;
93
+ private _serializeLine;
94
+ private _serializeRect;
95
+ private _serializeText;
96
+ private _serializePad;
97
+ }
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.KicadFootprint = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const crypto_1 = require("crypto");
40
+ // ─── Helpers ─────────────────────────────────────────────────────────
41
+ function uuid() {
42
+ return (0, crypto_1.randomUUID)();
43
+ }
44
+ function indent(s, level) {
45
+ const tabs = "\t".repeat(level);
46
+ return s.split("\n").map(line => line ? tabs + line : line).join("\n");
47
+ }
48
+ // ─── Default pad layers ──────────────────────────────────────────────
49
+ function defaultLayers(type) {
50
+ switch (type) {
51
+ case "smd":
52
+ return ["F.Cu", "F.Mask", "F.Paste"];
53
+ case "thru_hole":
54
+ return ["*.Cu", "*.Mask"];
55
+ case "np_thru_hole":
56
+ return ["*.Cu", "*.Mask"];
57
+ }
58
+ }
59
+ // ─── Class ───────────────────────────────────────────────────────────
60
+ /**
61
+ * Programmatically builds a KiCad footprint (.kicad_mod) file.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const fp = new KicadFootprint({ name: "MyModule" });
66
+ * fp.addPad({ number: "1", type: "smd", shape: "roundrect", x: 0, y: 0, width: 1.5, height: 0.8 });
67
+ * fp.addLine({ x1: -2, y1: -1, x2: 2, y2: -1 });
68
+ * fs.writeFileSync("MyModule.kicad_mod", fp.serialize());
69
+ * ```
70
+ */
71
+ class KicadFootprint {
72
+ constructor(options) {
73
+ this._pads = [];
74
+ this._lines = [];
75
+ this._rects = [];
76
+ this._texts = [];
77
+ this.name = options.name;
78
+ this.layer = options.layer ?? "F.Cu";
79
+ this.attr = options.attr ?? "smd";
80
+ }
81
+ // ── Builder methods ────────────────────────────────────────────────
82
+ addPad(options) {
83
+ this._pads.push({
84
+ number: options.number,
85
+ type: options.type,
86
+ shape: options.shape,
87
+ x: options.x,
88
+ y: options.y,
89
+ width: options.width,
90
+ height: options.height,
91
+ layers: options.layers ?? defaultLayers(options.type),
92
+ roundrectRatio: options.roundrectRatio,
93
+ drill: options.drill,
94
+ drillOffsetX: options.drillOffsetX,
95
+ drillOffsetY: options.drillOffsetY,
96
+ uuid: uuid(),
97
+ });
98
+ return this;
99
+ }
100
+ addLine(options) {
101
+ this._lines.push({
102
+ x1: options.x1,
103
+ y1: options.y1,
104
+ x2: options.x2,
105
+ y2: options.y2,
106
+ layer: options.layer ?? "F.SilkS",
107
+ width: options.width ?? 0.15,
108
+ uuid: uuid(),
109
+ });
110
+ return this;
111
+ }
112
+ addRect(options) {
113
+ this._rects.push({
114
+ x1: options.x1,
115
+ y1: options.y1,
116
+ x2: options.x2,
117
+ y2: options.y2,
118
+ layer: options.layer ?? "F.SilkS",
119
+ width: options.width ?? 0.15,
120
+ uuid: uuid(),
121
+ });
122
+ return this;
123
+ }
124
+ addText(options) {
125
+ this._texts.push({
126
+ text: options.text,
127
+ x: options.x,
128
+ y: options.y,
129
+ layer: options.layer ?? "F.SilkS",
130
+ fontSize: options.fontSize ?? 1,
131
+ thickness: options.thickness ?? 0.1,
132
+ justify: options.justify,
133
+ uuid: uuid(),
134
+ });
135
+ return this;
136
+ }
137
+ /**
138
+ * Link a 3D model file to this footprint.
139
+ * The path should be relative to the footprint file.
140
+ */
141
+ set3DModel(link) {
142
+ this._model3d = link;
143
+ return this;
144
+ }
145
+ // ── Serialization ──────────────────────────────────────────────────
146
+ serialize() {
147
+ const parts = [];
148
+ parts.push(`(footprint "${this.name}"`);
149
+ parts.push(`\t(version 20241229)`);
150
+ parts.push(`\t(generator "pcb_framework")`);
151
+ parts.push(`\t(generator_version "9.0")`);
152
+ parts.push(`\t(layer "${this.layer}")`);
153
+ // Reference property
154
+ parts.push(this._serializeProperty("Reference", "REF**", 0, -2, "F.SilkS"));
155
+ // Value property
156
+ parts.push(this._serializeProperty("Value", this.name, 0, 2, "F.Fab"));
157
+ // Datasheet property (hidden)
158
+ parts.push(this._serializeProperty("Datasheet", "", 0, 0, "F.Fab", true));
159
+ // Description property (hidden)
160
+ parts.push(this._serializeProperty("Description", "", 0, 0, "F.Fab", true));
161
+ // Attribute
162
+ parts.push(`\t(attr ${this.attr})`);
163
+ // Lines
164
+ for (const line of this._lines) {
165
+ parts.push(this._serializeLine(line));
166
+ }
167
+ // Rectangles (rendered as 4 fp_line segments)
168
+ for (const rect of this._rects) {
169
+ parts.push(this._serializeRect(rect));
170
+ }
171
+ // Texts
172
+ for (const text of this._texts) {
173
+ parts.push(this._serializeText(text));
174
+ }
175
+ // Pads
176
+ for (const pad of this._pads) {
177
+ parts.push(this._serializePad(pad));
178
+ }
179
+ // 3D model link
180
+ if (this._model3d) {
181
+ const m = this._model3d;
182
+ const ox = m.offset?.x ?? 0;
183
+ const oy = m.offset?.y ?? 0;
184
+ const oz = m.offset?.z ?? 0;
185
+ const sx = m.scale?.x ?? 1;
186
+ const sy = m.scale?.y ?? 1;
187
+ const sz = m.scale?.z ?? 1;
188
+ const rx = m.rotate?.x ?? 0;
189
+ const ry = m.rotate?.y ?? 0;
190
+ const rz = m.rotate?.z ?? 0;
191
+ parts.push(`\t(model "${m.path}"`);
192
+ parts.push(`\t\t(offset (xyz ${ox} ${oy} ${oz}))`);
193
+ parts.push(`\t\t(scale (xyz ${sx} ${sy} ${sz}))`);
194
+ parts.push(`\t\t(rotate (xyz ${rx} ${ry} ${rz}))`);
195
+ parts.push(`\t)`);
196
+ }
197
+ parts.push(`\t(embedded_fonts no)`);
198
+ parts.push(`)`);
199
+ return parts.join("\n") + "\n";
200
+ }
201
+ /**
202
+ * Write the footprint to a `.pretty` directory.
203
+ * Creates the directory if it doesn't exist.
204
+ * @returns The full path to the written file.
205
+ */
206
+ writeFile(prettyDir) {
207
+ if (!fs.existsSync(prettyDir)) {
208
+ fs.mkdirSync(prettyDir, { recursive: true });
209
+ }
210
+ const filePath = path.join(prettyDir, `${this.name}.kicad_mod`);
211
+ fs.writeFileSync(filePath, this.serialize(), "utf-8");
212
+ return filePath;
213
+ }
214
+ // ── Private serialization helpers ──────────────────────────────────
215
+ _serializeProperty(key, value, x, y, layer, hide = false) {
216
+ const id = uuid();
217
+ let s = `\t(property "${key}" "${value}"\n`;
218
+ s += `\t\t(at ${x} ${y} 0)\n`;
219
+ s += `\t\t(layer "${layer}")\n`;
220
+ if (hide) {
221
+ s += `\t\t(hide yes)\n`;
222
+ }
223
+ s += `\t\t(uuid "${id}")\n`;
224
+ s += `\t\t(effects\n`;
225
+ s += `\t\t\t(font\n`;
226
+ s += `\t\t\t\t(size 1 1)\n`;
227
+ s += `\t\t\t\t(thickness 0.15)\n`;
228
+ s += `\t\t\t)\n`;
229
+ s += `\t\t)\n`;
230
+ s += `\t)`;
231
+ return s;
232
+ }
233
+ _serializeLine(line) {
234
+ let s = `\t(fp_line\n`;
235
+ s += `\t\t(start ${line.x1} ${line.y1})\n`;
236
+ s += `\t\t(end ${line.x2} ${line.y2})\n`;
237
+ s += `\t\t(stroke\n`;
238
+ s += `\t\t\t(width ${line.width})\n`;
239
+ s += `\t\t\t(type solid)\n`;
240
+ s += `\t\t)\n`;
241
+ s += `\t\t(layer "${line.layer}")\n`;
242
+ s += `\t\t(uuid "${line.uuid}")\n`;
243
+ s += `\t)`;
244
+ return s;
245
+ }
246
+ _serializeRect(rect) {
247
+ // Render rect as 4 individual lines forming a box
248
+ const lines = [
249
+ { x1: rect.x1, y1: rect.y1, x2: rect.x2, y2: rect.y1 }, // top
250
+ { x1: rect.x2, y1: rect.y1, x2: rect.x2, y2: rect.y2 }, // right
251
+ { x1: rect.x2, y1: rect.y2, x2: rect.x1, y2: rect.y2 }, // bottom
252
+ { x1: rect.x1, y1: rect.y2, x2: rect.x1, y2: rect.y1 }, // left
253
+ ];
254
+ return lines.map(l => {
255
+ let s = `\t(fp_line\n`;
256
+ s += `\t\t(start ${l.x1} ${l.y1})\n`;
257
+ s += `\t\t(end ${l.x2} ${l.y2})\n`;
258
+ s += `\t\t(stroke\n`;
259
+ s += `\t\t\t(width ${rect.width})\n`;
260
+ s += `\t\t\t(type solid)\n`;
261
+ s += `\t\t)\n`;
262
+ s += `\t\t(layer "${rect.layer}")\n`;
263
+ s += `\t\t(uuid "${uuid()}")\n`;
264
+ s += `\t)`;
265
+ return s;
266
+ }).join("\n");
267
+ }
268
+ _serializeText(text) {
269
+ let s = `\t(fp_text user "${text.text}"\n`;
270
+ s += `\t\t(at ${text.x} ${text.y} 0)\n`;
271
+ s += `\t\t(unlocked yes)\n`;
272
+ s += `\t\t(layer "${text.layer}")\n`;
273
+ s += `\t\t(uuid "${text.uuid}")\n`;
274
+ s += `\t\t(effects\n`;
275
+ s += `\t\t\t(font\n`;
276
+ s += `\t\t\t\t(size ${text.fontSize} ${text.fontSize})\n`;
277
+ s += `\t\t\t\t(thickness ${text.thickness})\n`;
278
+ s += `\t\t\t)\n`;
279
+ if (text.justify) {
280
+ s += `\t\t\t(justify ${text.justify} bottom)\n`;
281
+ }
282
+ s += `\t\t)\n`;
283
+ s += `\t)`;
284
+ return s;
285
+ }
286
+ _serializePad(pad) {
287
+ const typeStr = pad.type === "thru_hole" ? "thru_hole" : pad.type === "np_thru_hole" ? "np_thru_hole" : "smd";
288
+ const shapeStr = pad.shape;
289
+ let s = `\t(pad "${pad.number}" ${typeStr} ${shapeStr}\n`;
290
+ s += `\t\t(at ${pad.x} ${pad.y})\n`;
291
+ s += `\t\t(size ${pad.width} ${pad.height})\n`;
292
+ if (pad.drill) {
293
+ if (pad.drillOffsetX != null || pad.drillOffsetY != null) {
294
+ const ox = pad.drillOffsetX ?? 0;
295
+ const oy = pad.drillOffsetY ?? 0;
296
+ s += `\t\t(drill ${pad.drill} (offset ${ox} ${oy}))\n`;
297
+ }
298
+ else {
299
+ s += `\t\t(drill ${pad.drill})\n`;
300
+ }
301
+ }
302
+ s += `\t\t(layers ${pad.layers.map(l => `"${l}"`).join(" ")})\n`;
303
+ if (pad.shape === "roundrect" && pad.roundrectRatio != null) {
304
+ s += `\t\t(roundrect_rratio ${pad.roundrectRatio})\n`;
305
+ }
306
+ s += `\t\t(uuid "${pad.uuid}")\n`;
307
+ s += `\t)`;
308
+ return s;
309
+ }
310
+ }
311
+ exports.KicadFootprint = KicadFootprint;
312
+ //# sourceMappingURL=KicadFootprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KicadFootprint.js","sourceRoot":"","sources":["../../../src/synth/KicadFootprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { KicadSymbol } from "./KicadSymbol";
2
+ import { KicadFootprint } from "./KicadFootprint";
3
+ /**
4
+ * Merges multiple KicadSymbol and KicadFootprint instances into
5
+ * the project's KiCad library files.
6
+ *
7
+ * - Symbols → single `.kicad_sym` file
8
+ * - Footprints → individual `.kicad_mod` files inside a `.pretty` directory
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const lib = new KicadLibrary();
13
+ * lib.addSymbol(mySymbol);
14
+ * lib.addFootprint(myFootprint);
15
+ * lib.writeSymbols("lib/Project_Symbols.kicad_sym");
16
+ * lib.writeFootprints("lib/Project_Footprints.pretty");
17
+ * ```
18
+ */
19
+ export declare class KicadLibrary {
20
+ private _symbols;
21
+ private _footprints;
22
+ addSymbol(symbol: KicadSymbol): this;
23
+ addFootprint(footprint: KicadFootprint): this;
24
+ get symbols(): ReadonlyArray<KicadSymbol>;
25
+ get footprints(): ReadonlyArray<KicadFootprint>;
26
+ /**
27
+ * Serialize all symbols into a complete `.kicad_sym` library file.
28
+ */
29
+ serializeSymbols(): string;
30
+ /**
31
+ * Write all symbols into a single `.kicad_sym` file.
32
+ * Creates parent directories if needed.
33
+ * @returns The full path to the written file.
34
+ */
35
+ writeSymbols(filePath: string): string;
36
+ /**
37
+ * Write all footprints into a `.pretty` directory.
38
+ * Creates the directory if it doesn't exist.
39
+ * @returns Array of written file paths.
40
+ */
41
+ writeFootprints(prettyDir: string): string[];
42
+ /**
43
+ * Write both symbols and footprints to the given library directory.
44
+ * Convenience method combining `writeSymbols` and `writeFootprints`.
45
+ *
46
+ * @param libDir - The library directory (e.g. "lib")
47
+ * @param symFilename - Symbol library filename (default: "Project_Symbols.kicad_sym")
48
+ * @param fpDirname - Footprint directory name (default: "Project_Footprints.pretty")
49
+ */
50
+ writeAll(libDir: string, symFilename?: string, fpDirname?: string): {
51
+ symbolsPath: string;
52
+ footprintPaths: string[];
53
+ };
54
+ /**
55
+ * Generate the content for a KiCad fp-lib-table file.
56
+ * @param relativePathToLibDir - Path from project dir to the directory containing .pretty
57
+ * @param libName - The name of the library (default: "Project_Footprints")
58
+ */
59
+ static generateFpLibTable(relativePathToLibDir: string, libName?: string): string;
60
+ /**
61
+ * Generate the content for a KiCad sym-lib-table file.
62
+ * @param relativePathToLibDir - Path from project dir to the directory containing .kicad_sym
63
+ * @param libName - The name of the library (default: "Project_Symbols")
64
+ */
65
+ static generateSymLibTable(relativePathToLibDir: string, libName?: string): string;
66
+ }
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.KicadLibrary = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Merges multiple KicadSymbol and KicadFootprint instances into
41
+ * the project's KiCad library files.
42
+ *
43
+ * - Symbols → single `.kicad_sym` file
44
+ * - Footprints → individual `.kicad_mod` files inside a `.pretty` directory
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const lib = new KicadLibrary();
49
+ * lib.addSymbol(mySymbol);
50
+ * lib.addFootprint(myFootprint);
51
+ * lib.writeSymbols("lib/Project_Symbols.kicad_sym");
52
+ * lib.writeFootprints("lib/Project_Footprints.pretty");
53
+ * ```
54
+ */
55
+ class KicadLibrary {
56
+ constructor() {
57
+ this._symbols = [];
58
+ this._footprints = [];
59
+ }
60
+ addSymbol(symbol) {
61
+ this._symbols.push(symbol);
62
+ return this;
63
+ }
64
+ addFootprint(footprint) {
65
+ this._footprints.push(footprint);
66
+ return this;
67
+ }
68
+ get symbols() {
69
+ return this._symbols;
70
+ }
71
+ get footprints() {
72
+ return this._footprints;
73
+ }
74
+ // ── Symbol library file ────────────────────────────────────────────
75
+ /**
76
+ * Serialize all symbols into a complete `.kicad_sym` library file.
77
+ */
78
+ serializeSymbols() {
79
+ const parts = [];
80
+ parts.push(`(kicad_symbol_lib`);
81
+ parts.push(`\t(version 20241209)`);
82
+ parts.push(`\t(generator "pcb_framework")`);
83
+ parts.push(`\t(generator_version "9.0")`);
84
+ for (const sym of this._symbols) {
85
+ parts.push(sym.serialize());
86
+ }
87
+ parts.push(`)`);
88
+ return parts.join("\n") + "\n";
89
+ }
90
+ /**
91
+ * Write all symbols into a single `.kicad_sym` file.
92
+ * Creates parent directories if needed.
93
+ * @returns The full path to the written file.
94
+ */
95
+ writeSymbols(filePath) {
96
+ const dir = path.dirname(filePath);
97
+ if (!fs.existsSync(dir)) {
98
+ fs.mkdirSync(dir, { recursive: true });
99
+ }
100
+ fs.writeFileSync(filePath, this.serializeSymbols(), "utf-8");
101
+ return filePath;
102
+ }
103
+ // ── Footprint library directory ────────────────────────────────────
104
+ /**
105
+ * Write all footprints into a `.pretty` directory.
106
+ * Creates the directory if it doesn't exist.
107
+ * @returns Array of written file paths.
108
+ */
109
+ writeFootprints(prettyDir) {
110
+ if (!fs.existsSync(prettyDir)) {
111
+ fs.mkdirSync(prettyDir, { recursive: true });
112
+ }
113
+ return this._footprints.map(fp => fp.writeFile(prettyDir));
114
+ }
115
+ /**
116
+ * Write both symbols and footprints to the given library directory.
117
+ * Convenience method combining `writeSymbols` and `writeFootprints`.
118
+ *
119
+ * @param libDir - The library directory (e.g. "lib")
120
+ * @param symFilename - Symbol library filename (default: "Project_Symbols.kicad_sym")
121
+ * @param fpDirname - Footprint directory name (default: "Project_Footprints.pretty")
122
+ */
123
+ writeAll(libDir, symFilename = "Project_Symbols.kicad_sym", fpDirname = "Project_Footprints.pretty") {
124
+ const symbolsPath = this.writeSymbols(path.join(libDir, symFilename));
125
+ const footprintPaths = this.writeFootprints(path.join(libDir, fpDirname));
126
+ return { symbolsPath, footprintPaths };
127
+ }
128
+ /**
129
+ * Generate the content for a KiCad fp-lib-table file.
130
+ * @param relativePathToLibDir - Path from project dir to the directory containing .pretty
131
+ * @param libName - The name of the library (default: "Project_Footprints")
132
+ */
133
+ static generateFpLibTable(relativePathToLibDir, libName = "Project_Footprints") {
134
+ // Do NOT use path.join here — it normalizes away ${KIPRJMOD}
135
+ const uri = `\${KIPRJMOD}/${relativePathToLibDir}/${libName}.pretty`;
136
+ return [
137
+ `(fp_lib_table`,
138
+ ` (version 7)`,
139
+ ` (lib (name ${JSON.stringify(libName)})(type "KiCad")(uri ${JSON.stringify(uri)})(options "")(descr "Local Project Footprints"))`,
140
+ `)`,
141
+ ""
142
+ ].join("\n");
143
+ }
144
+ /**
145
+ * Generate the content for a KiCad sym-lib-table file.
146
+ * @param relativePathToLibDir - Path from project dir to the directory containing .kicad_sym
147
+ * @param libName - The name of the library (default: "Project_Symbols")
148
+ */
149
+ static generateSymLibTable(relativePathToLibDir, libName = "Project_Symbols") {
150
+ // Do NOT use path.join here — it normalizes away ${KIPRJMOD}
151
+ const uri = `\${KIPRJMOD}/${relativePathToLibDir}/${libName}.kicad_sym`;
152
+ return [
153
+ `(sym_lib_table`,
154
+ ` (version 7)`,
155
+ ` (lib (name ${JSON.stringify(libName)})(type "KiCad")(uri ${JSON.stringify(uri)})(options "")(descr "Local Project Symbols"))`,
156
+ `)`,
157
+ ""
158
+ ].join("\n");
159
+ }
160
+ }
161
+ exports.KicadLibrary = KicadLibrary;
162
+ //# sourceMappingURL=KicadLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KicadLibrary.js","sourceRoot":"","sources":["../../../src/synth/KicadLibrary.ts"],"names":[],"mappings":"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"}