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,290 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
6
|
+
<title>Cylindrical Face Radius Embedding - BREP</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root{
|
|
9
|
+
--bg:#0b0f14; --panel:#0f141b; --text:#d7dde6; --muted:#9aa7b2;
|
|
10
|
+
--border:#1b2430; --accent:#5cc8ff; --chip:#121823;
|
|
11
|
+
}
|
|
12
|
+
*{box-sizing:border-box}
|
|
13
|
+
html,body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono','Courier New',monospace}
|
|
14
|
+
main{max-width:1100px;margin:0 auto;padding:28px}
|
|
15
|
+
h1{margin:0 0 18px;font-size:22px;color:var(--accent);font-weight:700}
|
|
16
|
+
.summary{color:var(--muted);margin-bottom:22px}
|
|
17
|
+
.card{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:18px;margin:0 0 18px}
|
|
18
|
+
.readme{padding:0}
|
|
19
|
+
.readme .header{padding:16px 18px;border-bottom:1px solid var(--border)}
|
|
20
|
+
.readme .content{padding:18px}
|
|
21
|
+
.doc-card{padding:18px}
|
|
22
|
+
.doc-nav{margin:0 0 18px;display:flex;gap:12px;flex-wrap:wrap;align-items:center;color:var(--muted)}
|
|
23
|
+
.doc-nav-links{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
|
|
24
|
+
.doc-nav a{color:var(--accent);font-weight:600}
|
|
25
|
+
.doc-list{list-style:none;margin:18px 0;padding:0}
|
|
26
|
+
.doc-list li{margin:6px 0}
|
|
27
|
+
.doc-list a{color:var(--accent)}
|
|
28
|
+
.nav-search{margin-left:auto;position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;min-width:240px;max-width:520px}
|
|
29
|
+
.search-title{font-weight:700;font-size:14px;margin-bottom:4px}
|
|
30
|
+
.search-hint{color:var(--muted);font-size:12px;margin:0}
|
|
31
|
+
.search-input-row{display:flex;gap:8px;align-items:center;width:100%}
|
|
32
|
+
.search-input{flex:1;border:1px solid var(--border);border-radius:10px;background:var(--chip);color:var(--text);padding:10px 12px}
|
|
33
|
+
.search-input:focus{outline:1px solid var(--accent);box-shadow:0 0 0 3px rgba(92,200,255,0.15)}
|
|
34
|
+
.search-clear{border:1px solid var(--border);background:var(--panel);color:var(--muted);border-radius:10px;padding:9px 12px;cursor:pointer;font-weight:600}
|
|
35
|
+
.search-clear:hover{border-color:var(--accent);color:var(--accent)}
|
|
36
|
+
.search-status{color:var(--muted);font-size:12px;margin-top:4px;width:100%;text-align:right}
|
|
37
|
+
.search-results{position:absolute;top:100%;right:0;margin-top:10px;border:1px solid var(--border);border-radius:12px;background:var(--panel);max-height:360px;overflow:auto;min-width:320px;max-width:520px;box-shadow:0 12px 30px rgba(0,0,0,0.35);z-index:25}
|
|
38
|
+
.search-results ul{list-style:none;margin:0;padding:0}
|
|
39
|
+
.search-item{padding:10px 12px;border-bottom:1px solid var(--border)}
|
|
40
|
+
.search-item:last-child{border-bottom:none}
|
|
41
|
+
.search-item a{display:block;color:var(--accent);font-weight:600}
|
|
42
|
+
.search-snippet{color:var(--muted);font-size:13px;margin-top:4px}
|
|
43
|
+
.search-results mark{background:rgba(92,200,255,0.2);color:var(--text);border-radius:4px;padding:0 2px}
|
|
44
|
+
.prose h1{font-size:24px;margin:0 0 12px}
|
|
45
|
+
.prose h2{font-size:18px;margin:18px 0 8px}
|
|
46
|
+
.prose h3{font-size:16px;margin:14px 0 6px}
|
|
47
|
+
.prose p{margin:0 0 10px}
|
|
48
|
+
.prose ul,.prose ol{margin:0 0 10px 18px}
|
|
49
|
+
.prose li{margin:4px 0}
|
|
50
|
+
.prose code{background:#0d1520;border:1px solid var(--border);padding:1px 5px;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono','Courier New',monospace;font-size:12px}
|
|
51
|
+
.prose pre{background:#0d1520;border:1px solid var(--border);padding:12px;border-radius:12px;overflow:auto}
|
|
52
|
+
.prose a{color:var(--accent)}
|
|
53
|
+
.prose img{max-width:100%;height:auto;}
|
|
54
|
+
.prose table{border-collapse:collapse;width:100%;margin:16px 0;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden}
|
|
55
|
+
.prose th,.prose td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}
|
|
56
|
+
.prose th{background:var(--chip);color:var(--text);font-weight:600;font-size:13px}
|
|
57
|
+
.prose tr:last-child td{border-bottom:none}
|
|
58
|
+
.prose tbody tr:hover{background:rgba(92,200,255,0.05)}
|
|
59
|
+
.license{
|
|
60
|
+
background:var(--panel);border:1px solid var(--border);border-radius:14px;
|
|
61
|
+
padding:16px 16px 8px;margin:0 0 18px;
|
|
62
|
+
}
|
|
63
|
+
.license > h2{margin:0 0 10px;font-size:16px;font-weight:700}
|
|
64
|
+
.pkg{
|
|
65
|
+
border-top:1px solid var(--border);padding:10px 0;
|
|
66
|
+
display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;
|
|
67
|
+
}
|
|
68
|
+
.pkg:first-of-type{border-top:none}
|
|
69
|
+
.pkg .meta{display:flex;gap:10px;flex-wrap:wrap}
|
|
70
|
+
.pkg .name{font-weight:600}
|
|
71
|
+
.pkg .desc{color:var(--muted);margin-top:2px}
|
|
72
|
+
a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline}
|
|
73
|
+
.chip{background:var(--chip);border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:12px;color:var(--muted)}
|
|
74
|
+
.footer{margin-top:26px;color:var(--muted);font-size:12px}
|
|
75
|
+
</style>
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
<main>
|
|
79
|
+
<nav class="doc-nav">
|
|
80
|
+
<div class="doc-nav-links">
|
|
81
|
+
<a href="index.html">Help Home</a><span>·</span><a href="/help/table-of-contents.html">Table of Contents</a><span>·</span><a href="https://github.com/mmiscool/BREP" target="_blank" rel="noopener noreferrer">GitHub</a>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="nav-search">
|
|
84
|
+
<div class="search-input-row">
|
|
85
|
+
<input type="search" id="doc-search" class="search-input" placeholder="Search docs... Type at least 2 characters to search" autocomplete="off" spellcheck="false" />
|
|
86
|
+
<button type="button" class="search-clear" id="doc-search-clear">Clear</button>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="search-status" id="doc-search-status"></div>
|
|
89
|
+
<div class="search-results" id="doc-search-results" hidden>
|
|
90
|
+
<ul id="doc-search-list"></ul>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</nav>
|
|
94
|
+
<section class="card doc-card">
|
|
95
|
+
|
|
96
|
+
<div class="prose">
|
|
97
|
+
<h1>Cylindrical Face Radius Embedding</h1><p>This feature adds automatic radius information embedding for cylindrical faces in BREP solids, making the radius values available for downstream operations like dimensioning.</p><h2>How It Works</h2><h3>1. Automatic Radius Embedding</h3><p>When cylindrical faces are created, the system automatically stores radius metadata:</p><p><pre><code>javascript
|
|
98
|
+
// For primitive cylinders
|
|
99
|
+
const cylinder = new BREP.Cylinder({
|
|
100
|
+
radius: 5.0,
|
|
101
|
+
height: 10.0,
|
|
102
|
+
name: 'MyCylinder'
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// The side face 'MyCylinder_S' will automatically have metadata:
|
|
106
|
+
// {
|
|
107
|
+
// type: 'cylindrical',
|
|
108
|
+
// radius: 5.0,
|
|
109
|
+
// height: 10.0,
|
|
110
|
+
// axis: [0, 1, 0],
|
|
111
|
+
// center: [0, 5.0, 0]
|
|
112
|
+
// }</code></pre></p><h3>2. Extrude Operations</h3><p>When extruding circular sketches, cylindrical faces are automatically detected and radius metadata is embedded:</p><p><pre><code>javascript
|
|
113
|
+
// If you extrude a circular face with radius 3.0
|
|
114
|
+
const extruded = new BREP.ExtrudeSolid({
|
|
115
|
+
face: circularFace,
|
|
116
|
+
distance: 8.0
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// The side wall will have cylindrical metadata with radius: 3.0</code></pre></p><h3>3. Accessing Face Metadata</h3><p>You can retrieve the embedded radius information:</p><p><pre><code>javascript
|
|
120
|
+
// Get metadata for a specific face
|
|
121
|
+
const metadata = solid.getFaceMetadata('MyCylinder_S');
|
|
122
|
+
|
|
123
|
+
if (metadata && metadata.type === 'cylindrical') {
|
|
124
|
+
console.log('Radius:', metadata.radius);
|
|
125
|
+
console.log('Height:', metadata.height);
|
|
126
|
+
console.log('Axis:', metadata.axis);
|
|
127
|
+
console.log('Center:', metadata.center);
|
|
128
|
+
}</code></pre></p><h3>4. Setting Custom Metadata</h3><p>You can also manually set face metadata:</p><p><pre><code>javascript
|
|
129
|
+
solid.setFaceMetadata('CustomFace', {
|
|
130
|
+
type: 'cylindrical',
|
|
131
|
+
radius: 7.5,
|
|
132
|
+
height: 12.0,
|
|
133
|
+
axis: [1, 0, 0],
|
|
134
|
+
center: [0, 0, 0]
|
|
135
|
+
});</code></pre></p><h2>Benefits for Dimensioning</h2><h3>Radial Dimensions</h3><p>The PMI system automatically uses embedded radius values when creating radial dimensions:</p><ol><li><strong>Automatic Detection</strong>: When you select a cylindrical face for dimensioning, the system first checks for embedded radius metadata</li><li><strong>Precise Values</strong>: Uses the exact radius value from the original geometry instead of approximating from triangle vertices</li><li><strong>Performance</strong>: No need to perform geometric calculations to determine the radius</li></ol><h3>Usage in PMI Mode</h3><p><pre><code>javascript
|
|
136
|
+
// In PMI mode, when creating a radial dimension:
|
|
137
|
+
// 1. Select the cylindrical face edge
|
|
138
|
+
// 2. The system automatically detects the embedded radius
|
|
139
|
+
// 3. Displays the correct radius value for dimensioning</code></pre></p><h2>Metadata Persistence</h2><p>Face metadata is automatically preserved through:</p><ul><li><strong>Boolean Operations</strong>: Union, subtract, intersect operations preserve metadata from both input solids</li><li><strong>Transformations</strong>: Metadata travels with the face through transformations</li><li><strong>Feature Operations</strong>: Fillets, chamfers, and other operations maintain source metadata when possible</li></ul><h2>Supported Face Types</h2><ul><li><strong>Cylindrical</strong>: Full circular cylinders with consistent radius</li><li><strong>Conical</strong>: Truncated cones (when top/bottom radii are equal, treated as cylindrical)</li><li><strong>Future</strong>: Spherical, toroidal, and other curved surfaces can be added using the same pattern</li></ul><h2>Implementation Notes</h2><p>The system uses a <code>Map</code> to store face metadata:</p><ul><li>Key: Face name (string)</li><li>Value: Metadata object with type, geometric parameters</li></ul><p>This approach is:</p><ul><li><strong>Lightweight</strong>: Only stores essential geometric information</li><li><strong>Extensible</strong>: Easy to add new face types and metadata</li><li><strong>Compatible</strong>: Works with existing BREP boolean operations</li><li><strong>Robust</strong>: Gracefully handles missing or invalid metadata</li></ul>
|
|
140
|
+
</div>
|
|
141
|
+
</section>
|
|
142
|
+
</main>
|
|
143
|
+
<script>
|
|
144
|
+
(() => {
|
|
145
|
+
const searchInput = document.getElementById("doc-search");
|
|
146
|
+
const resultsBox = document.getElementById("doc-search-results");
|
|
147
|
+
const resultsList = document.getElementById("doc-search-list");
|
|
148
|
+
const statusEl = document.getElementById("doc-search-status");
|
|
149
|
+
const clearBtn = document.getElementById("doc-search-clear");
|
|
150
|
+
if (!searchInput || !resultsBox || !resultsList || !statusEl || !clearBtn) return;
|
|
151
|
+
const indexUrl = "./search-index.json";
|
|
152
|
+
let indexPromise = null;
|
|
153
|
+
let cachedEntries = null;
|
|
154
|
+
|
|
155
|
+
const escapeHtml = (text = "") =>
|
|
156
|
+
text
|
|
157
|
+
.replace(/&/g, "&")
|
|
158
|
+
.replace(/</g, "<")
|
|
159
|
+
.replace(/>/g, ">");
|
|
160
|
+
|
|
161
|
+
const escapeRegExp = (text = "") => text.replace(/[.*+?^{}()|[]\$]/g, "\$&");
|
|
162
|
+
|
|
163
|
+
const highlight = (text, terms) => {
|
|
164
|
+
if (!terms.length) return escapeHtml(text);
|
|
165
|
+
const pattern = terms.map(escapeRegExp).join("|");
|
|
166
|
+
const regex = new RegExp(`(${pattern})`, "gi");
|
|
167
|
+
return escapeHtml(text).replace(regex, "<mark>$1</mark>");
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const buildSnippet = (entry, terms) => {
|
|
171
|
+
const source = entry.content || entry.summary || "";
|
|
172
|
+
if (!source) return { plain: "", highlighted: "" };
|
|
173
|
+
let hit = source.length;
|
|
174
|
+
for (const term of terms) {
|
|
175
|
+
const idx = entry.contentLower.indexOf(term);
|
|
176
|
+
if (idx !== -1 && idx < hit) hit = idx;
|
|
177
|
+
}
|
|
178
|
+
if (!Number.isFinite(hit) || hit === source.length) hit = 0;
|
|
179
|
+
const start = Math.max(0, hit - 60);
|
|
180
|
+
const end = Math.min(source.length, hit + 140);
|
|
181
|
+
const snippet = source.slice(start, end);
|
|
182
|
+
return { plain: snippet, highlighted: highlight(snippet, terms) };
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const updateStatus = (message) => {
|
|
186
|
+
statusEl.textContent = message;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const loadIndex = async () => {
|
|
190
|
+
if (cachedEntries) return cachedEntries;
|
|
191
|
+
if (!indexPromise) {
|
|
192
|
+
indexPromise = fetch(indexUrl, { cache: "no-store" })
|
|
193
|
+
.then((res) => {
|
|
194
|
+
if (!res.ok) throw new Error("Failed to load search index");
|
|
195
|
+
return res.json();
|
|
196
|
+
})
|
|
197
|
+
.then((json) => {
|
|
198
|
+
cachedEntries = Array.isArray(json)
|
|
199
|
+
? json.map((entry) => ({
|
|
200
|
+
...entry,
|
|
201
|
+
contentLower: (entry.content || "").toLowerCase(),
|
|
202
|
+
titleLower: (entry.title || "").toLowerCase(),
|
|
203
|
+
}))
|
|
204
|
+
: [];
|
|
205
|
+
return cachedEntries;
|
|
206
|
+
})
|
|
207
|
+
.catch((err) => {
|
|
208
|
+
console.error("Search index load failed", err);
|
|
209
|
+
cachedEntries = [];
|
|
210
|
+
throw err;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return indexPromise;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const renderResults = (entries, terms) => {
|
|
217
|
+
if (!terms.length) {
|
|
218
|
+
resultsBox.hidden = true;
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (!entries.length) {
|
|
222
|
+
resultsList.innerHTML = '<li class="search-item"><div class="search-snippet">No matches found.</div></li>';
|
|
223
|
+
resultsBox.hidden = false;
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const rendered = entries
|
|
227
|
+
.slice(0, 30)
|
|
228
|
+
.map((entry) => {
|
|
229
|
+
const snippet = buildSnippet(entry, terms);
|
|
230
|
+
const title = highlight(entry.title || entry.href, terms);
|
|
231
|
+
const hasFragment = snippet.plain && snippet.plain.trim().length > 0;
|
|
232
|
+
const fragment = hasFragment ? `#:~:text=${encodeURIComponent(snippet.plain.trim())}` : "";
|
|
233
|
+
const hrefWithFragment = hasFragment
|
|
234
|
+
? (entry.href.includes("#") ? `${entry.href}&:~:text=${encodeURIComponent(snippet.plain.trim())}` : `${entry.href}${fragment}`)
|
|
235
|
+
: entry.href;
|
|
236
|
+
const snippetHtml = snippet.highlighted ? `<div class="search-snippet">${snippet.highlighted}</div>` : "";
|
|
237
|
+
return `<li class="search-item"><a href="${hrefWithFragment}">${title}</a>${snippetHtml}</li>`;
|
|
238
|
+
})
|
|
239
|
+
.join("");
|
|
240
|
+
resultsList.innerHTML = rendered;
|
|
241
|
+
resultsBox.hidden = false;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
const performSearch = async () => {
|
|
245
|
+
const rawQuery = searchInput.value.trim();
|
|
246
|
+
if (rawQuery.length < 2) {
|
|
247
|
+
updateStatus("Type at least 2 characters to search.");
|
|
248
|
+
resultsBox.hidden = true;
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const terms = rawQuery.toLowerCase().split(/\s+/).filter(Boolean);
|
|
252
|
+
updateStatus("Searching...");
|
|
253
|
+
try {
|
|
254
|
+
const entries = await loadIndex();
|
|
255
|
+
const matches = entries.filter((entry) =>
|
|
256
|
+
terms.every((term) => entry.contentLower.includes(term) || entry.titleLower.includes(term))
|
|
257
|
+
);
|
|
258
|
+
renderResults(matches, terms);
|
|
259
|
+
updateStatus(matches.length ? `${matches.length} result${matches.length === 1 ? "" : "s"} for "${rawQuery}"` : "No matches found.");
|
|
260
|
+
} catch (err) {
|
|
261
|
+
updateStatus("Search unavailable (could not load index).");
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
searchInput.addEventListener("input", performSearch);
|
|
266
|
+
|
|
267
|
+
searchInput.addEventListener("focus", () => {
|
|
268
|
+
if (!cachedEntries) {
|
|
269
|
+
loadIndex().catch(() => updateStatus("Search unavailable (could not load index)."));
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
clearBtn.addEventListener("click", () => {
|
|
274
|
+
searchInput.value = "";
|
|
275
|
+
resultsBox.hidden = true;
|
|
276
|
+
updateStatus("Type at least 2 characters to search.");
|
|
277
|
+
searchInput.focus();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
document.addEventListener("keydown", (evt) => {
|
|
281
|
+
if (evt.key === "Escape" && document.activeElement === searchInput) {
|
|
282
|
+
searchInput.value = "";
|
|
283
|
+
resultsBox.hidden = true;
|
|
284
|
+
updateStatus("Type at least 2 characters to search.");
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
})();
|
|
288
|
+
</script>
|
|
289
|
+
</body>
|
|
290
|
+
</html>
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
6
|
+
<title>Dialog Screenshots - BREP</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root{
|
|
9
|
+
--bg:#0b0f14; --panel:#0f141b; --text:#d7dde6; --muted:#9aa7b2;
|
|
10
|
+
--border:#1b2430; --accent:#5cc8ff; --chip:#121823;
|
|
11
|
+
}
|
|
12
|
+
*{box-sizing:border-box}
|
|
13
|
+
html,body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono','Courier New',monospace}
|
|
14
|
+
main{max-width:1100px;margin:0 auto;padding:28px}
|
|
15
|
+
h1{margin:0 0 18px;font-size:22px;color:var(--accent);font-weight:700}
|
|
16
|
+
.summary{color:var(--muted);margin-bottom:22px}
|
|
17
|
+
.card{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:18px;margin:0 0 18px}
|
|
18
|
+
.readme{padding:0}
|
|
19
|
+
.readme .header{padding:16px 18px;border-bottom:1px solid var(--border)}
|
|
20
|
+
.readme .content{padding:18px}
|
|
21
|
+
.doc-card{padding:18px}
|
|
22
|
+
.doc-nav{margin:0 0 18px;display:flex;gap:12px;flex-wrap:wrap;align-items:center;color:var(--muted)}
|
|
23
|
+
.doc-nav-links{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
|
|
24
|
+
.doc-nav a{color:var(--accent);font-weight:600}
|
|
25
|
+
.doc-list{list-style:none;margin:18px 0;padding:0}
|
|
26
|
+
.doc-list li{margin:6px 0}
|
|
27
|
+
.doc-list a{color:var(--accent)}
|
|
28
|
+
.nav-search{margin-left:auto;position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;min-width:240px;max-width:520px}
|
|
29
|
+
.search-title{font-weight:700;font-size:14px;margin-bottom:4px}
|
|
30
|
+
.search-hint{color:var(--muted);font-size:12px;margin:0}
|
|
31
|
+
.search-input-row{display:flex;gap:8px;align-items:center;width:100%}
|
|
32
|
+
.search-input{flex:1;border:1px solid var(--border);border-radius:10px;background:var(--chip);color:var(--text);padding:10px 12px}
|
|
33
|
+
.search-input:focus{outline:1px solid var(--accent);box-shadow:0 0 0 3px rgba(92,200,255,0.15)}
|
|
34
|
+
.search-clear{border:1px solid var(--border);background:var(--panel);color:var(--muted);border-radius:10px;padding:9px 12px;cursor:pointer;font-weight:600}
|
|
35
|
+
.search-clear:hover{border-color:var(--accent);color:var(--accent)}
|
|
36
|
+
.search-status{color:var(--muted);font-size:12px;margin-top:4px;width:100%;text-align:right}
|
|
37
|
+
.search-results{position:absolute;top:100%;right:0;margin-top:10px;border:1px solid var(--border);border-radius:12px;background:var(--panel);max-height:360px;overflow:auto;min-width:320px;max-width:520px;box-shadow:0 12px 30px rgba(0,0,0,0.35);z-index:25}
|
|
38
|
+
.search-results ul{list-style:none;margin:0;padding:0}
|
|
39
|
+
.search-item{padding:10px 12px;border-bottom:1px solid var(--border)}
|
|
40
|
+
.search-item:last-child{border-bottom:none}
|
|
41
|
+
.search-item a{display:block;color:var(--accent);font-weight:600}
|
|
42
|
+
.search-snippet{color:var(--muted);font-size:13px;margin-top:4px}
|
|
43
|
+
.search-results mark{background:rgba(92,200,255,0.2);color:var(--text);border-radius:4px;padding:0 2px}
|
|
44
|
+
.prose h1{font-size:24px;margin:0 0 12px}
|
|
45
|
+
.prose h2{font-size:18px;margin:18px 0 8px}
|
|
46
|
+
.prose h3{font-size:16px;margin:14px 0 6px}
|
|
47
|
+
.prose p{margin:0 0 10px}
|
|
48
|
+
.prose ul,.prose ol{margin:0 0 10px 18px}
|
|
49
|
+
.prose li{margin:4px 0}
|
|
50
|
+
.prose code{background:#0d1520;border:1px solid var(--border);padding:1px 5px;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono','Courier New',monospace;font-size:12px}
|
|
51
|
+
.prose pre{background:#0d1520;border:1px solid var(--border);padding:12px;border-radius:12px;overflow:auto}
|
|
52
|
+
.prose a{color:var(--accent)}
|
|
53
|
+
.prose img{max-width:100%;height:auto;}
|
|
54
|
+
.prose table{border-collapse:collapse;width:100%;margin:16px 0;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden}
|
|
55
|
+
.prose th,.prose td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}
|
|
56
|
+
.prose th{background:var(--chip);color:var(--text);font-weight:600;font-size:13px}
|
|
57
|
+
.prose tr:last-child td{border-bottom:none}
|
|
58
|
+
.prose tbody tr:hover{background:rgba(92,200,255,0.05)}
|
|
59
|
+
.license{
|
|
60
|
+
background:var(--panel);border:1px solid var(--border);border-radius:14px;
|
|
61
|
+
padding:16px 16px 8px;margin:0 0 18px;
|
|
62
|
+
}
|
|
63
|
+
.license > h2{margin:0 0 10px;font-size:16px;font-weight:700}
|
|
64
|
+
.pkg{
|
|
65
|
+
border-top:1px solid var(--border);padding:10px 0;
|
|
66
|
+
display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;
|
|
67
|
+
}
|
|
68
|
+
.pkg:first-of-type{border-top:none}
|
|
69
|
+
.pkg .meta{display:flex;gap:10px;flex-wrap:wrap}
|
|
70
|
+
.pkg .name{font-weight:600}
|
|
71
|
+
.pkg .desc{color:var(--muted);margin-top:2px}
|
|
72
|
+
a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline}
|
|
73
|
+
.chip{background:var(--chip);border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:12px;color:var(--muted)}
|
|
74
|
+
.footer{margin-top:26px;color:var(--muted);font-size:12px}
|
|
75
|
+
</style>
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
<main>
|
|
79
|
+
<nav class="doc-nav">
|
|
80
|
+
<div class="doc-nav-links">
|
|
81
|
+
<a href="index.html">Help Home</a><span>·</span><a href="/help/table-of-contents.html">Table of Contents</a><span>·</span><a href="https://github.com/mmiscool/BREP" target="_blank" rel="noopener noreferrer">GitHub</a>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="nav-search">
|
|
84
|
+
<div class="search-input-row">
|
|
85
|
+
<input type="search" id="doc-search" class="search-input" placeholder="Search docs... Type at least 2 characters to search" autocomplete="off" spellcheck="false" />
|
|
86
|
+
<button type="button" class="search-clear" id="doc-search-clear">Clear</button>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="search-status" id="doc-search-status"></div>
|
|
89
|
+
<div class="search-results" id="doc-search-results" hidden>
|
|
90
|
+
<ul id="doc-search-list"></ul>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</nav>
|
|
94
|
+
<section class="card doc-card">
|
|
95
|
+
|
|
96
|
+
<div class="prose">
|
|
97
|
+
<h1>Dialog Screenshots</h1><ol><li>Run <code>pnpm dev</code> and open at least one of the capture helper pages:</li><p>- <code><a href="http://localhost:5173/feature-dialog-capture.html" target="_blank" rel="noopener noreferrer">http://localhost:5173/feature-dialog-capture.html</a></code> - <code><a href="http://localhost:5173/pmi-dialog-capture.html" target="_blank" rel="noopener noreferrer">http://localhost:5173/pmi-dialog-capture.html</a></code> - <code><a href="http://localhost:5173/assembly-constraint-capture.html" target="_blank" rel="noopener noreferrer">http://localhost:5173/assembly-constraint-capture.html</a></code></p><li>With the dev server running, execute <code>pnpm capture</code> to export every dialog screenshot. Outputs land in:</li></ol><p>- <code>docs/features</code> (feature dialogs) - <code>docs/pmi-annotations</code> (PMI annotations) - <code>docs/assembly-constraints</code> (assembly constraints)</p><p>For the schema that drives these dialogs (field types, defaults, and selection filters), see <a href="input-params-schema.html">Input Params Schema</a>.</p><h2>Configuration</h2><p>Customize the automation with environment variables:</p><ul><li><code>CAPTURE_SCOPE=features,pmi</code> limits which capture helpers are processed.</li><li><code>CAPTURE_BASE_URL=http://127.0.0.1:5174</code> points to a dev server running on a different host/port.</li><li><code>CAPTURE_URL</code> + <code>CAPTURE_OUTPUT</code> run a one-off capture against any URL.</li><li><code>CAPTURE_DEVICE_SCALE_FACTOR=1</code> (default <code>2</code>) controls the browser’s device pixel ratio for sharper or softer renders.</li><li><code>CAPTURE_OUTPUT_SCALE=device</code> keeps the full hi-DPI image size instead of downscaling back to CSS pixels (default <code>css</code> keeps the files small while retaining clarity).</li></ul>
|
|
98
|
+
</div>
|
|
99
|
+
</section>
|
|
100
|
+
</main>
|
|
101
|
+
<script>
|
|
102
|
+
(() => {
|
|
103
|
+
const searchInput = document.getElementById("doc-search");
|
|
104
|
+
const resultsBox = document.getElementById("doc-search-results");
|
|
105
|
+
const resultsList = document.getElementById("doc-search-list");
|
|
106
|
+
const statusEl = document.getElementById("doc-search-status");
|
|
107
|
+
const clearBtn = document.getElementById("doc-search-clear");
|
|
108
|
+
if (!searchInput || !resultsBox || !resultsList || !statusEl || !clearBtn) return;
|
|
109
|
+
const indexUrl = "./search-index.json";
|
|
110
|
+
let indexPromise = null;
|
|
111
|
+
let cachedEntries = null;
|
|
112
|
+
|
|
113
|
+
const escapeHtml = (text = "") =>
|
|
114
|
+
text
|
|
115
|
+
.replace(/&/g, "&")
|
|
116
|
+
.replace(/</g, "<")
|
|
117
|
+
.replace(/>/g, ">");
|
|
118
|
+
|
|
119
|
+
const escapeRegExp = (text = "") => text.replace(/[.*+?^{}()|[]\$]/g, "\$&");
|
|
120
|
+
|
|
121
|
+
const highlight = (text, terms) => {
|
|
122
|
+
if (!terms.length) return escapeHtml(text);
|
|
123
|
+
const pattern = terms.map(escapeRegExp).join("|");
|
|
124
|
+
const regex = new RegExp(`(${pattern})`, "gi");
|
|
125
|
+
return escapeHtml(text).replace(regex, "<mark>$1</mark>");
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const buildSnippet = (entry, terms) => {
|
|
129
|
+
const source = entry.content || entry.summary || "";
|
|
130
|
+
if (!source) return { plain: "", highlighted: "" };
|
|
131
|
+
let hit = source.length;
|
|
132
|
+
for (const term of terms) {
|
|
133
|
+
const idx = entry.contentLower.indexOf(term);
|
|
134
|
+
if (idx !== -1 && idx < hit) hit = idx;
|
|
135
|
+
}
|
|
136
|
+
if (!Number.isFinite(hit) || hit === source.length) hit = 0;
|
|
137
|
+
const start = Math.max(0, hit - 60);
|
|
138
|
+
const end = Math.min(source.length, hit + 140);
|
|
139
|
+
const snippet = source.slice(start, end);
|
|
140
|
+
return { plain: snippet, highlighted: highlight(snippet, terms) };
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const updateStatus = (message) => {
|
|
144
|
+
statusEl.textContent = message;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const loadIndex = async () => {
|
|
148
|
+
if (cachedEntries) return cachedEntries;
|
|
149
|
+
if (!indexPromise) {
|
|
150
|
+
indexPromise = fetch(indexUrl, { cache: "no-store" })
|
|
151
|
+
.then((res) => {
|
|
152
|
+
if (!res.ok) throw new Error("Failed to load search index");
|
|
153
|
+
return res.json();
|
|
154
|
+
})
|
|
155
|
+
.then((json) => {
|
|
156
|
+
cachedEntries = Array.isArray(json)
|
|
157
|
+
? json.map((entry) => ({
|
|
158
|
+
...entry,
|
|
159
|
+
contentLower: (entry.content || "").toLowerCase(),
|
|
160
|
+
titleLower: (entry.title || "").toLowerCase(),
|
|
161
|
+
}))
|
|
162
|
+
: [];
|
|
163
|
+
return cachedEntries;
|
|
164
|
+
})
|
|
165
|
+
.catch((err) => {
|
|
166
|
+
console.error("Search index load failed", err);
|
|
167
|
+
cachedEntries = [];
|
|
168
|
+
throw err;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return indexPromise;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const renderResults = (entries, terms) => {
|
|
175
|
+
if (!terms.length) {
|
|
176
|
+
resultsBox.hidden = true;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (!entries.length) {
|
|
180
|
+
resultsList.innerHTML = '<li class="search-item"><div class="search-snippet">No matches found.</div></li>';
|
|
181
|
+
resultsBox.hidden = false;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const rendered = entries
|
|
185
|
+
.slice(0, 30)
|
|
186
|
+
.map((entry) => {
|
|
187
|
+
const snippet = buildSnippet(entry, terms);
|
|
188
|
+
const title = highlight(entry.title || entry.href, terms);
|
|
189
|
+
const hasFragment = snippet.plain && snippet.plain.trim().length > 0;
|
|
190
|
+
const fragment = hasFragment ? `#:~:text=${encodeURIComponent(snippet.plain.trim())}` : "";
|
|
191
|
+
const hrefWithFragment = hasFragment
|
|
192
|
+
? (entry.href.includes("#") ? `${entry.href}&:~:text=${encodeURIComponent(snippet.plain.trim())}` : `${entry.href}${fragment}`)
|
|
193
|
+
: entry.href;
|
|
194
|
+
const snippetHtml = snippet.highlighted ? `<div class="search-snippet">${snippet.highlighted}</div>` : "";
|
|
195
|
+
return `<li class="search-item"><a href="${hrefWithFragment}">${title}</a>${snippetHtml}</li>`;
|
|
196
|
+
})
|
|
197
|
+
.join("");
|
|
198
|
+
resultsList.innerHTML = rendered;
|
|
199
|
+
resultsBox.hidden = false;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const performSearch = async () => {
|
|
203
|
+
const rawQuery = searchInput.value.trim();
|
|
204
|
+
if (rawQuery.length < 2) {
|
|
205
|
+
updateStatus("Type at least 2 characters to search.");
|
|
206
|
+
resultsBox.hidden = true;
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const terms = rawQuery.toLowerCase().split(/\s+/).filter(Boolean);
|
|
210
|
+
updateStatus("Searching...");
|
|
211
|
+
try {
|
|
212
|
+
const entries = await loadIndex();
|
|
213
|
+
const matches = entries.filter((entry) =>
|
|
214
|
+
terms.every((term) => entry.contentLower.includes(term) || entry.titleLower.includes(term))
|
|
215
|
+
);
|
|
216
|
+
renderResults(matches, terms);
|
|
217
|
+
updateStatus(matches.length ? `${matches.length} result${matches.length === 1 ? "" : "s"} for "${rawQuery}"` : "No matches found.");
|
|
218
|
+
} catch (err) {
|
|
219
|
+
updateStatus("Search unavailable (could not load index).");
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
searchInput.addEventListener("input", performSearch);
|
|
224
|
+
|
|
225
|
+
searchInput.addEventListener("focus", () => {
|
|
226
|
+
if (!cachedEntries) {
|
|
227
|
+
loadIndex().catch(() => updateStatus("Search unavailable (could not load index)."));
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
clearBtn.addEventListener("click", () => {
|
|
232
|
+
searchInput.value = "";
|
|
233
|
+
resultsBox.hidden = true;
|
|
234
|
+
updateStatus("Type at least 2 characters to search.");
|
|
235
|
+
searchInput.focus();
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
document.addEventListener("keydown", (evt) => {
|
|
239
|
+
if (evt.key === "Escape" && document.activeElement === searchInput) {
|
|
240
|
+
searchInput.value = "";
|
|
241
|
+
resultsBox.hidden = true;
|
|
242
|
+
updateStatus("Type at least 2 characters to search.");
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
})();
|
|
246
|
+
</script>
|
|
247
|
+
</body>
|
|
248
|
+
</html>
|