brepjs 20.12.4 → 20.12.6

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 (102) hide show
  1. package/dist/2d/lib/offset.d.ts +1 -1
  2. package/dist/2d.cjs +6 -6
  3. package/dist/2d.js +6 -6
  4. package/dist/{adjacencyFns-54UTqtan.js → adjacencyFns--KmBIKYJ.js} +3 -3
  5. package/dist/{adjacencyFns-C_Vb1AeW.cjs → adjacencyFns-BFJfaUwX.cjs} +3 -3
  6. package/dist/{blueprint-DFpjcrlm.js → blueprint-BhIk9Pvm.js} +7 -8
  7. package/dist/{blueprint-D0VEeTzJ.cjs → blueprint-D83DDDPb.cjs} +7 -8
  8. package/dist/{blueprintFns-Douf5ZdX.cjs → blueprintFns-C4TQn-x_.cjs} +2 -2
  9. package/dist/{blueprintFns-Dye1jezD.js → blueprintFns-eULVgkq9.js} +2 -2
  10. package/dist/{blueprintSketcher-Cr0Lr1Dq.js → blueprintSketcher-D_Faf0GO.js} +32 -14
  11. package/dist/{blueprintSketcher-W9yON-UC.cjs → blueprintSketcher-Di376t-0.cjs} +32 -14
  12. package/dist/{boolean2D-C9VghXHG.cjs → boolean2D-CNZFI_y8.cjs} +4 -4
  13. package/dist/{boolean2D-CCV3R6lN.js → boolean2D-DqpCF72W.js} +4 -4
  14. package/dist/brepjs.cjs +128 -100
  15. package/dist/brepjs.js +128 -100
  16. package/dist/{cameraFns-DZOI_ewG.js → cameraFns-CrClIkmV.js} +3 -3
  17. package/dist/{cameraFns-x3L6dtA8.cjs → cameraFns-RqraCXIc.cjs} +3 -3
  18. package/dist/core.cjs +2 -2
  19. package/dist/core.js +2 -2
  20. package/dist/{cornerFinder-BY10jciz.js → cornerFinder-BZuQkRp2.js} +1 -1
  21. package/dist/{cornerFinder-B8PqO4um.cjs → cornerFinder-CdOe1Wrb.cjs} +1 -1
  22. package/dist/{curveFns-B4308HNM.js → curveFns-BP3srCfK.js} +1 -1
  23. package/dist/{curveFns-8lUhNquZ.cjs → curveFns-CyIvQNYT.cjs} +1 -1
  24. package/dist/{drawFns-C7zAvera.cjs → drawFns-71cOhWD-.cjs} +29 -16
  25. package/dist/{drawFns-DjnU3fEd.js → drawFns-DxDwJ5zZ.js} +29 -16
  26. package/dist/{faceFns-BjmlYcc9.cjs → faceFns-B7MiDYj1.cjs} +2 -2
  27. package/dist/{faceFns-7eHqNM0P.js → faceFns-iVPbTxki.js} +2 -2
  28. package/dist/{healingFns-BW7mZ_SW.js → healingFns-BhP8zfp1.js} +5 -5
  29. package/dist/{healingFns-CYLIcIWv.cjs → healingFns-DWljGTNR.cjs} +5 -5
  30. package/dist/{helpers-BQ6XMFcm.js → helpers-D2hANLRu.js} +14 -10
  31. package/dist/{helpers-De0Z_6iV.cjs → helpers-DKEVm6Hu.cjs} +14 -10
  32. package/dist/{importFns-BCL4-H8e.js → importFns-DUzIkns7.js} +2 -2
  33. package/dist/{importFns-3IMBHQrQ.cjs → importFns-KEPAgbjj.cjs} +2 -2
  34. package/dist/index.d.ts +2 -2
  35. package/dist/io.cjs +2 -2
  36. package/dist/io.js +2 -2
  37. package/dist/kernel/bspline2dFit.d.ts +42 -0
  38. package/dist/kernel/geometry2d.d.ts +45 -0
  39. package/dist/kernel/occt/kernel2dOps.d.ts +1 -1
  40. package/dist/kernel/occtWasm/constructionOps.d.ts +1 -1
  41. package/dist/kernel/occtWasm/kernel2dOps.d.ts +7 -4
  42. package/dist/kernel/occtWasm/occtWasmAdapter.cjs +1 -1
  43. package/dist/kernel/occtWasm/occtWasmAdapter.d.ts +3 -3
  44. package/dist/kernel/occtWasm/occtWasmAdapter.js +1 -1
  45. package/dist/kernel/occtWasm/occtWasmTypes.d.ts +7 -0
  46. package/dist/{loftFns-DlG5oR0X.cjs → loftFns-D5AvfCGG.cjs} +17 -2
  47. package/dist/{loftFns-H4ZOpRAk.js → loftFns-D5NJpHLZ.js} +17 -2
  48. package/dist/{measureFns-Ce01LVwq.cjs → measureFns-CZHNWkiA.cjs} +102 -35
  49. package/dist/{measureFns-1IfNe629.js → measureFns-mxBdPiWa.js} +102 -35
  50. package/dist/measurement/measureFns.d.ts +3 -2
  51. package/dist/measurement.cjs +2 -2
  52. package/dist/measurement.js +2 -2
  53. package/dist/{meshFns-nEvfwNRF.cjs → meshFns-Czlt-GBJ.cjs} +3 -3
  54. package/dist/{meshFns-DaRZxa7B.js → meshFns-DmjMzNbH.js} +3 -3
  55. package/dist/{occtWasmAdapter-ipKUdNLN.js → occtWasmAdapter-B9d0Q0Vl.js} +1160 -261
  56. package/dist/{occtWasmAdapter-CRd9RFEu.cjs → occtWasmAdapter-DVxLkjlJ.cjs} +1171 -260
  57. package/dist/operations/patternFns.d.ts +6 -1
  58. package/dist/operations.cjs +2 -2
  59. package/dist/operations.js +2 -2
  60. package/dist/{originTrackingFns-zrksCJTa.js → originTrackingFns-CBnyKLm7.js} +2 -2
  61. package/dist/{originTrackingFns-9gyCMFFQ.cjs → originTrackingFns-CHymOLLm.cjs} +2 -2
  62. package/dist/{primitiveFns-BRXZ7jnP.cjs → primitiveFns-BVeBEaa4.cjs} +7 -14
  63. package/dist/{primitiveFns-ClQP6zMQ.js → primitiveFns-DeNl60Rw.js} +7 -14
  64. package/dist/{principalBoxFns-DsfWOoXg.js → principalBoxFns-3mW_hA6z.js} +3 -3
  65. package/dist/{principalBoxFns-tIv-crMB.cjs → principalBoxFns-CG6kG7vT.cjs} +3 -3
  66. package/dist/projection.cjs +1 -1
  67. package/dist/projection.js +1 -1
  68. package/dist/query/finderCore.d.ts +7 -7
  69. package/dist/query.cjs +2 -2
  70. package/dist/query.js +2 -2
  71. package/dist/{refResolveFns-BZdUlv9f.cjs → refResolveFns-BAs4p9z7.cjs} +6 -6
  72. package/dist/{refResolveFns-BG3JGs--.js → refResolveFns-DHx1Y3GG.js} +6 -6
  73. package/dist/{shapeFns-BbXqiNqY.cjs → shapeFns-C0w8vvfb.cjs} +2 -2
  74. package/dist/{shapeFns-BCgegapL.js → shapeFns-CgqKICF_.js} +2 -2
  75. package/dist/shapeRef.cjs +1 -1
  76. package/dist/shapeRef.js +1 -1
  77. package/dist/{shapeTypes-DJT3SnGK.cjs → shapeTypes-Dc7j-MYg.cjs} +10 -16
  78. package/dist/{shapeTypes-DAz6aAnJ.js → shapeTypes-DwvQUp9M.js} +10 -16
  79. package/dist/sketching/sketches.d.ts +2 -0
  80. package/dist/sketching.cjs +3 -3
  81. package/dist/sketching.js +3 -3
  82. package/dist/{solidBuilders-8xytLt8-.js → solidBuilders-DT1gpVWM.js} +5 -5
  83. package/dist/{solidBuilders-BWbqhbyv.cjs → solidBuilders-iS5DDwg8.cjs} +5 -5
  84. package/dist/{surfaceBuilders-CwG_RPdZ.cjs → surfaceBuilders-BvwSgD3C.cjs} +3 -3
  85. package/dist/{surfaceBuilders-BO96DMCH.js → surfaceBuilders-CPLe0bbk.js} +3 -3
  86. package/dist/text.cjs +2 -2
  87. package/dist/text.js +2 -2
  88. package/dist/{textBlueprints-Dhe8_Uvc.js → textBlueprints-BU0Rhk54.js} +19 -11
  89. package/dist/{textBlueprints-DHfYmLtP.cjs → textBlueprints-CNPCPJix.cjs} +19 -11
  90. package/dist/{textMetrics-CwYDH9js.cjs → textMetrics-C71g4TmO.cjs} +1 -1
  91. package/dist/{textMetrics-Bbf-Dllw.js → textMetrics-Df9aLYK2.js} +1 -1
  92. package/dist/{threadFns-B23RqugN.cjs → threadFns-CzXEnnmo.cjs} +37 -29
  93. package/dist/{threadFns-Cn7_bmux.js → threadFns-DESH7lcs.js} +36 -28
  94. package/dist/topology/apiTypes.d.ts +13 -7
  95. package/dist/topology.cjs +9 -9
  96. package/dist/topology.d.ts +1 -1
  97. package/dist/topology.js +9 -9
  98. package/dist/{topologyQueryFns-xh11vEQw.cjs → topologyQueryFns-5Frx8Y-0.cjs} +1 -1
  99. package/dist/{topologyQueryFns-BfYdGOJc.js → topologyQueryFns-LXV1nTaS.js} +1 -1
  100. package/dist/{validityTypes-CXkecqMw.cjs → validityTypes-C6rROGTP.cjs} +1 -1
  101. package/dist/{validityTypes-BfOuvfyp.js → validityTypes-DM-Iwe8N.js} +1 -1
  102. package/package.json +2 -1
