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,154 @@
|
|
|
1
|
+
import { BREP } from "../../BREP/BREP.js";
|
|
2
|
+
const THREE = BREP.THREE;
|
|
3
|
+
import { CADmaterials } from '../../UI/CADmaterials.js';
|
|
4
|
+
|
|
5
|
+
export function createPlaneBaseMesh() {
|
|
6
|
+
const material = CADmaterials.PLANE.BASE;
|
|
7
|
+
const mesh = new THREE.Mesh(new THREE.PlaneGeometry(5, 5), material);
|
|
8
|
+
mesh.type = 'PLANE';
|
|
9
|
+
mesh.renderOrder = 1;
|
|
10
|
+
return mesh;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const inputParamsSchema = {
|
|
14
|
+
id: {
|
|
15
|
+
type: "string",
|
|
16
|
+
default_value: null,
|
|
17
|
+
hint: "unique identifier for the plane feature",
|
|
18
|
+
},
|
|
19
|
+
datum: {
|
|
20
|
+
type: "reference_selection",
|
|
21
|
+
selectionFilter: ["PLANE", "FACE"],
|
|
22
|
+
multiple: false,
|
|
23
|
+
default_value: null,
|
|
24
|
+
hint: "Optional reference plane or face",
|
|
25
|
+
|
|
26
|
+
},
|
|
27
|
+
orientation: {
|
|
28
|
+
type: "options",
|
|
29
|
+
options: ["XY", "XZ", "YZ"],
|
|
30
|
+
default_value: "XY",
|
|
31
|
+
hint: "Plane orientation",
|
|
32
|
+
},
|
|
33
|
+
offset_distance: {
|
|
34
|
+
type: "number",
|
|
35
|
+
default_value: 0,
|
|
36
|
+
hint: "Plane offset distance",
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
export class PlaneFeature {
|
|
46
|
+
static shortName = "P";
|
|
47
|
+
static longName = "Plane";
|
|
48
|
+
static inputParamsSchema = inputParamsSchema;
|
|
49
|
+
|
|
50
|
+
constructor() {
|
|
51
|
+
this.inputParams = {};
|
|
52
|
+
|
|
53
|
+
this.persistentData = {};
|
|
54
|
+
}
|
|
55
|
+
async run() {
|
|
56
|
+
const planeMesh = await this.createPlaneMesh();
|
|
57
|
+
if (!planeMesh) return { added: [], removed: [] };
|
|
58
|
+
|
|
59
|
+
const group = new THREE.Group();
|
|
60
|
+
group.renderOrder = 1;
|
|
61
|
+
const featureID = this.inputParams.featureID || null;
|
|
62
|
+
const label = planeMesh.name || featureID || 'Plane';
|
|
63
|
+
group.name = `D:${label}`;
|
|
64
|
+
group.type = 'DATUM';
|
|
65
|
+
group.add(planeMesh);
|
|
66
|
+
|
|
67
|
+
if (featureID != null) {
|
|
68
|
+
planeMesh.owningFeatureID = String(featureID);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return { added: [group], removed: [] };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async createPlaneMesh() {
|
|
75
|
+
// When sanitized, reference_selection becomes an array; treat empty as no datum
|
|
76
|
+
const datum = Array.isArray(this.inputParams.datum) ? this.inputParams.datum[0] : this.inputParams.datum;
|
|
77
|
+
const basis = datum ? this.#basisFromReference(datum) : this.#basisFromOrientation(this.inputParams.orientation);
|
|
78
|
+
if (!basis) return null;
|
|
79
|
+
|
|
80
|
+
const planeMesh = createPlaneBaseMesh();
|
|
81
|
+
|
|
82
|
+
const basisMatrix = new THREE.Matrix4().makeBasis(basis.x, basis.y, basis.z);
|
|
83
|
+
planeMesh.setRotationFromMatrix(basisMatrix);
|
|
84
|
+
planeMesh.position.copy(basis.origin);
|
|
85
|
+
|
|
86
|
+
const offset = Number(this.inputParams.offset_distance) || 0;
|
|
87
|
+
if (offset) planeMesh.position.addScaledVector(basis.z, offset);
|
|
88
|
+
|
|
89
|
+
//planeMesh.uuid = this.inputParams.featureID; // Assign the featureID to the mesh's uuid
|
|
90
|
+
planeMesh.name = this.inputParams.featureID; // Ensure selectable by name
|
|
91
|
+
return planeMesh;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#basisFromOrientation(orientation) {
|
|
95
|
+
const rotX = orientation === "XZ" ? Math.PI / 2 : 0;
|
|
96
|
+
const rotY = orientation === "YZ" ? Math.PI / 2 : 0;
|
|
97
|
+
const rot = new THREE.Euler(rotX, rotY, 0);
|
|
98
|
+
const origin = new THREE.Vector3(0, 0, 0);
|
|
99
|
+
const x = new THREE.Vector3(1, 0, 0).applyEuler(rot).normalize();
|
|
100
|
+
const y = new THREE.Vector3(0, 1, 0).applyEuler(rot).normalize();
|
|
101
|
+
const z = new THREE.Vector3(0, 0, 1).applyEuler(rot).normalize();
|
|
102
|
+
return { origin, x, y, z };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
#basisFromReference(refObj) {
|
|
106
|
+
if (!refObj) return null;
|
|
107
|
+
const origin = new THREE.Vector3();
|
|
108
|
+
try { refObj.updateWorldMatrix(true, true); } catch { }
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const g = refObj.geometry;
|
|
112
|
+
if (g) {
|
|
113
|
+
const bs = g.boundingSphere || (g.computeBoundingSphere(), g.boundingSphere);
|
|
114
|
+
if (bs) origin.copy(refObj.localToWorld(bs.center.clone()));
|
|
115
|
+
else origin.copy(refObj.getWorldPosition(new THREE.Vector3()));
|
|
116
|
+
} else {
|
|
117
|
+
origin.copy(refObj.getWorldPosition(new THREE.Vector3()));
|
|
118
|
+
}
|
|
119
|
+
} catch {
|
|
120
|
+
origin.copy(refObj.getWorldPosition(new THREE.Vector3()));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (refObj.type === 'FACE') {
|
|
124
|
+
let n = null;
|
|
125
|
+
try {
|
|
126
|
+
if (typeof refObj.getAverageNormal === 'function') n = refObj.getAverageNormal().clone();
|
|
127
|
+
} catch { n = null; }
|
|
128
|
+
if (!n || n.lengthSq() < 1e-12) {
|
|
129
|
+
const q = new THREE.Quaternion();
|
|
130
|
+
try { refObj.getWorldQuaternion(q); } catch { }
|
|
131
|
+
n = new THREE.Vector3(0, 0, 1).applyQuaternion(q);
|
|
132
|
+
}
|
|
133
|
+
n.normalize();
|
|
134
|
+
|
|
135
|
+
const worldUp = new THREE.Vector3(0, 1, 0);
|
|
136
|
+
const refUp = Math.abs(n.dot(worldUp)) > 0.9 ? new THREE.Vector3(1, 0, 0) : worldUp;
|
|
137
|
+
const x = new THREE.Vector3().crossVectors(refUp, n).normalize();
|
|
138
|
+
const y = new THREE.Vector3().crossVectors(n, x).normalize();
|
|
139
|
+
return { origin, x, y, z: n };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const q = new THREE.Quaternion();
|
|
144
|
+
refObj.getWorldQuaternion(q);
|
|
145
|
+
const x = new THREE.Vector3(1, 0, 0).applyQuaternion(q).normalize();
|
|
146
|
+
const y = new THREE.Vector3(0, 1, 0).applyQuaternion(q).normalize();
|
|
147
|
+
const z = new THREE.Vector3(0, 0, 1).applyQuaternion(q).normalize();
|
|
148
|
+
return { origin, x, y, z };
|
|
149
|
+
} catch {
|
|
150
|
+
return this.#basisFromOrientation(this.inputParams.orientation);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// primitiveConeFeature.js
|
|
2
|
+
// Creates a primitive cone/frustum as separate meshes per surface: lateral (side) and caps.
|
|
3
|
+
// Aligned along the Y axis with base at y=0 and top at y=height (not centered).
|
|
4
|
+
|
|
5
|
+
import { BREP } from '../../BREP/BREP.js'
|
|
6
|
+
// no extra imports needed for centerline metadata
|
|
7
|
+
|
|
8
|
+
const inputParamsSchema = {
|
|
9
|
+
id: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
default_value: null,
|
|
12
|
+
hint: 'Unique identifier for the feature'
|
|
13
|
+
},
|
|
14
|
+
radiusTop: {
|
|
15
|
+
type: 'number',
|
|
16
|
+
default_value: 5,
|
|
17
|
+
hint: 'Top radius of the cone (tip if 0)'
|
|
18
|
+
},
|
|
19
|
+
radiusBottom: {
|
|
20
|
+
type: 'number',
|
|
21
|
+
default_value: 10,
|
|
22
|
+
hint: 'Base radius of the cone'
|
|
23
|
+
},
|
|
24
|
+
height: {
|
|
25
|
+
type: 'number',
|
|
26
|
+
default_value: 10,
|
|
27
|
+
hint: 'Height of the cone along Y-axis'
|
|
28
|
+
},
|
|
29
|
+
resolution: {
|
|
30
|
+
type: 'number',
|
|
31
|
+
default_value: 32,
|
|
32
|
+
hint: 'Number of segments around the circumference'
|
|
33
|
+
},
|
|
34
|
+
transform: {
|
|
35
|
+
type: 'transform',
|
|
36
|
+
default_value: { position: [0, 0, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1] },
|
|
37
|
+
hint: 'Position, rotation, and scale'
|
|
38
|
+
},
|
|
39
|
+
boolean: {
|
|
40
|
+
type: 'boolean_operation',
|
|
41
|
+
default_value: { targets: [], operation: 'NONE' },
|
|
42
|
+
hint: 'Optional boolean operation with selected solids'
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export class PrimitiveConeFeature {
|
|
47
|
+
static shortName = "P.CO";
|
|
48
|
+
static longName = "Primitive Cone";
|
|
49
|
+
static inputParamsSchema = inputParamsSchema;
|
|
50
|
+
|
|
51
|
+
constructor() {
|
|
52
|
+
this.inputParams = {};
|
|
53
|
+
this.persistentData = {};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async run(partHistory) {
|
|
57
|
+
const { radiusTop, radiusBottom, height, resolution } = this.inputParams;
|
|
58
|
+
|
|
59
|
+
const cone = await new BREP.Cone({
|
|
60
|
+
r1: radiusTop,
|
|
61
|
+
r2: radiusBottom,
|
|
62
|
+
h: height,
|
|
63
|
+
resolution,
|
|
64
|
+
name: this.inputParams.featureID
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
if (this.inputParams.transform) {
|
|
68
|
+
cone.bakeTRS(this.inputParams.transform);
|
|
69
|
+
}
|
|
70
|
+
} catch (_) { }
|
|
71
|
+
|
|
72
|
+
// Add a world-space centerline along Y from base to top and store on the solid
|
|
73
|
+
const THREE = BREP.THREE;
|
|
74
|
+
try {
|
|
75
|
+
const p = Array.isArray(this.inputParams?.transform?.position) ? this.inputParams.transform.position : [0, 0, 0];
|
|
76
|
+
const r = Array.isArray(this.inputParams?.transform?.rotationEuler) ? this.inputParams.transform.rotationEuler : [0, 0, 0];
|
|
77
|
+
const s = Array.isArray(this.inputParams?.transform?.scale) ? this.inputParams.transform.scale : [1, 1, 1];
|
|
78
|
+
const pos = new THREE.Vector3(p[0] || 0, p[1] || 0, p[2] || 0);
|
|
79
|
+
const eul = new THREE.Euler(
|
|
80
|
+
THREE.MathUtils.degToRad(r[0] || 0),
|
|
81
|
+
THREE.MathUtils.degToRad(r[1] || 0),
|
|
82
|
+
THREE.MathUtils.degToRad(r[2] || 0),
|
|
83
|
+
'XYZ'
|
|
84
|
+
);
|
|
85
|
+
const quat = new THREE.Quaternion().setFromEuler(eul);
|
|
86
|
+
const scl = new THREE.Vector3(s[0] || 1, s[1] || 1, s[2] || 1);
|
|
87
|
+
const M = new THREE.Matrix4().compose(pos, quat, scl);
|
|
88
|
+
const a0 = new THREE.Vector3(0, 0, 0).applyMatrix4(M);
|
|
89
|
+
const a1 = new THREE.Vector3(0, Number(height) || 0, 0).applyMatrix4(M);
|
|
90
|
+
if (a0.distanceToSquared(a1) >= 1e-16) {
|
|
91
|
+
const featureID = this.inputParams.featureID;
|
|
92
|
+
cone.addCenterline([a0.x, a0.y, a0.z], [a1.x, a1.y, a1.z], (featureID ? `${featureID}_AXIS` : 'AXIS'), { materialKey: 'OVERLAY' });
|
|
93
|
+
}
|
|
94
|
+
} catch (_) { }
|
|
95
|
+
|
|
96
|
+
cone.visualize();
|
|
97
|
+
return await BREP.applyBooleanOperation(partHistory || {}, cone, this.inputParams.boolean, this.inputParams.featureID);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// primitiveCubeFeature.js
|
|
2
|
+
// Creates a primitive axis-aligned rectangular prism (cube) composed of six Face objects.
|
|
3
|
+
// Positioned with its minimum corner at the origin (0,0,0). Dimensions extend +sizeX, +sizeY, +sizeZ along X/Y/Z.
|
|
4
|
+
|
|
5
|
+
import { BREP } from '../../BREP/BREP.js'
|
|
6
|
+
|
|
7
|
+
const inputParamsSchema = {
|
|
8
|
+
id: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
default_value: null,
|
|
11
|
+
hint: 'Unique identifier for the feature'
|
|
12
|
+
},
|
|
13
|
+
sizeX: {
|
|
14
|
+
type: 'number',
|
|
15
|
+
default_value: 10,
|
|
16
|
+
hint: 'Width along X'
|
|
17
|
+
},
|
|
18
|
+
sizeY: {
|
|
19
|
+
type: 'number',
|
|
20
|
+
default_value: 10,
|
|
21
|
+
hint: 'Height along Y'
|
|
22
|
+
},
|
|
23
|
+
sizeZ: {
|
|
24
|
+
type: 'number',
|
|
25
|
+
default_value: 10,
|
|
26
|
+
hint: 'Depth along Z'
|
|
27
|
+
},
|
|
28
|
+
transform: {
|
|
29
|
+
type: 'transform',
|
|
30
|
+
default_value: { position: [0, 0, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1] },
|
|
31
|
+
hint: 'Position, rotation, and scale'
|
|
32
|
+
},
|
|
33
|
+
boolean: {
|
|
34
|
+
type: 'boolean_operation',
|
|
35
|
+
default_value: { targets: [], operation: 'NONE' },
|
|
36
|
+
hint: 'Optional boolean operation with selected solids'
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export class PrimitiveCubeFeature {
|
|
41
|
+
static shortName = "P.CU";
|
|
42
|
+
static longName = "Primitive Cube";
|
|
43
|
+
static inputParamsSchema = inputParamsSchema;
|
|
44
|
+
|
|
45
|
+
constructor() {
|
|
46
|
+
this.inputParams = {};
|
|
47
|
+
this.persistentData = {};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async run(partHistory) {
|
|
51
|
+
const { sizeX, sizeY, sizeZ, featureID } = this.inputParams;
|
|
52
|
+
|
|
53
|
+
const cube = await new BREP.Cube({
|
|
54
|
+
x: sizeX,
|
|
55
|
+
y: sizeY,
|
|
56
|
+
z: sizeZ,
|
|
57
|
+
name: featureID,
|
|
58
|
+
});
|
|
59
|
+
// Apply transform before visualization so it bakes into geometry arrays
|
|
60
|
+
try {
|
|
61
|
+
if (this.inputParams.transform) {
|
|
62
|
+
cube.bakeTRS(this.inputParams.transform);
|
|
63
|
+
}
|
|
64
|
+
} catch (_) { alert("Error applying transform"); }
|
|
65
|
+
cube.visualize();
|
|
66
|
+
|
|
67
|
+
// Apply optional boolean operation
|
|
68
|
+
return await BREP.applyBooleanOperation(partHistory || {}, cube, this.inputParams.boolean, featureID);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// primitiveCylinderFeature.js
|
|
2
|
+
// Creates a primitive cylinder as separate faces: lateral (side) and two caps.
|
|
3
|
+
// Aligned along the Y axis with base at y=0 and top at y=height (not centered).
|
|
4
|
+
|
|
5
|
+
import { BREP } from '../../BREP/BREP.js'
|
|
6
|
+
// no extra imports needed for centerline metadata
|
|
7
|
+
|
|
8
|
+
const inputParamsSchema = {
|
|
9
|
+
id: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
default_value: null,
|
|
12
|
+
hint: 'Unique identifier for the feature'
|
|
13
|
+
},
|
|
14
|
+
radius: {
|
|
15
|
+
type: 'number',
|
|
16
|
+
default_value: 5,
|
|
17
|
+
hint: 'Radius of the cylinder'
|
|
18
|
+
},
|
|
19
|
+
height: {
|
|
20
|
+
type: 'number',
|
|
21
|
+
default_value: 10,
|
|
22
|
+
hint: 'Height of the cylinder along Y-axis'
|
|
23
|
+
},
|
|
24
|
+
resolution: {
|
|
25
|
+
type: 'number',
|
|
26
|
+
default_value: 64,
|
|
27
|
+
hint: 'Number of segments around the circumference'
|
|
28
|
+
},
|
|
29
|
+
transform: {
|
|
30
|
+
type: 'transform',
|
|
31
|
+
default_value: { position: [0, 0, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1] },
|
|
32
|
+
hint: 'Position, rotation, and scale'
|
|
33
|
+
},
|
|
34
|
+
boolean: {
|
|
35
|
+
type: 'boolean_operation',
|
|
36
|
+
default_value: { targets: [], operation: 'NONE' },
|
|
37
|
+
hint: 'Optional boolean operation with selected solids'
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export class PrimitiveCylinderFeature {
|
|
42
|
+
static shortName = "P.CY";
|
|
43
|
+
static longName = "Primitive Cylinder";
|
|
44
|
+
static inputParamsSchema = inputParamsSchema;
|
|
45
|
+
|
|
46
|
+
constructor() {
|
|
47
|
+
this.inputParams = {};
|
|
48
|
+
this.persistentData = {};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async run(partHistory) {
|
|
52
|
+
const { radius, height, resolution, featureID } = this.inputParams;
|
|
53
|
+
|
|
54
|
+
const cyl = await new BREP.Cylinder({
|
|
55
|
+
radius,
|
|
56
|
+
height,
|
|
57
|
+
resolution,
|
|
58
|
+
name: featureID,
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
if (this.inputParams.transform) {
|
|
62
|
+
cyl.bakeTRS(this.inputParams.transform);
|
|
63
|
+
}
|
|
64
|
+
} catch (_) { }
|
|
65
|
+
// Build world-space centerline along cylinder axis and store on the solid.
|
|
66
|
+
const THREE = BREP.THREE;
|
|
67
|
+
try {
|
|
68
|
+
const p = Array.isArray(this.inputParams?.transform?.position) ? this.inputParams.transform.position : [0, 0, 0];
|
|
69
|
+
const r = Array.isArray(this.inputParams?.transform?.rotationEuler) ? this.inputParams.transform.rotationEuler : [0, 0, 0];
|
|
70
|
+
const s = Array.isArray(this.inputParams?.transform?.scale) ? this.inputParams.transform.scale : [1, 1, 1];
|
|
71
|
+
const pos = new THREE.Vector3(p[0] || 0, p[1] || 0, p[2] || 0);
|
|
72
|
+
const eul = new THREE.Euler(
|
|
73
|
+
THREE.MathUtils.degToRad(r[0] || 0),
|
|
74
|
+
THREE.MathUtils.degToRad(r[1] || 0),
|
|
75
|
+
THREE.MathUtils.degToRad(r[2] || 0),
|
|
76
|
+
'XYZ'
|
|
77
|
+
);
|
|
78
|
+
const quat = new THREE.Quaternion().setFromEuler(eul);
|
|
79
|
+
const scl = new THREE.Vector3(s[0] || 1, s[1] || 1, s[2] || 1);
|
|
80
|
+
const M = new THREE.Matrix4().compose(pos, quat, scl);
|
|
81
|
+
const a0 = new THREE.Vector3(0, 0, 0).applyMatrix4(M);
|
|
82
|
+
const a1 = new THREE.Vector3(0, Number(height) || 0, 0).applyMatrix4(M);
|
|
83
|
+
if (a0.distanceToSquared(a1) >= 1e-16) {
|
|
84
|
+
cyl.addCenterline([a0.x, a0.y, a0.z], [a1.x, a1.y, a1.z], (featureID ? `${featureID}_AXIS` : 'AXIS'), { materialKey: 'OVERLAY' });
|
|
85
|
+
}
|
|
86
|
+
} catch (_) { }
|
|
87
|
+
|
|
88
|
+
cyl.visualize();
|
|
89
|
+
return await BREP.applyBooleanOperation(partHistory || {}, cyl, this.inputParams.boolean, featureID);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// primitivePyramidFeature.js
|
|
2
|
+
// Creates a primitive right pyramid as a Solid composed of Face objects:
|
|
3
|
+
// - One triangular Face per lateral side
|
|
4
|
+
// - One polygonal base Face (triangulated fan, combined into a single geometry)
|
|
5
|
+
// Aligned along the Y axis, centered at the origin,
|
|
6
|
+
// with the apex at +height/2 and the base plane at -height/2.
|
|
7
|
+
|
|
8
|
+
import { BREP } from '../../BREP/BREP.js'
|
|
9
|
+
|
|
10
|
+
const inputParamsSchema = {
|
|
11
|
+
id: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
default_value: null,
|
|
14
|
+
hint: 'Unique identifier for the feature'
|
|
15
|
+
},
|
|
16
|
+
baseSideLength: {
|
|
17
|
+
type: 'number',
|
|
18
|
+
default_value: 10,
|
|
19
|
+
hint: 'Side length of the regular base polygon'
|
|
20
|
+
},
|
|
21
|
+
sides: {
|
|
22
|
+
type: 'number',
|
|
23
|
+
default_value: 4,
|
|
24
|
+
hint: 'Number of sides for the base polygon (min 3)'
|
|
25
|
+
},
|
|
26
|
+
height: {
|
|
27
|
+
type: 'number',
|
|
28
|
+
default_value: 10,
|
|
29
|
+
hint: 'Height of the pyramid along Y-axis'
|
|
30
|
+
},
|
|
31
|
+
transform: {
|
|
32
|
+
type: 'transform',
|
|
33
|
+
default_value: { position: [0, 0, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1] },
|
|
34
|
+
hint: 'Position, rotation, and scale'
|
|
35
|
+
},
|
|
36
|
+
boolean: {
|
|
37
|
+
type: 'boolean_operation',
|
|
38
|
+
default_value: { targets: [], operation: 'NONE' },
|
|
39
|
+
hint: 'Optional boolean operation with selected solids'
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export class PrimitivePyramidFeature {
|
|
44
|
+
static shortName = "P.PY";
|
|
45
|
+
static longName = "Primitive Pyramid";
|
|
46
|
+
static inputParamsSchema = inputParamsSchema;
|
|
47
|
+
|
|
48
|
+
constructor() {
|
|
49
|
+
this.inputParams = {};
|
|
50
|
+
|
|
51
|
+
this.persistentData = {};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async run(partHistory) {
|
|
55
|
+
const { baseSideLength, sides, height, featureID } = this.inputParams;
|
|
56
|
+
|
|
57
|
+
const pyramid = await new BREP.Pyramid({
|
|
58
|
+
bL: baseSideLength,
|
|
59
|
+
s: sides,
|
|
60
|
+
h: height,
|
|
61
|
+
name: featureID,
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
if (this.inputParams.transform) {
|
|
65
|
+
pyramid.bakeTRS(this.inputParams.transform);
|
|
66
|
+
}
|
|
67
|
+
} catch (_) { }
|
|
68
|
+
pyramid.visualize();
|
|
69
|
+
|
|
70
|
+
return await BREP.applyBooleanOperation(partHistory || {}, pyramid, this.inputParams.boolean, featureID);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// primitiveSphereFeature.js
|
|
2
|
+
// Creates a primitive sphere as a Solid containing a single Face (one analytic surface).
|
|
3
|
+
// Centered at the origin, aligned with the Y axis (poles at ±radius along Y).
|
|
4
|
+
|
|
5
|
+
import { BREP } from '../../BREP/BREP.js'
|
|
6
|
+
|
|
7
|
+
const inputParamsSchema = {
|
|
8
|
+
id: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
default_value: null,
|
|
11
|
+
hint: 'Unique identifier for the feature'
|
|
12
|
+
},
|
|
13
|
+
radius: {
|
|
14
|
+
type: 'number',
|
|
15
|
+
default_value: 5,
|
|
16
|
+
hint: 'Radius of the sphere'
|
|
17
|
+
},
|
|
18
|
+
resolution: {
|
|
19
|
+
type: 'number',
|
|
20
|
+
default_value: 32,
|
|
21
|
+
hint: 'Base segment count (longitude). Latitude segments are derived from this.'
|
|
22
|
+
},
|
|
23
|
+
transform: {
|
|
24
|
+
type: 'transform',
|
|
25
|
+
default_value: { position: [0, 0, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1] },
|
|
26
|
+
hint: 'Position, rotation, and scale'
|
|
27
|
+
},
|
|
28
|
+
boolean: {
|
|
29
|
+
type: 'boolean_operation',
|
|
30
|
+
default_value: { targets: [], operation: 'NONE' },
|
|
31
|
+
hint: 'Optional boolean operation with selected solids'
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export class PrimitiveSphereFeature {
|
|
36
|
+
static shortName = "P.S";
|
|
37
|
+
static longName = "Primitive Sphere";
|
|
38
|
+
static inputParamsSchema = inputParamsSchema;
|
|
39
|
+
|
|
40
|
+
constructor() {
|
|
41
|
+
this.inputParams = {};
|
|
42
|
+
this.persistentData = {};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async run(partHistory) {
|
|
46
|
+
const { radius, resolution, featureID } = this.inputParams;
|
|
47
|
+
|
|
48
|
+
const sphere = await new BREP.Sphere({
|
|
49
|
+
r: radius,
|
|
50
|
+
resolution,
|
|
51
|
+
name: featureID,
|
|
52
|
+
});
|
|
53
|
+
try {
|
|
54
|
+
if (this.inputParams.transform) {
|
|
55
|
+
sphere.bakeTRS(this.inputParams.transform);
|
|
56
|
+
}
|
|
57
|
+
} catch (_) { }
|
|
58
|
+
sphere.visualize();
|
|
59
|
+
|
|
60
|
+
return await BREP.applyBooleanOperation(partHistory || {}, sphere, this.inputParams.boolean, featureID);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// primitiveTorusFeature.js
|
|
2
|
+
// Creates a primitive torus as a Solid composed of Face objects.
|
|
3
|
+
// If arc < 360°, adds end-cap Faces to close the open torus, matching
|
|
4
|
+
// the original orientation (start cap built at θ=0 with normal (0,-1,0),
|
|
5
|
+
// end cap is a rotated clone about +Z by the sweep arc).
|
|
6
|
+
|
|
7
|
+
import { BREP } from '../../BREP/BREP.js'
|
|
8
|
+
// no extra imports needed for centerline metadata
|
|
9
|
+
|
|
10
|
+
const inputParamsSchema = {
|
|
11
|
+
id: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
default_value: null,
|
|
14
|
+
hint: 'Unique identifier for the feature'
|
|
15
|
+
},
|
|
16
|
+
majorRadius: {
|
|
17
|
+
type: 'number',
|
|
18
|
+
default_value: 10,
|
|
19
|
+
hint: 'Distance from center to the centerline of the tube (R)'
|
|
20
|
+
},
|
|
21
|
+
tubeRadius: {
|
|
22
|
+
type: 'number',
|
|
23
|
+
default_value: 2,
|
|
24
|
+
hint: 'Radius of the tube (r)'
|
|
25
|
+
},
|
|
26
|
+
resolution: {
|
|
27
|
+
type: 'number',
|
|
28
|
+
default_value: 64,
|
|
29
|
+
hint: 'Quality resolution (base setting for segments)'
|
|
30
|
+
},
|
|
31
|
+
arc: {
|
|
32
|
+
type: 'number',
|
|
33
|
+
default_value: 360,
|
|
34
|
+
hint: 'Sweep angle of the torus in degrees (0, 360]'
|
|
35
|
+
},
|
|
36
|
+
transform: {
|
|
37
|
+
type: 'transform',
|
|
38
|
+
default_value: { position: [0, 0, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1] },
|
|
39
|
+
hint: 'Position, rotation, and scale'
|
|
40
|
+
},
|
|
41
|
+
boolean: {
|
|
42
|
+
type: 'boolean_operation',
|
|
43
|
+
default_value: { targets: [], operation: 'NONE' },
|
|
44
|
+
hint: 'Optional boolean operation with selected solids'
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export class PrimitiveTorusFeature {
|
|
49
|
+
static shortName = "P.T";
|
|
50
|
+
static longName = "Primitive Torus";
|
|
51
|
+
static inputParamsSchema = inputParamsSchema;
|
|
52
|
+
|
|
53
|
+
constructor() {
|
|
54
|
+
this.inputParams = {};
|
|
55
|
+
this.persistentData = {};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async run(partHistory) {
|
|
59
|
+
let {
|
|
60
|
+
majorRadius,
|
|
61
|
+
tubeRadius,
|
|
62
|
+
resolution,
|
|
63
|
+
arc,
|
|
64
|
+
featureID
|
|
65
|
+
} = this.inputParams;
|
|
66
|
+
|
|
67
|
+
const torus = await new BREP.Torus({
|
|
68
|
+
mR: majorRadius,
|
|
69
|
+
tR: tubeRadius,
|
|
70
|
+
resolution,
|
|
71
|
+
arcDegrees: arc,
|
|
72
|
+
name: featureID,
|
|
73
|
+
});
|
|
74
|
+
try {
|
|
75
|
+
if (this.inputParams.transform) {
|
|
76
|
+
torus.bakeTRS(this.inputParams.transform);
|
|
77
|
+
}
|
|
78
|
+
} catch (_) { }
|
|
79
|
+
|
|
80
|
+
// Add a world-space centerline edge along the torus revolve axis (Y).
|
|
81
|
+
// Choose a length that spans the torus extents and store on the solid.
|
|
82
|
+
const THREE = BREP.THREE;
|
|
83
|
+
try {
|
|
84
|
+
const p = Array.isArray(this.inputParams?.transform?.position) ? this.inputParams.transform.position : [0, 0, 0];
|
|
85
|
+
const r = Array.isArray(this.inputParams?.transform?.rotationEuler) ? this.inputParams.transform.rotationEuler : [0, 0, 0];
|
|
86
|
+
const s = Array.isArray(this.inputParams?.transform?.scale) ? this.inputParams.transform.scale : [1, 1, 1];
|
|
87
|
+
const pos = new THREE.Vector3(p[0] || 0, p[1] || 0, p[2] || 0);
|
|
88
|
+
const eul = new THREE.Euler(
|
|
89
|
+
THREE.MathUtils.degToRad(r[0] || 0),
|
|
90
|
+
THREE.MathUtils.degToRad(r[1] || 0),
|
|
91
|
+
THREE.MathUtils.degToRad(r[2] || 0),
|
|
92
|
+
'XYZ'
|
|
93
|
+
);
|
|
94
|
+
const quat = new THREE.Quaternion().setFromEuler(eul);
|
|
95
|
+
const scl = new THREE.Vector3(s[0] || 1, s[1] || 1, s[2] || 1);
|
|
96
|
+
const M = new THREE.Matrix4().compose(pos, quat, scl);
|
|
97
|
+
|
|
98
|
+
const L = 2 * (Math.abs(Number(majorRadius) || 0) + Math.abs(Number(tubeRadius) || 0));
|
|
99
|
+
const a0 = new THREE.Vector3(0, -0.5 * L, 0).applyMatrix4(M);
|
|
100
|
+
const a1 = new THREE.Vector3(0, +0.5 * L, 0).applyMatrix4(M);
|
|
101
|
+
if (a0.distanceToSquared(a1) >= 1e-16) {
|
|
102
|
+
torus.addCenterline([a0.x, a0.y, a0.z], [a1.x, a1.y, a1.z], (featureID ? `${featureID}_AXIS` : 'AXIS'), { materialKey: 'OVERLAY' });
|
|
103
|
+
}
|
|
104
|
+
} catch (_) { }
|
|
105
|
+
|
|
106
|
+
torus.visualize();
|
|
107
|
+
return await BREP.applyBooleanOperation(partHistory || {}, torus, this.inputParams.boolean, featureID);
|
|
108
|
+
}
|
|
109
|
+
}
|