brepjs 18.119.2 → 18.119.3

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 (96) hide show
  1. package/dist/2d/lib/curve2D.d.ts +6 -1
  2. package/dist/2d/lib/curve2dFns.d.ts +6 -1
  3. package/dist/2d.cjs +7 -7
  4. package/dist/2d.js +7 -7
  5. package/dist/{adjacencyFns-BdM5p58J.js → adjacencyFns-DLityMyV.js} +2 -2
  6. package/dist/{adjacencyFns-Brrc7jlS.cjs → adjacencyFns-DSxuQYnb.cjs} +2 -2
  7. package/dist/{blueprint-DTNT4qYJ.cjs → blueprint-BGcBMy3b.cjs} +39 -9
  8. package/dist/{blueprint-DJJo8WkI.js → blueprint-CAG6jseD.js} +33 -9
  9. package/dist/{blueprintFns-CcpboZ80.js → blueprintFns-B4C3zH7N.js} +9 -4
  10. package/dist/{blueprintFns-2XDZfCxX.cjs → blueprintFns-CnoqynzI.cjs} +9 -4
  11. package/dist/{blueprintSketcher-C0EXFVb2.cjs → blueprintSketcher-BNz6f36D.cjs} +166 -61
  12. package/dist/{blueprintSketcher-DDPyypmC.js → blueprintSketcher-CKKxvxB-.js} +159 -54
  13. package/dist/{boolean2D-Ddfo_dd0.cjs → boolean2D-B-0xobBP.cjs} +5 -5
  14. package/dist/{boolean2D-C_PVz8xT.js → boolean2D-C_1gMcZ6.js} +5 -5
  15. package/dist/brepjs.cjs +105 -92
  16. package/dist/brepjs.js +39 -27
  17. package/dist/{cameraFns-Czr5vABD.cjs → cameraFns-2-haLzLi.cjs} +4 -4
  18. package/dist/{cameraFns-D9tdBYLM.js → cameraFns-CG_J66Hl.js} +4 -4
  19. package/dist/core.cjs +12 -11
  20. package/dist/core.js +4 -3
  21. package/dist/{cornerFinder-Cqg-Dz74.js → cornerFinder-CPFM7bA0.js} +1 -1
  22. package/dist/{cornerFinder-DETRDOMz.cjs → cornerFinder-mfsUMi5g.cjs} +1 -1
  23. package/dist/{curveFns-RENXKp64.js → curveFns-DX13KRh2.js} +2 -2
  24. package/dist/{curveFns-D7utcbnf.cjs → curveFns-GmFnqNo3.cjs} +2 -2
  25. package/dist/{drawFns-D9Rf4foW.cjs → drawFns-B14M5M68.cjs} +14 -14
  26. package/dist/{drawFns-B9HbtAoc.js → drawFns-BShGVVXW.js} +14 -14
  27. package/dist/{errors-B3CDG537.js → errors-MHLiNE-C.js} +1 -92
  28. package/dist/{errors-CJU8CHng.cjs → errors-RHkKO5bZ.cjs} +0 -103
  29. package/dist/{faceFns-CPswi9Cm.cjs → faceFns-BK4r7Dxk.cjs} +3 -3
  30. package/dist/{faceFns-CB6uzvOg.js → faceFns-DJj9Nb6T.js} +3 -3
  31. package/dist/{healingFns-BFTYLiAm.js → healingFns-DxcRyVCG.js} +5 -6
  32. package/dist/{healingFns-bhMxTTqw.cjs → healingFns-Hx4oTlq8.cjs} +27 -28
  33. package/dist/{helpers-Cu4ag5bh.cjs → helpers-BfkBvokP.cjs} +8 -24
  34. package/dist/{helpers-BiN4qQZP.js → helpers-Du_OdHuy.js} +9 -25
  35. package/dist/{importFns-X8vBhZI2.js → importFns-BHs19muu.js} +3 -3
  36. package/dist/{importFns-DS4J1xLv.cjs → importFns-GySbuvVv.cjs} +3 -3
  37. package/dist/io.cjs +2 -2
  38. package/dist/io.js +2 -2
  39. package/dist/{loftFns-ChHjzUK-.cjs → loftFns-BdpZ8FMN.cjs} +2 -125
  40. package/dist/{loftFns-BF5X7ltI.js → loftFns-BeGJ6dxx.js} +4 -109
  41. package/dist/{measureFns-B5Zzg1qM.cjs → measureFns-CJGrmhHT.cjs} +4 -4
  42. package/dist/{measureFns-CC7HhAH3.js → measureFns-CMnbcUZC.js} +4 -4
  43. package/dist/measurement.cjs +1 -1
  44. package/dist/measurement.js +1 -1
  45. package/dist/{meshFns-D57Fyqyf.js → meshFns-Cs5EBsf7.js} +4 -4
  46. package/dist/{meshFns-CaXmWmhe.cjs → meshFns-Dqf5QBhQ.cjs} +5 -5
  47. package/dist/operations.cjs +2 -2
  48. package/dist/operations.js +2 -2
  49. package/dist/originTrackingFns-DZmdiQ-O.js +203 -0
  50. package/dist/originTrackingFns-fpEgTIwV.cjs +226 -0
  51. package/dist/{planeOps-Cp6GQ23-.js → planeOps-CQahLrCx.js} +1 -1
  52. package/dist/{planeOps-Cr25KWWA.cjs → planeOps-VlFxtvzY.cjs} +1 -1
  53. package/dist/primitiveFns-B_rflH83.cjs +773 -0
  54. package/dist/primitiveFns-Cxo3xDKY.js +558 -0
  55. package/dist/projection.cjs +1 -1
  56. package/dist/projection.js +1 -1
  57. package/dist/query.cjs +2 -2
  58. package/dist/query.js +2 -2
  59. package/dist/{refResolveFns-3bw9-U-e.js → refResolveFns-BbRLD8LA.js} +6 -6
  60. package/dist/{refResolveFns-BxmgIhQM.cjs → refResolveFns-CVDLwh12.cjs} +6 -6
  61. package/dist/result.cjs +1 -1
  62. package/dist/result.js +1 -1
  63. package/dist/rolldown-runtime-DakpK96I.cjs +43 -0
  64. package/dist/shapeFns-BTFx-os7.js +43 -0
  65. package/dist/shapeFns-D_5TgiUi.cjs +84 -0
  66. package/dist/shapeRef.cjs +1 -1
  67. package/dist/shapeRef.js +1 -1
  68. package/dist/{shapeTypes-Bpsu5KJO.cjs → shapeTypes-CkcIL7zv.cjs} +1 -222
  69. package/dist/{shapeTypes-CnKFSfDT.js → shapeTypes-t49f64Dx.js} +2 -139
  70. package/dist/sketching.cjs +3 -3
  71. package/dist/sketching.js +3 -3
  72. package/dist/{solidBuilders-I8_V8qqU.js → solidBuilders-DTgqQC3W.js} +310 -8
  73. package/dist/{solidBuilders-Bp7lQW62.cjs → solidBuilders-IiIzjKAr.cjs} +401 -15
  74. package/dist/{surfaceBuilders-D8_08oOR.cjs → surfaceBuilders-Biqx51el.cjs} +6 -5
  75. package/dist/{surfaceBuilders-BNR7yMQO.js → surfaceBuilders-BryY-i0F.js} +4 -3
  76. package/dist/text.cjs +2 -2
  77. package/dist/text.js +2 -2
  78. package/dist/{textBlueprints-B5zcLGvJ.cjs → textBlueprints-8EcWreab.cjs} +138 -51
  79. package/dist/{textBlueprints-igbNvKcd.js → textBlueprints-rA1HT6j1.js} +116 -11
  80. package/dist/{textMetrics-CJvtpbc3.js → textMetrics-Bcbso1Ns.js} +2 -2
  81. package/dist/{textMetrics-08fF0QNf.cjs → textMetrics-GPBu9JKi.cjs} +2 -2
  82. package/dist/{threadFns-CqSMNyTZ.js → threadFns-BOtXTHZ9.js} +8 -8
  83. package/dist/{threadFns-Co6vWEWx.cjs → threadFns-DRrk9Qod.cjs} +8 -8
  84. package/dist/topology.cjs +9 -9
  85. package/dist/topology.js +9 -9
  86. package/dist/{topologyQueryFns-C3fhJndG.cjs → topologyQueryFns-Bia7o8l_.cjs} +97 -6
  87. package/dist/{topologyQueryFns-DNqT88yx.js → topologyQueryFns-BkQ6Q7gN.js} +93 -2
  88. package/dist/validityTypes-DiTgeCD9.js +129 -0
  89. package/dist/validityTypes-ZGMVlv7b.cjs +200 -0
  90. package/dist/vectors.cjs +1 -1
  91. package/dist/vectors.js +1 -1
  92. package/package.json +8 -8
  93. package/dist/primitiveFns-CRy_CUVg.cjs +0 -492
  94. package/dist/primitiveFns-DCIH-SBm.js +0 -331
  95. package/dist/shapeFns-BrHFNLMA.js +0 -771
  96. package/dist/shapeFns-qm9VRo4i.cjs +0 -962