package/dist/brepjs.cjs CHANGED
@@ -1,42 +1,42 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-BW-eSwOZ.cjs");
3
- const require_shapeTypes = require("./shapeTypes-DJT3SnGK.cjs");
4
- const require_occtWasmAdapter = require("./occtWasmAdapter-CRd9RFEu.cjs");
3
+ const require_shapeTypes = require("./shapeTypes-Dc7j-MYg.cjs");
4
+ const require_occtWasmAdapter = require("./occtWasmAdapter-DVxLkjlJ.cjs");
5
5
  const require_bug = require("./bug-CBcpIPuf.cjs");
6
6
  const require_errors = require("./errors-O_blYTWT.cjs");
7
- const require_topologyQueryFns = require("./topologyQueryFns-xh11vEQw.cjs");
8
- const require_validityTypes = require("./validityTypes-CXkecqMw.cjs");
7
+ const require_topologyQueryFns = require("./topologyQueryFns-5Frx8Y-0.cjs");
8
+ const require_validityTypes = require("./validityTypes-C6rROGTP.cjs");
9
9
  const require_constants = require("./constants-oee0S_x6.cjs");
10
10
  const require_types = require("./types-CjF9Rofr.cjs");
11
11
  const require_vecOps = require("./vecOps-CrGEPPQM.cjs");
