brep-io-kernel 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 (403) hide show
  1. package/LICENSE.md +32 -0
  2. package/README.md +144 -0
  3. package/dist-kernel/brep-kernel.js +74699 -0
  4. package/dist-kernel/help/CONTRIBUTING.html +248 -0
  5. package/dist-kernel/help/LICENSE.html +248 -0
  6. package/dist-kernel/help/MODELING.png +0 -0
  7. package/dist-kernel/help/PMI.png +0 -0
  8. package/dist-kernel/help/SKETCH.png +0 -0
  9. package/dist-kernel/help/assembly-constraints__Coincident_Constraint_dialog.png +0 -0
  10. package/dist-kernel/help/assembly-constraints___Angle_Constraint_dialog.png +0 -0
  11. package/dist-kernel/help/assembly-constraints___Distance_Constraint_dialog.png +0 -0
  12. package/dist-kernel/help/assembly-constraints___Fixed_Constraint_dialog.png +0 -0
  13. package/dist-kernel/help/assembly-constraints___Parallel_Constraint_dialog.png +0 -0
  14. package/dist-kernel/help/assembly-constraints___Touch_Align_Constraint_dialog.png +0 -0
  15. package/dist-kernel/help/assembly-constraints__angle-constraint.html +248 -0
  16. package/dist-kernel/help/assembly-constraints__coincident-constraint.html +248 -0
  17. package/dist-kernel/help/assembly-constraints__distance-constraint.html +248 -0
  18. package/dist-kernel/help/assembly-constraints__fixed-constraint.html +248 -0
  19. package/dist-kernel/help/assembly-constraints__parallel-constraint.html +248 -0
  20. package/dist-kernel/help/assembly-constraints__solver.html +248 -0
  21. package/dist-kernel/help/assembly-constraints__touch-align-constraint.html +248 -0
  22. package/dist-kernel/help/brep-api.html +263 -0
  23. package/dist-kernel/help/brep-kernel.html +258 -0
  24. package/dist-kernel/help/brep-model.html +248 -0
  25. package/dist-kernel/help/cylindrical-face-radius-embedding.html +290 -0
  26. package/dist-kernel/help/dialog-screenshots.html +248 -0
  27. package/dist-kernel/help/extruded-sketch-radius-embedding.html +336 -0
  28. package/dist-kernel/help/features__Assembly_Component_dialog.png +0 -0
  29. package/dist-kernel/help/features__Boolean_dialog.png +0 -0
  30. package/dist-kernel/help/features__Chamfer_dialog.png +0 -0
  31. package/dist-kernel/help/features__Datium_dialog.png +0 -0
  32. package/dist-kernel/help/features__Extrude_dialog.png +0 -0
  33. package/dist-kernel/help/features__Fillet_dialog.png +0 -0
  34. package/dist-kernel/help/features__Helix_dialog.png +0 -0
  35. package/dist-kernel/help/features__Hole_dialog.png +0 -0
  36. package/dist-kernel/help/features__Image_Heightmap_Solid_dialog.png +0 -0
  37. package/dist-kernel/help/features__Image_to_Face_dialog.png +0 -0
  38. package/dist-kernel/help/features__Import_3D_Model_dialog.png +0 -0
  39. package/dist-kernel/help/features__Loft_dialog.png +0 -0
  40. package/dist-kernel/help/features__Mirror_dialog.png +0 -0
  41. package/dist-kernel/help/features__Offset_Shell_dialog.png +0 -0
  42. package/dist-kernel/help/features__Overlap_Cleanup_dialog.png +0 -0
  43. package/dist-kernel/help/features__Pattern_Linear_dialog.png +0 -0
  44. package/dist-kernel/help/features__Pattern_Radial_dialog.png +0 -0
  45. package/dist-kernel/help/features__Pattern_dialog.png +0 -0
  46. package/dist-kernel/help/features__Plane_dialog.png +0 -0
  47. package/dist-kernel/help/features__Primitive_Cone_dialog.png +0 -0
  48. package/dist-kernel/help/features__Primitive_Cube_dialog.png +0 -0
  49. package/dist-kernel/help/features__Primitive_Cylinder_dialog.png +0 -0
  50. package/dist-kernel/help/features__Primitive_Pyramid_dialog.png +0 -0
  51. package/dist-kernel/help/features__Primitive_Sphere_dialog.png +0 -0
  52. package/dist-kernel/help/features__Primitive_Torus_dialog.png +0 -0
  53. package/dist-kernel/help/features__Remesh_dialog.png +0 -0
  54. package/dist-kernel/help/features__Revolve_dialog.png +0 -0
  55. package/dist-kernel/help/features__Sheet_Metal_Contour_Flange_dialog.png +0 -0
  56. package/dist-kernel/help/features__Sheet_Metal_Cutout_dialog.png +0 -0
  57. package/dist-kernel/help/features__Sheet_Metal_Flange_dialog.png +0 -0
  58. package/dist-kernel/help/features__Sheet_Metal_Tab_dialog.png +0 -0
  59. package/dist-kernel/help/features__Sketch_dialog.png +0 -0
  60. package/dist-kernel/help/features__Spline_dialog.png +0 -0
  61. package/dist-kernel/help/features__Sweep_dialog.png +0 -0
  62. package/dist-kernel/help/features__Transform_dialog.png +0 -0
  63. package/dist-kernel/help/features__Tube_dialog.png +0 -0
  64. package/dist-kernel/help/features__assembly-component.html +248 -0
  65. package/dist-kernel/help/features__boolean.html +248 -0
  66. package/dist-kernel/help/features__chamfer.html +248 -0
  67. package/dist-kernel/help/features__datium.html +248 -0
  68. package/dist-kernel/help/features__datum.html +248 -0
  69. package/dist-kernel/help/features__extrude.html +248 -0
  70. package/dist-kernel/help/features__fillet.html +248 -0
  71. package/dist-kernel/help/features__helix.html +248 -0
  72. package/dist-kernel/help/features__hole.html +248 -0
  73. package/dist-kernel/help/features__image-heightmap-solid.html +248 -0
  74. package/dist-kernel/help/features__image-to-face-2D_dialog.png +0 -0
  75. package/dist-kernel/help/features__image-to-face-3D_dialog.png +0 -0
  76. package/dist-kernel/help/features__image-to-face.html +248 -0
  77. package/dist-kernel/help/features__import-3d-model.html +248 -0
  78. package/dist-kernel/help/features__index.html +248 -0
  79. package/dist-kernel/help/features__loft.html +248 -0
  80. package/dist-kernel/help/features__mirror.html +248 -0
  81. package/dist-kernel/help/features__offset-shell.html +248 -0
  82. package/dist-kernel/help/features__pattern-linear.html +248 -0
  83. package/dist-kernel/help/features__pattern-radial.html +248 -0
  84. package/dist-kernel/help/features__pattern.html +248 -0
  85. package/dist-kernel/help/features__plane.html +248 -0
  86. package/dist-kernel/help/features__primitive-cone.html +248 -0
  87. package/dist-kernel/help/features__primitive-cube.html +248 -0
  88. package/dist-kernel/help/features__primitive-cylinder.html +248 -0
  89. package/dist-kernel/help/features__primitive-pyramid.html +248 -0
  90. package/dist-kernel/help/features__primitive-sphere.html +248 -0
  91. package/dist-kernel/help/features__primitive-torus.html +248 -0
  92. package/dist-kernel/help/features__remesh.html +248 -0
  93. package/dist-kernel/help/features__revolve.html +248 -0
  94. package/dist-kernel/help/features__sheet-metal-contour-flange.html +248 -0
  95. package/dist-kernel/help/features__sheet-metal-flange.html +248 -0
  96. package/dist-kernel/help/features__sheet-metal-tab.html +248 -0
  97. package/dist-kernel/help/features__sketch.html +248 -0
  98. package/dist-kernel/help/features__spline.html +248 -0
  99. package/dist-kernel/help/features__sweep.html +248 -0
  100. package/dist-kernel/help/features__transform.html +248 -0
  101. package/dist-kernel/help/features__tube.html +248 -0
  102. package/dist-kernel/help/file-formats.html +248 -0
  103. package/dist-kernel/help/getting-started.html +248 -0
  104. package/dist-kernel/help/highlights.html +248 -0
  105. package/dist-kernel/help/history-systems.html +248 -0
  106. package/dist-kernel/help/how-it-works.html +248 -0
  107. package/dist-kernel/help/index.html +862 -0
  108. package/dist-kernel/help/input-params-schema.html +363 -0
  109. package/dist-kernel/help/inspector-improvements.html +248 -0
  110. package/dist-kernel/help/inspector.html +248 -0
  111. package/dist-kernel/help/modes__modeling.html +248 -0
  112. package/dist-kernel/help/modes__pmi.html +248 -0
  113. package/dist-kernel/help/modes__sketch.html +248 -0
  114. package/dist-kernel/help/plugins.html +248 -0
  115. package/dist-kernel/help/pmi-annotations__Angle_Dimension_dialog.png +0 -0
  116. package/dist-kernel/help/pmi-annotations__Explode_Body_dialog.png +0 -0
  117. package/dist-kernel/help/pmi-annotations__Hole_Callout_dialog.png +0 -0
  118. package/dist-kernel/help/pmi-annotations__Leader_dialog.png +0 -0
  119. package/dist-kernel/help/pmi-annotations__Linear_Dimension_dialog.png +0 -0
  120. package/dist-kernel/help/pmi-annotations__Note_dialog.png +0 -0
  121. package/dist-kernel/help/pmi-annotations__Radial_Dimension_dialog.png +0 -0
  122. package/dist-kernel/help/pmi-annotations__angle-dimension.html +248 -0
  123. package/dist-kernel/help/pmi-annotations__explode-body.html +248 -0
  124. package/dist-kernel/help/pmi-annotations__hole-callout.html +248 -0
  125. package/dist-kernel/help/pmi-annotations__index.html +248 -0
  126. package/dist-kernel/help/pmi-annotations__leader.html +248 -0
  127. package/dist-kernel/help/pmi-annotations__linear-dimension.html +248 -0
  128. package/dist-kernel/help/pmi-annotations__note.html +248 -0
  129. package/dist-kernel/help/pmi-annotations__radial-dimension.html +248 -0
  130. package/dist-kernel/help/search-index.json +464 -0
  131. package/dist-kernel/help/simplified-radial-dimensions.html +298 -0
  132. package/dist-kernel/help/solid-methods.html +359 -0
  133. package/dist-kernel/help/table-of-contents.html +330 -0
  134. package/dist-kernel/help/ui-overview.html +248 -0
  135. package/dist-kernel/help/whats-new.html +248 -0
  136. package/package.json +54 -0
  137. package/src/BREP/AssemblyComponent.js +42 -0
  138. package/src/BREP/BREP.js +43 -0
  139. package/src/BREP/BetterSolid.js +805 -0
  140. package/src/BREP/Edge.js +103 -0
  141. package/src/BREP/Extrude.js +403 -0
  142. package/src/BREP/Face.js +187 -0
  143. package/src/BREP/MeshRepairer.js +634 -0
  144. package/src/BREP/OffsetShellSolid.js +614 -0
  145. package/src/BREP/PointCloudWrap.js +302 -0
  146. package/src/BREP/Revolve.js +345 -0
  147. package/src/BREP/SolidMethods/authoring.js +112 -0
  148. package/src/BREP/SolidMethods/booleanOps.js +230 -0
  149. package/src/BREP/SolidMethods/chamfer.js +122 -0
  150. package/src/BREP/SolidMethods/edgeResolution.js +25 -0
  151. package/src/BREP/SolidMethods/fillet.js +792 -0
  152. package/src/BREP/SolidMethods/index.js +72 -0
  153. package/src/BREP/SolidMethods/io.js +105 -0
  154. package/src/BREP/SolidMethods/lifecycle.js +103 -0
  155. package/src/BREP/SolidMethods/manifoldOps.js +375 -0
  156. package/src/BREP/SolidMethods/meshCleanup.js +2512 -0
  157. package/src/BREP/SolidMethods/meshQueries.js +264 -0
  158. package/src/BREP/SolidMethods/metadata.js +106 -0
  159. package/src/BREP/SolidMethods/metrics.js +51 -0
  160. package/src/BREP/SolidMethods/transforms.js +361 -0
  161. package/src/BREP/SolidMethods/visualize.js +508 -0
  162. package/src/BREP/SolidShared.js +26 -0
  163. package/src/BREP/Sweep.js +1596 -0
  164. package/src/BREP/Tube.js +857 -0
  165. package/src/BREP/Vertex.js +43 -0
  166. package/src/BREP/applyBooleanOperation.js +704 -0
  167. package/src/BREP/boundsUtils.js +48 -0
  168. package/src/BREP/chamfer.js +551 -0
  169. package/src/BREP/edgePolylineUtils.js +85 -0
  170. package/src/BREP/fillets/common.js +388 -0
  171. package/src/BREP/fillets/fillet.js +1422 -0
  172. package/src/BREP/fillets/filletGeometry.js +15 -0
  173. package/src/BREP/fillets/inset.js +389 -0
  174. package/src/BREP/fillets/offsetHelper.js +143 -0
  175. package/src/BREP/fillets/outset.js +88 -0
  176. package/src/BREP/helix.js +193 -0
  177. package/src/BREP/meshToBrep.js +234 -0
  178. package/src/BREP/primitives.js +279 -0
  179. package/src/BREP/setupManifold.js +71 -0
  180. package/src/BREP/threadGeometry.js +1120 -0
  181. package/src/BREP/triangleUtils.js +8 -0
  182. package/src/BREP/triangulate.js +608 -0
  183. package/src/FeatureRegistry.js +183 -0
  184. package/src/PartHistory.js +1132 -0
  185. package/src/UI/AccordionWidget.js +292 -0
  186. package/src/UI/CADmaterials.js +850 -0
  187. package/src/UI/EnvMonacoEditor.js +522 -0
  188. package/src/UI/FloatingWindow.js +396 -0
  189. package/src/UI/HistoryWidget.js +457 -0
  190. package/src/UI/MainToolbar.js +131 -0
  191. package/src/UI/ModelLibraryView.js +194 -0
  192. package/src/UI/OrthoCameraIdle.js +206 -0
  193. package/src/UI/PluginsWidget.js +280 -0
  194. package/src/UI/SceneListing.js +606 -0
  195. package/src/UI/SelectionFilter.js +629 -0
  196. package/src/UI/ViewCube.js +389 -0
  197. package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +329 -0
  198. package/src/UI/assembly/AssemblyConstraintControlsWidget.js +282 -0
  199. package/src/UI/assembly/AssemblyConstraintsWidget.css +292 -0
  200. package/src/UI/assembly/AssemblyConstraintsWidget.js +1373 -0
  201. package/src/UI/assembly/constraintFaceUtils.js +115 -0
  202. package/src/UI/assembly/constraintHighlightUtils.js +70 -0
  203. package/src/UI/assembly/constraintLabelUtils.js +31 -0
  204. package/src/UI/assembly/constraintPointUtils.js +64 -0
  205. package/src/UI/assembly/constraintSelectionUtils.js +185 -0
  206. package/src/UI/assembly/constraintStatusUtils.js +142 -0
  207. package/src/UI/componentSelectorModal.js +240 -0
  208. package/src/UI/controls/CombinedTransformControls.js +386 -0
  209. package/src/UI/dialogs.js +351 -0
  210. package/src/UI/expressionsManager.js +100 -0
  211. package/src/UI/featureDialogWidgets/booleanField.js +25 -0
  212. package/src/UI/featureDialogWidgets/booleanOperationField.js +97 -0
  213. package/src/UI/featureDialogWidgets/buttonField.js +45 -0
  214. package/src/UI/featureDialogWidgets/componentSelectorField.js +102 -0
  215. package/src/UI/featureDialogWidgets/defaultField.js +23 -0
  216. package/src/UI/featureDialogWidgets/fileField.js +66 -0
  217. package/src/UI/featureDialogWidgets/index.js +34 -0
  218. package/src/UI/featureDialogWidgets/numberField.js +165 -0
  219. package/src/UI/featureDialogWidgets/optionsField.js +33 -0
  220. package/src/UI/featureDialogWidgets/referenceSelectionField.js +208 -0
  221. package/src/UI/featureDialogWidgets/stringField.js +24 -0
  222. package/src/UI/featureDialogWidgets/textareaField.js +28 -0
  223. package/src/UI/featureDialogWidgets/threadDesignationField.js +160 -0
  224. package/src/UI/featureDialogWidgets/transformField.js +252 -0
  225. package/src/UI/featureDialogWidgets/utils.js +43 -0
  226. package/src/UI/featureDialogWidgets/vec3Field.js +133 -0
  227. package/src/UI/featureDialogs.js +1414 -0
  228. package/src/UI/fileManagerWidget.js +615 -0
  229. package/src/UI/history/HistoryCollectionWidget.js +1294 -0
  230. package/src/UI/history/historyCollectionWidget.css.js +257 -0
  231. package/src/UI/history/historyDisplayInfo.js +133 -0
  232. package/src/UI/mobile.js +28 -0
  233. package/src/UI/objectDump.js +442 -0
  234. package/src/UI/pmi/AnnotationCollectionWidget.js +120 -0
  235. package/src/UI/pmi/AnnotationHistory.js +353 -0
  236. package/src/UI/pmi/AnnotationRegistry.js +90 -0
  237. package/src/UI/pmi/BaseAnnotation.js +269 -0
  238. package/src/UI/pmi/LabelOverlay.css +102 -0
  239. package/src/UI/pmi/LabelOverlay.js +191 -0
  240. package/src/UI/pmi/PMIMode.js +1550 -0
  241. package/src/UI/pmi/PMIViewsWidget.js +1098 -0
  242. package/src/UI/pmi/annUtils.js +729 -0
  243. package/src/UI/pmi/dimensions/AngleDimensionAnnotation.js +647 -0
  244. package/src/UI/pmi/dimensions/ExplodeBodyAnnotation.js +507 -0
  245. package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +462 -0
  246. package/src/UI/pmi/dimensions/LeaderAnnotation.js +403 -0
  247. package/src/UI/pmi/dimensions/LinearDimensionAnnotation.js +532 -0
  248. package/src/UI/pmi/dimensions/NoteAnnotation.js +110 -0
  249. package/src/UI/pmi/dimensions/RadialDimensionAnnotation.js +659 -0
  250. package/src/UI/pmi/pmiStyle.js +44 -0
  251. package/src/UI/sketcher/SketchMode3D.js +4095 -0
  252. package/src/UI/sketcher/dimensions.js +674 -0
  253. package/src/UI/sketcher/glyphs.js +236 -0
  254. package/src/UI/sketcher/highlights.js +60 -0
  255. package/src/UI/toolbarButtons/aboutButton.js +5 -0
  256. package/src/UI/toolbarButtons/exportButton.js +609 -0
  257. package/src/UI/toolbarButtons/flatPatternButton.js +307 -0
  258. package/src/UI/toolbarButtons/importButton.js +160 -0
  259. package/src/UI/toolbarButtons/inspectorToggleButton.js +12 -0
  260. package/src/UI/toolbarButtons/metadataButton.js +1063 -0
  261. package/src/UI/toolbarButtons/orientToFaceButton.js +114 -0
  262. package/src/UI/toolbarButtons/registerDefaultButtons.js +46 -0
  263. package/src/UI/toolbarButtons/saveButton.js +99 -0
  264. package/src/UI/toolbarButtons/scriptRunnerButton.js +302 -0
  265. package/src/UI/toolbarButtons/testsButton.js +26 -0
  266. package/src/UI/toolbarButtons/undoRedoButtons.js +25 -0
  267. package/src/UI/toolbarButtons/wireframeToggleButton.js +5 -0
  268. package/src/UI/toolbarButtons/zoomToFitButton.js +5 -0
  269. package/src/UI/triangleDebuggerWindow.js +945 -0
  270. package/src/UI/viewer.js +4228 -0
  271. package/src/assemblyConstraints/AssemblyConstraintHistory.js +1576 -0
  272. package/src/assemblyConstraints/AssemblyConstraintRegistry.js +120 -0
  273. package/src/assemblyConstraints/BaseAssemblyConstraint.js +66 -0
  274. package/src/assemblyConstraints/constraintExpressionUtils.js +35 -0
  275. package/src/assemblyConstraints/constraintUtils/parallelAlignment.js +676 -0
  276. package/src/assemblyConstraints/constraints/AngleConstraint.js +485 -0
  277. package/src/assemblyConstraints/constraints/CoincidentConstraint.js +194 -0
  278. package/src/assemblyConstraints/constraints/DistanceConstraint.js +616 -0
  279. package/src/assemblyConstraints/constraints/FixedConstraint.js +78 -0
  280. package/src/assemblyConstraints/constraints/ParallelConstraint.js +252 -0
  281. package/src/assemblyConstraints/constraints/TouchAlignConstraint.js +961 -0
  282. package/src/core/entities/HistoryCollectionBase.js +72 -0
  283. package/src/core/entities/ListEntityBase.js +109 -0
  284. package/src/core/entities/schemaProcesser.js +121 -0
  285. package/src/exporters/sheetMetalFlatPattern.js +659 -0
  286. package/src/exporters/sheetMetalUnfold.js +862 -0
  287. package/src/exporters/step.js +1135 -0
  288. package/src/exporters/threeMF.js +575 -0
  289. package/src/features/assemblyComponent/AssemblyComponentFeature.js +780 -0
  290. package/src/features/boolean/BooleanFeature.js +94 -0
  291. package/src/features/chamfer/ChamferFeature.js +116 -0
  292. package/src/features/datium/DatiumFeature.js +80 -0
  293. package/src/features/edgeFeatureUtils.js +41 -0
  294. package/src/features/extrude/ExtrudeFeature.js +143 -0
  295. package/src/features/fillet/FilletFeature.js +197 -0
  296. package/src/features/helix/HelixFeature.js +405 -0
  297. package/src/features/hole/HoleFeature.js +1050 -0
  298. package/src/features/hole/screwClearance.js +86 -0
  299. package/src/features/hole/threadDesignationCatalog.js +149 -0
  300. package/src/features/imageHeightSolid/ImageHeightmapSolidFeature.js +463 -0
  301. package/src/features/imageToFace/ImageToFaceFeature.js +727 -0
  302. package/src/features/imageToFace/imageEditor.js +1270 -0
  303. package/src/features/imageToFace/traceUtils.js +971 -0
  304. package/src/features/import3dModel/Import3dModelFeature.js +151 -0
  305. package/src/features/loft/LoftFeature.js +605 -0
  306. package/src/features/mirror/MirrorFeature.js +151 -0
  307. package/src/features/offsetFace/OffsetFaceFeature.js +370 -0
  308. package/src/features/offsetShell/OffsetShellFeature.js +89 -0
  309. package/src/features/overlapCleanup/OverlapCleanupFeature.js +85 -0
  310. package/src/features/pattern/PatternFeature.js +275 -0
  311. package/src/features/patternLinear/PatternLinearFeature.js +120 -0
  312. package/src/features/patternRadial/PatternRadialFeature.js +186 -0
  313. package/src/features/plane/PlaneFeature.js +154 -0
  314. package/src/features/primitiveCone/primitiveConeFeature.js +99 -0
  315. package/src/features/primitiveCube/primitiveCubeFeature.js +70 -0
  316. package/src/features/primitiveCylinder/primitiveCylinderFeature.js +91 -0
  317. package/src/features/primitivePyramid/primitivePyramidFeature.js +72 -0
  318. package/src/features/primitiveSphere/primitiveSphereFeature.js +62 -0
  319. package/src/features/primitiveTorus/primitiveTorusFeature.js +109 -0
  320. package/src/features/remesh/RemeshFeature.js +97 -0
  321. package/src/features/revolve/RevolveFeature.js +111 -0
  322. package/src/features/selectionUtils.js +118 -0
  323. package/src/features/sheetMetal/SheetMetalContourFlangeFeature.js +1656 -0
  324. package/src/features/sheetMetal/SheetMetalCutoutFeature.js +1056 -0
  325. package/src/features/sheetMetal/SheetMetalFlangeFeature.js +1568 -0
  326. package/src/features/sheetMetal/SheetMetalHemFeature.js +43 -0
  327. package/src/features/sheetMetal/SheetMetalObject.js +141 -0
  328. package/src/features/sheetMetal/SheetMetalTabFeature.js +176 -0
  329. package/src/features/sheetMetal/UNFOLD_NEUTRAL_REQUIREMENTS.md +153 -0
  330. package/src/features/sheetMetal/contour-flange-rebuild-spec.md +261 -0
  331. package/src/features/sheetMetal/profileUtils.js +25 -0
  332. package/src/features/sheetMetal/sheetMetalCleanup.js +9 -0
  333. package/src/features/sheetMetal/sheetMetalFaceTypes.js +146 -0
  334. package/src/features/sheetMetal/sheetMetalMetadata.js +165 -0
  335. package/src/features/sheetMetal/sheetMetalPipeline.js +169 -0
  336. package/src/features/sheetMetal/sheetMetalProfileUtils.js +216 -0
  337. package/src/features/sheetMetal/sheetMetalTabUtils.js +29 -0
  338. package/src/features/sheetMetal/sheetMetalTree.js +210 -0
  339. package/src/features/sketch/SketchFeature.js +955 -0
  340. package/src/features/sketch/sketchSolver2D/ConstraintEngine.js +800 -0
  341. package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +704 -0
  342. package/src/features/sketch/sketchSolver2D/mathHelpersMod.js +307 -0
  343. package/src/features/spline/SplineEditorSession.js +988 -0
  344. package/src/features/spline/SplineFeature.js +1388 -0
  345. package/src/features/spline/splineUtils.js +218 -0
  346. package/src/features/sweep/SweepFeature.js +110 -0
  347. package/src/features/transform/TransformFeature.js +152 -0
  348. package/src/features/tube/TubeFeature.js +635 -0
  349. package/src/fs.proxy.js +625 -0
  350. package/src/idbStorage.js +254 -0
  351. package/src/index.js +12 -0
  352. package/src/main.js +15 -0
  353. package/src/metadataManager.js +64 -0
  354. package/src/path.proxy.js +277 -0
  355. package/src/plugins/ghLoader.worker.js +151 -0
  356. package/src/plugins/pluginManager.js +286 -0
  357. package/src/pmi/PMIViewsManager.js +134 -0
  358. package/src/services/componentLibrary.js +198 -0
  359. package/src/tests/ConsoleCapture.js +189 -0
  360. package/src/tests/S7-diagnostics-2025-12-23T18-37-23-570Z.json +630 -0
  361. package/src/tests/browserTests.js +597 -0
  362. package/src/tests/debugBoolean.js +225 -0
  363. package/src/tests/partFiles/badBoolean.json +957 -0
  364. package/src/tests/partFiles/extrudeTest.json +88 -0
  365. package/src/tests/partFiles/filletFail.json +58 -0
  366. package/src/tests/partFiles/import_TEst.part.part.json +646 -0
  367. package/src/tests/partFiles/sheetMetalHem.BREP.json +734 -0
  368. package/src/tests/test_boolean_subtract.js +27 -0
  369. package/src/tests/test_chamfer.js +17 -0
  370. package/src/tests/test_extrudeFace.js +24 -0
  371. package/src/tests/test_fillet.js +17 -0
  372. package/src/tests/test_fillet_nonClosed.js +45 -0
  373. package/src/tests/test_filletsMoreDifficult.js +46 -0
  374. package/src/tests/test_history_features_basic.js +149 -0
  375. package/src/tests/test_hole.js +282 -0
  376. package/src/tests/test_mirror.js +16 -0
  377. package/src/tests/test_offsetShellGrouping.js +85 -0
  378. package/src/tests/test_plane.js +4 -0
  379. package/src/tests/test_primitiveCone.js +11 -0
  380. package/src/tests/test_primitiveCube.js +7 -0
  381. package/src/tests/test_primitiveCylinder.js +8 -0
  382. package/src/tests/test_primitivePyramid.js +9 -0
  383. package/src/tests/test_primitiveSphere.js +17 -0
  384. package/src/tests/test_primitiveTorus.js +21 -0
  385. package/src/tests/test_pushFace.js +126 -0
  386. package/src/tests/test_sheetMetalContourFlange.js +125 -0
  387. package/src/tests/test_sheetMetal_features.js +80 -0
  388. package/src/tests/test_sketch_openLoop.js +45 -0
  389. package/src/tests/test_solidMetrics.js +58 -0
  390. package/src/tests/test_stlLoader.js +1889 -0
  391. package/src/tests/test_sweepFace.js +55 -0
  392. package/src/tests/test_tube.js +45 -0
  393. package/src/tests/test_tube_closedLoop.js +67 -0
  394. package/src/tests/tests.js +493 -0
  395. package/src/tools/assemblyConstraintDialogCapturePage.js +56 -0
  396. package/src/tools/dialogCapturePageFactory.js +227 -0
  397. package/src/tools/featureDialogCapturePage.js +47 -0
  398. package/src/tools/pmiAnnotationDialogCapturePage.js +60 -0
  399. package/src/utils/axisHelpers.js +99 -0
  400. package/src/utils/deepClone.js +69 -0
  401. package/src/utils/geometryTolerance.js +37 -0
  402. package/src/utils/normalizeTypeString.js +8 -0
  403. package/src/utils/xformMath.js +51 -0