@@ -1,6 +1,6 @@
1
- import { i as castShape, it as getKernel } from "./shapeTypes-CnKFSfDT.js";
2
- import { I as unwrap, O as ok, l as typeCastError, v as err } from "./errors-B3CDG537.js";
3
- import { a as getCachedSurfaceType } from "./topologyQueryFns-DNqT88yx.js";
1
+ import { K as getKernel, i as castShape } from "./shapeTypes-t49f64Dx.js";
2
+ import { E as ok, P as unwrap, g as err, l as typeCastError } from "./errors-MHLiNE-C.js";
3
+ import { a as getCachedSurfaceType } from "./topologyQueryFns-BkQ6Q7gN.js";
4
4
  import { r as toVec3 } from "./types-D24Y27N0.js";
5
5
  //#region src/topology/cast.ts
6
6
  var TOPO_ENUM = {
@@ -1,11 +1,10 @@
1
- import { C as isSolid, R as getShapeKind, T as isWire, h as disposeResultShape, i as castShape, it as getKernel, m as disposeDowncastSource, n as castResultShape, x as isShape3D, y as isFace } from "./shapeTypes-CnKFSfDT.js";
2
- import { C as isOk, O as ok, S as isErr, d as validationError, i as kernelError, l as typeCastError, t as BrepErrorCode, v as err } from "./errors-B3CDG537.js";
3
- import { c as getFaces, i as getCachedIsValid, m as invalidateShapeCache, p as getWires, s as getEdges } from "./topologyQueryFns-DNqT88yx.js";
1
+ import { C as isSolid, E as getShapeKind, K as getKernel, T as isWire, h as disposeResultShape, i as castShape, m as disposeDowncastSource, n as castResultShape, x as isShape3D, y as isFace } from "./shapeTypes-t49f64Dx.js";
2
+ import { E as ok, b as isErr, d as validationError, g as err, i as kernelError, l as typeCastError, t as BrepErrorCode, x as isOk } from "./errors-MHLiNE-C.js";
3
+ import { c as getFaces, i as getCachedIsValid, m as invalidateShapeCache, p as getWires, s as getEdges } from "./topologyQueryFns-BkQ6Q7gN.js";
4
4
  import { n as HASH_CODE_MAX } from "./constants-ITRzCnCp.js";
5
- import { y as downcast } from "./faceFns-CB6uzvOg.js";
6
- import { _ as collectInputFaceHashes, y as propagateAllMetadata } from "./shapeFns-BrHFNLMA.js";
5
+ import { y as downcast } from "./faceFns-DJj9Nb6T.js";
6
+ import { C as propagateAllMetadata, f as cut, h as fuseAll, m as fuse, p as cutAll, x as collectInputFaceHashes } from "./solidBuilders-DTgqQC3W.js";
7
7
  import { t as firstOrThrow } from "./arrayAccess-DrUGPADn.js";
8
- import { f as cut, h as fuseAll, m as fuse, p as cutAll } from "./solidBuilders-I8_V8qqU.js";
9
8
  //#region src/topology/threeHelpers.ts
10
9
  /**
11
10
  * Convert a ShapeMesh into BufferGeometry-compatible typed arrays.
@@ -1,11 +1,10 @@
1
- const require_shapeTypes = require("./shapeTypes-Bpsu5KJO.cjs");
2
- const require_errors = require("./errors-CJU8CHng.cjs");
3
- const require_topologyQueryFns = require("./topologyQueryFns-C3fhJndG.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CkcIL7zv.cjs");
2
+ const require_errors = require("./errors-RHkKO5bZ.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-Bia7o8l_.cjs");
4
4
  const require_constants = require("./constants-BOVyEYGH.cjs");
5
- const require_faceFns = require("./faceFns-CPswi9Cm.cjs");
6
- const require_shapeFns = require("./shapeFns-qm9VRo4i.cjs");
5
+ const require_faceFns = require("./faceFns-BK4r7Dxk.cjs");
6
+ const require_solidBuilders = require("./solidBuilders-IiIzjKAr.cjs");
7
7
  const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
8
- const require_solidBuilders = require("./solidBuilders-Bp7lQW62.cjs");
9
8
  //#region src/topology/threeHelpers.ts
10
9
  /**
11
10
  * Convert a ShapeMesh into BufferGeometry-compatible typed arrays.
@@ -376,7 +375,7 @@ function fuseWithEvolution(a, b, { optimisation = "none", simplify = false, sign
376
375
  if (require_errors.isErr(checkA)) return checkA;
377
376
  const checkB = validateShape3D(b, "fuseWithEvolution: second operand");
378
377
  if (require_errors.isErr(checkB)) return checkB;
379
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([a, b]);
378
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([a, b]);
380
379
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().fuseWithHistory(a.wrapped, b.wrapped, inputFaceHashes, require_constants.HASH_CODE_MAX, {
381
380
  optimisation,
382
381
  simplify,
@@ -384,7 +383,7 @@ function fuseWithEvolution(a, b, { optimisation = "none", simplify = false, sign
384
383
  });
385
384
  const fuseResult = castToShape3D(resultShape, "FUSE_NOT_3D", "Fuse did not produce a 3D shape", "Common causes: overlapping coplanar faces, zero-thickness geometry, or non-manifold input. Try autoHeal() on inputs first.");
386
385
  if (fuseResult.ok) {
387
- require_shapeFns.propagateAllMetadata(evolution, [a, b], fuseResult.value);
386
+ require_solidBuilders.propagateAllMetadata(evolution, [a, b], fuseResult.value);
388
387
  return require_errors.ok({
389
388
  shape: fuseResult.value,
390
389
  evolution
@@ -398,7 +397,7 @@ function cutWithEvolution(base, tool, { optimisation = "none", simplify = false,
398
397
  if (require_errors.isErr(checkBase)) return checkBase;
399
398
  const checkTool = validateShape3D(tool, "cutWithEvolution: tool");
400
399
  if (require_errors.isErr(checkTool)) return checkTool;
401
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([base, tool]);
400
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([base, tool]);
402
401
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().cutWithHistory(base.wrapped, tool.wrapped, inputFaceHashes, require_constants.HASH_CODE_MAX, {
403
402
  optimisation,
404
403
  simplify,
@@ -406,7 +405,7 @@ function cutWithEvolution(base, tool, { optimisation = "none", simplify = false,
406
405
  });
407
406
  const cutResult = castToShape3D(resultShape, "CUT_NOT_3D", "Cut did not produce a 3D shape", "Common causes: tool does not fully intersect the base, or produces a zero-thickness sliver. Ensure the tool extends through the shape.");
408
407
  if (cutResult.ok) {
409
- require_shapeFns.propagateAllMetadata(evolution, [base, tool], cutResult.value);
408
+ require_solidBuilders.propagateAllMetadata(evolution, [base, tool], cutResult.value);
410
409
  return require_errors.ok({
411
410
  shape: cutResult.value,
412
411
  evolution
@@ -420,14 +419,14 @@ function intersectWithEvolution(a, b, { simplify = false, signal, fuzzyValue } =
420
419
  if (require_errors.isErr(checkA)) return checkA;
421
420
  const checkB = validateShape3D(b, "intersectWithEvolution: second operand");
422
421
  if (require_errors.isErr(checkB)) return checkB;
423
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([a, b]);
422
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([a, b]);
424
423
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().intersectWithHistory(a.wrapped, b.wrapped, inputFaceHashes, require_constants.HASH_CODE_MAX, {
425
424
  simplify,
426
425
  fuzzyValue
427
426
  });
428
427
  const intResult = castToShape3D(resultShape, "INTERSECT_NOT_3D", "Intersect did not produce a 3D shape", "Shapes may not overlap. Verify they share a common volume before intersecting.");
429
428
  if (intResult.ok) {
430
- require_shapeFns.propagateAllMetadata(evolution, [a, b], intResult.value);
429
+ require_solidBuilders.propagateAllMetadata(evolution, [a, b], intResult.value);
431
430
  return require_errors.ok({
432
431
  shape: intResult.value,
433
432
  evolution
@@ -462,14 +461,14 @@ function filletWithEvolution(shape, edges, radius) {
462
461
  filteredEdges = [...selectedEdges];
463
462
  kernelRadius = radius;
464
463
  }
465
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
464
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
466
465
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().filletWithHistory(shape.wrapped, filteredEdges.map((e) => e.wrapped), kernelRadius, inputFaceHashes, require_constants.HASH_CODE_MAX);
467
466
  const cast = require_shapeTypes.castResultShape(resultShape);
468
467
  if (!require_shapeTypes.isShape3D(cast)) {
469
468
  require_shapeTypes.disposeResultShape(cast);
470
469
  return require_errors.err(require_errors.kernelError(require_errors.BrepErrorCode.FILLET_NOT_3D, "Fillet result is not a 3D shape"));
471
470
  }
472
- require_shapeFns.propagateAllMetadata(evolution, [shape], cast);
471
+ require_solidBuilders.propagateAllMetadata(evolution, [shape], cast);
473
472
  return require_errors.ok({
474
473
  shape: cast,
475
474
  evolution
@@ -509,14 +508,14 @@ function chamferWithEvolution(shape, edges, distance) {
509
508
  filteredEdges = [...selectedEdges];
510
509
  kernelDistance = distance;
511
510
  }
512
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
511
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
513
512
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().chamferWithHistory(shape.wrapped, filteredEdges.map((e) => e.wrapped), kernelDistance, inputFaceHashes, require_constants.HASH_CODE_MAX);
514
513
  const cast = require_shapeTypes.castResultShape(resultShape);
515
514
  if (!require_shapeTypes.isShape3D(cast)) {
516
515
  require_shapeTypes.disposeResultShape(cast);
517
516
  return require_errors.err(require_errors.kernelError(require_errors.BrepErrorCode.CHAMFER_NOT_3D, "Chamfer result is not a 3D shape"));
518
517
  }
519
- require_shapeFns.propagateAllMetadata(evolution, [shape], cast);
518
+ require_solidBuilders.propagateAllMetadata(evolution, [shape], cast);
520
519
  return require_errors.ok({
521
520
  shape: cast,
522
521
  evolution
@@ -544,14 +543,14 @@ function shellWithEvolution(shape, faces, thickness, tolerance = .001) {
544
543
  if (thickness <= 0) return require_errors.err(require_errors.validationError("INVALID_THICKNESS", "Shell thickness must be positive"));
545
544
  if (faces.length === 0) return require_errors.err(require_errors.validationError("NO_FACES", "At least one face must be specified for shell"));
546
545
  try {
547
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
546
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
548
547
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().shellWithHistory(shape.wrapped, faces.map((f) => f.wrapped), thickness, inputFaceHashes, require_constants.HASH_CODE_MAX, tolerance);
549
548
  const cast = require_shapeTypes.castResultShape(resultShape);
550
549
  if (!require_shapeTypes.isShape3D(cast)) {
551
550
  require_shapeTypes.disposeResultShape(cast);
552
551
  return require_errors.err(require_errors.kernelError("SHELL_RESULT_NOT_3D", "Shell result is not a 3D shape"));
553
552
  }
554
- require_shapeFns.propagateAllMetadata(evolution, [shape], cast);
553
+ require_solidBuilders.propagateAllMetadata(evolution, [shape], cast);
555
554
  return require_errors.ok({
556
555
  shape: cast,
557
556
  evolution
@@ -650,7 +649,7 @@ function finalizeShape3D(evolution, resultShape, inputs, not3dCode, not3dMessage
650
649
  require_shapeTypes.disposeResultShape(cast);
651
650
  return require_errors.err(require_errors.kernelError(not3dCode, not3dMessage));
652
651
  }
653
- require_shapeFns.propagateAllMetadata(evolution, inputs, cast);
652
+ require_solidBuilders.propagateAllMetadata(evolution, inputs, cast);
654
653
  return require_errors.ok(cast);
655
654
  }
656
655
  /**
@@ -691,10 +690,10 @@ function thicken(shape, thickness) {
691
690
  const check = validateNotNull(shape, "thicken: shape");
692
691
  if (require_errors.isErr(check)) return check;
693
692
  try {
694
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
693
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
695
694
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().thickenWithHistory(shape.wrapped, thickness, inputFaceHashes, require_constants.HASH_CODE_MAX);
696
695
  const cast = require_shapeTypes.castResultShape(resultShape);
697
- require_shapeFns.propagateAllMetadata(evolution, [shape], cast);
696
+ require_solidBuilders.propagateAllMetadata(evolution, [shape], cast);
698
697
  return require_errors.ok(cast);
699
698
  } catch (e) {
700
699
  return require_errors.err(require_errors.kernelError("THICKEN_FAILED", `Thicken operation failed: ${e instanceof Error ? e.message : String(e)}`, e));
@@ -753,7 +752,7 @@ function fillet(shape, edges, radius, { trackEvolution = true } = {}) {
753
752
  }
754
753
  return require_errors.ok(cast);
755
754
  }
756
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
755
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
757
756
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().filletWithHistory(shape.wrapped, edgeShapes, kernelRadius, inputFaceHashes, require_constants.HASH_CODE_MAX);
758
757
  return finalizeShape3D(evolution, resultShape, [shape], require_errors.BrepErrorCode.FILLET_NOT_3D, "Fillet result is not a 3D shape");
759
758
  } catch (e) {
@@ -796,7 +795,7 @@ function chamfer(shape, edges, distance) {
796
795
  filteredEdges = [...selectedEdges];
797
796
  kernelDistance = distance;
798
797
  }
799
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
798
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
800
799
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().chamferWithHistory(shape.wrapped, filteredEdges.map((e) => e.wrapped), kernelDistance, inputFaceHashes, require_constants.HASH_CODE_MAX);
801
800
  return finalizeShape3D(evolution, resultShape, [shape], require_errors.BrepErrorCode.CHAMFER_NOT_3D, "Chamfer result is not a 3D shape");
802
801
  } catch (e) {
@@ -829,14 +828,14 @@ function shell(shape, faces, thickness, tolerance = .001, { trackEvolution = tru
829
828
  }
830
829
  return require_errors.ok(cast);
831
830
  }
832
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
831
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
833
832
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().shellWithHistory(shape.wrapped, faces.map((f) => f.wrapped), thickness, inputFaceHashes, require_constants.HASH_CODE_MAX, tolerance);
834
833
  const cast = require_shapeTypes.castResultShape(resultShape);
835
834
  if (!require_shapeTypes.isShape3D(cast)) {
836
835
  require_shapeTypes.disposeResultShape(cast);
837
836
  return require_errors.err(require_errors.kernelError("SHELL_RESULT_NOT_3D", "Shell result is not a 3D shape"));
838
837
  }
839
- require_shapeFns.propagateAllMetadata(evolution, [shape], cast);
838
+ require_solidBuilders.propagateAllMetadata(evolution, [shape], cast);
840
839
  return require_errors.ok(cast);
841
840
  } catch (e) {
842
841
  return require_errors.err(require_errors.kernelError("SHELL_FAILED", `Shell operation failed: ${e instanceof Error ? e.message : String(e)}`, e, {
@@ -858,14 +857,14 @@ function offset(shape, distance, tolerance = 1e-6) {
858
857
  if (require_errors.isErr(check)) return check;
859
858
  if (Math.abs(distance) < 1e-10) return require_errors.err(require_errors.validationError("ZERO_OFFSET", "Offset distance cannot be zero"));
860
859
  try {
861
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
860
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
862
861
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().offsetWithHistory(shape.wrapped, distance, inputFaceHashes, require_constants.HASH_CODE_MAX, tolerance);
863
862
  const cast = require_shapeTypes.castResultShape(resultShape);
864
863
  if (!require_shapeTypes.isShape3D(cast)) {
865
864
  require_shapeTypes.disposeResultShape(cast);
866
865
  return require_errors.err(require_errors.kernelError("OFFSET_RESULT_NOT_3D", "Offset result is not a 3D shape"));
867
866
  }
868
- require_shapeFns.propagateAllMetadata(evolution, [shape], cast);
867
+ require_solidBuilders.propagateAllMetadata(evolution, [shape], cast);
869
868
  return require_errors.ok(cast);
870
869
  } catch (e) {
871
870
  return require_errors.err(require_errors.kernelError("OFFSET_FAILED", `Offset operation failed: ${e instanceof Error ? e.message : String(e)}`, e));
@@ -903,7 +902,7 @@ function draft(shape, faces, pullDirection, neutralPlane, angle) {
903
902
  try {
904
903
  const { filteredFaces, kernelAngle } = resolveDraftCallback(faces, angle);
905
904
  if (filteredFaces.length === 0) return require_errors.err(require_errors.validationError(require_errors.BrepErrorCode.DRAFT_NO_FACES, "No faces with valid draft angle", void 0, void 0, "Check that the angle callback returns non-zero values between -90 and 90 degrees"));
906
- const inputFaceHashes = require_shapeFns.collectInputFaceHashes([shape]);
905
+ const inputFaceHashes = require_solidBuilders.collectInputFaceHashes([shape]);
907
906
  const { shape: resultShape, evolution } = require_shapeTypes.getKernel().draftWithHistory(shape.wrapped, filteredFaces.map((f) => f.wrapped), [
908
907
  pullDirection[0],
909
908
  pullDirection[1],
@@ -1,13 +1,12 @@
1
- const require_shapeTypes = require("./shapeTypes-Bpsu5KJO.cjs");
2
- const require_bug = require("./bug-O02CsAmt.cjs");
3
- const require_errors = require("./errors-CJU8CHng.cjs");
4
- const require_topologyQueryFns = require("./topologyQueryFns-C3fhJndG.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CkcIL7zv.cjs");
2
+ const require_errors = require("./errors-RHkKO5bZ.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-Bia7o8l_.cjs");
5
4
  const require_constants = require("./constants-BOVyEYGH.cjs");
6
5
  const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
7
- const require_faceFns = require("./faceFns-CPswi9Cm.cjs");
8
- const require_shapeFns = require("./shapeFns-qm9VRo4i.cjs");
9
- const require_curveFns = require("./curveFns-D7utcbnf.cjs");
10
- const require_measureFns = require("./measureFns-B5Zzg1qM.cjs");
6
+ const require_faceFns = require("./faceFns-BK4r7Dxk.cjs");
7
+ const require_shapeFns = require("./shapeFns-D_5TgiUi.cjs");
8
+ const require_curveFns = require("./curveFns-GmFnqNo3.cjs");
9
+ const require_measureFns = require("./measureFns-CJGrmhHT.cjs");
11
10
  //#region src/utils/vec2d.ts
12
11
  /** Precision for curve intersection and parameter operations. */
13
12
  var PRECISION_INTERSECTION = 1e-9;
@@ -74,7 +73,7 @@ var rotate2d = (point, angle, center = [0, 0]) => {
74
73
  * Normalize a 2D vector to unit length.
75
74
  * Returns `[0, 0]` for zero-length vectors (within epsilon).
76
75
  */
77
- function normalize2d$1([x, y]) {
76
+ function normalize2d([x, y]) {
78
77
  const l = Math.sqrt(x * x + y * y);
79
78
  return l < 1e-12 ? [0, 0] : [x / l, y / l];
80
79
  }
@@ -91,21 +90,6 @@ var cartesianToPolar = ([x, y]) => {
91
90
  return [Math.sqrt(x * x + y * y), Math.atan2(y, x)];
92
91
  };
93
92
  //#endregion
94
- //#region src/2d/lib/vectorOperations.ts
95
- /**
96
- * Normalize a 2D vector to unit length.
97
- *
98
- * Unlike the Layer 0 version (which returns [0,0] for zero-length vectors),
99
- * this throws a BrepBugError — Layer 2 code should never pass zero-length vectors.
100
- *
101
- * @throws When the vector has near-zero length.
102
- */
103
- var normalize2d = ([x, y]) => {
104
- const result = normalize2d$1([x, y]);
105
- if (result[0] === 0 && result[1] === 0) require_bug.bug("normalize2d", "Cannot normalize zero-length vector");
106
- return result;
107
- };
108
- //#endregion
109
93
  //#region src/query/finderCore.ts
110
94
  /**
111
95
  * Find exactly one element matching all predicates. Returns an error Result
@@ -1,13 +1,12 @@
1
- import { it as getKernel, y as isFace } from "./shapeTypes-CnKFSfDT.js";
2
- import { n as bug } from "./bug-BdOHwn_e.js";
3
- import { C as isOk, O as ok, o as queryError, v as err } from "./errors-B3CDG537.js";
4
- import { c as getFaces, f as getVertices, p as getWires, s as getEdges } from "./topologyQueryFns-DNqT88yx.js";
1
+ import { K as getKernel, y as isFace } from "./shapeTypes-t49f64Dx.js";
2
+ import { E as ok, g as err, o as queryError, x as isOk } from "./errors-MHLiNE-C.js";
3
+ import { c as getFaces, f as getVertices, p as getWires, s as getEdges } from "./topologyQueryFns-BkQ6Q7gN.js";
5
4
  import { t as DEG2RAD } from "./constants-ITRzCnCp.js";
6
5
  import { a as vecDot, d as vecNormalize } from "./vecOps-SKPRvPH-.js";
7
- import { l as normalAt, s as getSurfaceType } from "./faceFns-CB6uzvOg.js";
8
- import { a as isSameShape, n as getHashCode } from "./shapeFns-BrHFNLMA.js";
9
- import { f as getCurveType, i as curveIsClosed, o as curveLength } from "./curveFns-RENXKp64.js";
10
- import { n as measureArea } from "./measureFns-CC7HhAH3.js";
6
+ import { l as normalAt, s as getSurfaceType } from "./faceFns-DJj9Nb6T.js";
7
+ import { a as isSameShape, n as getHashCode } from "./shapeFns-BTFx-os7.js";
8
+ import { f as getCurveType, i as curveIsClosed, o as curveLength } from "./curveFns-DX13KRh2.js";
9
+ import { n as measureArea } from "./measureFns-CMnbcUZC.js";
11
10
  //#region src/utils/vec2d.ts
12
11
  /** Precision for curve intersection and parameter operations. */
13
12
  var PRECISION_INTERSECTION = 1e-9;
@@ -74,7 +73,7 @@ var rotate2d = (point, angle, center = [0, 0]) => {
74
73
  * Normalize a 2D vector to unit length.
75
74
  * Returns `[0, 0]` for zero-length vectors (within epsilon).
76
75
  */
77
- function normalize2d$1([x, y]) {
76
+ function normalize2d([x, y]) {
78
77
  const l = Math.sqrt(x * x + y * y);
79
78
  return l < 1e-12 ? [0, 0] : [x / l, y / l];
80
79
  }
@@ -91,21 +90,6 @@ var cartesianToPolar = ([x, y]) => {
91
90
  return [Math.sqrt(x * x + y * y), Math.atan2(y, x)];
92
91
  };
93
92
  //#endregion
94
- //#region src/2d/lib/vectorOperations.ts
95
- /**
96
- * Normalize a 2D vector to unit length.
97
- *
98
- * Unlike the Layer 0 version (which returns [0,0] for zero-length vectors),
99
- * this throws a BrepBugError — Layer 2 code should never pass zero-length vectors.
100
- *
101
- * @throws When the vector has near-zero length.
102
- */
103
- var normalize2d = ([x, y]) => {
104
- const result = normalize2d$1([x, y]);
105
- if (result[0] === 0 && result[1] === 0) bug("normalize2d", "Cannot normalize zero-length vector");
106
- return result;
107
- };
108
- //#endregion
109
93
  //#region src/query/finderCore.ts
110
94
  /**
111
95
  * Find exactly one element matching all predicates. Returns an error Result
@@ -324,4 +308,4 @@ function getSingleFace(f, shape) {
324
308
  return f(faceFinder()).findUnique(shape);
325
309
  }
326
310
  //#endregion
327
- export { samePoint as _, createTypedFinder as a, subtract2d as b, PRECISION_OFFSET as c, cartesianToPolar as d, crossProduct2d as f, rotate2d as g, polarToCartesian as h, wireFinder as i, add2d as l, polarAngle2d as m, edgeFinder as n, normalize2d as o, distance2d as p, faceFinder as r, PRECISION_INTERSECTION as s, getSingleFace as t, angle2d as u, scalarMultiply2d as v, squareDistance2d as y };
311
+ export { samePoint as _, createTypedFinder as a, subtract2d as b, add2d as c, crossProduct2d as d, distance2d as f, rotate2d as g, polarToCartesian as h, wireFinder as i, angle2d as l, polarAngle2d as m, edgeFinder as n, PRECISION_INTERSECTION as o, normalize2d as p, faceFinder as r, PRECISION_OFFSET as s, getSingleFace as t, cartesianToPolar as u, scalarMultiply2d as v, squareDistance2d as y };
@@ -1,8 +1,8 @@
1
- import { it as getKernel, n as castResultShape } from "./shapeTypes-CnKFSfDT.js";
1
+ import { K as getKernel, n as castResultShape } from "./shapeTypes-t49f64Dx.js";
2
2
  import { i as wasmIndex, r as vec3At$1 } from "./bug-BdOHwn_e.js";
3
- import { O as ok, r as ioError, t as BrepErrorCode, v as err } from "./errors-B3CDG537.js";
3
+ import { E as ok, g as err, r as ioError, t as BrepErrorCode } from "./errors-MHLiNE-C.js";
4
4
  import { n as getAtOrThrow } from "./arrayAccess-DrUGPADn.js";
5
- import { f as make2dSegmentCurve, m as make2dThreePointArc, s as make2dBezierCurve, t as Blueprint } from "./blueprint-DJJo8WkI.js";
5
+ import { f as make2dSegmentCurve, m as make2dThreePointArc, s as make2dBezierCurve, t as Blueprint } from "./blueprint-CAG6jseD.js";
6
6
  //#region src/io/objExportFns.ts
7
7
  /** Read a vec3 from a typed array at the given vertex index. */
8
8
  function vec3At(arr, i) {
@@ -1,8 +1,8 @@
1
- const require_shapeTypes = require("./shapeTypes-Bpsu5KJO.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CkcIL7zv.cjs");
2
2
  const require_bug = require("./bug-O02CsAmt.cjs");
3
- const require_errors = require("./errors-CJU8CHng.cjs");
3
+ const require_errors = require("./errors-RHkKO5bZ.cjs");
4
4
  const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
5
- const require_blueprint = require("./blueprint-DTNT4qYJ.cjs");
5
+ const require_blueprint = require("./blueprint-BGcBMy3b.cjs");
6
6
  //#region src/io/objExportFns.ts
7
7
  /** Read a vec3 from a typed array at the given vertex index. */
8
8
  function vec3At(arr, i) {
package/dist/io.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_meshFns = require("./meshFns-CaXmWmhe.cjs");
3
- const require_importFns = require("./importFns-DS4J1xLv.cjs");
2
+ const require_meshFns = require("./meshFns-Dqf5QBhQ.cjs");
3
+ const require_importFns = require("./importFns-GySbuvVv.cjs");
4
4
  exports.blueprintToDXF = require_importFns.blueprintToDXF;
5
5
  exports.exportDXF = require_importFns.exportDXF;
6
6
  exports.exportGlb = require_importFns.exportGlb;
package/dist/io.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as exportSTEP, r as exportSTL, t as exportIGES } from "./meshFns-D57Fyqyf.js";
2
- import { a as importSVG, c as blueprintToDXF, d as exportGltf, f as exportOBJ, i as exportSTEPConfigured, l as exportDXF, n as importSTEP, o as importSVGPathD, r as importSTL, s as exportThreeMF, t as importIGES, u as exportGlb } from "./importFns-X8vBhZI2.js";
1
+ import { n as exportSTEP, r as exportSTL, t as exportIGES } from "./meshFns-Cs5EBsf7.js";
2
+ import { a as importSVG, c as blueprintToDXF, d as exportGltf, f as exportOBJ, i as exportSTEPConfigured, l as exportDXF, n as importSTEP, o as importSVGPathD, r as importSTL, s as exportThreeMF, t as importIGES, u as exportGlb } from "./importFns-BHs19muu.js";
3
3
  export { blueprintToDXF, exportDXF, exportGlb, exportGltf, exportIGES, exportOBJ, exportSTEP, exportSTEPConfigured, exportSTL, exportThreeMF, importIGES, importSTEP, importSTL, importSVG, importSVGPathD };
@@ -1,5 +1,5 @@
1
- const require_shapeTypes = require("./shapeTypes-Bpsu5KJO.cjs");
2
- const require_errors = require("./errors-CJU8CHng.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CkcIL7zv.cjs");
2
+ const require_errors = require("./errors-RHkKO5bZ.cjs");
3
3
  const require_types = require("./types-KjA8tY4Y.cjs");
4
4
  const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
5
5
  //#region src/operations/extrudeUtils.ts
@@ -337,111 +337,6 @@ function guidedSweep(profile, spine, guides, options = {}) {
337
337
  }
338
338
  }
339
339
  //#endregion
340
- //#region src/operations/extrudeFns.ts
341
- /**
342
- * Basic extrusion operations — extrude and revolve.
343
- *
344
- * Sweep-based operations (sweep, supportExtrude, complexExtrude, twistExtrude)
345
- * have moved to `./sweepFns.js`.
346
- */
347
- /**
348
- * Extrude a face along a vector to produce a solid.
349
- *
350
- * @param face - The planar face to extrude.
351
- * @param extrusionVec - Direction and magnitude of the extrusion as `[x, y, z]`.
352
- * @returns `Result` containing the extruded solid, or an error if validation or operation fails.
353
- */
354
- function extrude(face, extrusionVec) {
355
- if (require_shapeTypes.getKernel().isNull(face.wrapped)) return require_errors.err(require_errors.validationError(require_errors.BrepErrorCode.NULL_SHAPE_INPUT, "extrude: face is a null shape"));
356
- if (require_vecOps.vecLength(extrusionVec) < 1e-10) return require_errors.err(require_errors.validationError("EXTRUDE_ZERO_VECTOR", "extrude: extrusion vector has zero length"));
357
- try {
358
- const kernel = require_shapeTypes.getKernel();
359
- const len = require_vecOps.vecLength(extrusionVec);
360
- const dir = require_vecOps.vecNormalize(extrusionVec);
361
- const shape = kernel.extrude(face.wrapped, [...dir], len);
362
- const solid = require_shapeTypes.createSolid(kernel.downcast(shape, "solid"));
363
- require_shapeTypes.disposeDowncastSource(shape, solid);
364
- return require_errors.ok(solid);
365
- } catch (e) {
366
- return require_errors.err(require_errors.kernelError("EXTRUDE_FAILED", "Extrusion operation failed", e, {
367
- operation: "extrude",
368
- vectorLength: require_vecOps.vecLength(extrusionVec)
369
- }));
370
- }
371
- }
372
- /**
373
- * Revolve a face around an axis to create a solid of revolution.
374
- *
375
- * @param face - The face to revolve.
376
- * @param center - A point on the rotation axis. Defaults to the origin.
377
- * @param direction - Direction vector of the rotation axis. Defaults to Z-up.
378
- * @param angle - Rotation angle in **radians**. Defaults to 2π (a full revolution).
379
- * @returns `Result` containing the revolved 3D shape, or an error if the result is not 3D.
380
- */
381
- function revolve(face, center = [
382
- 0,
383
- 0,
384
- 0
385
- ], direction = [
386
- 0,
387
- 0,
388
- 1
389
- ], angle = 2 * Math.PI) {
390
- if (require_shapeTypes.getKernel().isNull(face.wrapped)) return require_errors.err(require_errors.validationError(require_errors.BrepErrorCode.NULL_SHAPE_INPUT, "revolve: face is a null shape"));
391
- try {
392
- const result = require_shapeTypes.castResultShape(require_shapeTypes.getKernel().revolveVec(face.wrapped, [...center], [...direction], angle));
393
- if (!require_shapeTypes.isShape3D(result)) {
394
- require_shapeTypes.disposeResultShape(result);
395
- return require_errors.err(require_errors.typeCastError("REVOLUTION_NOT_3D", "Revolution did not produce a 3D shape"));
396
- }
397
- return require_errors.ok(result);
398
- } catch (e) {
399
- return require_errors.err(require_errors.kernelError("REVOLVE_FAILED", "Revolution operation failed", e, {
400
- operation: "revolve",
401
- angle
402
- }));
403
- }
404
- }
405
- /**
406
- * Batch extrude: build N independent extrusions in a single kernel call.
407
- *
408
- * Uses the C++ ExtrudeBatch extractor when available (single WASM call),
409
- * falling back to N individual extrude operations otherwise.
410
- *
411
- * @returns Array of valid solids, one per entry.
412
- */
413
- function extrudeAll(entries) {
414
- if (entries.length === 0) return require_errors.ok([]);
415
- const kernel = require_shapeTypes.getKernel();
416
- const kernelEntries = [];
417
- for (let i = 0; i < entries.length; i++) {
418
- const e = entries[i];
419
- if (!e) continue;
420
- const vec = typeof e.height === "number" ? [
421
- 0,
422
- 0,
423
- e.height
424
- ] : e.height;
425
- const len = require_vecOps.vecLength(vec);
426
- if (len < 1e-10) return require_errors.err(require_errors.validationError("EXTRUDE_ALL_ZERO_VECTOR", `extrudeAll: entry ${i} has zero-length extrusion vector`));
427
- const direction = [...require_vecOps.vecNormalize(vec)];
428
- kernelEntries.push({
429
- face: e.face.wrapped,
430
- direction,
431
- length: len
432
- });
433
- }
434
- try {
435
- return require_errors.ok((kernel.extrudeBatch?.(kernelEntries) ?? kernelEntries.map((e) => kernel.extrude(e.face, e.direction, e.length))).map((shape) => {
436
- const solid = require_shapeTypes.createSolid(kernel.downcast(shape, "solid"));
437
- require_shapeTypes.disposeDowncastSource(shape, solid);
438
- return solid;
439
- }));
440
- } catch (e) {
441
- return require_errors.err(require_errors.kernelError("EXTRUDE_ALL_FAILED", "Batch extrusion operation failed", e));
442
- }
443
- }
444
- //#endregion
445
340
  //#region src/operations/loftFns.ts
446
341
  /**
447
342
  * Functional loft operation using branded shape types.
@@ -544,18 +439,6 @@ Object.defineProperty(exports, "complexExtrude", {
544
439
  return complexExtrude;
545
440
  }
546
441
  });
547
- Object.defineProperty(exports, "extrude", {
548
- enumerable: true,
549
- get: function() {
550
- return extrude;
551
- }
552
- });
553
- Object.defineProperty(exports, "extrudeAll", {
554
- enumerable: true,
555
- get: function() {
556
- return extrudeAll;
557
- }
558
- });
559
442
  Object.defineProperty(exports, "guidedSweep", {
560
443
  enumerable: true,
561
444
  get: function() {
@@ -580,12 +463,6 @@ Object.defineProperty(exports, "multiSectionSweep", {
580
463
  return multiSectionSweep;
581
464
  }
582
465
  });
583
- Object.defineProperty(exports, "revolve", {
584
- enumerable: true,
585
- get: function() {
586
- return revolve;
587
- }
588
- });
589
466
  Object.defineProperty(exports, "supportExtrude", {
590
467
  enumerable: true,
591
468
  get: function() {