12
12
  const require_planeOps = require("./planeOps-DZfLToKZ.cjs");
13
- const require_faceFns = require("./faceFns-BjmlYcc9.cjs");
14
- const require_originTrackingFns = require("./originTrackingFns-9gyCMFFQ.cjs");
15
- const require_solidBuilders = require("./solidBuilders-BWbqhbyv.cjs");
16
- const require_primitiveFns = require("./primitiveFns-BRXZ7jnP.cjs");
17
- const require_shapeFns = require("./shapeFns-BbXqiNqY.cjs");
18
- const require_curveFns = require("./curveFns-8lUhNquZ.cjs");
19
- const require_meshFns = require("./meshFns-nEvfwNRF.cjs");
13
+ const require_faceFns = require("./faceFns-B7MiDYj1.cjs");
14
+ const require_originTrackingFns = require("./originTrackingFns-CHymOLLm.cjs");
15
+ const require_solidBuilders = require("./solidBuilders-iS5DDwg8.cjs");
16
+ const require_primitiveFns = require("./primitiveFns-BVeBEaa4.cjs");
17
+ const require_shapeFns = require("./shapeFns-C0w8vvfb.cjs");
18
+ const require_curveFns = require("./curveFns-CyIvQNYT.cjs");
19
+ const require_meshFns = require("./meshFns-Czlt-GBJ.cjs");
20
20
  const require_arrayAccess = require("./arrayAccess-DpJYARwv.cjs");
