@faicad/faijs 0.29.3 → 0.30.9
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/NOTICE +6 -5
- package/dist/api/api-namespace.d.ts +1 -1
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +53 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +136 -0
- package/dist/api/appearance.d.ts.map +1 -0
- package/dist/api/appearance.js +228 -0
- package/dist/api/appearance.js.map +1 -0
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.js +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -1
- package/dist/api/assembly/index.js +1 -1
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +33 -15
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +31 -13
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -1
- package/dist/api/assembly/solve.js +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +3 -4
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
- package/dist/api/assembly/solvers/linalg.d.ts +2 -2
- package/dist/api/assembly/solvers/linalg.js +2 -2
- package/dist/api/assembly/solvers/linalg.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +2 -5
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js +1 -4
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +7 -6
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
- package/dist/api/brep-mirror/booleanFns.js +5 -5
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
- package/dist/api/brep-mirror/compoundFns.js +4 -4
- package/dist/api/brep-mirror/compoundFns.js.map +1 -1
- package/dist/api/brep-mirror/healingFns.d.ts +4 -4
- package/dist/api/brep-mirror/healingFns.js +4 -4
- package/dist/api/brep-mirror/healingFns.js.map +1 -1
- package/dist/api/brep-mirror/hullFns.d.ts +2 -2
- package/dist/api/brep-mirror/hullFns.js +2 -2
- package/dist/api/brep-mirror/hullFns.js.map +1 -1
- package/dist/api/brep-mirror/patternFns.d.ts +5 -5
- package/dist/api/brep-mirror/patternFns.js +10 -10
- package/dist/api/brep-mirror/patternFns.js.map +1 -1
- package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
- package/dist/api/brep-mirror/primitiveFns.js +4 -4
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
- package/dist/api/brep-mirror/roofFns.d.ts +3 -3
- package/dist/api/brep-mirror/roofFns.js +7 -7
- package/dist/api/brep-mirror/roofFns.js.map +1 -1
- package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
- package/dist/api/brep-mirror/sweepFns.js +14 -14
- package/dist/api/brep-mirror/sweepFns.js.map +1 -1
- package/dist/api/brep-mirror/threadFns.d.ts +1 -1
- package/dist/api/brep-mirror/threadFns.js +1 -1
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
- package/dist/api/brep-mirror/topologyFns.js +8 -8
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/brep-operations/booleanFns.d.ts +40 -0
- package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-operations/booleanFns.js +104 -0
- package/dist/api/brep-operations/booleanFns.js.map +1 -0
- package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
- package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-operations/brepHelpers.js +131 -0
- package/dist/api/brep-operations/brepHelpers.js.map +1 -0
- package/dist/api/brep-operations/compoundFns.d.ts +46 -0
- package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-operations/compoundFns.js +299 -0
- package/dist/api/brep-operations/compoundFns.js.map +1 -0
- package/dist/api/brep-operations/healingFns.d.ts +78 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +294 -0
- package/dist/api/brep-operations/healingFns.js.map +1 -0
- package/dist/api/brep-operations/hullFns.d.ts +20 -0
- package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
- package/dist/api/brep-operations/hullFns.js +46 -0
- package/dist/api/brep-operations/hullFns.js.map +1 -0
- package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
- package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
- package/dist/api/brep-operations/joinery-brep.js +463 -0
- package/dist/api/brep-operations/joinery-brep.js.map +1 -0
- package/dist/api/brep-operations/patternFns.d.ts +43 -0
- package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
- package/dist/api/brep-operations/patternFns.js +178 -0
- package/dist/api/brep-operations/patternFns.js.map +1 -0
- package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
- package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-operations/primitiveFns.js +104 -0
- package/dist/api/brep-operations/primitiveFns.js.map +1 -0
- package/dist/api/brep-operations/roofFns.d.ts +24 -0
- package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
- package/dist/api/brep-operations/roofFns.js +229 -0
- package/dist/api/brep-operations/roofFns.js.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.js +431 -0
- package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
- package/dist/api/brep-operations/sweepFns.d.ts +60 -0
- package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-operations/sweepFns.js +323 -0
- package/dist/api/brep-operations/sweepFns.js.map +1 -0
- package/dist/api/brep-operations/threadFns.d.ts +83 -0
- package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
- package/dist/api/brep-operations/threadFns.js +138 -0
- package/dist/api/brep-operations/threadFns.js.map +1 -0
- package/dist/api/brep-operations/topologyFns.d.ts +90 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +276 -0
- package/dist/api/brep-operations/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +1 -1
- package/dist/api/brep-topology.d.ts.map +1 -1
- package/dist/api/brep-topology.js +1 -1
- package/dist/api/brep-topology.js.map +1 -1
- package/dist/api/brepjs-compat/index.d.ts +1 -1
- package/dist/api/brepjs-compat/index.js +3 -3
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts +235 -0
- package/dist/api/curve-sketch/index.d.ts.map +1 -0
- package/dist/api/curve-sketch/index.js +487 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -2
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-brep.d.ts +41 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +58 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-stl.d.ts +50 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +99 -0
- package/dist/api/export-stl.js.map +1 -0
- package/dist/api/extrude.d.ts +8 -11
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +11 -14
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.js +2 -2
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +2 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +2 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +4 -0
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +4 -0
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/core.d.ts +4 -0
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +4 -0
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +4 -0
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +4 -0
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +4 -0
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +4 -0
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +4 -0
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +4 -0
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +21 -21
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +25 -21
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +4 -0
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +4 -0
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +32 -32
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +52 -48
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +4 -0
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +4 -0
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +4 -0
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +4 -0
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +2 -2
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +7 -3
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +4 -0
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +4 -0
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +45 -45
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +67 -63
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/generated/view.d.ts +4 -0
- package/dist/api/generated/view.d.ts.map +1 -1
- package/dist/api/generated/view.js +4 -0
- package/dist/api/generated/view.js.map +1 -1
- package/dist/api/geom-types/constants.d.ts +11 -0
- package/dist/api/geom-types/constants.d.ts.map +1 -0
- package/dist/api/geom-types/constants.js +11 -0
- package/dist/api/geom-types/constants.js.map +1 -0
- package/dist/api/geom-types/index.d.ts +21 -0
- package/dist/api/geom-types/index.d.ts.map +1 -0
- package/dist/api/geom-types/index.js +22 -0
- package/dist/api/geom-types/index.js.map +1 -0
- package/dist/api/geom-types/planeOps.d.ts +98 -0
- package/dist/api/geom-types/planeOps.d.ts.map +1 -0
- package/dist/api/geom-types/planeOps.js +170 -0
- package/dist/api/geom-types/planeOps.js.map +1 -0
- package/dist/api/geom-types/planeTypes.d.ts +24 -0
- package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
- package/dist/api/geom-types/planeTypes.js +8 -0
- package/dist/api/geom-types/planeTypes.js.map +1 -0
- package/dist/api/geom-types/types.d.ts +64 -0
- package/dist/api/geom-types/types.d.ts.map +1 -0
- package/dist/api/geom-types/types.js +48 -0
- package/dist/api/geom-types/types.js.map +1 -0
- package/dist/api/geom-types/vecOps.d.ts +124 -0
- package/dist/api/geom-types/vecOps.d.ts.map +1 -0
- package/dist/api/geom-types/vecOps.js +202 -0
- package/dist/api/geom-types/vecOps.js.map +1 -0
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +6 -5
- package/dist/api/geom.js.map +1 -1
- package/dist/api/half-space.d.ts +56 -0
- package/dist/api/half-space.d.ts.map +1 -0
- package/dist/api/half-space.js +82 -0
- package/dist/api/half-space.js.map +1 -0
- package/dist/api/helix.d.ts +10 -1
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -3
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +28 -0
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +19 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +31 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +4 -30
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -42
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +5 -5
- package/dist/api/internal/compat-projection.js +5 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/dual-form-args.d.ts +0 -2
- package/dist/api/internal/dual-form-args.d.ts.map +1 -1
- package/dist/api/internal/dual-form-args.js +1 -3
- package/dist/api/internal/dual-form-args.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +5 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +7 -76
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +1 -1
- package/dist/api/internal/profile-wire.js +1 -1
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/internal/result-unwrap.d.ts +4 -6
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +4 -6
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +5 -3
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +2 -2
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +2 -2
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +3 -3
- package/dist/api/measurement/index.js +3 -3
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/meta.d.ts +91 -0
- package/dist/api/meta.d.ts.map +1 -0
- package/dist/api/meta.js +97 -0
- package/dist/api/meta.js.map +1 -0
- package/dist/api/offset2d.d.ts +49 -0
- package/dist/api/offset2d.d.ts.map +1 -0
- package/dist/api/offset2d.js +86 -0
- package/dist/api/offset2d.js.map +1 -0
- package/dist/api/pattern.js +3 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +124 -8
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +2 -2
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +12 -12
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +1 -1
- package/dist/api/result.js +1 -1
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts +2 -2
- package/dist/api/revolve.js +3 -3
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +5 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +3 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/shape-type/index.d.ts +141 -0
- package/dist/api/shape-type/index.d.ts.map +1 -0
- package/dist/api/shape-type/index.js +182 -0
- package/dist/api/shape-type/index.js.map +1 -0
- package/dist/api/shell.d.ts +2 -2
- package/dist/api/shell.js +2 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/solid-from-faces.d.ts +45 -0
- package/dist/api/solid-from-faces.d.ts.map +1 -0
- package/dist/api/solid-from-faces.js +72 -0
- package/dist/api/solid-from-faces.js.map +1 -0
- package/dist/api/solid-offset/index.d.ts +67 -0
- package/dist/api/solid-offset/index.d.ts.map +1 -0
- package/dist/api/solid-offset/index.js +132 -0
- package/dist/api/solid-offset/index.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +35 -33
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +222 -224
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface-face/index.d.ts +104 -0
- package/dist/api/surface-face/index.d.ts.map +1 -0
- package/dist/api/surface-face/index.js +217 -0
- package/dist/api/surface-face/index.js.map +1 -0
- package/dist/api/surface.d.ts +44 -0
- package/dist/api/surface.d.ts.map +1 -0
- package/dist/api/surface.js +66 -0
- package/dist/api/surface.js.map +1 -0
- package/dist/api/sweep.d.ts +59 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +11 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +11 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +1 -1
- package/dist/api/view/cameraFns.d.ts.map +1 -1
- package/dist/api/view/cameraFns.js +1 -1
- package/dist/api/view/cameraFns.js.map +1 -1
- package/dist/api/view/index.d.ts +0 -2
- package/dist/api/view/index.d.ts.map +1 -1
- package/dist/api/view/index.js +0 -2
- package/dist/api/view/index.js.map +1 -1
- package/dist/api/view/projectionPlanes.d.ts +1 -1
- package/dist/api/view/projectionPlanes.d.ts.map +1 -1
- package/dist/api/view/projectionPlanes.js.map +1 -1
- package/dist/api/view/view-camera.d.ts +7 -9
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +4 -6
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +0 -2
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +0 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/view/view-sheet.d.ts +0 -2
- package/dist/api/view/view-sheet.d.ts.map +1 -1
- package/dist/api/view/view-sheet.js +0 -2
- package/dist/api/view/view-sheet.js.map +1 -1
- package/dist/api/view-export/index.d.ts +97 -0
- package/dist/api/view-export/index.d.ts.map +1 -0
- package/dist/api/view-export/index.js +118 -0
- package/dist/api/view-export/index.js.map +1 -0
- package/dist/brep/brep-ops.d.ts +89 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +204 -13
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +20 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +46 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.js +8 -8
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +2 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -2
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +2 -2
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +40 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +268 -25
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-meta-header.d.ts +102 -0
- package/dist/brep/export/step-meta-header.d.ts.map +1 -0
- package/dist/brep/export/step-meta-header.js +225 -0
- package/dist/brep/export/step-meta-header.js.map +1 -0
- package/dist/brep/export/step.d.ts +5 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +11 -2
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +2 -2
- package/dist/brep/handle-bridge.js +2 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/index.d.ts +6 -3
- package/dist/brep/index.d.ts.map +1 -1
- package/dist/brep/index.js +6 -3
- package/dist/brep/index.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +2 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -4
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +3 -9
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +12 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +6 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +31 -9
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +1 -1
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-id.d.ts +0 -2
- package/dist/cad-runtime/lib-id.d.ts.map +1 -1
- package/dist/cad-runtime/lib-id.js +0 -2
- package/dist/cad-runtime/lib-id.js.map +1 -1
- package/dist/cad-runtime/live-shapes.d.ts +3 -5
- package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
- package/dist/cad-runtime/live-shapes.js +8 -10
- package/dist/cad-runtime/live-shapes.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +21 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +45 -6
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +4 -3
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +65 -3
- package/dist/define-op.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +1 -1
- package/dist/geometry2d/bridge/plane.js +1 -1
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +1 -1
- package/dist/geometry2d/curve2d.js +1 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/io/fai-zip/container-read.d.ts +16 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -1
- package/dist/io/fai-zip/container-read.js +22 -0
- package/dist/io/fai-zip/container-read.js.map +1 -1
- package/dist/io/fai-zip/index.d.ts +1 -1
- package/dist/io/fai-zip/index.d.ts.map +1 -1
- package/dist/io/fai-zip/index.js +1 -1
- package/dist/io/fai-zip/index.js.map +1 -1
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +10 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +22 -9
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +27 -6
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +90 -29
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +4 -0
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +27 -2
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +29 -2
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/source-edit.d.ts +2 -2
- package/dist/lang/source-edit.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +36 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +36 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/types.d.ts +5 -6
- package/dist/lang/types.d.ts.map +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/import-model.d.ts +94 -0
- package/dist/mesh/import-model.d.ts.map +1 -0
- package/dist/mesh/import-model.js +15 -0
- package/dist/mesh/import-model.js.map +1 -0
- package/dist/mesh/index.d.ts +19 -58
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -70
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +39 -16
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +151 -22
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +42 -7
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/threemf-bambu.d.ts +12 -1
- package/dist/mesh/threemf-bambu.d.ts.map +1 -1
- package/dist/mesh/threemf-bambu.js +68 -16
- package/dist/mesh/threemf-bambu.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +37 -1
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +205 -14
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/transform.d.ts +1 -1
- package/dist/mesh/transform.js +1 -1
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +43 -5
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +49 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +125 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +55 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +46 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
- package/dist/occt-kernel/highLevelApi.d.ts +4 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +4 -2
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +2 -2
- package/dist/occt-kernel/hullGeometry.js +2 -3
- package/dist/occt-kernel/hullGeometry.js.map +1 -1
- package/dist/occt-kernel/hullOps.d.ts +3 -3
- package/dist/occt-kernel/hullOps.js +4 -4
- package/dist/occt-kernel/hullOps.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +32 -5
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +19 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
- package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
- package/dist/occt-kernel/stepMetaParser.js +166 -0
- package/dist/occt-kernel/stepMetaParser.js.map +1 -0
- package/dist/occt-scan/recognize.d.ts +58 -0
- package/dist/occt-scan/recognize.d.ts.map +1 -0
- package/dist/occt-scan/recognize.js +216 -0
- package/dist/occt-scan/recognize.js.map +1 -0
- package/dist/primitives/brep-primitives.js +7 -7
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +1 -1
- package/dist/result/bug.js +1 -1
- package/dist/result/bug.js.map +1 -1
- package/dist/result/errors.d.ts +2 -2
- package/dist/result/errors.d.ts.map +1 -1
- package/dist/result/errors.js +1 -1
- package/dist/result/errors.js.map +1 -1
- package/dist/result/vec3.d.ts +1 -1
- package/dist/result/vec3.js +1 -1
- package/dist/result/vec3.js.map +1 -1
- package/dist/runtime-state.d.ts +16 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +27 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/script-globals.d.ts +24 -0
- package/dist/script-globals.d.ts.map +1 -0
- package/dist/script-globals.js +24 -0
- package/dist/script-globals.js.map +1 -0
- package/dist/shape.d.ts +35 -3
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +44 -2
- package/dist/shape.js.map +1 -1
- package/dist/step/stepMetaParser.d.ts +55 -0
- package/dist/step/stepMetaParser.d.ts.map +1 -0
- package/dist/step/stepMetaParser.js +177 -0
- package/dist/step/stepMetaParser.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +3 -2
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +9 -11
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STEP 元数据解析器 — 从 STEP (P21) 文本头部与 PRODUCT 层提取
|
|
3
|
+
* FileMeta(文件级)与 ShapeMeta(零件级描述字/料号)。
|
|
4
|
+
*
|
|
5
|
+
* 与 stepColorParser 同一原则:纯文本扫描,不依赖 OCCT 内核(XCAF label 层
|
|
6
|
+
* 是否暴露 description/属性不确定,见设计文档 2026-10-05-meta §6.3 风险 2)。
|
|
7
|
+
*
|
|
8
|
+
* 读取面映射(§3.3):
|
|
9
|
+
* - HEADER FILE_NAME(name,time_stamp,author,organization,preprocessor,originator)
|
|
10
|
+
* → title / creationDate / author / organization / application / designer。
|
|
11
|
+
* - HEADER FILE_DESCRIPTION(...) → description(逗号拼接,去首尾引号)。
|
|
12
|
+
* - DATA PRODUCT(name,description,frame)(第一个、leaf 使用的)→ 零件 description。
|
|
13
|
+
* name 已由 OCCT label 提供(不在本解析器处理)。
|
|
14
|
+
* - PRODUCT → PRODUCT_DEFINITION_FORMATION/WITH_SPECIFIED_SOURCE-关联的料号通道:
|
|
15
|
+
* PART_NUMBER_PROPERTY/IDENTIFICATION 命名在 §3.3 表里列出的 PART 层通道(P4
|
|
16
|
+
* 标 "IDENTIFICATION 内核支持" 待实测),这里尽量从 PRODUCT_DEFINITION 挂的
|
|
17
|
+
* UDA(GENERAL_PROPERTY + PROPERTY_DEFINITION)捞自定义属性。
|
|
18
|
+
*
|
|
19
|
+
* 所有扫描都容错:找不到就不给对应字段,绝不让解析器抛(信息性收益)。
|
|
20
|
+
*/
|
|
21
|
+
/** 剥离一层引号(STEP 字符串形如 `'abc'`),出双引号化转义;去末尾换行。 */
|
|
22
|
+
function unquote(s) {
|
|
23
|
+
const t = s.trim();
|
|
24
|
+
if (t.startsWith("'") && t.endsWith("'"))
|
|
25
|
+
return t.slice(1, -1);
|
|
26
|
+
return t;
|
|
27
|
+
}
|
|
28
|
+
/** 任一 `HEADER`/`DATA` 段中的实体文本(多行),从 header 段中取整行。 */
|
|
29
|
+
function headerLines(text) {
|
|
30
|
+
const m = /HEADER;\n([\s\S]*?)\nENDSEC;/.exec(text);
|
|
31
|
+
return m ? m[1] : '';
|
|
32
|
+
}
|
|
33
|
+
/** `TYPE(...)` 实体块捕获:从开括号起做括号配平扫描到闭合(容错 LIST/嵌套)。 */
|
|
34
|
+
function entityBlock(text, type) {
|
|
35
|
+
const re = new RegExp(`${type}\\s*\\(`, 'g');
|
|
36
|
+
let m;
|
|
37
|
+
while ((m = re.exec(text)) !== null) {
|
|
38
|
+
let depth = 0;
|
|
39
|
+
let inQuote = false;
|
|
40
|
+
let i = m.index + m[0].length - 1; // 停在开括号
|
|
41
|
+
for (; i < text.length; i++) {
|
|
42
|
+
const c = text[i];
|
|
43
|
+
if (c === "'")
|
|
44
|
+
inQuote = !inQuote;
|
|
45
|
+
if (inQuote)
|
|
46
|
+
continue;
|
|
47
|
+
if (c === '(')
|
|
48
|
+
depth++;
|
|
49
|
+
else if (c === ')') {
|
|
50
|
+
depth--;
|
|
51
|
+
if (depth === 0)
|
|
52
|
+
return text.slice(m.index, i + 1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
/** 逗号分隔的顶层简单参数(忽略嵌套括号内容仍按逗号简单切——够用即可)。 */
|
|
59
|
+
function splitTopLevel(body) {
|
|
60
|
+
// 剥离外层括号后,按未被引号包裹的逗号切分(不处理嵌套括号——STEP 伙伴级
|
|
61
|
+
// FILE_NAME/FILE_DESCRIPTION 参数都是简单标量/字符串,不涉及深层嵌套)。
|
|
62
|
+
const s = body.slice(body.indexOf('(') + 1, body.lastIndexOf(')'));
|
|
63
|
+
const parts = [];
|
|
64
|
+
let cur = '';
|
|
65
|
+
let inQuote = false;
|
|
66
|
+
for (let i = 0; i < s.length; i++) {
|
|
67
|
+
const c = s[i];
|
|
68
|
+
if (c === "'")
|
|
69
|
+
inQuote = !inQuote;
|
|
70
|
+
if (c === ',' && !inQuote) {
|
|
71
|
+
parts.push(cur);
|
|
72
|
+
cur = '';
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
cur += c;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
parts.push(cur);
|
|
79
|
+
return parts.map((p) => p.trim());
|
|
80
|
+
}
|
|
81
|
+
/** Header 段整块(FILE_NAME / FILE_DESCRIPTION / FILE_SCHEMA)→ FileMeta。 */
|
|
82
|
+
export function parseStepHeaderMeta(text) {
|
|
83
|
+
const meta = {};
|
|
84
|
+
const header = headerLines(text);
|
|
85
|
+
if (!header)
|
|
86
|
+
return meta;
|
|
87
|
+
const fileBlock = entityBlock(header, 'FILE_NAME');
|
|
88
|
+
if (fileBlock) {
|
|
89
|
+
const parts = splitTopLevel(fileBlock);
|
|
90
|
+
// FILE_NAME(name, time_stamp, author(list), organization(list), preprocessor, originator)
|
|
91
|
+
// 引号数组形如 `('x')`,去首尾括号后 unquote;author/organization 可能为列表。
|
|
92
|
+
const inline = (p) => {
|
|
93
|
+
if (!p)
|
|
94
|
+
return undefined;
|
|
95
|
+
const v = unquote(p.replace(/^\(|\)$/g, ''));
|
|
96
|
+
return v === '' ? undefined : v;
|
|
97
|
+
};
|
|
98
|
+
const title = inline(parts[0]);
|
|
99
|
+
if (title)
|
|
100
|
+
meta.title = title;
|
|
101
|
+
const cdate = inline(parts[1]);
|
|
102
|
+
if (cdate)
|
|
103
|
+
meta.creationDate = cdate;
|
|
104
|
+
const author = inline(parts[2] ?? '');
|
|
105
|
+
if (author)
|
|
106
|
+
meta.author = author;
|
|
107
|
+
const org = inline(parts[3] ?? '');
|
|
108
|
+
if (org)
|
|
109
|
+
meta.organization = org;
|
|
110
|
+
// preprocessor → application(编辑器导入后端把 preprocessor 视为 APP);
|
|
111
|
+
// originator → designer。
|
|
112
|
+
const pre = inline(parts[4] ?? '');
|
|
113
|
+
if (pre)
|
|
114
|
+
meta.application = pre;
|
|
115
|
+
const origin = inline(parts[5] ?? '');
|
|
116
|
+
if (origin)
|
|
117
|
+
meta.designer = origin;
|
|
118
|
+
}
|
|
119
|
+
const descBlock = entityBlock(header, 'FILE_DESCRIPTION');
|
|
120
|
+
if (descBlock) {
|
|
121
|
+
// FILE_DESCRIPTION(description_list, implementation_context):描述只取第一个
|
|
122
|
+
// 顶层参数(描述串列表,`('a','b')` 形态含内层逗号);实现上下文不算。
|
|
123
|
+
// 直接取 `FILE_DESCRIPTION((…),` 里第一层括号内的引号字符串列表。
|
|
124
|
+
const m = /FILE_DESCRIPTION\s*\(\s*\((.*?)\)\s*,\s*/.exec(descBlock);
|
|
125
|
+
if (m) {
|
|
126
|
+
const joined = m[1]
|
|
127
|
+
.split(',')
|
|
128
|
+
.map((p) => unquote(p.trim()))
|
|
129
|
+
.filter((v) => v !== '');
|
|
130
|
+
if (joined.length > 0)
|
|
131
|
+
meta.description = joined.join(', ');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return meta;
|
|
135
|
+
}
|
|
136
|
+
/** 伙伴层 PRODUCT 描述 + 根相关字段解析(简化:只取第一个 PRODUCT)。 */
|
|
137
|
+
export function parseStepPartMeta(text) {
|
|
138
|
+
const out = {};
|
|
139
|
+
// 逐 PRODUCT 取 description(第 2 个参数)。
|
|
140
|
+
const dataRe = /PRODUCT\s*\(/g;
|
|
141
|
+
let m;
|
|
142
|
+
while ((m = dataRe.exec(text)) !== null) {
|
|
143
|
+
const close = text.indexOf(')', m.index);
|
|
144
|
+
if (close < 0)
|
|
145
|
+
break;
|
|
146
|
+
const inner = text.slice(m.index, close + 1);
|
|
147
|
+
const descM = /,\s*'([^']*)'/.exec(inner);
|
|
148
|
+
if (descM) {
|
|
149
|
+
const d = descM[1];
|
|
150
|
+
if (d !== '')
|
|
151
|
+
out.description = d;
|
|
152
|
+
break; // 只取第一个
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// 属性笼(UDA:GENERAL_PROPERTY('name', value?) 挂在 PROPERTY_DEFINITION 上)。
|
|
156
|
+
const props = {};
|
|
157
|
+
const gpRe = /GENERAL_PROPERTY\s*\(\s*'([^']*)'\s*,\s*([^,)]+)/g;
|
|
158
|
+
let gm;
|
|
159
|
+
while ((gm = gpRe.exec(text)) !== null) {
|
|
160
|
+
props[gm[1]] = unquote(gm[2]);
|
|
161
|
+
}
|
|
162
|
+
if (Object.keys(props).length > 0)
|
|
163
|
+
out.metadata = props;
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=stepMetaParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepMetaParser.js","sourceRoot":"","sources":["../../src/occt-kernel/stepMetaParser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * STEP 元数据解析器 — 从 STEP (P21) 文本头部与 PRODUCT 层提取\n * FileMeta(文件级)与 ShapeMeta(零件级描述字/料号)。\n *\n * 与 stepColorParser 同一原则:纯文本扫描,不依赖 OCCT 内核(XCAF label 层\n * 是否暴露 description/属性不确定,见设计文档 2026-10-05-meta §6.3 风险 2)。\n *\n * 读取面映射(§3.3):\n * - HEADER FILE_NAME(name,time_stamp,author,organization,preprocessor,originator)\n * → title / creationDate / author / organization / application / designer。\n * - HEADER FILE_DESCRIPTION(...) → description(逗号拼接,去首尾引号)。\n * - DATA PRODUCT(name,description,frame)(第一个、leaf 使用的)→ 零件 description。\n * name 已由 OCCT label 提供(不在本解析器处理)。\n * - PRODUCT → PRODUCT_DEFINITION_FORMATION/WITH_SPECIFIED_SOURCE-关联的料号通道:\n * PART_NUMBER_PROPERTY/IDENTIFICATION 命名在 §3.3 表里列出的 PART 层通道(P4\n * 标 \"IDENTIFICATION 内核支持\" 待实测),这里尽量从 PRODUCT_DEFINITION 挂的\n * UDA(GENERAL_PROPERTY + PROPERTY_DEFINITION)捞自定义属性。\n *\n * 所有扫描都容错:找不到就不给对应字段,绝不让解析器抛(信息性收益)。\n */\n\n/** Header 级人物贡献字段(FILE_NAME 组内的三四五参数)。 */\nexport interface StepFileMeta {\n title?: string\n creationDate?: string\n designer?: string\n author?: string\n organization?: string\n application?: string\n description?: string\n /** 自定义 FILE_DESCRIPTION/FILE_NAME 之外的 vendor 属性(metadata 笼)。 */\n metadata?: Record<string, string>\n}\n\n/** STEP 伙伴级 P21 解析出的轻量属性。 */\nexport interface StepPartMeta {\n /** 产品描述(PRODUCT( ..., description, id ))。空串/缺省不设。 */\n description?: string\n /** 自定义属性:`PROPERTY_DEFINITION(...)` + `GENERAL_PROPERTY('name', value, ...)`。 */\n metadata?: Record<string, string>\n}\n\n/** 剥离一层引号(STEP 字符串形如 `'abc'`),出双引号化转义;去末尾换行。 */\nfunction unquote(s: string): string {\n const t = s.trim()\n if (t.startsWith(\"'\") && t.endsWith(\"'\")) return t.slice(1, -1)\n return t\n}\n\n/** 任一 `HEADER`/`DATA` 段中的实体文本(多行),从 header 段中取整行。 */\nfunction headerLines(text: string): string {\n const m = /HEADER;\\n([\\s\\S]*?)\\nENDSEC;/.exec(text)\n return m ? m[1] : ''\n}\n\n/** `TYPE(...)` 实体块捕获:从开括号起做括号配平扫描到闭合(容错 LIST/嵌套)。 */\nfunction entityBlock(text: string, type: string): string | undefined {\n const re = new RegExp(`${type}\\\\s*\\\\(`, 'g')\n let m: RegExpExecArray | null\n while ((m = re.exec(text)) !== null) {\n let depth = 0\n let inQuote = false\n let i = m.index + m[0].length - 1 // 停在开括号\n for (; i < text.length; i++) {\n const c = text[i]\n if (c === \"'\") inQuote = !inQuote\n if (inQuote) continue\n if (c === '(') depth++\n else if (c === ')') {\n depth--\n if (depth === 0) return text.slice(m.index, i + 1)\n }\n }\n }\n return undefined\n}\n\n/** 逗号分隔的顶层简单参数(忽略嵌套括号内容仍按逗号简单切——够用即可)。 */\nfunction splitTopLevel(body: string): string[] {\n // 剥离外层括号后,按未被引号包裹的逗号切分(不处理嵌套括号——STEP 伙伴级\n // FILE_NAME/FILE_DESCRIPTION 参数都是简单标量/字符串,不涉及深层嵌套)。\n const s = body.slice(body.indexOf('(') + 1, body.lastIndexOf(')'))\n const parts: string[] = []\n let cur = ''\n let inQuote = false\n for (let i = 0; i < s.length; i++) {\n const c = s[i]\n if (c === \"'\") inQuote = !inQuote\n if (c === ',' && !inQuote) {\n parts.push(cur)\n cur = ''\n } else {\n cur += c\n }\n }\n parts.push(cur)\n return parts.map((p) => p.trim())\n}\n\n/** Header 段整块(FILE_NAME / FILE_DESCRIPTION / FILE_SCHEMA)→ FileMeta。 */\nexport function parseStepHeaderMeta(text: string): StepFileMeta {\n const meta: StepFileMeta = {}\n const header = headerLines(text)\n if (!header) return meta\n\n const fileBlock = entityBlock(header, 'FILE_NAME')\n if (fileBlock) {\n const parts = splitTopLevel(fileBlock)\n // FILE_NAME(name, time_stamp, author(list), organization(list), preprocessor, originator)\n // 引号数组形如 `('x')`,去首尾括号后 unquote;author/organization 可能为列表。\n const inline = (p: string): string | undefined => {\n if (!p) return undefined\n const v = unquote(p.replace(/^\\(|\\)$/g, ''))\n return v === '' ? undefined : v\n }\n const title = inline(parts[0])\n if (title) meta.title = title\n const cdate = inline(parts[1])\n if (cdate) meta.creationDate = cdate\n const author = inline(parts[2] ?? '')\n if (author) meta.author = author\n const org = inline(parts[3] ?? '')\n if (org) meta.organization = org\n // preprocessor → application(编辑器导入后端把 preprocessor 视为 APP);\n // originator → designer。\n const pre = inline(parts[4] ?? '')\n if (pre) meta.application = pre\n const origin = inline(parts[5] ?? '')\n if (origin) meta.designer = origin\n }\n\n const descBlock = entityBlock(header, 'FILE_DESCRIPTION')\n if (descBlock) {\n // FILE_DESCRIPTION(description_list, implementation_context):描述只取第一个\n // 顶层参数(描述串列表,`('a','b')` 形态含内层逗号);实现上下文不算。\n // 直接取 `FILE_DESCRIPTION((…),` 里第一层括号内的引号字符串列表。\n const m = /FILE_DESCRIPTION\\s*\\(\\s*\\((.*?)\\)\\s*,\\s*/.exec(descBlock)\n if (m) {\n const joined = m[1]\n .split(',')\n .map((p) => unquote(p.trim()))\n .filter((v) => v !== '')\n if (joined.length > 0) meta.description = joined.join(', ')\n }\n }\n\n return meta\n}\n\n/** 伙伴层 PRODUCT 描述 + 根相关字段解析(简化:只取第一个 PRODUCT)。 */\nexport function parseStepPartMeta(text: string): StepPartMeta {\n const out: StepPartMeta = {}\n // 逐 PRODUCT 取 description(第 2 个参数)。\n const dataRe = /PRODUCT\\s*\\(/g\n let m: RegExpExecArray | null\n while ((m = dataRe.exec(text)) !== null) {\n const close = text.indexOf(')', m.index)\n if (close < 0) break\n const inner = text.slice(m.index, close + 1)\n const descM = /,\\s*'([^']*)'/.exec(inner)\n if (descM) {\n const d = descM[1]\n if (d !== '') out.description = d\n break // 只取第一个\n }\n }\n // 属性笼(UDA:GENERAL_PROPERTY('name', value?) 挂在 PROPERTY_DEFINITION 上)。\n const props: Record<string, string> = {}\n const gpRe = /GENERAL_PROPERTY\\s*\\(\\s*'([^']*)'\\s*,\\s*([^,)]+)/g\n let gm: RegExpExecArray | null\n while ((gm = gpRe.exec(text)) !== null) {\n props[gm[1]] = unquote(gm[2])\n }\n if (Object.keys(props).length > 0) out.metadata = props\n return out\n}"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal — occt-scan 识别层(仅供 `scripts/scan-occt-op-coverage.ts` 与回归测试使用,
|
|
3
|
+
* 不是 faijs 公开 API,勿从业务代码 import)。
|
|
4
|
+
*
|
|
5
|
+
* 识别「occt 原生内核直调」的源码分析。判据(方案 §7.2 缺陷 1 + §7.5 陷阱 1):
|
|
6
|
+
* 只有从 `getOcctKernel()` / `getKernel()` / `initOcctWasm()` 拿到的变量才是 occt 原生
|
|
7
|
+
* 句柄;`const kernel = getBrepApi()`(L1 契约句柄)的调用**不**算 occt 直调——把它的
|
|
8
|
+
* 方法调用算进去会把中立 op 全误判成平台 op。
|
|
9
|
+
*
|
|
10
|
+
* 用 TypeScript AST(ts.createSourceFile)做语法层分析,按符号声明位置判定,能穿透
|
|
11
|
+
* §7.2 要求的三类形态(正则在此处两头都错,见方案):
|
|
12
|
+
* - `const x = <handle>.<m>.bind(k)` → x(...) 与绑定点的 `<m>` 都计入
|
|
13
|
+
* - `(<cast>).<m>.call(k, ...)` → `<m>` 计入
|
|
14
|
+
* - `const { m } = <handle>` 解构 → 别名 m(...) 调用计入
|
|
15
|
+
* 以及最普通 `<handle>.<m>(...)` 链式直调。
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* 收集文件里「持有 occt 内核」的标识符集合。
|
|
19
|
+
*
|
|
20
|
+
* - 直接获取:`const k = getOcctKernel()` / `await initOcctWasm()` / `getKernel()`。
|
|
21
|
+
* - 派生别名不动点:`const raw = k as unknown as T` 等其初始化式判定为内核派生者的
|
|
22
|
+
* 局部 const 也收为内核标识(覆盖层层 cast/别名)。
|
|
23
|
+
*
|
|
24
|
+
* 注意:`getBrepApi()` 不在内核获取器之列,故 `const kernel = getBrepApi()` 的 `kernel`
|
|
25
|
+
* 不会进入返回值——§7.5 陷阱 1 的防线。
|
|
26
|
+
*
|
|
27
|
+
* @param src 待扫描的 TS 源码文本。
|
|
28
|
+
* @returns 内核标识符(变量名)集合,按字典序排列。
|
|
29
|
+
*/
|
|
30
|
+
export declare function kernelIdentifiers(src: string): Set<string>;
|
|
31
|
+
/**
|
|
32
|
+
* 收集「方法别名」:把 occt 方法绑定/解构到局部变量后,后续 `alias(...)` 调用要还原
|
|
33
|
+
* 成底层方法名。形态:
|
|
34
|
+
* - `const x = <内核值>.<m>.bind(k)` → x ⇒ m(覆盖 `raw.linearPattern.bind(k)` 后 `nativeLP(...)`)
|
|
35
|
+
* - `const { m } = <内核值>` / `{ m: mm }` → m ⇒ m / mm ⇒ m(解构)
|
|
36
|
+
* 只认内核派生基;`kernel = getBrepApi()` 的 .m 不作数(§7.5 陷阱 1)。
|
|
37
|
+
*
|
|
38
|
+
* @param src 待扫描的 TS 源码文本。
|
|
39
|
+
* @param kernelIds 内核标识符集合(来自 {@link kernelIdentifiers})。
|
|
40
|
+
* @returns 别名 → 底层 occt 方法名的映射。
|
|
41
|
+
*/
|
|
42
|
+
export declare function methodAliases(src: string, kernelIds: Set<string>): Map<string, string>;
|
|
43
|
+
/**
|
|
44
|
+
* 返回 src 里被调用的、基类是内核派生的 occt 方法名(与 occtNames 交集)。
|
|
45
|
+
*
|
|
46
|
+
* 覆盖形态(§7.2 缺陷 1):
|
|
47
|
+
* - `<k>.method(` 普通直调(k 为内核标识)
|
|
48
|
+
* - `getOcctKernel().method(...)` 链式(调用表达式基即内核)→ 属性访问基命中
|
|
49
|
+
* - `raw.method.bind(k)` / `(<cast>).m.call(k,…)` 绑定点属性访问把 `<m>` 计入
|
|
50
|
+
* - `const x = k.m.bind(...); x(...)` const 绑定别名调用
|
|
51
|
+
* - `const { m } = k; m(...)` 解构别名调用
|
|
52
|
+
*
|
|
53
|
+
* @param src 待扫描的 TS 源码文本。
|
|
54
|
+
* @param occtNames occt 方法名全集(用于交集过滤)。
|
|
55
|
+
* @returns 被调用的 occt 方法名集合。
|
|
56
|
+
*/
|
|
57
|
+
export declare function kernelCallsIn(src: string, occtNames: Set<string>): Set<string>;
|
|
58
|
+
//# sourceMappingURL=recognize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognize.d.ts","sourceRoot":"","sources":["../../src/occt-scan/recognize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA8DH;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CA8B1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmCtF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CA2B9E"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal — occt-scan 识别层(仅供 `scripts/scan-occt-op-coverage.ts` 与回归测试使用,
|
|
3
|
+
* 不是 faijs 公开 API,勿从业务代码 import)。
|
|
4
|
+
*
|
|
5
|
+
* 识别「occt 原生内核直调」的源码分析。判据(方案 §7.2 缺陷 1 + §7.5 陷阱 1):
|
|
6
|
+
* 只有从 `getOcctKernel()` / `getKernel()` / `initOcctWasm()` 拿到的变量才是 occt 原生
|
|
7
|
+
* 句柄;`const kernel = getBrepApi()`(L1 契约句柄)的调用**不**算 occt 直调——把它的
|
|
8
|
+
* 方法调用算进去会把中立 op 全误判成平台 op。
|
|
9
|
+
*
|
|
10
|
+
* 用 TypeScript AST(ts.createSourceFile)做语法层分析,按符号声明位置判定,能穿透
|
|
11
|
+
* §7.2 要求的三类形态(正则在此处两头都错,见方案):
|
|
12
|
+
* - `const x = <handle>.<m>.bind(k)` → x(...) 与绑定点的 `<m>` 都计入
|
|
13
|
+
* - `(<cast>).<m>.call(k, ...)` → `<m>` 计入
|
|
14
|
+
* - `const { m } = <handle>` 解构 → 别名 m(...) 调用计入
|
|
15
|
+
* 以及最普通 `<handle>.<m>(...)` 链式直调。
|
|
16
|
+
*/
|
|
17
|
+
import ts from 'typescript';
|
|
18
|
+
/** 返回函数调用表达式的被调用名(裸标识符或属性名),否则 null。 */
|
|
19
|
+
function calleeName(callee) {
|
|
20
|
+
if (!callee)
|
|
21
|
+
return null;
|
|
22
|
+
if (ts.isIdentifier(callee))
|
|
23
|
+
return callee.text;
|
|
24
|
+
if (ts.isPropertyAccessExpression(callee))
|
|
25
|
+
return callee.name.text;
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/** 去掉括号/类型断言/`as`/`!`/`satisfies`,拿到最内层表达式。 */
|
|
29
|
+
function unwrap(n) {
|
|
30
|
+
let x = n;
|
|
31
|
+
for (;;) {
|
|
32
|
+
if (ts.isParenthesizedExpression(x))
|
|
33
|
+
x = x.expression;
|
|
34
|
+
else if (ts.isAsExpression(x))
|
|
35
|
+
x = x.expression;
|
|
36
|
+
else if (ts.isTypeAssertionExpression(x))
|
|
37
|
+
x = x.expression;
|
|
38
|
+
else if (ts.isNonNullExpression(x))
|
|
39
|
+
x = x.expression;
|
|
40
|
+
else if (ts.isSatisfiesExpression?.(x)) {
|
|
41
|
+
x = x.expression;
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
return x;
|
|
47
|
+
}
|
|
48
|
+
function makeIsKernel(kernelIds) {
|
|
49
|
+
return (e) => {
|
|
50
|
+
const u = unwrap(e);
|
|
51
|
+
if (ts.isIdentifier(u))
|
|
52
|
+
return kernelIds.has(u.text);
|
|
53
|
+
if (ts.isCallExpression(u)) {
|
|
54
|
+
const nm = calleeName(u.expression);
|
|
55
|
+
return nm === 'getOcctKernel' || nm === 'getKernel' || nm === 'initOcctWasm';
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** 绑定模式里导出的名字。 */
|
|
61
|
+
function bindingNames(name) {
|
|
62
|
+
if (ts.isIdentifier(name))
|
|
63
|
+
return [name.text];
|
|
64
|
+
const out = [];
|
|
65
|
+
if (ts.isObjectBindingPattern(name)) {
|
|
66
|
+
for (const el of name.elements) {
|
|
67
|
+
if (ts.isBindingElement(el)) {
|
|
68
|
+
const prop = el.propertyName ? el.propertyName.getText() : el.name.getText();
|
|
69
|
+
out.push(prop);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (ts.isArrayBindingPattern(name)) {
|
|
74
|
+
for (const el of name.elements) {
|
|
75
|
+
if (ts.isBindingElement(el) && ts.isIdentifier(el.name))
|
|
76
|
+
out.push(el.name.text);
|
|
77
|
+
else if (ts.isBindingElement(el))
|
|
78
|
+
out.push(...bindingNames(el.name));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 收集文件里「持有 occt 内核」的标识符集合。
|
|
85
|
+
*
|
|
86
|
+
* - 直接获取:`const k = getOcctKernel()` / `await initOcctWasm()` / `getKernel()`。
|
|
87
|
+
* - 派生别名不动点:`const raw = k as unknown as T` 等其初始化式判定为内核派生者的
|
|
88
|
+
* 局部 const 也收为内核标识(覆盖层层 cast/别名)。
|
|
89
|
+
*
|
|
90
|
+
* 注意:`getBrepApi()` 不在内核获取器之列,故 `const kernel = getBrepApi()` 的 `kernel`
|
|
91
|
+
* 不会进入返回值——§7.5 陷阱 1 的防线。
|
|
92
|
+
*
|
|
93
|
+
* @param src 待扫描的 TS 源码文本。
|
|
94
|
+
* @returns 内核标识符(变量名)集合,按字典序排列。
|
|
95
|
+
*/
|
|
96
|
+
export function kernelIdentifiers(src) {
|
|
97
|
+
const sf = ts.createSourceFile('recognize.ts', src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
98
|
+
const KERNEL_ACQUIRE = /(?:const|let|var)\s+([A-Za-z_$][\w$]*)[^;=\n]*?=\s*(?:await\s+)?[^;\n]*(?:getOcctKernel|getKernel|initOcctWasm)\s*\(\s*\)/g;
|
|
99
|
+
const kernelIds = new Set();
|
|
100
|
+
KERNEL_ACQUIRE.lastIndex = 0;
|
|
101
|
+
for (let m = KERNEL_ACQUIRE.exec(src); m; m = KERNEL_ACQUIRE.exec(src))
|
|
102
|
+
kernelIds.add(m[1]);
|
|
103
|
+
// 收集文件内所有变声明的「名 → 初始化式」。
|
|
104
|
+
const initByVar = new Map();
|
|
105
|
+
(function collect(n) {
|
|
106
|
+
if (ts.isVariableDeclaration(n) && n.initializer) {
|
|
107
|
+
for (const nm of bindingNames(n.name))
|
|
108
|
+
initByVar.set(nm, n.initializer);
|
|
109
|
+
}
|
|
110
|
+
ts.forEachChild(n, collect);
|
|
111
|
+
})(sf);
|
|
112
|
+
const isKernelInDecl = makeIsKernel(kernelIds);
|
|
113
|
+
let changed = true;
|
|
114
|
+
while (changed) {
|
|
115
|
+
changed = false;
|
|
116
|
+
for (const [name, init] of initByVar) {
|
|
117
|
+
if (!kernelIds.has(name) && isKernelInDecl(init)) {
|
|
118
|
+
kernelIds.add(name);
|
|
119
|
+
changed = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return new Set([...kernelIds].sort());
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 收集「方法别名」:把 occt 方法绑定/解构到局部变量后,后续 `alias(...)` 调用要还原
|
|
127
|
+
* 成底层方法名。形态:
|
|
128
|
+
* - `const x = <内核值>.<m>.bind(k)` → x ⇒ m(覆盖 `raw.linearPattern.bind(k)` 后 `nativeLP(...)`)
|
|
129
|
+
* - `const { m } = <内核值>` / `{ m: mm }` → m ⇒ m / mm ⇒ m(解构)
|
|
130
|
+
* 只认内核派生基;`kernel = getBrepApi()` 的 .m 不作数(§7.5 陷阱 1)。
|
|
131
|
+
*
|
|
132
|
+
* @param src 待扫描的 TS 源码文本。
|
|
133
|
+
* @param kernelIds 内核标识符集合(来自 {@link kernelIdentifiers})。
|
|
134
|
+
* @returns 别名 → 底层 occt 方法名的映射。
|
|
135
|
+
*/
|
|
136
|
+
export function methodAliases(src, kernelIds) {
|
|
137
|
+
const sf = ts.createSourceFile('aliases.ts', src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
138
|
+
const isKernelIdent = makeIsKernel(kernelIds);
|
|
139
|
+
const alias = new Map();
|
|
140
|
+
for (const stmt of sf.statements) {
|
|
141
|
+
if (!ts.isVariableStatement(stmt))
|
|
142
|
+
continue;
|
|
143
|
+
for (const d of stmt.declarationList.declarations) {
|
|
144
|
+
if (!d.initializer)
|
|
145
|
+
continue;
|
|
146
|
+
// 形态 1:`const x = <值>.<m>.bind(k)` / `<值>.<m>.call(k, …)` ,<值> 是内核
|
|
147
|
+
if (ts.isIdentifier(d.name) || ts.isObjectBindingPattern(d.name)) {
|
|
148
|
+
const names = bindingNames(d.name);
|
|
149
|
+
// 解构出别名:const { m: mm } = kernel
|
|
150
|
+
if (ts.isObjectBindingPattern(d.name)) {
|
|
151
|
+
for (const el of d.name.elements) {
|
|
152
|
+
if (ts.isBindingElement(el)) {
|
|
153
|
+
const mth = el.propertyName ? el.propertyName.getText() : el.name.getText();
|
|
154
|
+
alias.set(el.name.getText(), mth);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (names.length === 1 && ts.isCallExpression(d.initializer)) {
|
|
159
|
+
const init = d.initializer;
|
|
160
|
+
const outerName = calleeName(init.expression);
|
|
161
|
+
if (outerName === 'bind' || outerName === 'call') {
|
|
162
|
+
const prop = init.expression;
|
|
163
|
+
if (ts.isPropertyAccessExpression(prop) && ts.isPropertyAccessExpression(prop.expression) && isKernelIdent(prop.expression.expression)) {
|
|
164
|
+
alias.set(names[0], prop.name.text);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return alias;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 返回 src 里被调用的、基类是内核派生的 occt 方法名(与 occtNames 交集)。
|
|
175
|
+
*
|
|
176
|
+
* 覆盖形态(§7.2 缺陷 1):
|
|
177
|
+
* - `<k>.method(` 普通直调(k 为内核标识)
|
|
178
|
+
* - `getOcctKernel().method(...)` 链式(调用表达式基即内核)→ 属性访问基命中
|
|
179
|
+
* - `raw.method.bind(k)` / `(<cast>).m.call(k,…)` 绑定点属性访问把 `<m>` 计入
|
|
180
|
+
* - `const x = k.m.bind(...); x(...)` const 绑定别名调用
|
|
181
|
+
* - `const { m } = k; m(...)` 解构别名调用
|
|
182
|
+
*
|
|
183
|
+
* @param src 待扫描的 TS 源码文本。
|
|
184
|
+
* @param occtNames occt 方法名全集(用于交集过滤)。
|
|
185
|
+
* @returns 被调用的 occt 方法名集合。
|
|
186
|
+
*/
|
|
187
|
+
export function kernelCallsIn(src, occtNames) {
|
|
188
|
+
const sf = ts.createSourceFile('scan.ts', src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
189
|
+
const kernelIds = kernelIdentifiers(src);
|
|
190
|
+
const alias = methodAliases(src, kernelIds);
|
|
191
|
+
const isKernelIdent = makeIsKernel(kernelIds);
|
|
192
|
+
const out = new Set();
|
|
193
|
+
const visit = (n) => {
|
|
194
|
+
// 别名调用:`nativeLP(...)` / `lp(...)` / `m(...)` 还原底层方法名
|
|
195
|
+
if (ts.isCallExpression(n)) {
|
|
196
|
+
const nm = calleeName(n.expression);
|
|
197
|
+
if (nm && alias.has(nm)) {
|
|
198
|
+
const real = alias.get(nm);
|
|
199
|
+
if (occtNames.has(real))
|
|
200
|
+
out.add(real);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// 内核派生基 . 属性访问 → 属性是 occt 方法(属性访问即方法引用/调用)
|
|
204
|
+
if (ts.isPropertyAccessExpression(n)) {
|
|
205
|
+
if (isKernelIdent(n.expression)) {
|
|
206
|
+
const name = n.name.text;
|
|
207
|
+
if (occtNames.has(name))
|
|
208
|
+
out.add(name);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
ts.forEachChild(n, visit);
|
|
212
|
+
};
|
|
213
|
+
visit(sf);
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=recognize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../src/occt-scan/recognize.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @internal — occt-scan 识别层(仅供 `scripts/scan-occt-op-coverage.ts` 与回归测试使用,\n * 不是 faijs 公开 API,勿从业务代码 import)。\n *\n * 识别「occt 原生内核直调」的源码分析。判据(方案 §7.2 缺陷 1 + §7.5 陷阱 1):\n * 只有从 `getOcctKernel()` / `getKernel()` / `initOcctWasm()` 拿到的变量才是 occt 原生\n * 句柄;`const kernel = getBrepApi()`(L1 契约句柄)的调用**不**算 occt 直调——把它的\n * 方法调用算进去会把中立 op 全误判成平台 op。\n *\n * 用 TypeScript AST(ts.createSourceFile)做语法层分析,按符号声明位置判定,能穿透\n * §7.2 要求的三类形态(正则在此处两头都错,见方案):\n * - `const x = <handle>.<m>.bind(k)` → x(...) 与绑定点的 `<m>` 都计入\n * - `(<cast>).<m>.call(k, ...)` → `<m>` 计入\n * - `const { m } = <handle>` 解构 → 别名 m(...) 调用计入\n * 以及最普通 `<handle>.<m>(...)` 链式直调。\n */\n\nimport ts from 'typescript'\n\n/** 返回函数调用表达式的被调用名(裸标识符或属性名),否则 null。 */\nfunction calleeName(callee: ts.Expression | undefined): string | null {\n if (!callee) return null\n if (ts.isIdentifier(callee)) return callee.text\n if (ts.isPropertyAccessExpression(callee)) return callee.name.text\n return null\n}\n\n/** 去掉括号/类型断言/`as`/`!`/`satisfies`,拿到最内层表达式。 */\nfunction unwrap(n: ts.Expression): ts.Expression {\n let x = n\n for (;;) {\n if (ts.isParenthesizedExpression(x)) x = x.expression\n else if (ts.isAsExpression(x)) x = x.expression\n else if (ts.isTypeAssertionExpression(x)) x = x.expression\n else if (ts.isNonNullExpression(x)) x = x.expression\n else if ((ts as unknown as { isSatisfiesExpression?: (x: ts.Node) => boolean }).isSatisfiesExpression?.(x)) {\n x = (x as ts.Expression & { expression: ts.Expression }).expression\n } else break\n }\n return x\n}\n\n/** 一个表达式是否「判定为 occt 内核派生句柄」(依据 kernelIds + 直接获取器)。 */\ntype IsKernel = (e: ts.Expression) => boolean\n\nfunction makeIsKernel(kernelIds: Set<string>): IsKernel {\n return (e) => {\n const u = unwrap(e)\n if (ts.isIdentifier(u)) return kernelIds.has(u.text)\n if (ts.isCallExpression(u)) {\n const nm = calleeName(u.expression)\n return nm === 'getOcctKernel' || nm === 'getKernel' || nm === 'initOcctWasm'\n }\n return false\n }\n}\n\n/** 绑定模式里导出的名字。 */\nfunction bindingNames(name: ts.BindingName): string[] {\n if (ts.isIdentifier(name)) return [name.text]\n const out: string[] = []\n if (ts.isObjectBindingPattern(name)) {\n for (const el of name.elements) {\n if (ts.isBindingElement(el)) {\n const prop = el.propertyName ? el.propertyName.getText() : el.name.getText()\n out.push(prop)\n }\n }\n } else if (ts.isArrayBindingPattern(name)) {\n for (const el of name.elements) {\n if (ts.isBindingElement(el) && ts.isIdentifier(el.name)) out.push(el.name.text)\n else if (ts.isBindingElement(el)) out.push(...bindingNames(el.name))\n }\n }\n return out\n}\n\n/**\n * 收集文件里「持有 occt 内核」的标识符集合。\n *\n * - 直接获取:`const k = getOcctKernel()` / `await initOcctWasm()` / `getKernel()`。\n * - 派生别名不动点:`const raw = k as unknown as T` 等其初始化式判定为内核派生者的\n * 局部 const 也收为内核标识(覆盖层层 cast/别名)。\n *\n * 注意:`getBrepApi()` 不在内核获取器之列,故 `const kernel = getBrepApi()` 的 `kernel`\n * 不会进入返回值——§7.5 陷阱 1 的防线。\n *\n * @param src 待扫描的 TS 源码文本。\n * @returns 内核标识符(变量名)集合,按字典序排列。\n */\nexport function kernelIdentifiers(src: string): Set<string> {\n const sf = ts.createSourceFile('recognize.ts', src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)\n\n const KERNEL_ACQUIRE =\n /(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)[^;=\\n]*?=\\s*(?:await\\s+)?[^;\\n]*(?:getOcctKernel|getKernel|initOcctWasm)\\s*\\(\\s*\\)/g\n const kernelIds = new Set<string>()\n KERNEL_ACQUIRE.lastIndex = 0\n for (let m = KERNEL_ACQUIRE.exec(src); m; m = KERNEL_ACQUIRE.exec(src)) kernelIds.add(m[1])\n\n // 收集文件内所有变声明的「名 → 初始化式」。\n const initByVar = new Map<string, ts.Expression>()\n ;(function collect(n: ts.Node): void {\n if (ts.isVariableDeclaration(n) && n.initializer) {\n for (const nm of bindingNames(n.name)) initByVar.set(nm, n.initializer)\n }\n ts.forEachChild(n, collect)\n })(sf)\n\n const isKernelInDecl = makeIsKernel(kernelIds)\n let changed = true\n while (changed) {\n changed = false\n for (const [name, init] of initByVar) {\n if (!kernelIds.has(name) && isKernelInDecl(init)) {\n kernelIds.add(name)\n changed = true\n }\n }\n }\n return new Set([...kernelIds].sort())\n}\n\n/**\n * 收集「方法别名」:把 occt 方法绑定/解构到局部变量后,后续 `alias(...)` 调用要还原\n * 成底层方法名。形态:\n * - `const x = <内核值>.<m>.bind(k)` → x ⇒ m(覆盖 `raw.linearPattern.bind(k)` 后 `nativeLP(...)`)\n * - `const { m } = <内核值>` / `{ m: mm }` → m ⇒ m / mm ⇒ m(解构)\n * 只认内核派生基;`kernel = getBrepApi()` 的 .m 不作数(§7.5 陷阱 1)。\n *\n * @param src 待扫描的 TS 源码文本。\n * @param kernelIds 内核标识符集合(来自 {@link kernelIdentifiers})。\n * @returns 别名 → 底层 occt 方法名的映射。\n */\nexport function methodAliases(src: string, kernelIds: Set<string>): Map<string, string> {\n const sf = ts.createSourceFile('aliases.ts', src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)\n const isKernelIdent = makeIsKernel(kernelIds)\n const alias = new Map<string, string>()\n\n for (const stmt of sf.statements as unknown as ts.Node[]) {\n if (!ts.isVariableStatement(stmt)) continue\n for (const d of stmt.declarationList.declarations) {\n if (!d.initializer) continue\n // 形态 1:`const x = <值>.<m>.bind(k)` / `<值>.<m>.call(k, …)` ,<值> 是内核\n if (ts.isIdentifier(d.name) || ts.isObjectBindingPattern(d.name)) {\n const names = bindingNames(d.name)\n // 解构出别名:const { m: mm } = kernel\n if (ts.isObjectBindingPattern(d.name)) {\n for (const el of d.name.elements) {\n if (ts.isBindingElement(el)) {\n const mth = el.propertyName ? el.propertyName.getText() : el.name.getText()\n alias.set(el.name.getText(), mth)\n }\n }\n }\n if (names.length === 1 && ts.isCallExpression(d.initializer)) {\n const init = d.initializer\n const outerName = calleeName(init.expression)\n if (outerName === 'bind' || outerName === 'call') {\n const prop = init.expression as ts.PropertyAccessExpression\n if (ts.isPropertyAccessExpression(prop) && ts.isPropertyAccessExpression(prop.expression) && isKernelIdent(prop.expression.expression)) {\n alias.set(names[0]!, prop.name.text)\n }\n }\n }\n }\n }\n }\n return alias\n}\n\n/**\n * 返回 src 里被调用的、基类是内核派生的 occt 方法名(与 occtNames 交集)。\n *\n * 覆盖形态(§7.2 缺陷 1):\n * - `<k>.method(` 普通直调(k 为内核标识)\n * - `getOcctKernel().method(...)` 链式(调用表达式基即内核)→ 属性访问基命中\n * - `raw.method.bind(k)` / `(<cast>).m.call(k,…)` 绑定点属性访问把 `<m>` 计入\n * - `const x = k.m.bind(...); x(...)` const 绑定别名调用\n * - `const { m } = k; m(...)` 解构别名调用\n *\n * @param src 待扫描的 TS 源码文本。\n * @param occtNames occt 方法名全集(用于交集过滤)。\n * @returns 被调用的 occt 方法名集合。\n */\nexport function kernelCallsIn(src: string, occtNames: Set<string>): Set<string> {\n const sf = ts.createSourceFile('scan.ts', src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)\n const kernelIds = kernelIdentifiers(src)\n const alias = methodAliases(src, kernelIds)\n const isKernelIdent = makeIsKernel(kernelIds)\n const out = new Set<string>()\n\n const visit = (n: ts.Node): void => {\n // 别名调用:`nativeLP(...)` / `lp(...)` / `m(...)` 还原底层方法名\n if (ts.isCallExpression(n)) {\n const nm = calleeName(n.expression)\n if (nm && alias.has(nm)) {\n const real = alias.get(nm)!\n if (occtNames.has(real)) out.add(real)\n }\n }\n // 内核派生基 . 属性访问 → 属性是 occt 方法(属性访问即方法引用/调用)\n if (ts.isPropertyAccessExpression(n)) {\n if (isKernelIdent(n.expression)) {\n const name = n.name.text\n if (occtNames.has(name)) out.add(name)\n }\n }\n ts.forEachChild(n, visit)\n }\n visit(sf)\n return out\n}"]}
|
|
@@ -63,10 +63,10 @@ function applyCenter(kernel, solid, center) {
|
|
|
63
63
|
return translated;
|
|
64
64
|
}
|
|
65
65
|
/**
|
|
66
|
-
* 用 OCCT 直接构造一个长方体 Solid
|
|
66
|
+
* 用 OCCT 直接构造一个长方体 Solid(原 brepjs `box(width, depth, height,
|
|
67
67
|
* {at?, centered?})` 契约,§4.1 A 决策;与 mesh 路径逐点对齐)。
|
|
68
68
|
*
|
|
69
|
-
*
|
|
69
|
+
* 几何语义与旧 `primitiveFns.box` 完全一致:
|
|
70
70
|
* 默认 min 角点在原点;`centered:true`(无 at 时)居中到原点;`at` 为中心
|
|
71
71
|
* 语义且优先于 `centered`。
|
|
72
72
|
*/
|
|
@@ -74,7 +74,7 @@ function cubeToCadSolid(kernel, params) {
|
|
|
74
74
|
const w = params.width;
|
|
75
75
|
const d = params.depth;
|
|
76
76
|
const h = params.height;
|
|
77
|
-
// brepjs box: center = at ?? (centered ? [0,0,0] : undefined);未给 center →
|
|
77
|
+
// 原 brepjs box: center = at ?? (centered ? [0,0,0] : undefined);未给 center →
|
|
78
78
|
// 构造角点实体不平移(这里统一中心构造 + 平移量,等价)。
|
|
79
79
|
const center = params.at !== undefined
|
|
80
80
|
? params.at
|
|
@@ -94,10 +94,10 @@ function sphereToCadSolid(kernel, params) {
|
|
|
94
94
|
return applyCenter(kernel, solid, params.center);
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
* 用 OCCT 直接构造一个圆柱体 Solid
|
|
97
|
+
* 用 OCCT 直接构造一个圆柱体 Solid(原 brepjs `cylinder(radius, height, {
|
|
98
98
|
* at, centered })` 契约,§4.3 A 决策;与 mesh 路径逐点对齐)。
|
|
99
99
|
*
|
|
100
|
-
*
|
|
100
|
+
* 锚点同旧 `primitiveFns.cylinder`:`at` 是底面轴心(BASE)语义(默认
|
|
101
101
|
* [0,0,0]),OCCT makeCylinder 原生从 z=0 沿 +Z 建高 → 无需重居中;`centered:true`
|
|
102
102
|
* 指底面沿轴下移 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。
|
|
103
103
|
*/
|
|
@@ -114,10 +114,10 @@ function cylinderToCadSolid(kernel, params) {
|
|
|
114
114
|
return solid;
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
117
|
-
* 用 OCCT 直接构造一个圆锥体 Solid
|
|
117
|
+
* 用 OCCT 直接构造一个圆锥体 Solid(原 brepjs `cone(bottomRadius, topRadius,
|
|
118
118
|
* height, { at, centered })` 契约,§4.1 P 决策;与 mesh 路径逐点对齐)。
|
|
119
119
|
*
|
|
120
|
-
*
|
|
120
|
+
* 锚点同旧 `primitiveFns.cone`:`at` 是底面轴心(BASE)语义(默认
|
|
121
121
|
* [0,0,0]),OCCT makeCone 原生从 z=0 沿 +Z 建高 → 无需重居中;`centered:true`
|
|
122
122
|
* 指底面沿轴下移 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。
|
|
123
123
|
*/
|