@@ -0,0 +1,805 @@
1
+
2
+ /**
3
+ * Solid: Authoring wrapper around manifold-3d Mesh/Manifold
4
+ *
5
+ * Requirements
6
+ * - Environment: ES modules. For disk export (`writeSTL`) a Node.js runtime is required.
7
+ * - Dependency: `setupManifold.js` must provide a ready-to-use `manifold` module
8
+ * exposing `{ Manifold, Mesh }` from `manifold-3d`.
9
+ * - Geometry: Input triangles must describe a closed, watertight, 2‑manifold.
10
+ * The class includes helpers to fix triangle adjacency winding and will flip
11
+ * the entire mesh if overall orientation is inward, but it cannot repair
12
+ * topological holes or self-intersections.
13
+ * - Vertex uniqueness: Vertices are uniqued by exact coordinate match
14
+ * (string key of `x,y,z`). If you author with floating tolerances, you must
15
+ * supply identical numeric values for shared vertices or change `_key()` to
16
+ * implement a tolerance strategy.
17
+ *
18
+ * Theory of Operation
19
+ * - Authoring model:
20
+ * - Add triangles via `addTriangle(faceName, v1, v2, v3)`.
21
+ * - Each triangle stores three vertex indices in `_triVerts` and a per‑triangle
22
+ * face label ID in `_triIDs`. Face labels are mapped to globally unique
23
+ * IDs from `Manifold.reserveIDs()` so provenance persists through CSG.
24
+ * - Vertices are stored in `_vertProperties` in MeshGL layout `[x,y,z,...]`.
25
+ *
26
+ * - Manifold build (`_manifoldize`):
27
+ * - Before building, `fixTriangleWindingsByAdjacency()` enforces opposite
28
+ * orientation across shared edges; then a signed‑volume check flips all
29
+ * triangles if the mesh is inward‑facing.
30
+ * - A `Mesh` is constructed with `{ numProp, vertProperties, triVerts, faceID }`,
31
+ * where `faceID` is the per‑triangle label array. `mesh.merge()` is called
32
+ * to fill merge vectors when needed, then `new Manifold(mesh)` is created
33
+ * and cached until the authoring arrays change.
34
+ *
35
+ * - Provenance & queries:
36
+ * - After any boolean operation, Manifold propagates `faceID` so each output
37
+ * triangle keeps the original face label. `getFace(name)` and `getFaces()`
38
+ * read `mesh.faceID` to enumerate triangles by label (no planar grouping or
39
+ * merging), which supports faces comprised of many non‑coplanar triangles
40
+ * (e.g., cylinder side walls).
41
+ *
42
+ * - Boolean CSG:
43
+ * - `union`, `subtract`, `intersect` call Manifold’s CSG APIs on the cached
44
+ * Manifold objects and then rebuild a new Solid from the result. Face ID →
45
+ * name maps from both inputs are merged so all original labels remain
46
+ * available in the output.
47
+ *
48
+ * - Export:
49
+ * - `toSTL()` returns an ASCII STL string from the current Manifold mesh.
50
+ * - `writeSTL(path)` writes the STL to disk using a dynamic `fs` import so
51
+ * the module stays browser‑safe.
52
+ * - `toSTEP()` returns a triangulated STEP (faceted BREP) string.
53
+ * - `writeSTEP(path)` writes the STEP file to disk in Node.js environments.
54
+ *
55
+ * Performance Notes
56
+ * - Manifoldization is cached and only recomputed when authoring arrays change
57
+ * (`_dirty`). Face queries iterate triangles and filter by `faceID`, which is
58
+ * linear in triangle count.
59
+ */
60
+ import {
61
+ THREE,
62
+ debugMode,
63
+ } from "./SolidShared.js";
64
+ import * as SolidMethods from "./SolidMethods/index.js";
65
+ export { Edge, Vertex, Face } from "./SolidShared.js";
66
+ /**
67
+ * Solid
68
+ * - Add triangles with a face name.
69
+ * - Data is stored in Manifold's MeshGL layout (vertProperties, triVerts, faceID).
70
+ * - Face names are mapped to globally-unique Manifold IDs so they propagate through boolean ops.
71
+ * - Query triangles for a given face name after any CSG by reading runs back from MeshGL.
72
+ */
73
+ export class Solid extends THREE.Group {
74
+ // Always reconstruct booleans as this base Solid (not subclasses) to avoid
75
+ // re-running primitive generate() when rebuilding from Manifold.
76
+ static BaseSolid = Solid;
77
+ /**
78
+ * Construct an empty Solid with authoring buffers, face/edge metadata, and aux-edge storage initialized.
79
+ */
80
+ constructor() {
81
+ super(...arguments);
82
+ SolidMethods.constructorImpl.apply(this, arguments);
83
+ }
84
+
85
+ /**
86
+ * Bake a Matrix4 into authored vertices (and aux edges/metadata), marking the manifold dirty.
87
+ * @param {THREE.Matrix4|{elements:number[]}} matrix Matrix or matrix-like object
88
+ * @returns {Solid}
89
+ */
90
+ bakeTransform(matrix) {
91
+ return SolidMethods.bakeTransform.apply(this, arguments);
92
+ }
93
+
94
+ /**
95
+ * Compose TRS from `{ t, rDeg, s }` and bake it into authored geometry.
96
+ * @param {{t?:number[],rDeg?:number[],s?:number[]}} trs TRS description in degrees
97
+ * @returns {Solid}
98
+ */
99
+ bakeTRS(trs) {
100
+ return SolidMethods.bakeTRS.apply(this, arguments);
101
+ }
102
+
103
+ /**
104
+ * Internal: build the exact vertex deduplication key for a coordinate triple.
105
+ * @param {[number,number,number]} param0
106
+ * @returns {string}
107
+ */
108
+ _key([x, y, z]) {
109
+ return SolidMethods._key.apply(this, arguments);
110
+ }
111
+
112
+ /**
113
+ * Internal: fetch or create a vertex index for a point, validating finiteness.
114
+ * @param {number[]|{x:number,y:number,z:number}} p
115
+ * @returns {number} vertex index
116
+ */
117
+ _getPointIndex(p) {
118
+ return SolidMethods._getPointIndex.apply(this, arguments);
119
+ }
120
+
121
+ /**
122
+ * Internal: map a face name to a globally unique Manifold ID (creates if missing).
123
+ * @param {string} faceName
124
+ * @returns {number}
125
+ */
126
+ _getOrCreateID(faceName) {
127
+ return SolidMethods._getOrCreateID.apply(this, arguments);
128
+ }
129
+
130
+ /**
131
+ * Add a CCW triangle labeled with the given face name to the authoring buffers.
132
+ * @param {string} faceName
133
+ * @param {[number,number,number]} v1
134
+ * @param {[number,number,number]} v2
135
+ * @param {[number,number,number]} v3
136
+ * @returns {Solid}
137
+ */
138
+ addTriangle(faceName, v1, v2, v3) {
139
+ return SolidMethods.addTriangle.apply(this, arguments);
140
+ }
141
+
142
+ /**
143
+ * Add an auxiliary polyline (e.g., centerline) to visualize alongside the solid.
144
+ * @param {string} name
145
+ * @param {Array<[number,number,number]>} points
146
+ * @param {object} [options]
147
+ * @param {boolean} [options.closedLoop=false] render as a closed loop when visualized
148
+ * @param {boolean} [options.polylineWorld=false] whether points are already in world space
149
+ * @param {'OVERLAY'|'BASE'|string} [options.materialKey='OVERLAY'] visualization material tag
150
+ * @returns {Solid}
151
+ */
152
+ addAuxEdge(name, points, options = {}) {
153
+ return SolidMethods.addAuxEdge.apply(this, arguments);
154
+ }
155
+
156
+ /**
157
+ * Convenience helper to add a two-point centerline as an auxiliary edge.
158
+ * @param {number[]|{x:number,y:number,z:number}} a
159
+ * @param {number[]|{x:number,y:number,z:number}} b
160
+ * @param {string} [name='CENTERLINE']
161
+ * @param {object} [options]
162
+ * @param {boolean} [options.closedLoop=false] render as a closed loop when visualized
163
+ * @param {boolean} [options.polylineWorld=false] whether points are already in world space
164
+ * @param {'OVERLAY'|'BASE'|string} [options.materialKey='OVERLAY'] visualization material tag
165
+ * @returns {Solid}
166
+ */
167
+ addCenterline(a, b, name = 'CENTERLINE', options = {}) {
168
+ return SolidMethods.addCenterline.apply(this, arguments);
169
+ }
170
+
171
+ /**
172
+ * Merge and set metadata for a face label.
173
+ * @param {string} faceName
174
+ * @param {object} metadata
175
+ * @returns {Solid}
176
+ */
177
+ setFaceMetadata(faceName, metadata) {
178
+ return SolidMethods.setFaceMetadata.apply(this, arguments);
179
+ }
180
+
181
+ /**
182
+ * Get metadata for a face label (empty object if none).
183
+ * @param {string} faceName
184
+ * @returns {object}
185
+ */
186
+ getFaceMetadata(faceName) {
187
+ return SolidMethods.getFaceMetadata.apply(this, arguments);
188
+ }
189
+
190
+ /**
191
+ * Rename a face; if the new name already exists, merge triangles/metadata into it.
192
+ * @param {string} oldName
193
+ * @param {string} newName
194
+ * @returns {Solid}
195
+ */
196
+ renameFace(oldName, newName) {
197
+ return SolidMethods.renameFace.apply(this, arguments);
198
+ }
199
+
200
+ /**
201
+ * Merge and set metadata for a boundary edge label.
202
+ * @param {string} edgeName
203
+ * @param {object} metadata
204
+ * @returns {Solid}
205
+ */
206
+ setEdgeMetadata(edgeName, metadata) {
207
+ return SolidMethods.setEdgeMetadata.apply(this, arguments);
208
+ }
209
+
210
+ /**
211
+ * Get metadata for a boundary edge label (null if none).
212
+ * @param {string} edgeName
213
+ * @returns {object|null}
214
+ */
215
+ getEdgeMetadata(edgeName) {
216
+ return SolidMethods.getEdgeMetadata.apply(this, arguments);
217
+ }
218
+
219
+ /**
220
+ * Remesh by splitting edges longer than a threshold; preserves face IDs and fixes winding.
221
+ * @param {object} [options]
222
+ * @param {number} options.maxEdgeLength maximum allowed edge length before splitting (required)
223
+ * @param {number} [options.maxIterations=10] number of remesh passes to attempt
224
+ * @returns {Solid}
225
+ */
226
+ remesh({ maxEdgeLength, maxIterations = 10 } = {}) {
227
+ return SolidMethods.remesh.apply(this, arguments);
228
+ }
229
+
230
+ /**
231
+ * Remove small disconnected triangle islands relative to the main shell.
232
+ * @param {object} [options]
233
+ * @param {number} [options.maxTriangles=30] triangle-count threshold for removal
234
+ * @param {boolean} [options.removeInternal=true] drop islands inside the main shell
235
+ * @param {boolean} [options.removeExternal=true] drop islands outside the main shell
236
+ * @returns {number} triangles removed
237
+ */
238
+ removeSmallIslands({ maxTriangles = 30, removeInternal = true, removeExternal = true } = {}) {
239
+ return SolidMethods.removeSmallIslands.apply(this, arguments);
240
+ }
241
+
242
+ /**
243
+ * Remove only small internal islands (wrapper around removeSmallIslands).
244
+ * @param {number} [maxTriangles=30]
245
+ * @returns {number}
246
+ */
247
+ removeSmallInternalIslands(maxTriangles = 30) {
248
+ return SolidMethods.removeSmallInternalIslands.apply(this, arguments);
249
+ }
250
+
251
+ /**
252
+ * Remove faces that only connect via a single shared edge chain to an opposite-facing neighbor.
253
+ * @param {object} [options]
254
+ * @param {number} [options.normalDotThreshold=-0.95] dot-product threshold for opposite normals
255
+ * @returns {number} triangles removed
256
+ */
257
+ removeOppositeSingleEdgeFaces({ normalDotThreshold = -0.95 } = {}) {
258
+ return SolidMethods.removeOppositeSingleEdgeFaces.apply(this, arguments);
259
+ }
260
+
261
+ /**
262
+ * Mirror the solid across a plane defined by a point and a normal, returning a new Solid.
263
+ * @param {number[]|THREE.Vector3} point
264
+ * @param {number[]|THREE.Vector3} normal
265
+ * @returns {Solid}
266
+ */
267
+ mirrorAcrossPlane(point, normal) {
268
+ return SolidMethods.mirrorAcrossPlane.apply(this, arguments);
269
+ }
270
+
271
+ /**
272
+ * Push a named face along its outward normal by the given distance.
273
+ * @param {string} faceName
274
+ * @param {number} distance
275
+ * @returns {Solid}
276
+ */
277
+ pushFace(faceName, distance) {
278
+ return SolidMethods.pushFace.apply(this, arguments);
279
+ }
280
+
281
+ /**
282
+ * Remove tiny boundary-adjacent triangles via edge flips under an area threshold.
283
+ * @param {number} areaThreshold
284
+ * @param {number} [maxIterations=1]
285
+ * @returns {number} flips applied
286
+ */
287
+ removeTinyBoundaryTriangles(areaThreshold, maxIterations = 1) {
288
+ return SolidMethods.removeTinyBoundaryTriangles.apply(this, arguments);
289
+ }
290
+
291
+ /**
292
+ * Collapse triangles whose shortest edge is below a threshold and clean up the mesh.
293
+ * @param {number} lengthThreshold
294
+ * @returns {number} edge collapses performed
295
+ */
296
+ collapseTinyTriangles(lengthThreshold) {
297
+ return SolidMethods.collapseTinyTriangles.apply(this, arguments);
298
+ }
299
+
300
+ /**
301
+ * Flip all triangle windings to invert normals and rebuild the manifold.
302
+ * @returns {Solid}
303
+ */
304
+ invertNormals() {
305
+ return SolidMethods.invertNormals.apply(this, arguments);
306
+ }
307
+
308
+ /**
309
+ * Fix triangle winding coherency across shared edges.
310
+ * @returns {Solid}
311
+ */
312
+ fixTriangleWindingsByAdjacency() {
313
+ return SolidMethods.fixTriangleWindingsByAdjacency.apply(this, arguments);
314
+ }
315
+
316
+ /**
317
+ * Check whether the authored mesh is a coherently oriented manifold.
318
+ * @returns {boolean}
319
+ */
320
+ _isCoherentlyOrientedManifold() {
321
+ return SolidMethods._isCoherentlyOrientedManifold.apply(this, arguments);
322
+ }
323
+
324
+ /**
325
+ * Set vertex weld epsilon (<=0 disables) and optionally weld existing vertices.
326
+ * @param {number} [epsilon=0]
327
+ * @returns {Solid}
328
+ */
329
+ setEpsilon(epsilon = 0) {
330
+ return SolidMethods.setEpsilon.apply(this, arguments);
331
+ }
332
+
333
+ /**
334
+ * Create a lightweight clone of this Solid (copies geometry, labels, metadata, aux edges).
335
+ * @returns {Solid}
336
+ */
337
+ clone() {
338
+ return SolidMethods.clone.apply(this, arguments);
339
+ }
340
+
341
+ /**
342
+ * Internal: weld vertices within epsilon using grid hashing and drop degenerates.
343
+ * @param {number} eps
344
+ * @returns {Solid}
345
+ */
346
+ _weldVerticesByEpsilon(eps) {
347
+ return SolidMethods._weldVerticesByEpsilon.apply(this, arguments);
348
+ }
349
+
350
+ /**
351
+ * Build (or reuse) the cached Manifold from authored arrays, fixing winding/orientation first.
352
+ * @returns {import('./SolidShared.js').Manifold}
353
+ */
354
+ _manifoldize() {
355
+ return SolidMethods._manifoldize.apply(this, arguments);
356
+ }
357
+
358
+ /**
359
+ * Get a fresh MeshGL snapshot (`vertProperties`, `triVerts`, `faceID`) from the manifold.
360
+ * @returns {import('./SolidShared.js').ManifoldMesh}
361
+ */
362
+ getMesh() {
363
+ return SolidMethods.getMesh.apply(this, arguments);
364
+ }
365
+
366
+ /**
367
+ * Dispose the cached Manifold to free wasm memory and mark the solid dirty.
368
+ * @returns {Solid}
369
+ */
370
+ free() {
371
+ return SolidMethods.free.apply(this, arguments);
372
+ }
373
+
374
+ /**
375
+ * Offset all vertices of a named face along its average normal by a distance.
376
+ * @param {string} faceName
377
+ * @param {number} distance
378
+ * @returns {Solid}
379
+ */
380
+ offsetFace(faceName, distance) {
381
+ return SolidMethods.offsetFace.apply(this, arguments);
382
+ }
383
+
384
+ /**
385
+ * Internal: build faceID -> triangle index cache if missing.
386
+ * @returns {void}
387
+ */
388
+ _ensureFaceIndex() {
389
+ return SolidMethods._ensureFaceIndex.apply(this, arguments);
390
+ }
391
+
392
+ /**
393
+ * Get triangles belonging to a face label with positions and indices.
394
+ * @param {string} name
395
+ * @returns {Array<{faceName:string,indices:number[],p1:number[],p2:number[],p3:number[]}>}
396
+ */
397
+ getFace(name) {
398
+ return SolidMethods.getFace.apply(this, arguments);
399
+ }
400
+
401
+ /**
402
+ * List all face labels present on this solid.
403
+ * @returns {string[]}
404
+ */
405
+ getFaceNames() {
406
+ return SolidMethods.getFaceNames.apply(this, arguments);
407
+ }
408
+
409
+ /**
410
+ * Generate an ASCII STL string for the current manifold mesh.
411
+ * @param {string} [name='solid']
412
+ * @param {number} [precision=6]
413
+ * @returns {string}
414
+ */
415
+ toSTL(name = "solid", precision = 6) {
416
+ return SolidMethods.toSTL.apply(this, arguments);
417
+ }
418
+
419
+ /**
420
+ * Write an ASCII STL file to disk (Node.js only).
421
+ * @param {string} filePath
422
+ * @param {string} [name='solid']
423
+ * @param {number} [precision=6]
424
+ * @returns {Promise<string>} resolves with file path
425
+ */
426
+ async writeSTL(filePath, name = "solid", precision = 6) {
427
+ return SolidMethods.writeSTL.apply(this, arguments);
428
+ }
429
+
430
+ /**
431
+ * Generate a triangulated STEP string for this solid.
432
+ * @param {string} [name=this.name||'part']
433
+ * @param {{unit?: string, precision?: number, scale?: number, applyWorldTransform?: boolean}} [options]
434
+ * @returns {string}
435
+ */
436
+ toSTEP(name = undefined, options = {}) {
437
+ return SolidMethods.toSTEP.apply(this, arguments);
438
+ }
439
+
440
+ /**
441
+ * Write a triangulated STEP file to disk (Node.js only).
442
+ * @param {string} filePath
443
+ * @param {string} [name=this.name||'part']
444
+ * @param {{unit?: string, precision?: number, scale?: number, applyWorldTransform?: boolean}} [options]
445
+ * @returns {Promise<string>} resolves with file path
446
+ */
447
+ async writeSTEP(filePath, name = undefined, options = {}) {
448
+ return SolidMethods.writeSTEP.apply(this, arguments);
449
+ }
450
+
451
+ /**
452
+ * Enumerate faces with their triangles; optionally include empty labels.
453
+ * @param {boolean} [includeEmpty=false]
454
+ * @returns {Array<{faceName:string,triangles:any[]}>}
455
+ */
456
+ getFaces(includeEmpty = false) {
457
+ return SolidMethods.getFaces.apply(this, arguments);
458
+ }
459
+
460
+ /**
461
+ * Build per-face meshes and boundary edges as children for visualization.
462
+ * @param {object} [options]
463
+ * @param {boolean} [options.showEdges=true] include boundary edge polylines
464
+ * @param {boolean} [options.forceAuthoring=false] force authoring arrays instead of manifold mesh
465
+ * @param {boolean} [options.authoringOnly=false] skip manifold path entirely (fallback visualization)
466
+ * @returns {void}
467
+ */
468
+ visualize(options = {}) {
469
+ return SolidMethods.visualize.apply(this, arguments);
470
+ }
471
+
472
+ /**
473
+ * Extract boundary polylines between differing face labels from the current mesh.
474
+ * @returns {Array<{name:string,faceA:string,faceB:string,positions:number[][],indices:number[]}>}
475
+ */
476
+ getBoundaryEdgePolylines() {
477
+ return SolidMethods.getBoundaryEdgePolylines.apply(this, arguments);
478
+ }
479
+
480
+ /**
481
+ * Internal: merge face ID -> name maps from two solids (used during booleans).
482
+ * @param {Solid} other
483
+ * @returns {Map<number,string>}
484
+ */
485
+ _combineIdMaps(other) {
486
+ return SolidMethods._combineIdMaps.apply(this, arguments);
487
+ }
488
+
489
+ /**
490
+ * Internal: merge face metadata maps from two solids.
491
+ * @param {Solid} other
492
+ * @returns {Map<string,object>}
493
+ */
494
+ _combineFaceMetadata(other) {
495
+ return SolidMethods._combineFaceMetadata.apply(this, arguments);
496
+ }
497
+
498
+ /**
499
+ * Static helper: expand face IDs from a MeshGL into a JS array (or zeros when absent).
500
+ * @param {import('./SolidShared.js').ManifoldMesh} mesh
501
+ * @returns {number[]}
502
+ */
503
+ static _expandTriIDsFromMesh(mesh) {
504
+ return SolidMethods._expandTriIDsFromMeshStatic.apply(this, arguments);
505
+ }
506
+
507
+ /**
508
+ * Static helper: build a Solid from an existing Manifold and ID -> face-name map.
509
+ * @param {import('./SolidShared.js').Manifold} manifoldObj
510
+ * @param {Map<number,string>} idToFaceName
511
+ * @returns {Solid}
512
+ */
513
+ static _fromManifold(manifoldObj, idToFaceName) {
514
+ return SolidMethods._fromManifoldStatic.apply(this, arguments);
515
+ }
516
+
517
+ /**
518
+ * Boolean union with another solid; merges face labels, metadata, and aux edges.
519
+ * @param {Solid} other
520
+ * @returns {Solid}
521
+ */
522
+ union(other) {
523
+ return SolidMethods.union.apply(this, arguments);
524
+ }
525
+
526
+ /**
527
+ * Boolean subtraction (this minus other); merges face labels, metadata, and aux edges.
528
+ * @param {Solid} other
529
+ * @returns {Solid}
530
+ */
531
+ subtract(other) {
532
+ return SolidMethods.subtract.apply(this, arguments);
533
+ }
534
+
535
+ /**
536
+ * Boolean intersection with another solid; merges face labels, metadata, and aux edges.
537
+ * @param {Solid} other
538
+ * @returns {Solid}
539
+ */
540
+ intersect(other) {
541
+ return SolidMethods.intersect.apply(this, arguments);
542
+ }
543
+
544
+ /**
545
+ * Boolean difference alias using Manifold.difference (same as subtract).
546
+ * @param {Solid} other
547
+ * @returns {Solid}
548
+ */
549
+ difference(other) {
550
+ return SolidMethods.difference.apply(this, arguments);
551
+ }
552
+
553
+ /**
554
+ * Simplify the manifold (optionally with tolerance and in-place update).
555
+ * @param {number} [tolerance]
556
+ * @param {boolean} [updateInPlace] when true, mutate this solid instead of returning a clone
557
+ * @returns {Solid}
558
+ */
559
+ simplify(tolerance = undefined) {
560
+ return SolidMethods.simplify.apply(this, arguments);
561
+ }
562
+
563
+ /**
564
+ * Rebuild with Manifold tolerance applied, returning a new Solid.
565
+ * @param {number} tolerance
566
+ * @returns {Solid}
567
+ */
568
+ setTolerance(tolerance) {
569
+ return SolidMethods.setTolerance.apply(this, arguments);
570
+ }
571
+
572
+ /**
573
+ * Compute volume from the current manifold mesh.
574
+ * @returns {number}
575
+ */
576
+ volume() {
577
+ return SolidMethods.volume.apply(this, arguments);
578
+ }
579
+
580
+ /**
581
+ * Compute total surface area from the current manifold mesh.
582
+ * @returns {number}
583
+ */
584
+ surfaceArea() {
585
+ return SolidMethods.surfaceArea.apply(this, arguments);
586
+ }
587
+
588
+ /**
589
+ * Count triangles in the current manifold mesh.
590
+ * @returns {number}
591
+ */
592
+ getTriangleCount() {
593
+ return SolidMethods.getTriangleCount.apply(this, arguments);
594
+ }
595
+
596
+ /**
597
+ * Split self-intersecting triangle pairs conservatively while preserving face IDs.
598
+ * @param {boolean} [diagnostics=false]
599
+ * @returns {number} splits applied
600
+ */
601
+ splitSelfIntersectingTriangles() {
602
+ return SolidMethods.splitSelfIntersectingTriangles.apply(this, arguments);
603
+ }
604
+
605
+ /**
606
+ * Remove triangles with duplicate or collinear vertices.
607
+ * @returns {number} triangles removed
608
+ */
609
+ removeDegenerateTriangles() {
610
+ return SolidMethods.removeDegenerateTriangles.apply(this, arguments);
611
+ }
612
+
613
+ /**
614
+ * Rebuild authoring arrays from the manifold’s exterior surface, dropping internal faces.
615
+ * @returns {number} triangles removed
616
+ */
617
+ removeInternalTriangles() {
618
+ return SolidMethods.removeInternalTriangles.apply(this, arguments);
619
+ }
620
+
621
+ /**
622
+ * Remove internal triangles via centroid ray tests without needing manifoldization.
623
+ * @returns {number} triangles removed
624
+ */
625
+ removeInternalTrianglesByRaycast() {
626
+ return SolidMethods.removeInternalTrianglesByRaycast.apply(this, arguments);
627
+ }
628
+
629
+ /**
630
+ * Remove internal triangles using solid-angle (winding number) classification.
631
+ * @param {object} [options]
632
+ * @param {number} [options.offsetScale=1e-5] centroid offset scale relative to the model diagonal
633
+ * @param {number} [options.crossingTolerance=0.05] tolerance for inside/outside crossing detection
634
+ * @returns {number} triangles removed
635
+ */
636
+ removeInternalTrianglesByWinding(options = {}) {
637
+ return SolidMethods.removeInternalTrianglesByWinding.apply(this, [options]);
638
+ }
639
+
640
+ /**
641
+ * Reassign tiny disconnected islands within the same face label to the
642
+ * largest adjacent face by surface area.
643
+ * @param {number} size area threshold
644
+ * @returns {number} triangles reassigned
645
+ */
646
+ cleanupTinyFaceIslands(size) {
647
+ return SolidMethods.cleanupTinyFaceIslands.apply(this, arguments);
648
+ }
649
+
650
+ /**
651
+ * Merge faces smaller than the given area into their largest neighbor.
652
+ * @param {number} [maxArea=0.001] area threshold
653
+ * @returns {this}
654
+ */
655
+ mergeTinyFaces(maxArea = 0.001) {
656
+ return SolidMethods.mergeTinyFaces.apply(this, arguments);
657
+ }
658
+
659
+ /**
660
+ * Apply chamfers to named edges and return the booleaned result (async).
661
+ * @param {object} [options]
662
+ * @param {number} options.distance chamfer distance (required, > 0)
663
+ * @param {string[]} [options.edgeNames] edge labels to chamfer
664
+ * @param {any[]} [options.edges] pre-resolved Edge objects on this solid
665
+ * @param {'INSET'|'OUTSET'|string} [options.direction='INSET'] subtract vs union behavior
666
+ * @param {number} [options.inflate=0.1] tool inflation (negated for OUTSET)
667
+ * @param {boolean} [options.debug=false] enable builder debug aids
668
+ * @param {string} [options.featureID='CHAMFER'] name prefix for generated solids
669
+ * @param {number} [options.sampleCount] optional sampling override for chamfer strip
670
+ * @param {boolean} [options.snapSeamToEdge] force seam to snap to edge
671
+ * @param {number} [options.sideStripSubdiv] side-strip subdivisions
672
+ * @param {number} [options.seamInsetScale] inset scale for seam
673
+ * @param {boolean} [options.flipSide] flip side selection
674
+ * @param {number} [options.debugStride] sampling stride for debug output
675
+ * @returns {Promise<Solid>}
676
+ */
677
+ chamfer(options = {}) {
678
+ return SolidMethods.chamfer.apply(this, [options]);
679
+ }
680
+
681
+ /**
682
+ * Apply constant-radius fillets to named edges and return the booleaned result (async).
683
+ * @param {object} [options]
684
+ * @param {number} options.radius fillet radius (required, > 0)
685
+ * @param {string[]} [options.edgeNames] edge labels to fillet
686
+ * @param {any[]} [options.edges] pre-resolved Edge objects on this solid
687
+ * @param {'INSET'|'OUTSET'|string} [options.direction='INSET'] subtract vs union behavior
688
+ * @param {number} [options.inflate=0.1] tube inflation for cutting/union
689
+ * @param {number} [options.resolution=32] tube resolution (segments around circumference)
690
+ * @param {boolean} [options.combineEdges=false] combine connected edges that share face pairs into single paths
691
+ * @param {boolean} [options.showTangentOverlays=false] overlay tangency polylines on the helper tube for debugging/PMI
692
+ * @param {boolean} [options.debug=false] enable builder debug aids
693
+ * @param {string} [options.featureID='FILLET'] name prefix for generated solids
694
+ * @param {number} [options.cleanupTinyFaceIslandsArea=0.001] area threshold for face-island relabeling (<= 0 disables)
695
+ * @returns {Promise<Solid>}
696
+ */
697
+ fillet(options = {}) {
698
+ return SolidMethods.fillet.apply(this, [options]);
699
+ }
700
+
701
+
702
+ /**
703
+ * Getter to access current FACE children; triggers visualize() before returning them.
704
+ * @returns {Array<any>}
705
+ */
706
+ get faces(){
707
+ this.visualize();
708
+ return this.children.filter(c=>c.type==='FACE');
709
+ }
710
+ }
711
+
712
+ // Helper to include the owning feature ID in Solid profiling logs
713
+ const __solidProfilingOwnerTag = (solidInstance) => {
714
+ try {
715
+ const owner = solidInstance?.owningFeatureID ?? solidInstance?.ID ?? null;
716
+ return owner ? ` owningFeature=${owner}` : '';
717
+ } catch {
718
+ return '';
719
+ }
720
+ };
721
+
722
+ const __solidSlowMethodThresholdMs = 1000;
723
+
724
+ const __solidProfilingFormatMessage = (prefix, methodName, phase, durationMs) => {
725
+ const rounded = Math.round(durationMs);
726
+ const label = `${prefix} ${methodName}`;
727
+ switch (phase) {
728
+ case 'resolved': return `${label} resolved in ${rounded} ms`;
729
+ case 'rejected': return `${label} rejected in ${rounded} ms`;
730
+ case 'completed': return `${label} in ${rounded} ms`;
731
+ case 'threw': return `${label} threw in ${rounded} ms`;
732
+ default: return null;
733
+ }
734
+ };
735
+
736
+ const __solidProfilingLogTiming = (prefix, methodName, phase, durationMs) => {
737
+ const message = __solidProfilingFormatMessage(prefix, methodName, phase, durationMs);
738
+ if (!message) return;
739
+ if (debugMode) {
740
+ try { console.log(message); } catch { }
741
+ }
742
+ if (durationMs >= __solidSlowMethodThresholdMs) {
743
+ const slowMsg = `${message} (SLOW > ${__solidSlowMethodThresholdMs} ms)`;
744
+ try {
745
+ if (typeof console !== 'undefined') {
746
+ const warnFn = (typeof console.warn === 'function')
747
+ ? console.warn
748
+ : (typeof console.log === 'function' ? console.log : null);
749
+ if (warnFn) warnFn.call(console, slowMsg);
750
+ }
751
+ } catch { }
752
+ }
753
+ };
754
+
755
+ // --- Method-level time profiling for Solid -----------------------------------
756
+ // Wrap all prototype methods (except constructor and _manifoldize, which is
757
+ // already instrumented) to log execution time when debugMode is true, and
758
+ // always flag calls that exceed __solidSlowMethodThresholdMs.
759
+ (() => {
760
+ try {
761
+ if (Solid.__profiled) return;
762
+ Solid.__profiled = true;
763
+ const nowMs = () => (typeof performance !== 'undefined' && performance?.now ? performance.now() : Date.now());
764
+ const skip = new Set(['constructor', '_manifoldize']);
765
+ const proto = Solid.prototype;
766
+ for (const name of Object.getOwnPropertyNames(proto)) {
767
+ if (skip.has(name)) continue;
768
+ const desc = Object.getOwnPropertyDescriptor(proto, name);
769
+ if (!desc || typeof desc.value !== 'function') continue;
770
+ const fn = desc.value;
771
+ const wrapped = function (...args) {
772
+ const prefix = `[Solid${__solidProfilingOwnerTag(this)}]`;
773
+ const t0 = nowMs();
774
+ const logPhase = (phase) => {
775
+ const duration = nowMs() - t0;
776
+ __solidProfilingLogTiming(prefix, name, phase, duration);
777
+ };
778
+ try {
779
+ const ret = fn.apply(this, args);
780
+ if (ret && typeof ret.then === 'function') {
781
+ return ret.then(
782
+ (val) => { logPhase('resolved'); return val; },
783
+ (err) => { logPhase('rejected'); throw err; }
784
+ );
785
+ }
786
+ logPhase('completed');
787
+ return ret;
788
+ } catch (e) {
789
+ logPhase('threw');
790
+ throw e;
791
+ }
792
+ };
793
+ try { Object.defineProperty(wrapped, 'name', { value: name, configurable: true }); } catch { }
794
+ Object.defineProperty(proto, name, { ...desc, value: wrapped });
795
+ }
796
+ } catch { }
797
+ })();
798
+
799
+ // --- Example usage -----------------------------------------------------------
800
+ // Build a 10 x 10 x w box by triangles, naming each face.
801
+ // Then query triangles for a face and perform a boolean op.
802
+
803
+ if (import.meta && import.meta.url && typeof window === "undefined") {
804
+ // If running under Node for a quick test, you can comment this guard and log outputs.
805
+ }