21
- const require_surfaceBuilders = require("./surfaceBuilders-CwG_RPdZ.cjs");
22
- const require_healingFns = require("./healingFns-CYLIcIWv.cjs");
23
- const require_threadFns = require("./threadFns-B23RqugN.cjs");
24
- const require_blueprintSketcher = require("./blueprintSketcher-W9yON-UC.cjs");
25
- const require_helpers = require("./helpers-De0Z_6iV.cjs");
26
- const require_blueprint = require("./blueprint-D0VEeTzJ.cjs");
27
- const require_drawFns = require("./drawFns-C7zAvera.cjs");
28
- const require_measureFns = require("./measureFns-Ce01LVwq.cjs");
29
- const require_cornerFinder = require("./cornerFinder-B8PqO4um.cjs");
30
- const require_boolean2D = require("./boolean2D-C9VghXHG.cjs");
31
- const require_blueprintFns = require("./blueprintFns-Douf5ZdX.cjs");
32
- const require_importFns = require("./importFns-3IMBHQrQ.cjs");
33
- const require_textBlueprints = require("./textBlueprints-DHfYmLtP.cjs");
34
- const require_loftFns = require("./loftFns-DlG5oR0X.cjs");
35
- const require_refResolveFns = require("./refResolveFns-BZdUlv9f.cjs");
36
- const require_adjacencyFns = require("./adjacencyFns-C_Vb1AeW.cjs");
37
- const require_cameraFns = require("./cameraFns-x3L6dtA8.cjs");
38
- const require_textMetrics = require("./textMetrics-CwYDH9js.cjs");
39
- const require_principalBoxFns = require("./principalBoxFns-tIv-crMB.cjs");
21
+ const require_surfaceBuilders = require("./surfaceBuilders-BvwSgD3C.cjs");
22
+ const require_healingFns = require("./healingFns-DWljGTNR.cjs");
23
+ const require_threadFns = require("./threadFns-CzXEnnmo.cjs");
24
+ const require_blueprintSketcher = require("./blueprintSketcher-Di376t-0.cjs");
25
+ const require_helpers = require("./helpers-DKEVm6Hu.cjs");
26
+ const require_blueprint = require("./blueprint-D83DDDPb.cjs");
27
+ const require_drawFns = require("./drawFns-71cOhWD-.cjs");
28
+ const require_measureFns = require("./measureFns-CZHNWkiA.cjs");
29
+ const require_cornerFinder = require("./cornerFinder-CdOe1Wrb.cjs");
30
+ const require_boolean2D = require("./boolean2D-CNZFI_y8.cjs");
31
+ const require_blueprintFns = require("./blueprintFns-C4TQn-x_.cjs");
32
+ const require_importFns = require("./importFns-KEPAgbjj.cjs");
33
+ const require_textBlueprints = require("./textBlueprints-CNPCPJix.cjs");
34
+ const require_loftFns = require("./loftFns-D5AvfCGG.cjs");
35
+ const require_refResolveFns = require("./refResolveFns-BAs4p9z7.cjs");
36
+ const require_adjacencyFns = require("./adjacencyFns-BFJfaUwX.cjs");
37
+ const require_cameraFns = require("./cameraFns-RqraCXIc.cjs");
38
+ const require_textMetrics = require("./textMetrics-C71g4TmO.cjs");
39
+ const require_principalBoxFns = require("./principalBoxFns-CG6kG7vT.cjs");
40
40
  const require_workerPool = require("./workerPool-D5tiNXrI.cjs");
41
41
  // src/kernel/types.ts
42
42
  /** Check if the kernel supports hidden-line-removal projection. */
