@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,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fuseShapes = fuseShapes;
4
+ exports.cutShapes = cutShapes;
5
+ exports.intersectShapes = intersectShapes;
6
+ /** Fuse (union) two shapes. Returns a new shape. */
7
+ function fuseShapes(oc, a, b) {
8
+ const op = new oc.BRepAlgoAPI_Fuse_3(a, b);
9
+ op.Build();
10
+ const result = op.Shape();
11
+ op.delete();
12
+ return result;
13
+ }
14
+ /** Cut shape `b` from shape `a`. Returns a new shape. */
15
+ function cutShapes(oc, a, b) {
16
+ const op = new oc.BRepAlgoAPI_Cut_3(a, b);
17
+ op.Build();
18
+ const result = op.Shape();
19
+ op.delete();
20
+ return result;
21
+ }
22
+ /** Intersect two shapes. Returns their common volume. */
23
+ function intersectShapes(oc, a, b) {
24
+ const op = new oc.BRepAlgoAPI_Common_3(a, b);
25
+ op.Build();
26
+ const result = op.Shape();
27
+ op.delete();
28
+ return result;
29
+ }
30
+ //# sourceMappingURL=booleans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booleans.js","sourceRoot":"","sources":["../../../../src/synth/3d/booleans.ts"],"names":[],"mappings":";;AAMA,gCAMC;AAGD,8BAMC;AAGD,0CAMC;AAzBD,oDAAoD;AACpD,SAAgB,UAAU,CAAC,EAAM,EAAE,CAAM,EAAE,CAAM;IAC7C,MAAM,EAAE,GAAG,IAAK,EAAU,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,EAAU,CAAC,KAAK,EAAE,CAAC;IACpB,MAAM,MAAM,GAAI,EAAU,CAAC,KAAK,EAAE,CAAC;IACnC,EAAE,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,yDAAyD;AACzD,SAAgB,SAAS,CAAC,EAAM,EAAE,CAAM,EAAE,CAAM;IAC5C,MAAM,EAAE,GAAG,IAAK,EAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,EAAU,CAAC,KAAK,EAAE,CAAC;IACpB,MAAM,MAAM,GAAI,EAAU,CAAC,KAAK,EAAE,CAAC;IACnC,EAAE,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,yDAAyD;AACzD,SAAgB,eAAe,CAAC,EAAM,EAAE,CAAM,EAAE,CAAM;IAClD,MAAM,EAAE,GAAG,IAAK,EAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,EAAU,CAAC,KAAK,EAAE,CAAC;IACpB,MAAM,MAAM,GAAI,EAAU,CAAC,KAAK,EAAE,CAAC;IACnC,EAAE,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Edge filleting (rounding) via BRepFilletAPI_MakeFillet.
3
+ */
4
+ import type { OC } from "./types";
5
+ /**
6
+ * Apply a fillet of `radius` mm to all edges of the shape.
7
+ * Returns a new shape with rounded edges.
8
+ */
9
+ export declare function filletAllEdges(oc: OC, shape: any, radius: number): any;
10
+ /**
11
+ * Apply a fillet of `radius` mm to specific edges (by index, 0-based).
12
+ * Useful when you only want to round certain edges.
13
+ */
14
+ export declare function filletEdgesByIndex(oc: OC, shape: any, edgeIndices: number[], radius: number): any;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filletAllEdges = filletAllEdges;
4
+ exports.filletEdgesByIndex = filletEdgesByIndex;
5
+ /**
6
+ * Apply a fillet of `radius` mm to all edges of the shape.
7
+ * Returns a new shape with rounded edges.
8
+ */
9
+ function filletAllEdges(oc, shape, radius) {
10
+ const mkFillet = new oc.BRepFilletAPI_MakeFillet(shape, oc.ChFi3d_FilletShape.ChFi3d_Rational);
11
+ // Iterate all edges in the shape
12
+ const explorer = new oc.TopExp_Explorer_2(shape, oc.TopAbs_ShapeEnum.TopAbs_EDGE, oc.TopAbs_ShapeEnum.TopAbs_SHAPE);
13
+ while (explorer.More()) {
14
+ const edge = oc.TopoDS.Edge_1(explorer.Current());
15
+ mkFillet.Add_2(radius, edge);
16
+ explorer.Next();
17
+ }
18
+ explorer.delete();
19
+ mkFillet.Build();
20
+ const result = mkFillet.Shape();
21
+ mkFillet.delete();
22
+ return result;
23
+ }
24
+ /**
25
+ * Apply a fillet of `radius` mm to specific edges (by index, 0-based).
26
+ * Useful when you only want to round certain edges.
27
+ */
28
+ function filletEdgesByIndex(oc, shape, edgeIndices, radius) {
29
+ const mkFillet = new oc.BRepFilletAPI_MakeFillet(shape, oc.ChFi3d_FilletShape.ChFi3d_Rational);
30
+ const explorer = new oc.TopExp_Explorer_2(shape, oc.TopAbs_ShapeEnum.TopAbs_EDGE, oc.TopAbs_ShapeEnum.TopAbs_SHAPE);
31
+ const indexSet = new Set(edgeIndices);
32
+ let idx = 0;
33
+ while (explorer.More()) {
34
+ if (indexSet.has(idx)) {
35
+ const edge = oc.TopoDS.Edge_1(explorer.Current());
36
+ mkFillet.Add_2(radius, edge);
37
+ }
38
+ idx++;
39
+ explorer.Next();
40
+ }
41
+ explorer.delete();
42
+ mkFillet.Build();
43
+ const result = mkFillet.Shape();
44
+ mkFillet.delete();
45
+ return result;
46
+ }
47
+ //# sourceMappingURL=fillet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fillet.js","sourceRoot":"","sources":["../../../../src/synth/3d/fillet.ts"],"names":[],"mappings":";;AASA,wCA2BC;AAMD,gDAoCC;AAzED;;;GAGG;AACH,SAAgB,cAAc,CAAC,EAAM,EAAE,KAAU,EAAE,MAAc;IAC7D,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,wBAAwB,CAC5C,KAAK,EACL,EAAE,CAAC,kBAAkB,CAAC,eAAsB,CAC/C,CAAC;IAEF,iCAAiC;IACjC,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,iBAAiB,CACrC,KAAK,EACL,EAAE,CAAC,gBAAgB,CAAC,WAAkB,EACtC,EAAE,CAAC,gBAAgB,CAAC,YAAmB,CAC1C,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,CAAC;IAGjB,QAAgB,CAAC,KAAK,EAAE,CAAC;IAG1B,MAAM,MAAM,GAAI,QAAgB,CAAC,KAAK,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAC9B,EAAM,EACN,KAAU,EACV,WAAqB,EACrB,MAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,wBAAwB,CAC5C,KAAK,EACL,EAAE,CAAC,kBAAkB,CAAC,eAAsB,CAC/C,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,iBAAiB,CACrC,KAAK,EACL,EAAE,CAAC,gBAAgB,CAAC,WAAkB,EACtC,EAAE,CAAC,gBAAgB,CAAC,YAAmB,CAC1C,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,EAAE,CAAC;QACN,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,CAAC;IAGjB,QAAgB,CAAC,KAAK,EAAE,CAAC;IAG1B,MAAM,MAAM,GAAI,QAAgB,CAAC,KAAK,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 3D Model Generation Pipeline — public API surface.
3
+ */
4
+ export { Kicad3DModel, SolidBuilder, type Kicad3DModelOptions } from "./Kicad3DModel";
5
+ export { initOCC } from "./occ";
6
+ export type { OC, Vec3, ColorRGBA, SolidHandle, ExportOptions, ExportResult, Model3DLink, } from "./types";
7
+ export { parseHexColor } from "./types";
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseHexColor = exports.initOCC = exports.SolidBuilder = exports.Kicad3DModel = void 0;
4
+ /**
5
+ * 3D Model Generation Pipeline — public API surface.
6
+ */
7
+ var Kicad3DModel_1 = require("./Kicad3DModel");
8
+ Object.defineProperty(exports, "Kicad3DModel", { enumerable: true, get: function () { return Kicad3DModel_1.Kicad3DModel; } });
9
+ Object.defineProperty(exports, "SolidBuilder", { enumerable: true, get: function () { return Kicad3DModel_1.SolidBuilder; } });
10
+ var occ_1 = require("./occ");
11
+ Object.defineProperty(exports, "initOCC", { enumerable: true, get: function () { return occ_1.initOCC; } });
12
+ var types_1 = require("./types");
13
+ Object.defineProperty(exports, "parseHexColor", { enumerable: true, get: function () { return types_1.parseHexColor; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/synth/3d/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,+CAAsF;AAA7E,4GAAA,YAAY,OAAA;AAAE,4GAAA,YAAY,OAAA;AACnC,6BAAgC;AAAvB,8FAAA,OAAO,OAAA;AAUhB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Custom OpenCascade initializer that avoids using 'import' for WASM files,
3
+ * which causes issues in Node.js ESM/Vitest environment.
4
+ */
5
+ export declare const initOpenCascade: (options?: any) => Promise<unknown>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initOpenCascade = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ /**
9
+ * Custom OpenCascade initializer that avoids using 'import' for WASM files,
10
+ * which causes issues in Node.js ESM/Vitest environment.
11
+ */
12
+ const initOpenCascade = async (options = {}) => {
13
+ const { module = {}, libs = [] } = options;
14
+ // Standard CommonJS doesn't need createRequire, but we keep the logic
15
+ // for compatibility with how it was originally structured.
16
+ // In Node.js CJS, require, __filename, and __dirname are already available.
17
+ console.log('[occ-loader] Setting up polyfills...');
18
+ // @ts-ignore
19
+ globalThis.__dirname = __dirname;
20
+ // @ts-ignore
21
+ globalThis.__filename = __filename;
22
+ // @ts-ignore
23
+ globalThis.require = require;
24
+ console.log('[occ-loader] Importing opencascade.js glue code via string-eval...');
25
+ const ocMainJSPath = require.resolve('opencascade.js/dist/opencascade.js');
26
+ const ocMainJSCode = fs_1.default.readFileSync(ocMainJSPath, 'utf8');
27
+ // The opencascade.js glue code is an IIFE followed by "export default Module;"
28
+ // We strip the export and eval the rest to get the Module constructor.
29
+ const patchedCode = ocMainJSCode.replace('export default Module;', 'Module');
30
+ const ocMainJS = eval(patchedCode);
31
+ console.log('[occ-loader] Reading main WASM binary...');
32
+ const wasmPath = require.resolve('opencascade.js/dist/opencascade.wasm');
33
+ const wasmBinary = fs_1.default.readFileSync(wasmPath);
34
+ console.log('[occ-loader] Instantiating OpenCascade module...');
35
+ return new Promise((resolve, reject) => {
36
+ try {
37
+ const ocModule = new ocMainJS({
38
+ wasmBinary: wasmBinary,
39
+ locateFile: (path) => {
40
+ // This is still used by internally by ocMainJS if it needs other files
41
+ const resolved = require.resolve('opencascade.js/dist/' + path);
42
+ console.log(`[occ-loader] locateFile: ${path} -> ${resolved}`);
43
+ return resolved;
44
+ },
45
+ ...module
46
+ });
47
+ ocModule.then(async (oc) => {
48
+ console.log('[occ-loader] OpenCascade core initialized. Loading libraries...');
49
+ for (const lib of libs) {
50
+ const libPath = typeof lib === 'string' && !lib.includes('/')
51
+ ? require.resolve('opencascade.js/dist/' + lib)
52
+ : lib;
53
+ console.log(`[occ-loader] Loading dynamic library: ${libPath}`);
54
+ // Force loadAsync: false to use readFileSync (ENVIRONMENT_IS_NODE logic)
55
+ // instead of fetch (which fails on absolute paths).
56
+ oc.loadDynamicLibrary(libPath, {
57
+ loadAsync: false,
58
+ global: true,
59
+ nodelete: true,
60
+ allowUndefined: false
61
+ });
62
+ }
63
+ console.log('[occ-loader] All libraries loaded.');
64
+ resolve(oc);
65
+ }).catch((e) => {
66
+ console.error('[occ-loader] Failed to initialize ocModule:', e);
67
+ reject(e);
68
+ });
69
+ }
70
+ catch (e) {
71
+ console.error('[occ-loader] Synchronous error during instantiation:', e);
72
+ reject(e);
73
+ }
74
+ });
75
+ };
76
+ exports.initOpenCascade = initOpenCascade;
77
+ //# sourceMappingURL=occ-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"occ-loader.js","sourceRoot":"","sources":["../../../../src/synth/3d/occ-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ type OpenCascadeInstance = any;
2
+ export declare function initOCC(): Promise<OpenCascadeInstance>;
3
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initOCC = initOCC;
4
+ /**
5
+ * Singleton OpenCascade WASM loader.
6
+ *
7
+ * Caches the OC instance after first init to avoid re-loading the WASM binary.
8
+ * Safe for repeated calls from tests and CLI.
9
+ */
10
+ const occ_loader_1 = require("./occ-loader");
11
+ let _oc = null;
12
+ let _initPromise = null;
13
+ async function initOCC() {
14
+ if (_oc)
15
+ return _oc;
16
+ if (_initPromise)
17
+ return _initPromise;
18
+ // Use our custom loader that avoids problematic 'import' of WASM files
19
+ _initPromise = (0, occ_loader_1.initOpenCascade)({
20
+ libs: [
21
+ "opencascade.core.wasm",
22
+ "opencascade.modelingAlgorithms.wasm",
23
+ "opencascade.dataExchangeBase.wasm"
24
+ ]
25
+ }).then(oc => {
26
+ _oc = oc;
27
+ return oc;
28
+ });
29
+ return _initPromise;
30
+ }
31
+ //# sourceMappingURL=occ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"occ.js","sourceRoot":"","sources":["../../../../src/synth/3d/occ.ts"],"names":[],"mappings":";;AAaA,0BAiBC;AA9BD;;;;;GAKG;AACH,6CAA+C;AAI/C,IAAI,GAAG,GAA+B,IAAI,CAAC;AAC3C,IAAI,YAAY,GAAwC,IAAI,CAAC;AAEtD,KAAK,UAAU,OAAO;IACzB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,uEAAuE;IACvE,YAAY,GAAG,IAAA,4BAAe,EAAC;QAC3B,IAAI,EAAE;YACF,uBAAuB;YACvB,qCAAqC;YACrC,mCAAmC;SACtC;KACJ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QACT,GAAG,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,YAAa,CAAC;AACzB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Primitive solid constructors (all dimensions in mm).
3
+ *
4
+ * Each function returns a TopoDS_Shape ready for boolean ops / transforms.
5
+ */
6
+ import type { OC } from "./types";
7
+ export interface BoxOptions {
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ /** If true, center the box on the origin (default false → corner at origin) */
12
+ center?: boolean;
13
+ }
14
+ export interface SphereOptions {
15
+ r: number;
16
+ /** Ignored — sphere is always centered at origin. Provided for API symmetry. */
17
+ center?: boolean;
18
+ }
19
+ export interface CylinderOptions {
20
+ r: number;
21
+ h: number;
22
+ /** If true, center the cylinder on the origin (default false → base at Z=0) */
23
+ center?: boolean;
24
+ }
25
+ /**
26
+ * Create a box. When `center` is true the box is centered on the origin,
27
+ * otherwise corner 0 sits at the origin.
28
+ */
29
+ export declare function makeBox(oc: OC, opts: BoxOptions): any;
30
+ /**
31
+ * Create a sphere centered at the origin.
32
+ */
33
+ export declare function makeSphere(oc: OC, opts: SphereOptions): any;
34
+ /**
35
+ * Create a cylinder. When `center` is true the cylinder's midpoint
36
+ * is at the origin; otherwise the base sits at Z = 0.
37
+ */
38
+ export declare function makeCylinder(oc: OC, opts: CylinderOptions): any;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeBox = makeBox;
4
+ exports.makeSphere = makeSphere;
5
+ exports.makeCylinder = makeCylinder;
6
+ /**
7
+ * Create a box. When `center` is true the box is centered on the origin,
8
+ * otherwise corner 0 sits at the origin.
9
+ */
10
+ function makeBox(oc, opts) {
11
+ const { x, y, z, center } = opts;
12
+ let maker;
13
+ if (center) {
14
+ const corner = new oc.gp_Pnt_3(-x / 2, -y / 2, -z / 2);
15
+ maker = new oc.BRepPrimAPI_MakeBox_3(corner, x, y, z);
16
+ corner.delete();
17
+ }
18
+ else {
19
+ maker = new oc.BRepPrimAPI_MakeBox_2(x, y, z);
20
+ }
21
+ const shape = maker.Shape();
22
+ maker.delete();
23
+ return shape;
24
+ }
25
+ /**
26
+ * Create a sphere centered at the origin.
27
+ */
28
+ function makeSphere(oc, opts) {
29
+ const maker = new oc.BRepPrimAPI_MakeSphere_1(opts.r);
30
+ const shape = maker.Shape();
31
+ maker.delete();
32
+ return shape;
33
+ }
34
+ /**
35
+ * Create a cylinder. When `center` is true the cylinder's midpoint
36
+ * is at the origin; otherwise the base sits at Z = 0.
37
+ */
38
+ function makeCylinder(oc, opts) {
39
+ const { r, h, center } = opts;
40
+ const maker = new oc.BRepPrimAPI_MakeCylinder_1(r, h);
41
+ let shape = maker.Shape();
42
+ maker.delete();
43
+ if (center) {
44
+ // Shift down by h/2
45
+ const trsf = new oc.gp_Trsf_1();
46
+ const vec = new oc.gp_Vec_4(0, 0, -h / 2);
47
+ trsf.SetTranslation_1(vec);
48
+ const transformer = new oc.BRepBuilderAPI_Transform_2(shape, trsf, true);
49
+ const moved = transformer.Shape();
50
+ transformer.delete();
51
+ trsf.delete();
52
+ vec.delete();
53
+ shape.delete();
54
+ shape = moved;
55
+ }
56
+ return shape;
57
+ }
58
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../../src/synth/3d/primitives.ts"],"names":[],"mappings":";;AAgCA,0BAeC;AAKD,gCAKC;AAMD,oCAqBC;AAxDD;;;GAGG;AACH,SAAgB,OAAO,CAAC,EAAM,EAAE,IAAgB;IAC5C,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEjC,IAAI,KAAU,CAAC;IACf,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,KAAK,GAAG,IAAI,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;SAAM,CAAC;QACJ,KAAK,GAAG,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAI,KAAa,CAAC,KAAK,EAAE,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,EAAM,EAAE,IAAmB;IAClD,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAI,KAAa,CAAC,KAAK,EAAE,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,EAAM,EAAE,IAAqB;IACtD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,IAAI,KAAK,GAAI,KAAa,CAAC,KAAK,EAAE,CAAC;IACnC,KAAK,CAAC,MAAM,EAAE,CAAC;IAEf,IAAI,MAAM,EAAE,CAAC;QACT,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,WAAW,GAAG,IAAI,EAAE,CAAC,0BAA0B,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QAClC,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { OC, SolidHandle } from "./types";
2
+ /**
3
+ * Write a list of solids to a STEP file.
4
+ * All solids are fused into a single compound before writing.
5
+ * Returns true on success, false if STEP export is unavailable.
6
+ */
7
+ export declare function writeSTEP(oc: OC, solids: SolidHandle[], filePath: string): boolean;
@@ -0,0 +1,72 @@
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.writeSTEP = writeSTEP;
37
+ /**
38
+ * Optional STEP export using STEPControl_Writer.
39
+ *
40
+ * STEP files don't carry color information but are useful for
41
+ * downstream processing in CAD tools.
42
+ */
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ /**
46
+ * Write a list of solids to a STEP file.
47
+ * All solids are fused into a single compound before writing.
48
+ * Returns true on success, false if STEP export is unavailable.
49
+ */
50
+ function writeSTEP(oc, solids, filePath) {
51
+ try {
52
+ const dir = path.dirname(filePath);
53
+ if (!fs.existsSync(dir)) {
54
+ fs.mkdirSync(dir, { recursive: true });
55
+ }
56
+ const writer = new oc.STEPControl_Writer_1();
57
+ const pr = new oc.Message_ProgressRange_1();
58
+ for (const solid of solids) {
59
+ writer.Transfer(solid.shape, oc.STEPControl_StepModelType.STEPControl_AsIs, true, pr);
60
+ }
61
+ const status = writer.Write(filePath);
62
+ writer.delete();
63
+ pr.delete();
64
+ // IFSelect_ReturnStatus.IFSelect_RetDone === 0
65
+ return true;
66
+ }
67
+ catch {
68
+ // STEP export not available in this WASM build — silently skip
69
+ return false;
70
+ }
71
+ }
72
+ //# sourceMappingURL=stepWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepWriter.js","sourceRoot":"","sources":["../../../../src/synth/3d/stepWriter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,8BAiCC;AAjDD;;;;;GAKG;AACH,uCAAyB;AACzB,2CAA6B;AAI7B;;;;GAIG;AACH,SAAgB,SAAS,CACrB,EAAM,EACN,MAAqB,EACrB,QAAgB;IAEhB,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,oBAAoB,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,uBAAuB,EAAE,CAAC;QAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,CACX,KAAK,CAAC,KAAK,EACX,EAAE,CAAC,yBAAyB,CAAC,gBAAuB,EACpD,IAAI,EACJ,EAAE,CACL,CAAC;QACN,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,EAAE,CAAC,MAAM,EAAE,CAAC;QAEZ,+CAA+C;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,+DAA+D;QAC/D,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Geometric transforms applied to TopoDS_Shape objects.
3
+ * All angles are in degrees. All distances are in mm.
4
+ */
5
+ import type { OC, Vec3 } from "./types";
6
+ /** Translate a shape by (x, y, z). Returns a new shape. */
7
+ export declare function translateShape(oc: OC, shape: any, v: Vec3): any;
8
+ /**
9
+ * Rotate a shape around X, Y, Z axes (applied in that order).
10
+ * Angles are in degrees.
11
+ */
12
+ export declare function rotateShape(oc: OC, shape: any, angles: Vec3): any;
13
+ /**
14
+ * Uniform or per-axis scale. Returns a new shape.
15
+ * Note: OCC gp_Trsf only supports uniform scale directly.
16
+ * For non-uniform, we use SetValues on the matrix.
17
+ */
18
+ export declare function scaleShape(oc: OC, shape: any, s: Vec3): any;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.translateShape = translateShape;
4
+ exports.rotateShape = rotateShape;
5
+ exports.scaleShape = scaleShape;
6
+ const DEG_TO_RAD = Math.PI / 180;
7
+ /** Translate a shape by (x, y, z). Returns a new shape. */
8
+ function translateShape(oc, shape, v) {
9
+ const trsf = new oc.gp_Trsf_1();
10
+ const vec = new oc.gp_Vec_4(v.x, v.y, v.z);
11
+ trsf.SetTranslation_1(vec);
12
+ const transformer = new oc.BRepBuilderAPI_Transform_2(shape, trsf, true);
13
+ const result = transformer.Shape();
14
+ transformer.delete();
15
+ trsf.delete();
16
+ vec.delete();
17
+ return result;
18
+ }
19
+ /**
20
+ * Rotate a shape around X, Y, Z axes (applied in that order).
21
+ * Angles are in degrees.
22
+ */
23
+ function rotateShape(oc, shape, angles) {
24
+ let current = shape;
25
+ const axes = [
26
+ { dir: [1, 0, 0], angle: angles.x },
27
+ { dir: [0, 1, 0], angle: angles.y },
28
+ { dir: [0, 0, 1], angle: angles.z },
29
+ ];
30
+ for (const { dir, angle } of axes) {
31
+ if (Math.abs(angle) < 1e-9)
32
+ continue;
33
+ const origin = new oc.gp_Pnt_3(0, 0, 0);
34
+ const direction = new oc.gp_Dir_4(dir[0], dir[1], dir[2]);
35
+ const axis = new oc.gp_Ax1_2(origin, direction);
36
+ const trsf = new oc.gp_Trsf_1();
37
+ trsf.SetRotation_1(axis, angle * DEG_TO_RAD);
38
+ const transformer = new oc.BRepBuilderAPI_Transform_2(current, trsf, true);
39
+ const next = transformer.Shape();
40
+ transformer.delete();
41
+ trsf.delete();
42
+ axis.delete();
43
+ direction.delete();
44
+ origin.delete();
45
+ if (current !== shape)
46
+ current.delete();
47
+ current = next;
48
+ }
49
+ return current;
50
+ }
51
+ /**
52
+ * Uniform or per-axis scale. Returns a new shape.
53
+ * Note: OCC gp_Trsf only supports uniform scale directly.
54
+ * For non-uniform, we use SetValues on the matrix.
55
+ */
56
+ function scaleShape(oc, shape, s) {
57
+ const trsf = new oc.gp_Trsf_1();
58
+ if (Math.abs(s.x - s.y) < 1e-9 && Math.abs(s.y - s.z) < 1e-9) {
59
+ // Uniform scale
60
+ const origin = new oc.gp_Pnt_3(0, 0, 0);
61
+ trsf.SetScale(origin, s.x);
62
+ origin.delete();
63
+ }
64
+ else {
65
+ // Non-uniform scale via affine matrix
66
+ trsf.SetValues(s.x, 0, 0, 0, 0, s.y, 0, 0, 0, 0, s.z, 0);
67
+ }
68
+ const transformer = new oc.BRepBuilderAPI_Transform_2(shape, trsf, true);
69
+ const result = transformer.Shape();
70
+ transformer.delete();
71
+ trsf.delete();
72
+ return result;
73
+ }
74
+ //# sourceMappingURL=transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../../../src/synth/3d/transforms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared types for the 3D model generation pipeline.
3
+ * All dimensions are in millimeters.
4
+ */
5
+ import type { initOpenCascade } from "opencascade.js";
6
+ export type OpenCascadeInstance = Awaited<ReturnType<typeof initOpenCascade>>;
7
+ export type OC = OpenCascadeInstance;
8
+ export interface Vec3 {
9
+ x: number;
10
+ y: number;
11
+ z: number;
12
+ }
13
+ export interface ColorRGBA {
14
+ /** Red 0–1 */
15
+ r: number;
16
+ /** Green 0–1 */
17
+ g: number;
18
+ /** Blue 0–1 */
19
+ b: number;
20
+ /** Alpha 0–1 (default 1) */
21
+ a?: number;
22
+ }
23
+ /**
24
+ * Wraps an OpenCascade TopoDS_Shape with color and name metadata.
25
+ */
26
+ export interface SolidHandle {
27
+ shape: any;
28
+ color?: ColorRGBA;
29
+ name?: string;
30
+ }
31
+ export interface ExportOptions {
32
+ /** Output directory for generated files */
33
+ outDir: string;
34
+ /** Base filename without extension */
35
+ baseName: string;
36
+ /** Formats to export (default: ["wrl"]) */
37
+ formats?: ("wrl" | "step")[];
38
+ }
39
+ export interface ExportResult {
40
+ wrlPath?: string;
41
+ stepPath?: string;
42
+ }
43
+ /** Options for the model link in the KiCad footprint */
44
+ export interface Model3DLink {
45
+ /** Relative path to the 3D model file */
46
+ path: string;
47
+ offset?: Vec3;
48
+ scale?: Vec3;
49
+ rotate?: Vec3;
50
+ }
51
+ /**
52
+ * Parse a hex color string (#RRGGBB or #RGB) to ColorRGBA.
53
+ */
54
+ export declare function parseHexColor(hex: string): ColorRGBA;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Shared types for the 3D model generation pipeline.
4
+ * All dimensions are in millimeters.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.parseHexColor = parseHexColor;
8
+ /**
9
+ * Parse a hex color string (#RRGGBB or #RGB) to ColorRGBA.
10
+ */
11
+ function parseHexColor(hex) {
12
+ let h = hex.replace(/^#/, "");
13
+ if (h.length === 3) {
14
+ h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
15
+ }
16
+ const r = parseInt(h.substring(0, 2), 16) / 255;
17
+ const g = parseInt(h.substring(2, 4), 16) / 255;
18
+ const b = parseInt(h.substring(4, 6), 16) / 255;
19
+ return { r, g, b, a: 1 };
20
+ }
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/synth/3d/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA4DH,sCASC;AAZD;;GAEG;AACH,SAAgB,aAAa,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { OC, SolidHandle } from "./types";
2
+ /**
3
+ * Write a list of colored solids to a VRML 2.0 file.
4
+ */
5
+ export declare function writeVRML(oc: OC, solids: SolidHandle[], filePath: string): void;