brep-io-kernel 1.0.21 → 1.0.23

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 (37) hide show
  1. package/README.md +4 -1
  2. package/dist-kernel/brep-kernel.js +17545 -16874
  3. package/package.json +3 -2
  4. package/src/BREP/Edge.js +2 -0
  5. package/src/BREP/Face.js +2 -0
  6. package/src/BREP/SolidMethods/fillet.js +17 -3
  7. package/src/BREP/SolidMethods/visualize.js +372 -365
  8. package/src/BREP/Vertex.js +2 -17
  9. package/src/BREP/fillets/fillet.js +193 -39
  10. package/src/PartHistory.js +4 -25
  11. package/src/SketchSolver2D.js +3 -0
  12. package/src/UI/AccordionWidget.js +1 -1
  13. package/src/UI/EnvMonacoEditor.js +0 -3
  14. package/src/UI/HistoryWidget.js +3 -0
  15. package/src/UI/SceneListing.js +45 -7
  16. package/src/UI/SelectionFilter.js +469 -442
  17. package/src/UI/SelectionState.js +464 -0
  18. package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +40 -1
  19. package/src/UI/assembly/AssemblyConstraintsWidget.js +17 -3
  20. package/src/UI/assembly/constraintSelectionUtils.js +3 -182
  21. package/src/UI/{assembly/constraintFaceUtils.js → faceUtils.js} +30 -5
  22. package/src/UI/featureDialogs.js +99 -69
  23. package/src/UI/pmi/LabelOverlay.js +32 -0
  24. package/src/UI/pmi/PMIMode.js +23 -0
  25. package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +7 -1
  26. package/src/UI/toolbarButtons/orientToFaceButton.js +3 -36
  27. package/src/UI/toolbarButtons/registerDefaultButtons.js +2 -0
  28. package/src/UI/toolbarButtons/selectionStateButton.js +206 -0
  29. package/src/UI/viewer.js +16 -16
  30. package/src/assemblyConstraints/AssemblyConstraintHistory.js +18 -42
  31. package/src/assemblyConstraints/constraints/AngleConstraint.js +1 -0
  32. package/src/assemblyConstraints/constraints/DistanceConstraint.js +1 -0
  33. package/src/features/fillet/FilletFeature.js +7 -0
  34. package/src/features/selectionUtils.js +21 -5
  35. package/src/features/sketch/SketchFeature.js +2 -2
  36. package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +3 -2
  37. package/src/utils/selectionResolver.js +258 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brep-io-kernel",
3
- "version": "1.0.21",
3
+ "version": "1.0.23",
4
4
  "scripts": {
5
5
  "dev": "pnpm generateLicenses && pnpm build:kernel && vite --host 0.0.0.0",
6
6
  "build": "pnpm generateLicenses && vite build",
@@ -21,7 +21,8 @@
21
21
  "./BREP": "./dist-kernel/brep-kernel.js",
22
22
  "./PartHistory": "./dist-kernel/brep-kernel.js",
23
23
  "./AssemblyConstraintHistory": "./dist-kernel/brep-kernel.js",
24
- "./AssemblyConstraintRegistry": "./dist-kernel/brep-kernel.js"
24
+ "./AssemblyConstraintRegistry": "./dist-kernel/brep-kernel.js",
25
+ "./SketchSolver2D": "./src/SketchSolver2D.js"
25
26
  },