@@ -5124,29 +5124,29 @@ function toKernelPnt(v) {
5124
5124
  function toKernelDir(v) {
5125
5125
  return require_shapeTypes.getKernel().createDirection3d(v[0], v[1], v[2]);
5126
5126
  }
5127
- /** Extract Vec3 from a kernel 3D vector */
5128
- function fromKernelVec(ocVec) {
5127
+ function xyzOf(v) {
5128
+ if (typeof v.X === "function") return [
5129
+ v.X(),
5130
+ v.Y(),
5131
+ v.Z()
5132
+ ];
5129
5133
  return [
5130
- ocVec.X(),
5131
- ocVec.Y(),
5132
- ocVec.Z()
5134
+ v.x,
5135
+ v.y,
5136
+ v.z
5133
5137
  ];
5134
5138
  }
5139
+ /** Extract Vec3 from a kernel 3D vector */
5140
+ function fromKernelVec(ocVec) {
5141
+ return xyzOf(ocVec);
5142
+ }
5135
5143
  /** Extract Vec3 from a kernel 3D point */
5136
5144
  function fromKernelPnt(ocPnt) {
5137
- return [
5138
- ocPnt.X(),
5139
- ocPnt.Y(),
5140
- ocPnt.Z()
5141
- ];
5145
+ return xyzOf(ocPnt);
5142
5146
  }
5143
5147
  /** Extract Vec3 from a kernel 3D direction */
5144
5148
  function fromKernelDir(ocDir) {
5145
- return [
5146
- ocDir.X(),
5147
- ocDir.Y(),
5148
- ocDir.Z()
5149
- ];
5149
+ return xyzOf(ocDir);
5150
5150
  }
5151
5151
  /** Execute fn with a temporary kernel 3D vector, auto-deleted after. */
5152
5152
  function withKernelVec(v, fn) {
@@ -7950,19 +7950,73 @@ function resolveTargetFace(shape, faceSpec) {
7950
7950
  return require_errors.ok(faceSpec);
7951
7951
  }
7952
7952
  /**
7953
- * Convert a DrawingLike or Wire to a ClosedWire & PlanarWire (profiles are always
7954
- * closed and planar). `owned` is true when we materialised a fresh sketch wire
7955
- * (the caller must dispose it); false when the caller's own Wire is passed through.
7953
+ * Build the profile's face in the XY plane. A Drawing's sketch is released once
7954
+ * its face exists; a caller's Wire is expected to be closed and planar.
7956
7955
  */
7957
- function toWire(profile) {
7958
- if ("sketchOnPlane" in profile && typeof profile.sketchOnPlane === "function") return {
7959
- wire: profile.sketchOnPlane("XY").wire,
7960
- owned: true
7961
- };
7962
- return {
7963
- wire: profile,
7964
- owned: false
7965
- };
7956
+ function profileFace(profile) {
7957
+ if ("sketchOnPlane" in profile && typeof profile.sketchOnPlane === "function") {
7958
+ const sketch = profile.sketchOnPlane("XY");
7959
+ try {
7960
+ return require_errors.ok(sketch.face());
7961
+ } catch (e) {
7962
+ return require_errors.err(require_errors.validationError("COMPOUND_PROFILE_INVALID", `compoundOps: the profile does not make a single face: ${e instanceof Error ? e.message : String(e)}`));
7963
+ } finally {
7964
+ sketch.delete?.();
7965
+ }
7966
+ }
7967
+ return require_surfaceBuilders.makeFace(profile);
7968
+ }
7969
+ /**
7970
+ * Move a face drawn in XY onto a target face: its origin to `center`, its Z axis
7971
+ * to `normal`. Faces parallel to XY keep the world X and Y axes; on any other
7972
+ * face local Y runs up the face (world +Z projected onto it) and local X is
7973
+ * Y x normal, which points right when the face is seen from outside.
7974
+ */
7975
+ function placeOnFace(face, normal, center) {
7976
+ const [nx, ny, nz] = normal;
7977
+ if (Math.abs(nz) > 1 - 1e-9) return require_errors.ok(require_primitiveFns.translate(face, center));
7978
+ const yDir = require_vecOps.vecNormalize([
7979
+ -nx * nz,
7980
+ -ny * nz,
7981
+ 1 - nz * nz
7982
+ ]);
7983
+ const xDir = require_vecOps.vecCross(yDir, normal);
7984
+ return require_primitiveFns.applyMatrix(face, {
7985
+ linear: [
7986
+ xDir[0],
7987
+ yDir[0],
7988
+ nx,
7989
+ xDir[1],
7990
+ yDir[1],
7991
+ ny,
7992
+ xDir[2],
7993
+ yDir[2],
7994
+ nz
7995
+ ],
7996
+ translation: center
7997
+ });
7998
+ }
7999
+ /** Extrude the profile, placed on the target face, by `distance` along the face normal. */
8000
+ function profileTool(shape, faceSpec, profile, distance) {
8001
+ try {
8002
+ var _usingCtx$3 = require_shapeTypes._usingCtx();
8003
+ const targetResult = resolveTargetFace(shape, faceSpec);
8004
+ if (require_errors.isErr(targetResult)) return targetResult;
8005
+ const normal = require_vecOps.vecNormalize(require_faceFns.normalAt(targetResult.value));
8006
+ const center = require_faceFns.faceCenter(targetResult.value);
8007
+ const scope = _usingCtx$3.u(new require_shapeTypes.DisposalScope());
8008
+ const flat = profileFace(profile);
8009
+ if (require_errors.isErr(flat)) return flat;
8010
+ scope.register(flat.value);
8011
+ const placed = placeOnFace(flat.value, normal, center);
8012
+ if (require_errors.isErr(placed)) return placed;
8013
+ scope.register(placed.value);
8014
+ return require_textBlueprints.extrude(placed.value, require_vecOps.vecScale(normal, distance));
8015
+ } catch (_) {
8016
+ _usingCtx$3.e = _;
8017
+ } finally {
8018
+ _usingCtx$3.d();
8019
+ }
7966
8020
  }
7967
8021
  /**
7968
8022
  * Drill a hole through a 3D shape.
@@ -8068,31 +8122,18 @@ function drill(shape, options) {
8068
8122
  */
8069
8123
  function pocket(shape, options) {
8070
8124
  try {
8071
- var _usingCtx$3 = require_shapeTypes._usingCtx();
8125
+ var _usingCtx3 = require_shapeTypes._usingCtx();
8072
8126
  const s = resolve(shape);
8073
8127
  const { profile, depth } = options;
8074
8128
  if (depth <= 0) return require_errors.err(require_errors.validationError("POCKET_INVALID_DEPTH", "Pocket depth must be positive"));
8075
- const targetResult = resolveTargetFace(s, options.face);
8076
- if (require_errors.isErr(targetResult)) return targetResult;
8077
- const targetFace = targetResult.value;
8078
- const normal = require_faceFns.normalAt(targetFace);
8079
- const center = require_faceFns.faceCenter(targetFace);
8080
- const scope = _usingCtx$3.u(new require_shapeTypes.DisposalScope());
8081
- const { wire: w, owned } = toWire(profile);
8082
- if (owned) scope.register(w);
8083
- const faceResult = require_surfaceBuilders.makeFace(w);
8084
- if (require_errors.isErr(faceResult)) return faceResult;
8085
- scope.register(faceResult.value);
8086
- const positioned = scope.register(require_primitiveFns.translate(faceResult.value, center));
8087
- const extDir = require_vecOps.vecScale(require_vecOps.vecNormalize(normal), -depth);
8088
- const toolResult = require_textBlueprints.extrude(positioned, extDir);
8129
+ const toolResult = profileTool(s, options.face, profile, -depth);
8089
8130
  if (require_errors.isErr(toolResult)) return toolResult;
8090
- scope.register(toolResult.value);
8091
- return require_solidBuilders.cut(s, toolResult.value, { unsafe: true });
8131
+ const tool = _usingCtx3.u(toolResult.value);
8132
+ return require_solidBuilders.cut(s, tool, { unsafe: true });
8092
8133
  } catch (_) {
8093
- _usingCtx$3.e = _;
8134
+ _usingCtx3.e = _;
8094
8135
  } finally {
8095
- _usingCtx$3.d();
8136
+ _usingCtx3.d();
8096
8137
  }
8097
8138
  }
8098
8139
  /**
@@ -8103,31 +8144,18 @@ function pocket(shape, options) {
8103
8144
  */
8104
8145
  function boss(shape, options) {
8105
8146
  try {
8106
- var _usingCtx3 = require_shapeTypes._usingCtx();
8147
+ var _usingCtx4 = require_shapeTypes._usingCtx();
8107
8148
  const s = resolve(shape);
8108
8149
  const { profile, height } = options;
8109
8150
  if (height <= 0) return require_errors.err(require_errors.validationError("BOSS_INVALID_HEIGHT", "Boss height must be positive"));
8110
- const targetResult = resolveTargetFace(s, options.face);
8111
- if (require_errors.isErr(targetResult)) return targetResult;
8112
- const targetFace = targetResult.value;
8113
- const normal = require_faceFns.normalAt(targetFace);
8114
- const center = require_faceFns.faceCenter(targetFace);
8115
- const scope = _usingCtx3.u(new require_shapeTypes.DisposalScope());
8116
- const { wire: w, owned } = toWire(profile);
8117
- if (owned) scope.register(w);
8118
- const faceResult = require_surfaceBuilders.makeFace(w);
8119
- if (require_errors.isErr(faceResult)) return faceResult;
8120
- scope.register(faceResult.value);
8121
- const positioned = scope.register(require_primitiveFns.translate(faceResult.value, center));
8122
- const extDir = require_vecOps.vecScale(require_vecOps.vecNormalize(normal), height);
8123
- const toolResult = require_textBlueprints.extrude(positioned, extDir);
8151
+ const toolResult = profileTool(s, options.face, profile, height);
8124
8152
  if (require_errors.isErr(toolResult)) return toolResult;
8125
- scope.register(toolResult.value);
8126
- return require_solidBuilders.fuse(s, toolResult.value, { unsafe: true });
8153
+ const tool = _usingCtx4.u(toolResult.value);
8154
+ return require_solidBuilders.fuse(s, tool, { unsafe: true });
8127
8155
  } catch (_) {
8128
- _usingCtx3.e = _;
8156
+ _usingCtx4.e = _;
8129
8157
  } finally {
8130
- _usingCtx3.d();
8158
+ _usingCtx4.d();
8131
8159
  }
8132
8160
  }
8133
8161
  /**
@@ -8137,7 +8165,7 @@ function boss(shape, options) {
8137
8165
  */
8138
8166
  function mirrorJoin(shape, options) {
8139
8167
  try {
8140
- var _usingCtx4 = require_shapeTypes._usingCtx();
8168
+ var _usingCtx5 = require_shapeTypes._usingCtx();
8141
8169
  const s = resolve(shape);
8142
8170
  const normal = options?.normal ?? [
8143
8171
  1,
@@ -8146,12 +8174,12 @@ function mirrorJoin(shape, options) {
8146
8174
  ];
8147
8175
  const planeOrigin = options?.at;
8148
8176
  if (require_vecOps.vecIsZero(normal)) return require_errors.err(require_errors.validationError("MIRROR_ZERO_NORMAL", "Mirror plane normal cannot be zero"));
8149
- const mirrored = _usingCtx4.u(require_primitiveFns.mirror(s, normal, planeOrigin));
8177
+ const mirrored = _usingCtx5.u(require_primitiveFns.mirror(s, normal, planeOrigin));
8150
8178
  return require_solidBuilders.fuse(s, mirrored, { unsafe: true });
8151
8179
  } catch (_) {
8152
- _usingCtx4.e = _;
8180
+ _usingCtx5.e = _;
8153
8181
  } finally {
8154
- _usingCtx4.d();
8182
+ _usingCtx5.d();
8155
8183
  }
8156
8184
  }
8157
8185
  /**
@@ -8166,7 +8194,7 @@ function rectangularPattern(shape, options) {
8166
8194
  if (xCount < 1 || yCount < 1) return require_errors.err(require_errors.validationError("PATTERN_INVALID_COUNT", "Pattern counts must be at least 1"));
8167
8195
  if (require_vecOps.vecIsZero(xDir)) return require_errors.err(require_errors.validationError("PATTERN_ZERO_DIRECTION", "X direction cannot be zero"));
8168
8196
  if (require_vecOps.vecIsZero(yDir)) return require_errors.err(require_errors.validationError("PATTERN_ZERO_DIRECTION", "Y direction cannot be zero"));
8169
- if (xCount === 1 && yCount === 1) return require_errors.ok(s);
8197
+ if (xCount === 1 && yCount === 1) return require_shapeFns.clone(s);
8170
8198
  const xNorm = require_vecOps.vecNormalize(xDir);
8171
8199
  const yNorm = require_vecOps.vecNormalize(yDir);
8172
8200
  const copies = [s];