@faicad/faijs 0.14.1 → 0.16.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/dist/api/api-namespace.d.ts +7 -0
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +23 -22
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +26 -8
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +4 -1
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/generated/cad/script-face.d.ts +1 -1
- package/dist/api/generated/cad/script-face.d.ts.map +1 -1
- package/dist/api/generated/cad/script-face.js +1 -2
- package/dist/api/generated/cad/script-face.js.map +1 -1
- package/dist/api/generated/operations.js +16 -16
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +0 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -4
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -3
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.d.ts +0 -8
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +19 -26
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/index.d.ts +1 -10
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +10 -18
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +3 -1
- package/dist/api/internal/compat-projection.d.ts.map +1 -1
- package/dist/api/internal/compat-projection.js +8 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/replica-role-table.d.ts +36 -0
- package/dist/api/internal/replica-role-table.d.ts.map +1 -0
- package/dist/api/internal/replica-role-table.js +73 -0
- package/dist/api/internal/replica-role-table.js.map +1 -0
- package/dist/api/internal/result-unwrap.d.ts +3 -1
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +2 -2
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/occt-kernel-bridge.d.ts +105 -27
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +255 -41
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +25 -61
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/replicate.d.ts +145 -0
- package/dist/api/replicate.d.ts.map +1 -0
- package/dist/api/replicate.js +351 -0
- package/dist/api/replicate.js.map +1 -0
- package/dist/api/revolve.d.ts +36 -0
- package/dist/api/revolve.d.ts.map +1 -0
- package/dist/api/revolve.js +165 -0
- package/dist/api/revolve.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +8 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +37 -36
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface/projection-overrides.d.ts.map +1 -1
- package/dist/api/surface/projection-overrides.js +6 -0
- package/dist/api/surface/projection-overrides.js.map +1 -1
- package/dist/boolean/deriveNormals.d.ts +5 -4
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +24 -7
- package/dist/boolean/deriveNormals.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +58 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +39 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -5
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +232 -18
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +79 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +18 -1
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +81 -11
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +6 -28
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +6 -17
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +13 -18
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +25 -18
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +4 -2
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +2 -0
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +4 -6
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +4 -9
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +0 -7
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +1 -3
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +13 -18
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/env-agnostic.d.ts +38 -0
- package/dist/env-agnostic.d.ts.map +1 -0
- package/dist/env-agnostic.js +29 -0
- package/dist/env-agnostic.js.map +1 -0
- package/dist/fcstd/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +8 -1
- package/dist/fcstd/codegen.js.map +1 -1
- package/dist/fcstd/expressions.d.ts +24 -0
- package/dist/fcstd/expressions.d.ts.map +1 -1
- package/dist/fcstd/expressions.js +91 -0
- package/dist/fcstd/expressions.js.map +1 -1
- package/dist/fcstd/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +16 -2
- package/dist/fcstd/feature-translate.js.map +1 -1
- package/dist/fcstd/structural-types.d.ts.map +1 -1
- package/dist/fcstd/structural-types.js +5 -0
- package/dist/fcstd/structural-types.js.map +1 -1
- package/dist/index.d.ts +7 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -16
- package/dist/index.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts +9 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +7 -1
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/symbol-table.d.ts +31 -0
- package/dist/lang/symbol-table.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +6 -16
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +6 -16
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +50 -1
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/mesh/creased-normals.d.ts +50 -0
- package/dist/mesh/creased-normals.d.ts.map +1 -0
- package/dist/mesh/creased-normals.js +114 -0
- package/dist/mesh/creased-normals.js.map +1 -0
- package/dist/mesh/decoration-provider.d.ts +53 -0
- package/dist/mesh/decoration-provider.d.ts.map +1 -0
- package/dist/mesh/decoration-provider.js +21 -0
- package/dist/mesh/decoration-provider.js.map +1 -0
- package/dist/mesh/engrave.d.ts +4 -0
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +22 -31
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +5 -14
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +7 -19
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +2 -1
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +5 -7
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts +5 -18
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +4 -48
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/stl-loader.d.ts +23 -0
- package/dist/mesh/stl-loader.d.ts.map +1 -0
- package/dist/mesh/stl-loader.js +139 -0
- package/dist/mesh/stl-loader.js.map +1 -0
- package/dist/module-resolver/parse-imports.d.ts +37 -0
- package/dist/module-resolver/parse-imports.d.ts.map +1 -0
- package/dist/module-resolver/parse-imports.js +39 -0
- package/dist/module-resolver/parse-imports.js.map +1 -0
- package/dist/module-resolver/resolver.d.ts +1 -1
- package/dist/module-resolver/resolver.js +2 -2
- package/dist/module-resolver/resolver.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +1 -22
- package/dist/node-host/cli.js.map +1 -1
- package/dist/primitives/text/cjk-font.d.ts +42 -0
- package/dist/primitives/text/cjk-font.d.ts.map +1 -0
- package/dist/primitives/text/cjk-font.js +86 -0
- package/dist/primitives/text/cjk-font.js.map +1 -0
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.js +2 -2
- package/dist/sdk.js.map +1 -1
- package/dist/symbol-table.d.ts +15 -0
- package/dist/symbol-table.d.ts.map +1 -0
- package/dist/symbol-table.js +14 -0
- package/dist/symbol-table.js.map +1 -0
- package/dist/topology/naming/lineage-resolve.js +1 -1
- package/dist/topology/naming/lineage-resolve.js.map +1 -1
- package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
- package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
- package/dist/vendored/brepjs/kernel/index.js +11 -0
- package/dist/vendored/brepjs/kernel/index.js.map +1 -1
- package/dist/weapp.d.ts +3 -3
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +6 -3
- package/dist/weapp.js.map +1 -1
- package/package.json +16 -14
- package/dist/api/compat/index.d.ts +0 -173
- package/dist/api/compat/index.d.ts.map +0 -1
- package/dist/api/compat/index.js +0 -222
- package/dist/api/compat/index.js.map +0 -1
- package/dist/api/compound.d.ts +0 -110
- package/dist/api/compound.d.ts.map +0 -1
- package/dist/api/compound.js +0 -164
- package/dist/api/compound.js.map +0 -1
- package/dist/api/copy.d.ts +0 -40
- package/dist/api/copy.d.ts.map +0 -1
- package/dist/api/copy.js +0 -83
- package/dist/api/copy.js.map +0 -1
- package/dist/api/fai_drill.d.ts +0 -46
- package/dist/api/fai_drill.d.ts.map +0 -1
- package/dist/api/fai_drill.js +0 -243
- package/dist/api/fai_drill.js.map +0 -1
- package/dist/api/fai_extrude.d.ts +0 -36
- package/dist/api/fai_extrude.d.ts.map +0 -1
- package/dist/api/fai_extrude.js +0 -79
- package/dist/api/fai_extrude.js.map +0 -1
- package/dist/api/fai_split.d.ts +0 -46
- package/dist/api/fai_split.d.ts.map +0 -1
- package/dist/api/fai_split.js +0 -254
- package/dist/api/fai_split.js.map +0 -1
- package/dist/api/load.d.ts +0 -41
- package/dist/api/load.d.ts.map +0 -1
- package/dist/api/load.js +0 -84
- package/dist/api/load.js.map +0 -1
- package/dist/api/svgExtrude.d.ts +0 -32
- package/dist/api/svgExtrude.d.ts.map +0 -1
- package/dist/api/svgExtrude.js +0 -74
- package/dist/api/svgExtrude.js.map +0 -1
- package/dist/api/text.d.ts +0 -34
- package/dist/api/text.d.ts.map +0 -1
- package/dist/api/text.js +0 -101
- package/dist/api/text.js.map +0 -1
- package/dist/brep/text/fontTestHelper.d.ts +0 -30
- package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
- package/dist/brep/text/fontTestHelper.js +0 -57
- package/dist/brep/text/fontTestHelper.js.map +0 -1
- package/dist/cad-runtime/module-executor.d.ts +0 -271
- package/dist/cad-runtime/module-executor.d.ts.map +0 -1
- package/dist/cad-runtime/module-executor.js +0 -630
- package/dist/cad-runtime/module-executor.js.map +0 -1
- package/dist/cad-runtime/terminal-dag.d.ts +0 -65
- package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
- package/dist/cad-runtime/terminal-dag.js +0 -167
- package/dist/cad-runtime/terminal-dag.js.map +0 -1
- package/dist/faqts/browser.d.ts +0 -16
- package/dist/faqts/browser.d.ts.map +0 -1
- package/dist/faqts/browser.js +0 -13
- package/dist/faqts/browser.js.map +0 -1
- package/dist/faqts/exec-blob.d.ts +0 -14
- package/dist/faqts/exec-blob.d.ts.map +0 -1
- package/dist/faqts/exec-blob.js +0 -22
- package/dist/faqts/exec-blob.js.map +0 -1
- package/dist/faqts/exec-node.d.ts +0 -15
- package/dist/faqts/exec-node.d.ts.map +0 -1
- package/dist/faqts/exec-node.js +0 -29
- package/dist/faqts/exec-node.js.map +0 -1
- package/dist/faqts/imports.d.ts +0 -74
- package/dist/faqts/imports.d.ts.map +0 -1
- package/dist/faqts/imports.js +0 -95
- package/dist/faqts/imports.js.map +0 -1
- package/dist/faqts/index.d.ts +0 -22
- package/dist/faqts/index.d.ts.map +0 -1
- package/dist/faqts/index.js +0 -21
- package/dist/faqts/index.js.map +0 -1
- package/dist/faqts/node.d.ts +0 -23
- package/dist/faqts/node.d.ts.map +0 -1
- package/dist/faqts/node.js +0 -23
- package/dist/faqts/node.js.map +0 -1
- package/dist/faqts/run.d.ts +0 -62
- package/dist/faqts/run.d.ts.map +0 -1
- package/dist/faqts/run.js +0 -62
- package/dist/faqts/run.js.map +0 -1
- package/dist/faqts/transform.d.ts +0 -43
- package/dist/faqts/transform.d.ts.map +0 -1
- package/dist/faqts/transform.js +0 -35
- package/dist/faqts/transform.js.map +0 -1
- package/dist/lang/compile.d.ts +0 -50
- package/dist/lang/compile.d.ts.map +0 -1
- package/dist/lang/compile.js +0 -368
- package/dist/lang/compile.js.map +0 -1
- package/dist/lang/keep.d.ts +0 -109
- package/dist/lang/keep.d.ts.map +0 -1
- package/dist/lang/keep.js +0 -226
- package/dist/lang/keep.js.map +0 -1
- package/dist/lang/parser.d.ts +0 -91
- package/dist/lang/parser.d.ts.map +0 -1
- package/dist/lang/parser.js +0 -1594
- package/dist/lang/parser.js.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
- package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
- package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
- package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
- package/dist/mesh/drill-hole/drill-types.js +0 -7
- package/dist/mesh/drill-hole/drill-types.js.map +0 -1
- package/dist/mesh/fai_drill.d.ts +0 -21
- package/dist/mesh/fai_drill.d.ts.map +0 -1
- package/dist/mesh/fai_drill.js +0 -92
- package/dist/mesh/fai_drill.js.map +0 -1
- package/dist/mesh/fai_extrude.d.ts +0 -24
- package/dist/mesh/fai_extrude.d.ts.map +0 -1
- package/dist/mesh/fai_extrude.js +0 -42
- package/dist/mesh/fai_extrude.js.map +0 -1
- package/dist/mesh/fai_split.d.ts +0 -164
- package/dist/mesh/fai_split.d.ts.map +0 -1
- package/dist/mesh/fai_split.js +0 -269
- package/dist/mesh/fai_split.js.map +0 -1
- package/dist/primitives/svg-extrude.d.ts +0 -43
- package/dist/primitives/svg-extrude.d.ts.map +0 -1
- package/dist/primitives/svg-extrude.js +0 -78
- package/dist/primitives/svg-extrude.js.map +0 -1
- package/dist/primitives/text/cjk.d.ts +0 -61
- package/dist/primitives/text/cjk.d.ts.map +0 -1
- package/dist/primitives/text/cjk.js +0 -215
- package/dist/primitives/text/cjk.js.map +0 -1
- package/dist/primitives/text-geometry.d.ts +0 -47
- package/dist/primitives/text-geometry.d.ts.map +0 -1
- package/dist/primitives/text-geometry.js +0 -127
- package/dist/primitives/text-geometry.js.map +0 -1
- package/dist/test-helpers.d.ts +0 -31
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -55
- package/dist/test-helpers.js.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
- package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
package/dist/api/text.js
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib text — 文字创建库函数(text)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
|
|
6
|
-
*/
|
|
7
|
-
import { cad } from '../mesh/index.js';
|
|
8
|
-
import { solidToShape } from '../brep/brep-ops.js';
|
|
9
|
-
import { textToSolid } from '../brep/text/text-to-solid.js';
|
|
10
|
-
import { ensureDefaultFont } from '../brep/text/fontRegistry.js';
|
|
11
|
-
import { getSolidBoundingBox } from '../brep/brep-utils.js';
|
|
12
|
-
import { containsCjk, loadSystemCjkFont } from '../primitives/text/cjk.js';
|
|
13
|
-
import { getBackends } from '../runtime-state.js';
|
|
14
|
-
import { fromBrep } from '../shape.js';
|
|
15
|
-
import { defineOp } from '../sdk.js';
|
|
16
|
-
import { assertPositiveNumber } from './assert.js';
|
|
17
|
-
/**
|
|
18
|
-
* Validate text parameters: `text` must be a non-empty string, and `size` and
|
|
19
|
-
* `depth` must be positive numbers.
|
|
20
|
-
* @param params - the raw text operation parameters.
|
|
21
|
-
*/
|
|
22
|
-
export function assertTextParams(params) {
|
|
23
|
-
if (typeof params.text !== 'string' || params.text.trim() === '') {
|
|
24
|
-
throw new Error(`[stdlib/text] text must be a non-empty string, got ${JSON.stringify(params.text)}`);
|
|
25
|
-
}
|
|
26
|
-
assertPositiveNumber(params.size, 'text.size');
|
|
27
|
-
assertPositiveNumber(params.depth, 'text.depth');
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* BREP 路径:opentype.js → OCCT wire/face → extrude → center + fromBrep 登记。
|
|
31
|
-
*
|
|
32
|
-
* 与 mesh 路径一样,当文本包含 CJK 字符但没有 CJK 字体时,
|
|
33
|
-
* 将 CJK 字符替换为 '?' 以实现优雅降级。
|
|
34
|
-
*/
|
|
35
|
-
async function textBrep(params) {
|
|
36
|
-
const kernel = getBackends().kernel.brep;
|
|
37
|
-
if (!kernel)
|
|
38
|
-
throw new Error('[stdlib/text] no OCCT kernel');
|
|
39
|
-
await ensureDefaultFont();
|
|
40
|
-
const text = params.text;
|
|
41
|
-
const size = params.size;
|
|
42
|
-
const depth = params.depth;
|
|
43
|
-
// 如果文本包含 CJK 字符,检查是否有 CJK 字体
|
|
44
|
-
let renderText = text;
|
|
45
|
-
if (containsCjk(text)) {
|
|
46
|
-
const cjkResult = await loadSystemCjkFont();
|
|
47
|
-
if (!cjkResult) {
|
|
48
|
-
// 无 CJK 字体:将 CJK 字符替换为 '?' 以实现优雅降级
|
|
49
|
-
renderText = text.replace(/[\u4E00-\u9FFF\u3400-\u4DBF\u2F800-\u2FA1F\u3000-\u303F\uFF00-\uFFEF]/g, '?');
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// 将文字转换为 OCCT solid
|
|
53
|
-
const rawSolid = textToSolid(kernel, renderText, {
|
|
54
|
-
fontSize: size,
|
|
55
|
-
depth,
|
|
56
|
-
});
|
|
57
|
-
// Center the solid to match mesh path behavior:
|
|
58
|
-
// X/Z centered at origin, Y bottom aligned to 0
|
|
59
|
-
const bbox = getSolidBoundingBox(kernel, rawSolid);
|
|
60
|
-
const cx = (bbox.min[0] + bbox.max[0]) / 2;
|
|
61
|
-
const cz = (bbox.min[2] + bbox.max[2]) / 2;
|
|
62
|
-
const centeredSolid = kernel.translate(rawSolid, -cx, -bbox.min[1], -cz);
|
|
63
|
-
kernel.release(rawSolid);
|
|
64
|
-
return fromBrep(solidToShape(kernel, centeredSolid), { solid: centeredSolid });
|
|
65
|
-
}
|
|
66
|
-
/** 兼容两种调用形态:`cad.text({ text, size, depth })`(创建类)与
|
|
67
|
-
* `cad.text(part0, { text, size, depth })`(历史 fixture 带输入参数,输入被忽略)。 */
|
|
68
|
-
function textParamsOf(inputOrParams, maybeParams) {
|
|
69
|
-
return (maybeParams ?? inputOrParams ?? {});
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* 生成文字零件(文字轮廓挤出,X/Z 居中、Y 底部对齐原点)。
|
|
73
|
-
* @group 创建
|
|
74
|
-
* @inputs 0
|
|
75
|
-
* @async true
|
|
76
|
-
* @qual warn
|
|
77
|
-
* @name text
|
|
78
|
-
* @returns Shape 文字几何,生成独立零件。
|
|
79
|
-
* @param maybeParams - 兼容形态的补充参数(正常不传)。type:Record<string, unknown> required:false
|
|
80
|
-
* @param inputOrParams.text - 要生成的文字。type:string required:true
|
|
81
|
-
* @param inputOrParams.size - 字号(mm)。type:number required:true
|
|
82
|
-
* @param inputOrParams.depth - 挤出深度(mm)。type:number required:true
|
|
83
|
-
* @param inputOrParams.font - 字体。type:string 默认 默认字体
|
|
84
|
-
* @note font 语义未定(当前只有默认字体),⚠️ 暂不要传。兼容 `cad.text(part0, {...})` 带输入形态(输入被忽略),正常写 `cad.text({...})` 即可。
|
|
85
|
-
* @example
|
|
86
|
-
* const t = await cad.text({ text: 'Hello', size: 20, depth: 5 })
|
|
87
|
-
*/
|
|
88
|
-
export const text = defineOp({
|
|
89
|
-
mesh: async (inputOrParams, maybeParams) => {
|
|
90
|
-
const params = textParamsOf(inputOrParams, maybeParams);
|
|
91
|
-
assertTextParams(params);
|
|
92
|
-
return cad.text({ text: params.text, size: params.size, depth: params.depth });
|
|
93
|
-
},
|
|
94
|
-
brep: async (inputOrParams, maybeParams) => {
|
|
95
|
-
const params = textParamsOf(inputOrParams, maybeParams);
|
|
96
|
-
assertTextParams(params);
|
|
97
|
-
return textBrep(params);
|
|
98
|
-
},
|
|
99
|
-
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } },
|
|
100
|
-
});
|
|
101
|
-
//# sourceMappingURL=text.js.map
|
package/dist/api/text.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/api/text.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib text — 文字创建库函数(text)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport { textToSolid } from '../brep/text/text-to-solid'\nimport { ensureDefaultFont } from '../brep/text/fontRegistry'\nimport { getSolidBoundingBox } from '../brep/brep-utils'\nimport { containsCjk, loadSystemCjkFont } from '../primitives/text/cjk'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { assertPositiveNumber } from './assert'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * Validate text parameters: `text` must be a non-empty string, and `size` and\n * `depth` must be positive numbers.\n * @param params - the raw text operation parameters.\n */\nexport function assertTextParams(params: Record<string, unknown>): void {\n if (typeof params.text !== 'string' || params.text.trim() === '') {\n throw new Error(`[stdlib/text] text must be a non-empty string, got ${JSON.stringify(params.text)}`)\n }\n assertPositiveNumber(params.size, 'text.size')\n assertPositiveNumber(params.depth, 'text.depth')\n}\n\n/**\n * BREP 路径:opentype.js → OCCT wire/face → extrude → center + fromBrep 登记。\n *\n * 与 mesh 路径一样,当文本包含 CJK 字符但没有 CJK 字体时,\n * 将 CJK 字符替换为 '?' 以实现优雅降级。\n */\nasync function textBrep(params: Record<string, unknown>): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/text] no OCCT kernel')\n\n await ensureDefaultFont()\n\n const text = params.text as string\n const size = params.size as number\n const depth = params.depth as number\n\n // 如果文本包含 CJK 字符,检查是否有 CJK 字体\n let renderText = text\n if (containsCjk(text)) {\n const cjkResult = await loadSystemCjkFont()\n if (!cjkResult) {\n // 无 CJK 字体:将 CJK 字符替换为 '?' 以实现优雅降级\n renderText = text.replace(/[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u2F800-\\u2FA1F\\u3000-\\u303F\\uFF00-\\uFFEF]/g, '?')\n }\n }\n\n // 将文字转换为 OCCT solid\n const rawSolid = textToSolid(kernel, renderText, {\n fontSize: size,\n depth,\n })\n\n // Center the solid to match mesh path behavior:\n // X/Z centered at origin, Y bottom aligned to 0\n const bbox = getSolidBoundingBox(kernel, rawSolid)\n const cx = (bbox.min[0] + bbox.max[0]) / 2\n const cz = (bbox.min[2] + bbox.max[2]) / 2\n const centeredSolid = kernel.translate(rawSolid, -cx, -bbox.min[1], -cz)\n kernel.release(rawSolid)\n\n return fromBrep(solidToShape(kernel, centeredSolid), { solid: centeredSolid })\n}\n\n/** 兼容两种调用形态:`cad.text({ text, size, depth })`(创建类)与\n * `cad.text(part0, { text, size, depth })`(历史 fixture 带输入参数,输入被忽略)。 */\nfunction textParamsOf(inputOrParams: unknown, maybeParams?: Record<string, unknown>): Record<string, unknown> {\n return (maybeParams ?? inputOrParams ?? {}) as Record<string, unknown>\n}\n\n/**\n * 生成文字零件(文字轮廓挤出,X/Z 居中、Y 底部对齐原点)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual warn\n * @name text\n * @returns Shape 文字几何,生成独立零件。\n * @param maybeParams - 兼容形态的补充参数(正常不传)。type:Record<string, unknown> required:false\n * @param inputOrParams.text - 要生成的文字。type:string required:true\n * @param inputOrParams.size - 字号(mm)。type:number required:true\n * @param inputOrParams.depth - 挤出深度(mm)。type:number required:true\n * @param inputOrParams.font - 字体。type:string 默认 默认字体\n * @note font 语义未定(当前只有默认字体),⚠️ 暂不要传。兼容 `cad.text(part0, {...})` 带输入形态(输入被忽略),正常写 `cad.text({...})` 即可。\n * @example\n * const t = await cad.text({ text: 'Hello', size: 20, depth: 5 })\n */\nexport const text = defineOp({\n mesh: async (inputOrParams: unknown, maybeParams?: Record<string, unknown>) => {\n const params = textParamsOf(inputOrParams, maybeParams)\n assertTextParams(params)\n return cad.text({ text: params.text as string, size: params.size as number, depth: params.depth as number })\n },\n brep: async (inputOrParams: unknown, maybeParams?: Record<string, unknown>) => {\n const params = textParamsOf(inputOrParams, maybeParams)\n assertTextParams(params)\n return textBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 测试环境字体加载器 — Node/vitest 专用
|
|
3
|
-
*
|
|
4
|
-
* 通过 fs.readFileSync 读取字体文件,注入到 fontRegistry。
|
|
5
|
-
*
|
|
6
|
-
* 用法(在测试 beforeAll 中):
|
|
7
|
-
* await setupTestFont() // 设置 loader + 加载字体
|
|
8
|
-
*
|
|
9
|
-
* 或仅设置 loader(字体由 executeText → ensureDefaultFont 惰性加载):
|
|
10
|
-
* ensureTestFontLoader()
|
|
11
|
-
*
|
|
12
|
-
* 字体文件唯一真源:src/assets/fonts/OpenSans-Regular.ttf
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* 设置 fs 字体加载器(幂等,多次调用安全)。
|
|
16
|
-
*
|
|
17
|
-
* 设置后,ensureDefaultFont() 会用此 loader 读取字体文件。
|
|
18
|
-
*/
|
|
19
|
-
export declare function ensureTestFontLoader(): void;
|
|
20
|
-
/**
|
|
21
|
-
* 设置 fs 字体加载器并立即加载字体。
|
|
22
|
-
*
|
|
23
|
-
* 适用于直接调用 text-to-solid(不经 executeText)的测试:
|
|
24
|
-
* text-to-solid 内部调用 getFont(),需要字体已注册。
|
|
25
|
-
*
|
|
26
|
-
* 对于经 executeText 的测试,只需 ensureTestFontLoader() 即可,
|
|
27
|
-
* 因为 executeTextBrep 会调用 ensureDefaultFont() 惰性加载。
|
|
28
|
-
*/
|
|
29
|
-
export declare function setupTestFont(): Promise<void>;
|
|
30
|
-
//# sourceMappingURL=fontTestHelper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fontTestHelper.d.ts","sourceRoot":"","sources":["../../../src/brep/text/fontTestHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAyBH;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAGnD"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 测试环境字体加载器 — Node/vitest 专用
|
|
3
|
-
*
|
|
4
|
-
* 通过 fs.readFileSync 读取字体文件,注入到 fontRegistry。
|
|
5
|
-
*
|
|
6
|
-
* 用法(在测试 beforeAll 中):
|
|
7
|
-
* await setupTestFont() // 设置 loader + 加载字体
|
|
8
|
-
*
|
|
9
|
-
* 或仅设置 loader(字体由 executeText → ensureDefaultFont 惰性加载):
|
|
10
|
-
* ensureTestFontLoader()
|
|
11
|
-
*
|
|
12
|
-
* 字体文件唯一真源:src/assets/fonts/OpenSans-Regular.ttf
|
|
13
|
-
*/
|
|
14
|
-
import { readFileSync } from 'node:fs';
|
|
15
|
-
import { fileURLToPath } from 'node:url';
|
|
16
|
-
import { setFontLoader, ensureDefaultFont } from './fontRegistry.js';
|
|
17
|
-
let fontBuffer = null;
|
|
18
|
-
function getFontBuffer() {
|
|
19
|
-
if (fontBuffer)
|
|
20
|
-
return fontBuffer;
|
|
21
|
-
// 模块相对(P6:与 cwd 无关)
|
|
22
|
-
const fontPath = fileURLToPath(new URL('../../assets/fonts/OpenSans-Regular.ttf', import.meta.url));
|
|
23
|
-
const buf = readFileSync(fontPath);
|
|
24
|
-
fontBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
25
|
-
return fontBuffer;
|
|
26
|
-
}
|
|
27
|
-
const fsFontLoader = {
|
|
28
|
-
async loadDefaultFont() {
|
|
29
|
-
return getFontBuffer();
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
let loaderSet = false;
|
|
33
|
-
/**
|
|
34
|
-
* 设置 fs 字体加载器(幂等,多次调用安全)。
|
|
35
|
-
*
|
|
36
|
-
* 设置后,ensureDefaultFont() 会用此 loader 读取字体文件。
|
|
37
|
-
*/
|
|
38
|
-
export function ensureTestFontLoader() {
|
|
39
|
-
if (loaderSet)
|
|
40
|
-
return;
|
|
41
|
-
loaderSet = true;
|
|
42
|
-
setFontLoader(fsFontLoader);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* 设置 fs 字体加载器并立即加载字体。
|
|
46
|
-
*
|
|
47
|
-
* 适用于直接调用 text-to-solid(不经 executeText)的测试:
|
|
48
|
-
* text-to-solid 内部调用 getFont(),需要字体已注册。
|
|
49
|
-
*
|
|
50
|
-
* 对于经 executeText 的测试,只需 ensureTestFontLoader() 即可,
|
|
51
|
-
* 因为 executeTextBrep 会调用 ensureDefaultFont() 惰性加载。
|
|
52
|
-
*/
|
|
53
|
-
export async function setupTestFont() {
|
|
54
|
-
ensureTestFontLoader();
|
|
55
|
-
await ensureDefaultFont();
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=fontTestHelper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fontTestHelper.js","sourceRoot":"","sources":["../../../src/brep/text/fontTestHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAmB,MAAM,gBAAgB,CAAA;AAElF,IAAI,UAAU,GAAuB,IAAI,CAAA;AAEzC,SAAS,aAAa;IACpB,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACjC,oBAAoB;IACpB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,yCAAyC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACnG,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAClC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAgB,CAAA;IAC7F,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,MAAM,YAAY,GAAe;IAC/B,KAAK,CAAC,eAAe;QACnB,OAAO,aAAa,EAAE,CAAA;IACxB,CAAC;CACF,CAAA;AAED,IAAI,SAAS,GAAG,KAAK,CAAA;AAErB;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,SAAS;QAAE,OAAM;IACrB,SAAS,GAAG,IAAI,CAAA;IAChB,aAAa,CAAC,YAAY,CAAC,CAAA;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,oBAAoB,EAAE,CAAA;IACtB,MAAM,iBAAiB,EAAE,CAAA;AAC3B,CAAC","sourcesContent":["/**\n * 测试环境字体加载器 — Node/vitest 专用\n *\n * 通过 fs.readFileSync 读取字体文件,注入到 fontRegistry。\n *\n * 用法(在测试 beforeAll 中):\n * await setupTestFont() // 设置 loader + 加载字体\n *\n * 或仅设置 loader(字体由 executeText → ensureDefaultFont 惰性加载):\n * ensureTestFontLoader()\n *\n * 字体文件唯一真源:src/assets/fonts/OpenSans-Regular.ttf\n */\n\nimport { readFileSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\nimport { setFontLoader, ensureDefaultFont, type FontLoader } from './fontRegistry'\n\nlet fontBuffer: ArrayBuffer | null = null\n\nfunction getFontBuffer(): ArrayBuffer {\n if (fontBuffer) return fontBuffer\n // 模块相对(P6:与 cwd 无关)\n const fontPath = fileURLToPath(new URL('../../assets/fonts/OpenSans-Regular.ttf', import.meta.url))\n const buf = readFileSync(fontPath)\n fontBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer\n return fontBuffer\n}\n\nconst fsFontLoader: FontLoader = {\n async loadDefaultFont(): Promise<ArrayBuffer> {\n return getFontBuffer()\n },\n}\n\nlet loaderSet = false\n\n/**\n * 设置 fs 字体加载器(幂等,多次调用安全)。\n *\n * 设置后,ensureDefaultFont() 会用此 loader 读取字体文件。\n */\nexport function ensureTestFontLoader(): void {\n if (loaderSet) return\n loaderSet = true\n setFontLoader(fsFontLoader)\n}\n\n/**\n * 设置 fs 字体加载器并立即加载字体。\n *\n * 适用于直接调用 text-to-solid(不经 executeText)的测试:\n * text-to-solid 内部调用 getFont(),需要字体已注册。\n *\n * 对于经 executeText 的测试,只需 ensureTestFontLoader() 即可,\n * 因为 executeTextBrep 会调用 ensureDefaultFont() 惰性加载。\n */\nexport async function setupTestFont(): Promise<void> {\n ensureTestFontLoader()\n await ensureDefaultFont()\n}\n"]}
|
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* module-executor — JS VM 模块加载与增量调度(VM 执行方案 Phase 1)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* ModuleExecutor 是 VM 执行的核心:
|
|
6
|
-
* - `ctx` 持久变量容器(跨 execute/append/update 存活)
|
|
7
|
-
* - `load(code)` 用 data:/Blob URL 动态 import 编译产物(零 import,两平台同构)
|
|
8
|
-
* - `executeAll/executeIds/executeFrom` 按 deps 拓扑序调度
|
|
9
|
-
* - `reconcileCtx` 回收"定义语句已不在脚本中"的变量并释放其内核资源
|
|
10
|
-
* - `cache` 记录每语句 statementKey + outputContentKey(plan 增量判定)
|
|
11
|
-
*/
|
|
12
|
-
import type { CompiledStatementMeta } from '../lang/compile.js';
|
|
13
|
-
import type { StatementIR, ScriptIR } from '../lang/types.js';
|
|
14
|
-
import { type InternalKeepRecord } from '../lang/keep.js';
|
|
15
|
-
import type { Shape } from '../mesh/types.js';
|
|
16
|
-
import type { BrepHandle } from '../brep/engine/types.js';
|
|
17
|
-
import type { PartName, StmtId } from '../identity.js';
|
|
18
|
-
import { type StdlibNamespace } from '../runtime-state.js';
|
|
19
|
-
/**
|
|
20
|
-
* 已装配的命名空间集合(标准库 `cad` + 宿主注册的库)。
|
|
21
|
-
* 编译产物 `fn(ctx, ns)` 经 ns.<binding>.<callee>() 调用——引擎不区分函数来自哪个库。
|
|
22
|
-
*/
|
|
23
|
-
export interface Namespaces {
|
|
24
|
-
readonly cad: StdlibNamespace;
|
|
25
|
-
readonly [binding: string]: StdlibNamespace;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 执行记账(P5:exec 上下文删除后,ModuleExecutor 只需 beforeStatement + outputCache)。
|
|
29
|
-
* beforeStatement:undo 逐语句快照钩子;outputCache:语句产物缓存(collectResult 消费)。
|
|
30
|
-
*/
|
|
31
|
-
export interface ExecBookkeeping {
|
|
32
|
-
beforeStatement?: (stmtId: string, index: number) => void;
|
|
33
|
-
outputCache: Map<PartName, Shape>;
|
|
34
|
-
/** 变更声明(P6:引擎比对推导 + 装配应用记录),collectResult 消费。 */
|
|
35
|
-
changed: Set<PartName>;
|
|
36
|
-
}
|
|
37
|
-
/** 编译产物中的单条语句(模块文本 `{ id, deps, fn }`)。 */
|
|
38
|
-
export interface CompiledStatement {
|
|
39
|
-
id: StmtId;
|
|
40
|
-
deps: StmtId[];
|
|
41
|
-
fn: (ctx: Record<string, unknown>, ns: Namespaces) => Promise<void>;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Options for constructing a ModuleExecutor, providing the OCCT handle
|
|
45
|
-
* callbacks the executor needs to integrate with the runtime's persistent
|
|
46
|
-
* solid caches.
|
|
47
|
-
*/
|
|
48
|
-
export interface ModuleExecutorOptions {
|
|
49
|
-
/** Release the OCCT handle for a PartName (called when reconcileCtx deletes a variable; no-op without a handle). */
|
|
50
|
-
releaseSolid?: (partName: PartName) => void;
|
|
51
|
-
/** Read the OCCT handle currently held for a PartName (used for replacement-release pre-capture). */
|
|
52
|
-
getSolid?: (partName: PartName) => BrepHandle | undefined;
|
|
53
|
-
/** Release a previously captured OCCT handle (replacement release: free the old handle after a same-id recompute succeeds). */
|
|
54
|
-
releaseHandle?: (handle: BrepHandle) => void;
|
|
55
|
-
/** Sync an identity-slot solid into the PartName-keyed solidCache (relied on by existing runtime logic). */
|
|
56
|
-
setSolid?: (partName: PartName, solid: BrepHandle) => void;
|
|
57
|
-
/** Sync an identity-slot faceEvolution into the PartName-keyed faceEvolutionCache. */
|
|
58
|
-
setFaceEvolution?: (partName: PartName, evo: Map<number, number[]>) => void;
|
|
59
|
-
/** Sync an identity-slot roleTable into the PartName-keyed roleTableCache (§2.3 naming). */
|
|
60
|
-
setRoleTable?: (partName: PartName, roleTable: unknown) => void;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* ModuleExecutor loads JS VM modules and schedules incremental execution.
|
|
64
|
-
*
|
|
65
|
-
* It is the heart of the VM execution approach: it keeps the persistent `ctx`
|
|
66
|
-
* variable container alive across execute/append/update calls, dynamically
|
|
67
|
-
* imports compiled modules from data:/Blob URLs (zero imports, isomorphic on
|
|
68
|
-
* both platforms), schedules all/selected/from statements in dependency
|
|
69
|
-
* topological order, reclaims variables whose defining statements have left the
|
|
70
|
-
* script, and caches each statement's key + output content key for incremental
|
|
71
|
-
* planning.
|
|
72
|
-
*/
|
|
73
|
-
export declare class ModuleExecutor {
|
|
74
|
-
/** Persistent variable container across incremental executions. */
|
|
75
|
-
readonly ctx: Record<string, unknown>;
|
|
76
|
-
private stmts;
|
|
77
|
-
/** statementKey 缓存(增量判定;key = op|JSON(args)|deps 的 outputContentKey) */
|
|
78
|
-
private cache;
|
|
79
|
-
/**
|
|
80
|
-
* 函数体 keep 登记(keep-syntax 设计 §2.2):
|
|
81
|
-
* stmtId → { kept, hidden }。语句执行前清空本条记录,执行中累加;
|
|
82
|
-
* 本轮未执行(缓存命中)→ 保留上一轮记录(keep 零重算的前提)。
|
|
83
|
-
*/
|
|
84
|
-
readonly internalKeep: Map<StmtId, InternalKeepRecord>;
|
|
85
|
-
private sourceById;
|
|
86
|
-
private metaById;
|
|
87
|
-
private script;
|
|
88
|
-
private lastCode;
|
|
89
|
-
/**
|
|
90
|
-
* 默认命名空间绑定名(U10/R2):与 runtime 的 registerLib(…, {default: true}) 声明同步;
|
|
91
|
-
* statementKey/computeKey 中 namespace 缺省(undefined)的语句按该绑定名计 key。
|
|
92
|
-
*/
|
|
93
|
-
private defaultNsName;
|
|
94
|
-
/**
|
|
95
|
-
* Sync the default namespace binding name (called by runtime.registerLib with {default:true}).
|
|
96
|
-
* @param name - the namespace binding name to use as default.
|
|
97
|
-
*/
|
|
98
|
-
setDefaultNsName(name: string): void;
|
|
99
|
-
private namespaces;
|
|
100
|
-
/** 库内容身份表(binding → content hash;增量 key 版控,B2 §7.3) */
|
|
101
|
-
private libIds;
|
|
102
|
-
/** 本机函数调用嵌套深度(§5.5):> 0 表示当前在函数体内执行——keep 登记被抑制。 */
|
|
103
|
-
private userFunctionDepth;
|
|
104
|
-
private readonly releaseSolid?;
|
|
105
|
-
private readonly getSolid?;
|
|
106
|
-
private readonly releaseHandle?;
|
|
107
|
-
private readonly setSolid?;
|
|
108
|
-
private readonly setFaceEvolution?;
|
|
109
|
-
private readonly setRoleTable?;
|
|
110
|
-
constructor(namespaces: Namespaces, options?: ModuleExecutorOptions);
|
|
111
|
-
/**
|
|
112
|
-
* Hot-update the assembled namespace set (after registerLib mounts a new
|
|
113
|
-
* library).
|
|
114
|
-
* @param namespaces - the new assembled namespaces.
|
|
115
|
-
* @param libIds - the library content-identity table (binding → libId), used
|
|
116
|
-
* to version library-branch statement keys (B2, §7.3).
|
|
117
|
-
*/
|
|
118
|
-
setNamespaces(namespaces: Namespaces, libIds?: ReadonlyMap<string, string>): void;
|
|
119
|
-
/**
|
|
120
|
-
* Update the script and its compiled metadata (ctx stays alive).
|
|
121
|
-
* @param script - the parsed ScriptIR.
|
|
122
|
-
* @param compiled - the compiled statement metadata.
|
|
123
|
-
*/
|
|
124
|
-
setCompiled(script: ScriptIR, compiled: CompiledStatementMeta[]): void;
|
|
125
|
-
/**
|
|
126
|
-
* Load the compiled module, skipping a reload when the code is unchanged
|
|
127
|
-
* (compiled-product cache).
|
|
128
|
-
* @param code - the compiled module source.
|
|
129
|
-
*/
|
|
130
|
-
load(code: string): Promise<void>;
|
|
131
|
-
/**
|
|
132
|
-
* Execute every statement in dependency topological order (i.e. statement
|
|
133
|
-
* table order).
|
|
134
|
-
* @param exec - the execution bookkeeping.
|
|
135
|
-
*/
|
|
136
|
-
executeAll(exec: ExecBookkeeping): Promise<void>;
|
|
137
|
-
/**
|
|
138
|
-
* Execute only the given statements (append: the prefix is already in the
|
|
139
|
-
* persistent ctx). As in the old interpreter, beforeStatement fires only for
|
|
140
|
-
* new_shape statements; void/same_shape statements (do_assemble/add_constraint)
|
|
141
|
-
* do not trigger it (do_assemble's fn delegates internally).
|
|
142
|
-
* @param ids - the compiled statement ids to execute.
|
|
143
|
-
* @param exec - the execution bookkeeping.
|
|
144
|
-
*/
|
|
145
|
-
executeIds(ids: StmtId[], exec: ExecBookkeeping): Promise<void>;
|
|
146
|
-
/**
|
|
147
|
-
* Re-execute from the change points on (update: plan derives the stale set).
|
|
148
|
-
* The stale set is closed over deps (a statement depending on a stale one is
|
|
149
|
-
* itself stale) and runs in topological order.
|
|
150
|
-
* @param staleIds - the set of stale statement ids to recompute.
|
|
151
|
-
* @param exec - the execution bookkeeping.
|
|
152
|
-
*/
|
|
153
|
-
executeFrom(staleIds: Set<StmtId>, exec: ExecBookkeeping): Promise<void>;
|
|
154
|
-
/**
|
|
155
|
-
* Reclaim ctx variables whose defining statement is no longer in the script
|
|
156
|
-
* and release their kernel resources (a required action after undoing a
|
|
157
|
-
* statement deletion). Variables in `referencedVars` are kept even when not
|
|
158
|
-
* written by an active statement (cross-file references to other files'
|
|
159
|
-
* parts).
|
|
160
|
-
* @param activeStmtIds - the ids of statements still considered active.
|
|
161
|
-
* @param writeSets - mapping of statement id to the variable names it writes.
|
|
162
|
-
* @param referencedVars - variable names still referenced by the active
|
|
163
|
-
* script; these survive reclaim.
|
|
164
|
-
*/
|
|
165
|
-
reconcileCtx(activeStmtIds: Set<StmtId>, writeSets: Map<StmtId, PartName[]>, referencedVars?: Set<string>): void;
|
|
166
|
-
/** 清除所有缓存(key 缓存 + ctx 变量)。测试用:CadRuntime.clearStatementCache 调用。 */
|
|
167
|
-
clearCache(): void;
|
|
168
|
-
/**
|
|
169
|
-
* Read a statement's statementKey cache entry.
|
|
170
|
-
* @param id - the compiled statement id.
|
|
171
|
-
* @returns the cached key and output content key, or undefined.
|
|
172
|
-
*/
|
|
173
|
-
getCachedKey(id: StmtId): {
|
|
174
|
-
key: string;
|
|
175
|
-
outputContentKey: string;
|
|
176
|
-
} | undefined;
|
|
177
|
-
/**
|
|
178
|
-
* Read a statement's function-body keep registration (used by the terminal-dag
|
|
179
|
-
* C1 check); undefined when none exists.
|
|
180
|
-
* @param id - the compiled statement id.
|
|
181
|
-
* @returns the internal keep record, or undefined.
|
|
182
|
-
*/
|
|
183
|
-
getInternalKeep(id: StmtId): InternalKeepRecord | undefined;
|
|
184
|
-
/**
|
|
185
|
-
* Register a function-body keep entry into ModuleExecutor.internalKeep,
|
|
186
|
-
* accumulating during execution.
|
|
187
|
-
* @param id - the compiled statement id.
|
|
188
|
-
* @param names - the kept variable names.
|
|
189
|
-
* @param hidden - whether the kept variables are hidden.
|
|
190
|
-
*/
|
|
191
|
-
registerKeep(id: StmtId, names: PartName[], hidden: boolean): void;
|
|
192
|
-
/**
|
|
193
|
-
* 函数 BREP 域释放(§5.6 / D13):取走当前域的句柄登记表,收集本语句输出
|
|
194
|
-
* (返回值)可到达的全部句柄为 keep 集,释放登记域内除 keep 集外的全部句柄。
|
|
195
|
-
* 函数体内中间体的瞬态句柄在此一次性释放——单次调用内存有界,不逐轮释放。
|
|
196
|
-
*/
|
|
197
|
-
private releaseFunctionBrepDomain;
|
|
198
|
-
/**
|
|
199
|
-
* Read a ctx variable.
|
|
200
|
-
* @param name - the variable name.
|
|
201
|
-
* @returns the variable value.
|
|
202
|
-
*/
|
|
203
|
-
getCtxVar(name: string): unknown;
|
|
204
|
-
/**
|
|
205
|
-
* Write a ctx variable (used to sync assembly transforms from outputCache
|
|
206
|
-
* back into ctx).
|
|
207
|
-
* @param name - the variable name.
|
|
208
|
-
* @param value - the value to store.
|
|
209
|
-
*/
|
|
210
|
-
setCtxVar(name: string, value: unknown): void;
|
|
211
|
-
/**
|
|
212
|
-
* All variable names currently held in the persistent ctx (covers parts
|
|
213
|
-
* executed by previous execute/append/update calls).
|
|
214
|
-
* @returns the ctx variable names.
|
|
215
|
-
*/
|
|
216
|
-
listCtxKeys(): string[];
|
|
217
|
-
/**
|
|
218
|
-
* Returns the compiled metadata in params + statements order.
|
|
219
|
-
* @returns the compiled statement metadata array.
|
|
220
|
-
*/
|
|
221
|
-
getMetas(): CompiledStatementMeta[];
|
|
222
|
-
/** 清空 ctx 与 statementKey 缓存(CadRuntime.dispose 用)。 */
|
|
223
|
-
clear(): void;
|
|
224
|
-
/** 语句执行后:ctx → outputCache 同步 + 身份槽 → solidCache/faceEvolutionCache 同步 + statementKey 缓存 + 装配传播。 */
|
|
225
|
-
private afterStatement;
|
|
226
|
-
/**
|
|
227
|
-
* P6:装配传播——取走全部待应用变换,引擎应用到成员(mesh 原地 + BREP 槽 + solidCache),
|
|
228
|
-
* 记录 changed,并让依赖成员的下游语句失效重算(DAG 重放,替代 exec.dependentsOf 图遍历)。
|
|
229
|
-
*/
|
|
230
|
-
private applyPendingAssemblyTransforms;
|
|
231
|
-
/** 找出依赖给定变量名的语句(装配成员 → 消费它的下游)。 */
|
|
232
|
-
private computeDownstream;
|
|
233
|
-
/**
|
|
234
|
-
* 判定并发 part-brep-lost 事件。
|
|
235
|
-
*
|
|
236
|
-
* 判据:语句有几何输入且**全部**输入都在 BREP 链上,但输出**不在**链上
|
|
237
|
-
* → BREP 链在此断开(mesh-only 函数或 fallthrough)。
|
|
238
|
-
*
|
|
239
|
-
* true-JS-subset §4.4.2:几何输入 = positional 中的 VarRefIR + ExprIR.refs
|
|
240
|
-
* (表达式实参引用的 Shape 变量同样喂进本语句;CallRef 嵌套调用是只读查询不计)。
|
|
241
|
-
*/
|
|
242
|
-
private emitBrepLost;
|
|
243
|
-
/**
|
|
244
|
-
* Compute a statementKey = op | JSON(positional + args without keep) | each
|
|
245
|
-
* dependency's output content key (parameter statements use the parameter
|
|
246
|
-
* value). The keep/keepHidden keys are excluded so toggling retain/hide state
|
|
247
|
-
* triggers no geometric recompute. plan() uses this with the current cache to
|
|
248
|
-
* compute the expected key for incremental decisions.
|
|
249
|
-
*
|
|
250
|
-
* true-JS-subset §4.4.1:位置实参槽入 key——ExprIR 可 JSON 化
|
|
251
|
-
* (text + refs + params),表达式文本变化即触发重算;表达式引用的上游变量
|
|
252
|
-
* 变化经 deps 的 outputContentKey 传递。
|
|
253
|
-
*
|
|
254
|
-
* 本机函数调用(local):key 前缀 `local.<callee>#<bodyHash>`(§6.2 / P4 内容寻址)——
|
|
255
|
-
* 编辑函数体文本 → 所有调用该函数的语句 key 变化 → 下游失效重算;不改函数体零重算。
|
|
256
|
-
* @param meta - the compiled statement metadata.
|
|
257
|
-
* @param source - the source statement, or undefined for parameter statements.
|
|
258
|
-
* @returns the computed statement key string.
|
|
259
|
-
*/
|
|
260
|
-
computeKey(meta: CompiledStatementMeta, source: StatementIR | undefined): string;
|
|
261
|
-
/**
|
|
262
|
-
* 按绑定名查 libId(setNamespaces 已存表;本机函数不含——只适用于库分支 key)。
|
|
263
|
-
* 库未登记或表缺失 → 'missing',增量会自动失效重算。
|
|
264
|
-
* @param binding 命名空间绑定名。
|
|
265
|
-
* @returns 库的内容身份;`'missing'` 表示该绑定无登记身份。
|
|
266
|
-
*/
|
|
267
|
-
libIdOf(binding: string): string;
|
|
268
|
-
/** outputContentKey:shape 语句 = mesh 内容哈希;参数语句 = 参数值。 */
|
|
269
|
-
private computeOutputContentKey;
|
|
270
|
-
}
|
|
271
|
-
//# sourceMappingURL=module-executor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"module-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/module-executor.ts"],"names":[],"mappings":"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"}
|