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.
- package/LICENSE.md +32 -0
- package/README.md +144 -0
- package/dist-kernel/brep-kernel.js +74699 -0
- package/dist-kernel/help/CONTRIBUTING.html +248 -0
- package/dist-kernel/help/LICENSE.html +248 -0
- package/dist-kernel/help/MODELING.png +0 -0
- package/dist-kernel/help/PMI.png +0 -0
- package/dist-kernel/help/SKETCH.png +0 -0
- package/dist-kernel/help/assembly-constraints__Coincident_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Angle_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Distance_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Fixed_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Parallel_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Touch_Align_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints__angle-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__coincident-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__distance-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__fixed-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__parallel-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__solver.html +248 -0
- package/dist-kernel/help/assembly-constraints__touch-align-constraint.html +248 -0
- package/dist-kernel/help/brep-api.html +263 -0
- package/dist-kernel/help/brep-kernel.html +258 -0
- package/dist-kernel/help/brep-model.html +248 -0
- package/dist-kernel/help/cylindrical-face-radius-embedding.html +290 -0
- package/dist-kernel/help/dialog-screenshots.html +248 -0
- package/dist-kernel/help/extruded-sketch-radius-embedding.html +336 -0
- package/dist-kernel/help/features__Assembly_Component_dialog.png +0 -0
- package/dist-kernel/help/features__Boolean_dialog.png +0 -0
- package/dist-kernel/help/features__Chamfer_dialog.png +0 -0
- package/dist-kernel/help/features__Datium_dialog.png +0 -0
- package/dist-kernel/help/features__Extrude_dialog.png +0 -0
- package/dist-kernel/help/features__Fillet_dialog.png +0 -0
- package/dist-kernel/help/features__Helix_dialog.png +0 -0
- package/dist-kernel/help/features__Hole_dialog.png +0 -0
- package/dist-kernel/help/features__Image_Heightmap_Solid_dialog.png +0 -0
- package/dist-kernel/help/features__Image_to_Face_dialog.png +0 -0
- package/dist-kernel/help/features__Import_3D_Model_dialog.png +0 -0
- package/dist-kernel/help/features__Loft_dialog.png +0 -0
- package/dist-kernel/help/features__Mirror_dialog.png +0 -0
- package/dist-kernel/help/features__Offset_Shell_dialog.png +0 -0
- package/dist-kernel/help/features__Overlap_Cleanup_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_Linear_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_Radial_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_dialog.png +0 -0
- package/dist-kernel/help/features__Plane_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cone_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cube_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cylinder_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Pyramid_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Sphere_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Torus_dialog.png +0 -0
- package/dist-kernel/help/features__Remesh_dialog.png +0 -0
- package/dist-kernel/help/features__Revolve_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Contour_Flange_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Cutout_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Flange_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Tab_dialog.png +0 -0
- package/dist-kernel/help/features__Sketch_dialog.png +0 -0
- package/dist-kernel/help/features__Spline_dialog.png +0 -0
- package/dist-kernel/help/features__Sweep_dialog.png +0 -0
- package/dist-kernel/help/features__Transform_dialog.png +0 -0
- package/dist-kernel/help/features__Tube_dialog.png +0 -0
- package/dist-kernel/help/features__assembly-component.html +248 -0
- package/dist-kernel/help/features__boolean.html +248 -0
- package/dist-kernel/help/features__chamfer.html +248 -0
- package/dist-kernel/help/features__datium.html +248 -0
- package/dist-kernel/help/features__datum.html +248 -0
- package/dist-kernel/help/features__extrude.html +248 -0
- package/dist-kernel/help/features__fillet.html +248 -0
- package/dist-kernel/help/features__helix.html +248 -0
- package/dist-kernel/help/features__hole.html +248 -0
- package/dist-kernel/help/features__image-heightmap-solid.html +248 -0
- package/dist-kernel/help/features__image-to-face-2D_dialog.png +0 -0
- package/dist-kernel/help/features__image-to-face-3D_dialog.png +0 -0
- package/dist-kernel/help/features__image-to-face.html +248 -0
- package/dist-kernel/help/features__import-3d-model.html +248 -0
- package/dist-kernel/help/features__index.html +248 -0
- package/dist-kernel/help/features__loft.html +248 -0
- package/dist-kernel/help/features__mirror.html +248 -0
- package/dist-kernel/help/features__offset-shell.html +248 -0
- package/dist-kernel/help/features__pattern-linear.html +248 -0
- package/dist-kernel/help/features__pattern-radial.html +248 -0
- package/dist-kernel/help/features__pattern.html +248 -0
- package/dist-kernel/help/features__plane.html +248 -0
- package/dist-kernel/help/features__primitive-cone.html +248 -0
- package/dist-kernel/help/features__primitive-cube.html +248 -0
- package/dist-kernel/help/features__primitive-cylinder.html +248 -0
- package/dist-kernel/help/features__primitive-pyramid.html +248 -0
- package/dist-kernel/help/features__primitive-sphere.html +248 -0
- package/dist-kernel/help/features__primitive-torus.html +248 -0
- package/dist-kernel/help/features__remesh.html +248 -0
- package/dist-kernel/help/features__revolve.html +248 -0
- package/dist-kernel/help/features__sheet-metal-contour-flange.html +248 -0
- package/dist-kernel/help/features__sheet-metal-flange.html +248 -0
- package/dist-kernel/help/features__sheet-metal-tab.html +248 -0
- package/dist-kernel/help/features__sketch.html +248 -0
- package/dist-kernel/help/features__spline.html +248 -0
- package/dist-kernel/help/features__sweep.html +248 -0
- package/dist-kernel/help/features__transform.html +248 -0
- package/dist-kernel/help/features__tube.html +248 -0
- package/dist-kernel/help/file-formats.html +248 -0
- package/dist-kernel/help/getting-started.html +248 -0
- package/dist-kernel/help/highlights.html +248 -0
- package/dist-kernel/help/history-systems.html +248 -0
- package/dist-kernel/help/how-it-works.html +248 -0
- package/dist-kernel/help/index.html +862 -0
- package/dist-kernel/help/input-params-schema.html +363 -0
- package/dist-kernel/help/inspector-improvements.html +248 -0
- package/dist-kernel/help/inspector.html +248 -0
- package/dist-kernel/help/modes__modeling.html +248 -0
- package/dist-kernel/help/modes__pmi.html +248 -0
- package/dist-kernel/help/modes__sketch.html +248 -0
- package/dist-kernel/help/plugins.html +248 -0
- package/dist-kernel/help/pmi-annotations__Angle_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Explode_Body_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Hole_Callout_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Leader_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Linear_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Note_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Radial_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__angle-dimension.html +248 -0
- package/dist-kernel/help/pmi-annotations__explode-body.html +248 -0
- package/dist-kernel/help/pmi-annotations__hole-callout.html +248 -0
- package/dist-kernel/help/pmi-annotations__index.html +248 -0
- package/dist-kernel/help/pmi-annotations__leader.html +248 -0
- package/dist-kernel/help/pmi-annotations__linear-dimension.html +248 -0
- package/dist-kernel/help/pmi-annotations__note.html +248 -0
- package/dist-kernel/help/pmi-annotations__radial-dimension.html +248 -0
- package/dist-kernel/help/search-index.json +464 -0
- package/dist-kernel/help/simplified-radial-dimensions.html +298 -0
- package/dist-kernel/help/solid-methods.html +359 -0
- package/dist-kernel/help/table-of-contents.html +330 -0
- package/dist-kernel/help/ui-overview.html +248 -0
- package/dist-kernel/help/whats-new.html +248 -0
- package/package.json +54 -0
- package/src/BREP/AssemblyComponent.js +42 -0
- package/src/BREP/BREP.js +43 -0
- package/src/BREP/BetterSolid.js +805 -0
- package/src/BREP/Edge.js +103 -0
- package/src/BREP/Extrude.js +403 -0
- package/src/BREP/Face.js +187 -0
- package/src/BREP/MeshRepairer.js +634 -0
- package/src/BREP/OffsetShellSolid.js +614 -0
- package/src/BREP/PointCloudWrap.js +302 -0
- package/src/BREP/Revolve.js +345 -0
- package/src/BREP/SolidMethods/authoring.js +112 -0
- package/src/BREP/SolidMethods/booleanOps.js +230 -0
- package/src/BREP/SolidMethods/chamfer.js +122 -0
- package/src/BREP/SolidMethods/edgeResolution.js +25 -0
- package/src/BREP/SolidMethods/fillet.js +792 -0
- package/src/BREP/SolidMethods/index.js +72 -0
- package/src/BREP/SolidMethods/io.js +105 -0
- package/src/BREP/SolidMethods/lifecycle.js +103 -0
- package/src/BREP/SolidMethods/manifoldOps.js +375 -0
- package/src/BREP/SolidMethods/meshCleanup.js +2512 -0
- package/src/BREP/SolidMethods/meshQueries.js +264 -0
- package/src/BREP/SolidMethods/metadata.js +106 -0
- package/src/BREP/SolidMethods/metrics.js +51 -0
- package/src/BREP/SolidMethods/transforms.js +361 -0
- package/src/BREP/SolidMethods/visualize.js +508 -0
- package/src/BREP/SolidShared.js +26 -0
- package/src/BREP/Sweep.js +1596 -0
- package/src/BREP/Tube.js +857 -0
- package/src/BREP/Vertex.js +43 -0
- package/src/BREP/applyBooleanOperation.js +704 -0
- package/src/BREP/boundsUtils.js +48 -0
- package/src/BREP/chamfer.js +551 -0
- package/src/BREP/edgePolylineUtils.js +85 -0
- package/src/BREP/fillets/common.js +388 -0
- package/src/BREP/fillets/fillet.js +1422 -0
- package/src/BREP/fillets/filletGeometry.js +15 -0
- package/src/BREP/fillets/inset.js +389 -0
- package/src/BREP/fillets/offsetHelper.js +143 -0
- package/src/BREP/fillets/outset.js +88 -0
- package/src/BREP/helix.js +193 -0
- package/src/BREP/meshToBrep.js +234 -0
- package/src/BREP/primitives.js +279 -0
- package/src/BREP/setupManifold.js +71 -0
- package/src/BREP/threadGeometry.js +1120 -0
- package/src/BREP/triangleUtils.js +8 -0
- package/src/BREP/triangulate.js +608 -0
- package/src/FeatureRegistry.js +183 -0
- package/src/PartHistory.js +1132 -0
- package/src/UI/AccordionWidget.js +292 -0
- package/src/UI/CADmaterials.js +850 -0
- package/src/UI/EnvMonacoEditor.js +522 -0
- package/src/UI/FloatingWindow.js +396 -0
- package/src/UI/HistoryWidget.js +457 -0
- package/src/UI/MainToolbar.js +131 -0
- package/src/UI/ModelLibraryView.js +194 -0
- package/src/UI/OrthoCameraIdle.js +206 -0
- package/src/UI/PluginsWidget.js +280 -0
- package/src/UI/SceneListing.js +606 -0
- package/src/UI/SelectionFilter.js +629 -0
- package/src/UI/ViewCube.js +389 -0
- package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +329 -0
- package/src/UI/assembly/AssemblyConstraintControlsWidget.js +282 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.css +292 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.js +1373 -0
- package/src/UI/assembly/constraintFaceUtils.js +115 -0
- package/src/UI/assembly/constraintHighlightUtils.js +70 -0
- package/src/UI/assembly/constraintLabelUtils.js +31 -0
- package/src/UI/assembly/constraintPointUtils.js +64 -0
- package/src/UI/assembly/constraintSelectionUtils.js +185 -0
- package/src/UI/assembly/constraintStatusUtils.js +142 -0
- package/src/UI/componentSelectorModal.js +240 -0
- package/src/UI/controls/CombinedTransformControls.js +386 -0
- package/src/UI/dialogs.js +351 -0
- package/src/UI/expressionsManager.js +100 -0
- package/src/UI/featureDialogWidgets/booleanField.js +25 -0
- package/src/UI/featureDialogWidgets/booleanOperationField.js +97 -0
- package/src/UI/featureDialogWidgets/buttonField.js +45 -0
- package/src/UI/featureDialogWidgets/componentSelectorField.js +102 -0
- package/src/UI/featureDialogWidgets/defaultField.js +23 -0
- package/src/UI/featureDialogWidgets/fileField.js +66 -0
- package/src/UI/featureDialogWidgets/index.js +34 -0
- package/src/UI/featureDialogWidgets/numberField.js +165 -0
- package/src/UI/featureDialogWidgets/optionsField.js +33 -0
- package/src/UI/featureDialogWidgets/referenceSelectionField.js +208 -0
- package/src/UI/featureDialogWidgets/stringField.js +24 -0
- package/src/UI/featureDialogWidgets/textareaField.js +28 -0
- package/src/UI/featureDialogWidgets/threadDesignationField.js +160 -0
- package/src/UI/featureDialogWidgets/transformField.js +252 -0
- package/src/UI/featureDialogWidgets/utils.js +43 -0
- package/src/UI/featureDialogWidgets/vec3Field.js +133 -0
- package/src/UI/featureDialogs.js +1414 -0
- package/src/UI/fileManagerWidget.js +615 -0
- package/src/UI/history/HistoryCollectionWidget.js +1294 -0
- package/src/UI/history/historyCollectionWidget.css.js +257 -0
- package/src/UI/history/historyDisplayInfo.js +133 -0
- package/src/UI/mobile.js +28 -0
- package/src/UI/objectDump.js +442 -0
- package/src/UI/pmi/AnnotationCollectionWidget.js +120 -0
- package/src/UI/pmi/AnnotationHistory.js +353 -0
- package/src/UI/pmi/AnnotationRegistry.js +90 -0
- package/src/UI/pmi/BaseAnnotation.js +269 -0
- package/src/UI/pmi/LabelOverlay.css +102 -0
- package/src/UI/pmi/LabelOverlay.js +191 -0
- package/src/UI/pmi/PMIMode.js +1550 -0
- package/src/UI/pmi/PMIViewsWidget.js +1098 -0
- package/src/UI/pmi/annUtils.js +729 -0
- package/src/UI/pmi/dimensions/AngleDimensionAnnotation.js +647 -0
- package/src/UI/pmi/dimensions/ExplodeBodyAnnotation.js +507 -0
- package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +462 -0
- package/src/UI/pmi/dimensions/LeaderAnnotation.js +403 -0
- package/src/UI/pmi/dimensions/LinearDimensionAnnotation.js +532 -0
- package/src/UI/pmi/dimensions/NoteAnnotation.js +110 -0
- package/src/UI/pmi/dimensions/RadialDimensionAnnotation.js +659 -0
- package/src/UI/pmi/pmiStyle.js +44 -0
- package/src/UI/sketcher/SketchMode3D.js +4095 -0
- package/src/UI/sketcher/dimensions.js +674 -0
- package/src/UI/sketcher/glyphs.js +236 -0
- package/src/UI/sketcher/highlights.js +60 -0
- package/src/UI/toolbarButtons/aboutButton.js +5 -0
- package/src/UI/toolbarButtons/exportButton.js +609 -0
- package/src/UI/toolbarButtons/flatPatternButton.js +307 -0
- package/src/UI/toolbarButtons/importButton.js +160 -0
- package/src/UI/toolbarButtons/inspectorToggleButton.js +12 -0
- package/src/UI/toolbarButtons/metadataButton.js +1063 -0
- package/src/UI/toolbarButtons/orientToFaceButton.js +114 -0
- package/src/UI/toolbarButtons/registerDefaultButtons.js +46 -0
- package/src/UI/toolbarButtons/saveButton.js +99 -0
- package/src/UI/toolbarButtons/scriptRunnerButton.js +302 -0
- package/src/UI/toolbarButtons/testsButton.js +26 -0
- package/src/UI/toolbarButtons/undoRedoButtons.js +25 -0
- package/src/UI/toolbarButtons/wireframeToggleButton.js +5 -0
- package/src/UI/toolbarButtons/zoomToFitButton.js +5 -0
- package/src/UI/triangleDebuggerWindow.js +945 -0
- package/src/UI/viewer.js +4228 -0
- package/src/assemblyConstraints/AssemblyConstraintHistory.js +1576 -0
- package/src/assemblyConstraints/AssemblyConstraintRegistry.js +120 -0
- package/src/assemblyConstraints/BaseAssemblyConstraint.js +66 -0
- package/src/assemblyConstraints/constraintExpressionUtils.js +35 -0
- package/src/assemblyConstraints/constraintUtils/parallelAlignment.js +676 -0
- package/src/assemblyConstraints/constraints/AngleConstraint.js +485 -0
- package/src/assemblyConstraints/constraints/CoincidentConstraint.js +194 -0
- package/src/assemblyConstraints/constraints/DistanceConstraint.js +616 -0
- package/src/assemblyConstraints/constraints/FixedConstraint.js +78 -0
- package/src/assemblyConstraints/constraints/ParallelConstraint.js +252 -0
- package/src/assemblyConstraints/constraints/TouchAlignConstraint.js +961 -0
- package/src/core/entities/HistoryCollectionBase.js +72 -0
- package/src/core/entities/ListEntityBase.js +109 -0
- package/src/core/entities/schemaProcesser.js +121 -0
- package/src/exporters/sheetMetalFlatPattern.js +659 -0
- package/src/exporters/sheetMetalUnfold.js +862 -0
- package/src/exporters/step.js +1135 -0
- package/src/exporters/threeMF.js +575 -0
- package/src/features/assemblyComponent/AssemblyComponentFeature.js +780 -0
- package/src/features/boolean/BooleanFeature.js +94 -0
- package/src/features/chamfer/ChamferFeature.js +116 -0
- package/src/features/datium/DatiumFeature.js +80 -0
- package/src/features/edgeFeatureUtils.js +41 -0
- package/src/features/extrude/ExtrudeFeature.js +143 -0
- package/src/features/fillet/FilletFeature.js +197 -0
- package/src/features/helix/HelixFeature.js +405 -0
- package/src/features/hole/HoleFeature.js +1050 -0
- package/src/features/hole/screwClearance.js +86 -0
- package/src/features/hole/threadDesignationCatalog.js +149 -0
- package/src/features/imageHeightSolid/ImageHeightmapSolidFeature.js +463 -0
- package/src/features/imageToFace/ImageToFaceFeature.js +727 -0
- package/src/features/imageToFace/imageEditor.js +1270 -0
- package/src/features/imageToFace/traceUtils.js +971 -0
- package/src/features/import3dModel/Import3dModelFeature.js +151 -0
- package/src/features/loft/LoftFeature.js +605 -0
- package/src/features/mirror/MirrorFeature.js +151 -0
- package/src/features/offsetFace/OffsetFaceFeature.js +370 -0
- package/src/features/offsetShell/OffsetShellFeature.js +89 -0
- package/src/features/overlapCleanup/OverlapCleanupFeature.js +85 -0
- package/src/features/pattern/PatternFeature.js +275 -0
- package/src/features/patternLinear/PatternLinearFeature.js +120 -0
- package/src/features/patternRadial/PatternRadialFeature.js +186 -0
- package/src/features/plane/PlaneFeature.js +154 -0
- package/src/features/primitiveCone/primitiveConeFeature.js +99 -0
- package/src/features/primitiveCube/primitiveCubeFeature.js +70 -0
- package/src/features/primitiveCylinder/primitiveCylinderFeature.js +91 -0
- package/src/features/primitivePyramid/primitivePyramidFeature.js +72 -0
- package/src/features/primitiveSphere/primitiveSphereFeature.js +62 -0
- package/src/features/primitiveTorus/primitiveTorusFeature.js +109 -0
- package/src/features/remesh/RemeshFeature.js +97 -0
- package/src/features/revolve/RevolveFeature.js +111 -0
- package/src/features/selectionUtils.js +118 -0
- package/src/features/sheetMetal/SheetMetalContourFlangeFeature.js +1656 -0
- package/src/features/sheetMetal/SheetMetalCutoutFeature.js +1056 -0
- package/src/features/sheetMetal/SheetMetalFlangeFeature.js +1568 -0
- package/src/features/sheetMetal/SheetMetalHemFeature.js +43 -0
- package/src/features/sheetMetal/SheetMetalObject.js +141 -0
- package/src/features/sheetMetal/SheetMetalTabFeature.js +176 -0
- package/src/features/sheetMetal/UNFOLD_NEUTRAL_REQUIREMENTS.md +153 -0
- package/src/features/sheetMetal/contour-flange-rebuild-spec.md +261 -0
- package/src/features/sheetMetal/profileUtils.js +25 -0
- package/src/features/sheetMetal/sheetMetalCleanup.js +9 -0
- package/src/features/sheetMetal/sheetMetalFaceTypes.js +146 -0
- package/src/features/sheetMetal/sheetMetalMetadata.js +165 -0
- package/src/features/sheetMetal/sheetMetalPipeline.js +169 -0
- package/src/features/sheetMetal/sheetMetalProfileUtils.js +216 -0
- package/src/features/sheetMetal/sheetMetalTabUtils.js +29 -0
- package/src/features/sheetMetal/sheetMetalTree.js +210 -0
- package/src/features/sketch/SketchFeature.js +955 -0
- package/src/features/sketch/sketchSolver2D/ConstraintEngine.js +800 -0
- package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +704 -0
- package/src/features/sketch/sketchSolver2D/mathHelpersMod.js +307 -0
- package/src/features/spline/SplineEditorSession.js +988 -0
- package/src/features/spline/SplineFeature.js +1388 -0
- package/src/features/spline/splineUtils.js +218 -0
- package/src/features/sweep/SweepFeature.js +110 -0
- package/src/features/transform/TransformFeature.js +152 -0
- package/src/features/tube/TubeFeature.js +635 -0
- package/src/fs.proxy.js +625 -0
- package/src/idbStorage.js +254 -0
- package/src/index.js +12 -0
- package/src/main.js +15 -0
- package/src/metadataManager.js +64 -0
- package/src/path.proxy.js +277 -0
- package/src/plugins/ghLoader.worker.js +151 -0
- package/src/plugins/pluginManager.js +286 -0
- package/src/pmi/PMIViewsManager.js +134 -0
- package/src/services/componentLibrary.js +198 -0
- package/src/tests/ConsoleCapture.js +189 -0
- package/src/tests/S7-diagnostics-2025-12-23T18-37-23-570Z.json +630 -0
- package/src/tests/browserTests.js +597 -0
- package/src/tests/debugBoolean.js +225 -0
- package/src/tests/partFiles/badBoolean.json +957 -0
- package/src/tests/partFiles/extrudeTest.json +88 -0
- package/src/tests/partFiles/filletFail.json +58 -0
- package/src/tests/partFiles/import_TEst.part.part.json +646 -0
- package/src/tests/partFiles/sheetMetalHem.BREP.json +734 -0
- package/src/tests/test_boolean_subtract.js +27 -0
- package/src/tests/test_chamfer.js +17 -0
- package/src/tests/test_extrudeFace.js +24 -0
- package/src/tests/test_fillet.js +17 -0
- package/src/tests/test_fillet_nonClosed.js +45 -0
- package/src/tests/test_filletsMoreDifficult.js +46 -0
- package/src/tests/test_history_features_basic.js +149 -0
- package/src/tests/test_hole.js +282 -0
- package/src/tests/test_mirror.js +16 -0
- package/src/tests/test_offsetShellGrouping.js +85 -0
- package/src/tests/test_plane.js +4 -0
- package/src/tests/test_primitiveCone.js +11 -0
- package/src/tests/test_primitiveCube.js +7 -0
- package/src/tests/test_primitiveCylinder.js +8 -0
- package/src/tests/test_primitivePyramid.js +9 -0
- package/src/tests/test_primitiveSphere.js +17 -0
- package/src/tests/test_primitiveTorus.js +21 -0
- package/src/tests/test_pushFace.js +126 -0
- package/src/tests/test_sheetMetalContourFlange.js +125 -0
- package/src/tests/test_sheetMetal_features.js +80 -0
- package/src/tests/test_sketch_openLoop.js +45 -0
- package/src/tests/test_solidMetrics.js +58 -0
- package/src/tests/test_stlLoader.js +1889 -0
- package/src/tests/test_sweepFace.js +55 -0
- package/src/tests/test_tube.js +45 -0
- package/src/tests/test_tube_closedLoop.js +67 -0
- package/src/tests/tests.js +493 -0
- package/src/tools/assemblyConstraintDialogCapturePage.js +56 -0
- package/src/tools/dialogCapturePageFactory.js +227 -0
- package/src/tools/featureDialogCapturePage.js +47 -0
- package/src/tools/pmiAnnotationDialogCapturePage.js +60 -0
- package/src/utils/axisHelpers.js +99 -0
- package/src/utils/deepClone.js +69 -0
- package/src/utils/geometryTolerance.js +37 -0
- package/src/utils/normalizeTypeString.js +8 -0
- 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
|
+
}
|