26
27
  "files": [
27
28
  "src/**",
package/src/BREP/Edge.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as THREE from "three";
2
2
  import { CADmaterials } from "../UI/CADmaterials.js";
3
+ import { SelectionState } from "../UI/SelectionState.js";
3
4
  import { Line2 } from "three/examples/jsm/Addons.js";
4
5
 
5
6
  export class Edge extends Line2 {
@@ -10,6 +11,7 @@ export class Edge extends Line2 {
10
11
  this.type = 'EDGE';
11
12
  this.renderOrder = 2;
12
13
  this.closedLoop = false;
14
+ SelectionState.attach(this);
13
15
  }
14
16
 
15
17
  // Total polyline length in world space
package/src/BREP/Face.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as THREE from "three";
2
2
  import { CADmaterials } from "../UI/CADmaterials.js";
3
+ import { SelectionState } from "../UI/SelectionState.js";
3
4
  import { computeTriangleArea } from "./triangleUtils.js";
4
5
 
5
6
  export class Face extends THREE.Mesh {
@@ -10,6 +11,7 @@ export class Face extends THREE.Mesh {
10
11
  this.type = 'FACE';
11
12
  this.renderOrder = 1;
12
13
  this.parentSolid = null;
14
+ SelectionState.attach(this);
13
15
  }
14
16
 
15
17
  // Compute the average geometric normal of this face's triangles in world space.
@@ -493,6 +493,7 @@ function mergeInsetEndCapsByNormal(resultSolid, featureID, direction, dotThresho
493
493
  * @param {boolean} [opts.debug=false] Enable debug visuals in fillet builder
494
494
  * @param {boolean} [opts.showTangentOverlays=false] Show pre-inflate tangent overlays on the fillet tube
495
495
  * @param {string} [opts.featureID='FILLET'] For naming of intermediates and result
496
+ * @param {number} [opts.cleanupTinyFaceIslandsArea=0.001] area threshold for face-island relabeling (<= 0 disables)
496
497
  * @returns {import('../BetterSolid.js').Solid}
497
498
  */
498
499
  export async function fillet(opts = {}) {
@@ -511,6 +512,10 @@ export async function fillet(opts = {}) {
511
512
  const combineEdges = (dir !== 'INSET') && !!opts.combineEdges;
512
513
  const showTangentOverlays = !!opts.showTangentOverlays;
513
514
  const featureID = opts.featureID || 'FILLET';
515
+ const cleanupTinyFaceIslandsAreaRaw = Number(opts.cleanupTinyFaceIslandsArea);
516
+ const cleanupTinyFaceIslandsArea = Number.isFinite(cleanupTinyFaceIslandsAreaRaw)
517
+ ? cleanupTinyFaceIslandsAreaRaw
518
+ : 0.001;
514
519
  const SolidCtor = this?.constructor;
515
520
  consoleLogReplacement('[Solid.fillet] Begin', {
516
521
  featureID,
@@ -522,6 +527,7 @@ export async function fillet(opts = {}) {
522
527
  debug,
523
528
  showTangentOverlays,
524
529
  combineEdges,
530
+ cleanupTinyFaceIslandsArea,
525
531
  requestedEdgeNames: Array.isArray(opts.edgeNames) ? opts.edgeNames : [],
526
532
  providedEdgeCount: Array.isArray(opts.edges) ? opts.edges.length : 0,
527
533
  });
@@ -738,8 +744,16 @@ export async function fillet(opts = {}) {
738
744
  }
739
745
 
740
746
  try {
741
- if (dir === 'INSET' && typeof result.mergeTinyFaces === 'function') {
742
- await result.mergeTinyFaces(0.001);
747
+ if (cleanupTinyFaceIslandsArea > 0 && typeof result.cleanupTinyFaceIslands === 'function') {
748
+ await result.cleanupTinyFaceIslands(cleanupTinyFaceIslandsArea);
749
+ }
750
+ } catch (err) {
751
+ console.warn('[Solid.fillet] cleanupTinyFaceIslands failed', { featureID, error: err?.message || err });
752
+ }
753
+
754
+ try {
755
+ if (typeof result.mergeTinyFaces === 'function') {
756
+ await result.mergeTinyFaces(0.1);
743
757
  }
744
758
  } catch (err) {
745
759
  console.warn('[Solid.fillet] mergeTinyFaces failed', { featureID, error: err?.message || err });
@@ -789,4 +803,4 @@ export async function fillet(opts = {}) {
789
803
 
790
804
  function consoleLogReplacement(args){
791
805
  if (debugMode) console.log(...args);
792
- }
806
+ }