@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/fai_split.js
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib split — 分割库函数(返回具名对象 { front, back })
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* dispatchPath 静态判定 brep/mesh,双输出以具名对象返回(替代 outputCache 多输出写入)。
|
|
6
|
-
*/
|
|
7
|
-
import { cad } from '../mesh/index.js';
|
|
8
|
-
import { splitBrep, solidToShape, translateBrep, } from '../brep/brep-ops.js';
|
|
9
|
-
import { dovetailBooleanSplitBrep, dowelOrTenonBooleanSplitBrep, } from './brep-mirror/joinery-brep.js';
|
|
10
|
-
import { computeBasisFromNormal } from '../mesh/fai_split.js';
|
|
11
|
-
import { getBackends } from '../runtime-state.js';
|
|
12
|
-
import { solid, fromBrep, brepOf } from '../shape.js';
|
|
13
|
-
import { defineOp } from '../sdk.js';
|
|
14
|
-
import { assertNonZeroVec3 } from './assert.js';
|
|
15
|
-
/** 世界坐标 → 局部坐标(含单位缩放)。 */
|
|
16
|
-
function worldToLocalVec3(worldPos, partTransform) {
|
|
17
|
-
const offset = partTransform?.position;
|
|
18
|
-
if (!offset)
|
|
19
|
-
return worldPos;
|
|
20
|
-
const scale = partTransform?.scale;
|
|
21
|
-
if (scale && (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1)) {
|
|
22
|
-
return [
|
|
23
|
-
(worldPos[0] - offset[0]) / scale[0],
|
|
24
|
-
(worldPos[1] - offset[1]) / scale[1],
|
|
25
|
-
(worldPos[2] - offset[2]) / scale[2],
|
|
26
|
-
];
|
|
27
|
-
}
|
|
28
|
-
return [
|
|
29
|
-
worldPos[0] - offset[0],
|
|
30
|
-
worldPos[1] - offset[1],
|
|
31
|
-
worldPos[2] - offset[2],
|
|
32
|
-
];
|
|
33
|
-
}
|
|
34
|
-
/** BREP 路径:OCCT 平面/榫卯分割 + 分离位移。 */
|
|
35
|
-
function splitBrepPath(input, params) {
|
|
36
|
-
const kernel = getBackends().kernel.brep;
|
|
37
|
-
if (!kernel)
|
|
38
|
-
throw new Error('[stdlib/split] no OCCT kernel');
|
|
39
|
-
const inputSolid = brepOf(input);
|
|
40
|
-
if (!inputSolid)
|
|
41
|
-
throw new Error('[stdlib/split] input is not BREP');
|
|
42
|
-
const cutMode = params.cutMode ?? 'plane';
|
|
43
|
-
const normal = params.normal ?? [0, 0, 1];
|
|
44
|
-
const offset = typeof params.offset === 'number' ? params.offset : 0;
|
|
45
|
-
const inPlaneAngleDeg = typeof params.inPlaneAngleDeg === 'number' ? params.inPlaneAngleDeg : 0;
|
|
46
|
-
const bbCenter = params.bbCenter ?? cad.bboxCenter(input);
|
|
47
|
-
const bboxSize = params.bboxSize ?? cad.boundingBox(input).max.map((v, i) => v - cad.boundingBox(input).min[i]);
|
|
48
|
-
const partTransform = getBackends().config.partTransform;
|
|
49
|
-
const localBbCenter = worldToLocalVec3(bbCenter, partTransform);
|
|
50
|
-
const scale = partTransform?.scale;
|
|
51
|
-
const hasScale = scale && (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1);
|
|
52
|
-
const localBboxSize = hasScale
|
|
53
|
-
? [bboxSize[0] / scale[0], bboxSize[1] / scale[1], bboxSize[2] / scale[2]]
|
|
54
|
-
: bboxSize;
|
|
55
|
-
const planeCenter = [
|
|
56
|
-
localBbCenter[0] + offset * normal[0],
|
|
57
|
-
localBbCenter[1] + offset * normal[1],
|
|
58
|
-
localBbCenter[2] + offset * normal[2],
|
|
59
|
-
];
|
|
60
|
-
const originOffset = normal[0] * planeCenter[0] + normal[1] * planeCenter[1] + normal[2] * planeCenter[2];
|
|
61
|
-
const { widthDir, depthDir } = computeBasisFromNormal(normal, inPlaneAngleDeg);
|
|
62
|
-
const basis = {
|
|
63
|
-
normal: normal,
|
|
64
|
-
widthDir: widthDir,
|
|
65
|
-
depthDir: depthDir,
|
|
66
|
-
planeCenter: planeCenter,
|
|
67
|
-
originOffset,
|
|
68
|
-
};
|
|
69
|
-
let frontSolid;
|
|
70
|
-
let backSolid;
|
|
71
|
-
if (cutMode === 'dovetail') {
|
|
72
|
-
const groove = {
|
|
73
|
-
depth: params.grooveDepth ?? 0,
|
|
74
|
-
depthTolerance: params.grooveDepthTolerance ?? 0,
|
|
75
|
-
width: params.grooveWidth ?? 0,
|
|
76
|
-
widthTolerance: params.grooveWidthTolerance ?? 0,
|
|
77
|
-
flapsAngle: params.grooveFlapsAngle ?? 0,
|
|
78
|
-
};
|
|
79
|
-
const result = dovetailBooleanSplitBrep(kernel, inputSolid, basis, groove);
|
|
80
|
-
frontSolid = result.front;
|
|
81
|
-
backSolid = result.back;
|
|
82
|
-
}
|
|
83
|
-
else if (cutMode === 'dowel' || cutMode === 'straight-tenon' || cutMode === 'tenon') {
|
|
84
|
-
const shape = cutMode === 'dowel' ? 'dowel' : 'tenon';
|
|
85
|
-
let joineryParams;
|
|
86
|
-
if (cutMode === 'dowel') {
|
|
87
|
-
joineryParams = {
|
|
88
|
-
size: params.dowelDiameter ?? 0,
|
|
89
|
-
sizeTolerance: params.dowelDiameterTolerance ?? 0,
|
|
90
|
-
height: params.dowelHeight ?? 0,
|
|
91
|
-
heightTolerance: params.dowelHeightTolerance ?? 0,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
joineryParams = {
|
|
96
|
-
size: params.tenonSideLength ?? 0,
|
|
97
|
-
sizeTolerance: params.tenonSideLengthTolerance ?? 0,
|
|
98
|
-
height: params.tenonHeight ?? 0,
|
|
99
|
-
heightTolerance: params.tenonHeightTolerance ?? 0,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
const selectedSections = params.selectedSections;
|
|
103
|
-
const result = dowelOrTenonBooleanSplitBrep(kernel, inputSolid, basis, shape, joineryParams, selectedSections ?? null);
|
|
104
|
-
frontSolid = result.front;
|
|
105
|
-
backSolid = result.back;
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
const splitResult = splitBrep(kernel, inputSolid, {
|
|
109
|
-
normal: normal,
|
|
110
|
-
originOffset,
|
|
111
|
-
planeCenter: planeCenter,
|
|
112
|
-
});
|
|
113
|
-
frontSolid = splitResult.front;
|
|
114
|
-
backSolid = splitResult.back;
|
|
115
|
-
}
|
|
116
|
-
// 分离位移:与 mesh 路径 finalizeExplode 同公式(bbox 对角线 2% + joinery 深度一半)
|
|
117
|
-
const applyExplode = params.applyExplode ?? true;
|
|
118
|
-
if (applyExplode) {
|
|
119
|
-
const bboxDiagonal = Math.sqrt(localBboxSize[0] * localBboxSize[0] + localBboxSize[1] * localBboxSize[1] + localBboxSize[2] * localBboxSize[2]);
|
|
120
|
-
const baseOffset = bboxDiagonal * 0.02;
|
|
121
|
-
let joineryOffset = 0;
|
|
122
|
-
if (cutMode === 'dovetail') {
|
|
123
|
-
joineryOffset = (params.grooveDepth ?? 0) / 2;
|
|
124
|
-
}
|
|
125
|
-
else if (cutMode === 'dowel') {
|
|
126
|
-
joineryOffset = (params.dowelHeight ?? 0) / 2;
|
|
127
|
-
}
|
|
128
|
-
else if (cutMode === 'straight-tenon' || cutMode === 'tenon') {
|
|
129
|
-
joineryOffset = (params.tenonHeight ?? 0) / 2;
|
|
130
|
-
}
|
|
131
|
-
const frontOffset = baseOffset + joineryOffset;
|
|
132
|
-
const backOffset = -(baseOffset + joineryOffset);
|
|
133
|
-
const frontTranslated = translateBrep(kernel, frontSolid, [
|
|
134
|
-
normal[0] * frontOffset,
|
|
135
|
-
normal[1] * frontOffset,
|
|
136
|
-
normal[2] * frontOffset,
|
|
137
|
-
]);
|
|
138
|
-
const backTranslated = translateBrep(kernel, backSolid, [
|
|
139
|
-
normal[0] * backOffset,
|
|
140
|
-
normal[1] * backOffset,
|
|
141
|
-
normal[2] * backOffset,
|
|
142
|
-
]);
|
|
143
|
-
kernel.release(frontSolid);
|
|
144
|
-
kernel.release(backSolid);
|
|
145
|
-
frontSolid = frontTranslated;
|
|
146
|
-
backSolid = backTranslated;
|
|
147
|
-
}
|
|
148
|
-
const frontShape = fromBrep(solidToShape(kernel, frontSolid), { solid: frontSolid });
|
|
149
|
-
const backShape = fromBrep(solidToShape(kernel, backSolid), { solid: backSolid });
|
|
150
|
-
return { front: frontShape, back: backShape };
|
|
151
|
-
}
|
|
152
|
-
/** mesh 路径:manifold-3d mesh-CSG。 */
|
|
153
|
-
async function splitMeshPath(input, params) {
|
|
154
|
-
const cutMode = params.cutMode ?? 'plane';
|
|
155
|
-
const normal = params.normal ?? [0, 0, 1];
|
|
156
|
-
const offset = typeof params.offset === 'number' ? params.offset : 0;
|
|
157
|
-
const inPlaneAngleDeg = typeof params.inPlaneAngleDeg === 'number' ? params.inPlaneAngleDeg : 0;
|
|
158
|
-
const bbCenter = params.bbCenter ?? cad.bboxCenter(input);
|
|
159
|
-
const bboxSize = params.bboxSize ?? cad.boundingBox(input).max.map((v, i) => v - cad.boundingBox(input).min[i]);
|
|
160
|
-
const partTransform = getBackends().config.partTransform;
|
|
161
|
-
const localBbCenter = worldToLocalVec3(bbCenter, partTransform);
|
|
162
|
-
const scale = partTransform?.scale;
|
|
163
|
-
const hasScale = scale && (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1);
|
|
164
|
-
const localBboxSize = hasScale
|
|
165
|
-
? [bboxSize[0] / scale[0], bboxSize[1] / scale[1], bboxSize[2] / scale[2]]
|
|
166
|
-
: bboxSize;
|
|
167
|
-
const result = await cad.fai_splitWithParams({
|
|
168
|
-
shape: input,
|
|
169
|
-
cutMode: cutMode,
|
|
170
|
-
normal,
|
|
171
|
-
offset,
|
|
172
|
-
inPlaneAngleDeg,
|
|
173
|
-
bbCenter: localBbCenter,
|
|
174
|
-
bboxSize: localBboxSize,
|
|
175
|
-
groove: params.grooveDepth !== undefined ? {
|
|
176
|
-
depth: params.grooveDepth,
|
|
177
|
-
depthTolerance: params.grooveDepthTolerance ?? 0,
|
|
178
|
-
width: params.grooveWidth ?? 0,
|
|
179
|
-
widthTolerance: params.grooveWidthTolerance ?? 0,
|
|
180
|
-
flapsAngle: params.grooveFlapsAngle ?? 0,
|
|
181
|
-
} : undefined,
|
|
182
|
-
dowel: params.dowelDiameter !== undefined ? {
|
|
183
|
-
diameter: params.dowelDiameter,
|
|
184
|
-
diameterTolerance: params.dowelDiameterTolerance ?? 0,
|
|
185
|
-
height: params.dowelHeight ?? 0,
|
|
186
|
-
heightTolerance: params.dowelHeightTolerance ?? 0,
|
|
187
|
-
} : undefined,
|
|
188
|
-
tenon: params.tenonSideLength !== undefined ? {
|
|
189
|
-
sideLength: params.tenonSideLength,
|
|
190
|
-
sideLengthTolerance: params.tenonSideLengthTolerance ?? 0,
|
|
191
|
-
height: params.tenonHeight ?? 0,
|
|
192
|
-
heightTolerance: params.tenonHeightTolerance ?? 0,
|
|
193
|
-
} : undefined,
|
|
194
|
-
selectedSections: params.selectedSections,
|
|
195
|
-
applyExplode: params.applyExplode ?? true,
|
|
196
|
-
});
|
|
197
|
-
return { front: solid(result.front), back: solid(result.back) };
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* 分割几何,返回具名对象 { front, back } 两个独立零件。
|
|
201
|
-
* @group 特征
|
|
202
|
-
* @inputs 1
|
|
203
|
-
* @async true
|
|
204
|
-
* @qual warn
|
|
205
|
-
* @name fai_split
|
|
206
|
-
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):`fai_` 前缀 op 为编辑器应用提供,不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
207
|
-
* @returns { front: Shape; back: Shape } 必须用解构 `const { front: partA, back: partB } = await cad.fai_split(...)` 取出两个零件。
|
|
208
|
-
* @param input - 目标几何。type:Shape required:true
|
|
209
|
-
* @param params.cutMode - 切割模式。type:'plane' | 'dovetail' | 'dowel' | 'tenon' | 'straight-tenon' | 'straight' 默认 'plane'
|
|
210
|
-
* @param params.normal - 切割面法向。type:[x,y,z] 默认 [0,0,1]
|
|
211
|
-
* @param params.offset - 切割面沿法向偏移(过 bbCenter)。type:number 默认 0
|
|
212
|
-
* @param params.inPlaneAngleDeg - 切割面面内旋转角(度)。type:number 默认 0
|
|
213
|
-
* @param params.bbCenter - 包围盒中心(缺省自动推导)。type:[x,y,z] 默认 自动
|
|
214
|
-
* @param params.bboxSize - 包围盒尺寸(缺省自动推导)。type:[x,y,z] 默认 自动
|
|
215
|
-
* @param params.applyExplode - 是否将两侧沿法向分离位移(bbox 对角线 2% + 榫卯深度一半)。type:boolean 默认 true
|
|
216
|
-
* @param params.grooveDepth - 燕尾槽深(cutMode='dovetail')。type:number
|
|
217
|
-
* @param params.grooveWidth - 燕尾槽宽(cutMode='dovetail')。type:number
|
|
218
|
-
* @param params.grooveDepthTolerance - 燕尾槽深公差。type:number
|
|
219
|
-
* @param params.grooveWidthTolerance - 燕尾槽宽公差。type:number
|
|
220
|
-
* @param params.grooveFlapsAngle - 燕尾槽翼角(度)。type:number
|
|
221
|
-
* @param params.dowelDiameter - 定位销直径(cutMode='dowel')。type:number
|
|
222
|
-
* @param params.dowelDiameterTolerance - 定位销直径公差。type:number
|
|
223
|
-
* @param params.dowelHeight - 定位销高度。type:number
|
|
224
|
-
* @param params.dowelHeightTolerance - 定位销高度公差。type:number
|
|
225
|
-
* @param params.tenonSideLength - 直榫边长(cutMode='tenon'/'straight-tenon')。type:number
|
|
226
|
-
* @param params.tenonSideLengthTolerance - 直榫边长公差。type:number
|
|
227
|
-
* @param params.tenonHeight - 直榫高度。type:number
|
|
228
|
-
* @param params.tenonHeightTolerance - 直榫高度公差。type:number
|
|
229
|
-
* @param params.selectedSections - 参与榫卯的截面下标。type:number[]
|
|
230
|
-
* @note 切割面统一用 `normal`/`offset`/`inPlaneAngleDeg` 描述;早期文本层曾与执行层键名断裂(planeRotation/planePosition),已修并统一为上述键名。
|
|
231
|
-
* @example
|
|
232
|
-
* const { front: part1, back: part2 } = await cad.fai_split(part0, { normal: [0, 0, 1], offset: 5, cutMode: 'dovetail', grooveDepth: 3, grooveWidth: 5 })
|
|
233
|
-
*/
|
|
234
|
-
export const fai_split = defineOp({
|
|
235
|
-
mesh: (input, params = {}) => {
|
|
236
|
-
if (!input)
|
|
237
|
-
throw new Error('[stdlib/split] no input geometry');
|
|
238
|
-
if (params.normal !== undefined && params.normal !== null) {
|
|
239
|
-
assertNonZeroVec3(params.normal, 'split.normal');
|
|
240
|
-
}
|
|
241
|
-
return splitMeshPath(input, params);
|
|
242
|
-
},
|
|
243
|
-
brep: (input, params = {}) => {
|
|
244
|
-
if (!input)
|
|
245
|
-
throw new Error('[stdlib/split] no input geometry');
|
|
246
|
-
if (params.normal !== undefined && params.normal !== null) {
|
|
247
|
-
assertNonZeroVec3(params.normal, 'split.normal');
|
|
248
|
-
}
|
|
249
|
-
return splitBrepPath(input, params);
|
|
250
|
-
},
|
|
251
|
-
outputs: ['front', 'back'],
|
|
252
|
-
naming: { kind: 'subdivide' },
|
|
253
|
-
});
|
|
254
|
-
//# sourceMappingURL=fai_split.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fai_split.js","sourceRoot":"","sources":["../../src/api/fai_split.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib split — 分割库函数(返回具名对象 { front, back })\n *\n *\n * dispatchPath 静态判定 brep/mesh,双输出以具名对象返回(替代 outputCache 多输出写入)。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport {\n splitBrep,\n solidToShape,\n translateBrep,\n} from '../brep/brep-ops'\nimport {\n dovetailBooleanSplitBrep,\n dowelOrTenonBooleanSplitBrep,\n type JoineryBasis,\n type GrooveParams,\n type DowelOrTenonParams,\n} from './brep-mirror/joinery-brep'\nimport { computeBasisFromNormal } from '../mesh/fai_split'\nimport { getBackends } from '../runtime-state'\nimport { solid, fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { assertNonZeroVec3 } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** 世界坐标 → 局部坐标(含单位缩放)。 */\nfunction worldToLocalVec3(\n worldPos: Vec3,\n partTransform: { position: [number, number, number]; scale?: [number, number, number] } | undefined,\n): Vec3 {\n const offset = partTransform?.position\n if (!offset) return worldPos\n const scale = partTransform?.scale\n if (scale && (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1)) {\n return [\n (worldPos[0] - offset[0]) / scale[0],\n (worldPos[1] - offset[1]) / scale[1],\n (worldPos[2] - offset[2]) / scale[2],\n ]\n }\n return [\n worldPos[0] - offset[0],\n worldPos[1] - offset[1],\n worldPos[2] - offset[2],\n ]\n}\n\n/** BREP 路径:OCCT 平面/榫卯分割 + 分离位移。 */\nfunction splitBrepPath(input: Shape, params: Record<string, unknown>): { front: Shape; back: Shape } {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/split] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/split] input is not BREP')\n\n const cutMode = (params.cutMode as string) ?? 'plane'\n const normal = (params.normal as Vec3) ?? [0, 0, 1]\n const offset = typeof params.offset === 'number' ? params.offset : 0\n const inPlaneAngleDeg = typeof params.inPlaneAngleDeg === 'number' ? params.inPlaneAngleDeg : 0\n const bbCenter = (params.bbCenter as Vec3) ?? cad.bboxCenter(input)\n const bboxSize = (params.bboxSize as Vec3) ?? cad.boundingBox(input).max.map(\n (v, i) => v - cad.boundingBox(input).min[i],\n ) as Vec3\n\n const partTransform = getBackends().config.partTransform\n const localBbCenter = worldToLocalVec3(bbCenter, partTransform)\n const scale = partTransform?.scale\n const hasScale = scale && (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1)\n const localBboxSize: Vec3 = hasScale\n ? [bboxSize[0] / scale![0], bboxSize[1] / scale![1], bboxSize[2] / scale![2]]\n : bboxSize\n\n const planeCenter: Vec3 = [\n localBbCenter[0] + offset * normal[0],\n localBbCenter[1] + offset * normal[1],\n localBbCenter[2] + offset * normal[2],\n ]\n const originOffset = normal[0] * planeCenter[0] + normal[1] * planeCenter[1] + normal[2] * planeCenter[2]\n\n const { widthDir, depthDir } = computeBasisFromNormal(normal, inPlaneAngleDeg)\n const basis: JoineryBasis = {\n normal: normal as Vec3,\n widthDir: widthDir as Vec3,\n depthDir: depthDir as Vec3,\n planeCenter: planeCenter as Vec3,\n originOffset,\n }\n\n let frontSolid: BrepHandle\n let backSolid: BrepHandle\n\n if (cutMode === 'dovetail') {\n const groove: GrooveParams = {\n depth: (params.grooveDepth as number) ?? 0,\n depthTolerance: (params.grooveDepthTolerance as number) ?? 0,\n width: (params.grooveWidth as number) ?? 0,\n widthTolerance: (params.grooveWidthTolerance as number) ?? 0,\n flapsAngle: (params.grooveFlapsAngle as number) ?? 0,\n }\n const result = dovetailBooleanSplitBrep(kernel, inputSolid, basis, groove)\n frontSolid = result.front\n backSolid = result.back\n } else if (cutMode === 'dowel' || cutMode === 'straight-tenon' || cutMode === 'tenon') {\n const shape: 'dowel' | 'tenon' = cutMode === 'dowel' ? 'dowel' : 'tenon'\n let joineryParams: DowelOrTenonParams\n if (cutMode === 'dowel') {\n joineryParams = {\n size: (params.dowelDiameter as number) ?? 0,\n sizeTolerance: (params.dowelDiameterTolerance as number) ?? 0,\n height: (params.dowelHeight as number) ?? 0,\n heightTolerance: (params.dowelHeightTolerance as number) ?? 0,\n }\n } else {\n joineryParams = {\n size: (params.tenonSideLength as number) ?? 0,\n sizeTolerance: (params.tenonSideLengthTolerance as number) ?? 0,\n height: (params.tenonHeight as number) ?? 0,\n heightTolerance: (params.tenonHeightTolerance as number) ?? 0,\n }\n }\n const selectedSections = params.selectedSections as number[] | null | undefined\n const result = dowelOrTenonBooleanSplitBrep(\n kernel, inputSolid, basis, shape, joineryParams, selectedSections ?? null,\n )\n frontSolid = result.front\n backSolid = result.back\n } else {\n const splitResult = splitBrep(kernel, inputSolid, {\n normal: normal as Vec3,\n originOffset,\n planeCenter: planeCenter as Vec3,\n })\n frontSolid = splitResult.front\n backSolid = splitResult.back\n }\n\n // 分离位移:与 mesh 路径 finalizeExplode 同公式(bbox 对角线 2% + joinery 深度一半)\n const applyExplode = (params.applyExplode as boolean | undefined) ?? true\n if (applyExplode) {\n const bboxDiagonal = Math.sqrt(\n localBboxSize[0] * localBboxSize[0] + localBboxSize[1] * localBboxSize[1] + localBboxSize[2] * localBboxSize[2],\n )\n const baseOffset = bboxDiagonal * 0.02\n let joineryOffset = 0\n if (cutMode === 'dovetail') {\n joineryOffset = ((params.grooveDepth as number) ?? 0) / 2\n } else if (cutMode === 'dowel') {\n joineryOffset = ((params.dowelHeight as number) ?? 0) / 2\n } else if (cutMode === 'straight-tenon' || cutMode === 'tenon') {\n joineryOffset = ((params.tenonHeight as number) ?? 0) / 2\n }\n const frontOffset = baseOffset + joineryOffset\n const backOffset = -(baseOffset + joineryOffset)\n const frontTranslated = translateBrep(kernel, frontSolid, [\n normal[0] * frontOffset,\n normal[1] * frontOffset,\n normal[2] * frontOffset,\n ])\n const backTranslated = translateBrep(kernel, backSolid, [\n normal[0] * backOffset,\n normal[1] * backOffset,\n normal[2] * backOffset,\n ])\n kernel.release(frontSolid)\n kernel.release(backSolid)\n frontSolid = frontTranslated\n backSolid = backTranslated\n }\n\n const frontShape = fromBrep(solidToShape(kernel, frontSolid), { solid: frontSolid })\n const backShape = fromBrep(solidToShape(kernel, backSolid), { solid: backSolid })\n return { front: frontShape, back: backShape }\n}\n\n/** mesh 路径:manifold-3d mesh-CSG。 */\nasync function splitMeshPath(input: Shape, params: Record<string, unknown>): Promise<{ front: Shape; back: Shape }> {\n const cutMode = (params.cutMode as string) ?? 'plane'\n const normal = (params.normal as Vec3) ?? [0, 0, 1]\n const offset = typeof params.offset === 'number' ? params.offset : 0\n const inPlaneAngleDeg = typeof params.inPlaneAngleDeg === 'number' ? params.inPlaneAngleDeg : 0\n const bbCenter = (params.bbCenter as Vec3) ?? cad.bboxCenter(input)\n const bboxSize = (params.bboxSize as Vec3) ?? cad.boundingBox(input).max.map(\n (v, i) => v - cad.boundingBox(input).min[i],\n ) as Vec3\n\n const partTransform = getBackends().config.partTransform\n const localBbCenter = worldToLocalVec3(bbCenter, partTransform)\n const scale = partTransform?.scale\n const hasScale = scale && (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1)\n const localBboxSize: Vec3 = hasScale\n ? [bboxSize[0] / scale![0], bboxSize[1] / scale![1], bboxSize[2] / scale![2]]\n : bboxSize\n\n const result = await cad.fai_splitWithParams({\n shape: input,\n cutMode: cutMode as 'plane' | 'dovetail' | 'dowel' | 'straight-tenon' | 'tenon' | 'straight',\n normal,\n offset,\n inPlaneAngleDeg,\n bbCenter: localBbCenter,\n bboxSize: localBboxSize,\n groove: params.grooveDepth !== undefined ? {\n depth: params.grooveDepth as number,\n depthTolerance: (params.grooveDepthTolerance as number) ?? 0,\n width: (params.grooveWidth as number) ?? 0,\n widthTolerance: (params.grooveWidthTolerance as number) ?? 0,\n flapsAngle: (params.grooveFlapsAngle as number) ?? 0,\n } : undefined,\n dowel: params.dowelDiameter !== undefined ? {\n diameter: params.dowelDiameter as number,\n diameterTolerance: (params.dowelDiameterTolerance as number) ?? 0,\n height: (params.dowelHeight as number) ?? 0,\n heightTolerance: (params.dowelHeightTolerance as number) ?? 0,\n } : undefined,\n tenon: params.tenonSideLength !== undefined ? {\n sideLength: params.tenonSideLength as number,\n sideLengthTolerance: (params.tenonSideLengthTolerance as number) ?? 0,\n height: (params.tenonHeight as number) ?? 0,\n heightTolerance: (params.tenonHeightTolerance as number) ?? 0,\n } : undefined,\n selectedSections: params.selectedSections as number[] | null | undefined,\n applyExplode: (params.applyExplode as boolean | undefined) ?? true,\n })\n\n return { front: solid(result.front), back: solid(result.back) }\n}\n\n/**\n * 分割几何,返回具名对象 { front, back } 两个独立零件。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual warn\n * @name fai_split\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):`fai_` 前缀 op 为编辑器应用提供,不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns { front: Shape; back: Shape } 必须用解构 `const { front: partA, back: partB } = await cad.fai_split(...)` 取出两个零件。\n * @param input - 目标几何。type:Shape required:true\n * @param params.cutMode - 切割模式。type:'plane' | 'dovetail' | 'dowel' | 'tenon' | 'straight-tenon' | 'straight' 默认 'plane'\n * @param params.normal - 切割面法向。type:[x,y,z] 默认 [0,0,1]\n * @param params.offset - 切割面沿法向偏移(过 bbCenter)。type:number 默认 0\n * @param params.inPlaneAngleDeg - 切割面面内旋转角(度)。type:number 默认 0\n * @param params.bbCenter - 包围盒中心(缺省自动推导)。type:[x,y,z] 默认 自动\n * @param params.bboxSize - 包围盒尺寸(缺省自动推导)。type:[x,y,z] 默认 自动\n * @param params.applyExplode - 是否将两侧沿法向分离位移(bbox 对角线 2% + 榫卯深度一半)。type:boolean 默认 true\n * @param params.grooveDepth - 燕尾槽深(cutMode='dovetail')。type:number\n * @param params.grooveWidth - 燕尾槽宽(cutMode='dovetail')。type:number\n * @param params.grooveDepthTolerance - 燕尾槽深公差。type:number\n * @param params.grooveWidthTolerance - 燕尾槽宽公差。type:number\n * @param params.grooveFlapsAngle - 燕尾槽翼角(度)。type:number\n * @param params.dowelDiameter - 定位销直径(cutMode='dowel')。type:number\n * @param params.dowelDiameterTolerance - 定位销直径公差。type:number\n * @param params.dowelHeight - 定位销高度。type:number\n * @param params.dowelHeightTolerance - 定位销高度公差。type:number\n * @param params.tenonSideLength - 直榫边长(cutMode='tenon'/'straight-tenon')。type:number\n * @param params.tenonSideLengthTolerance - 直榫边长公差。type:number\n * @param params.tenonHeight - 直榫高度。type:number\n * @param params.tenonHeightTolerance - 直榫高度公差。type:number\n * @param params.selectedSections - 参与榫卯的截面下标。type:number[]\n * @note 切割面统一用 `normal`/`offset`/`inPlaneAngleDeg` 描述;早期文本层曾与执行层键名断裂(planeRotation/planePosition),已修并统一为上述键名。\n * @example\n * const { front: part1, back: part2 } = await cad.fai_split(part0, { normal: [0, 0, 1], offset: 5, cutMode: 'dovetail', grooveDepth: 3, grooveWidth: 5 })\n */\nexport const fai_split = defineOp({\n mesh: (input: Shape, params: Record<string, unknown> = {}) => {\n if (!input) throw new Error('[stdlib/split] no input geometry')\n if (params.normal !== undefined && params.normal !== null) {\n assertNonZeroVec3(params.normal, 'split.normal')\n }\n return splitMeshPath(input, params)\n },\n brep: (input: Shape, params: Record<string, unknown> = {}) => {\n if (!input) throw new Error('[stdlib/split] no input geometry')\n if (params.normal !== undefined && params.normal !== null) {\n assertNonZeroVec3(params.normal, 'split.normal')\n }\n return splitBrepPath(input, params)\n },\n outputs: ['front', 'back'],\n naming: { kind: 'subdivide' } as Provenance,\n})\n"]}
|
package/dist/api/load.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib load — 加载库函数(统一 load 函数)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* buffer 经宿主资产解析器解析,isCadFormat 静态判定 brep/mesh,
|
|
6
|
-
* 产物经 solid()/fromBrep() 构造器创建。
|
|
7
|
-
*/
|
|
8
|
-
import type { Shape } from '../mesh/types.js';
|
|
9
|
-
/**
|
|
10
|
-
* 执行加载操作(统一 load 函数)
|
|
11
|
-
*
|
|
12
|
-
* 按 params 中存在的 key/path/url 分流解析 buffer,全部经宿主资产解析器。
|
|
13
|
-
*
|
|
14
|
-
* 静态分派:
|
|
15
|
-
* - CAD 源 + kernel + 非 mesh 模式 → BREP 路径(loadBrep 异常 = 未预期错误,冒泡上报)
|
|
16
|
-
* - 非 CAD 源 / 无 kernel / mesh 模式 → mesh 路径
|
|
17
|
-
* - brep 模式且将走 mesh 路径 → 调用前抛 BrepUnsupportedError(不静默回退)
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* 加载几何资产。key / path / url 三选一(按此优先级分流),内容经宿主资产解析器解析,**引用而非拷贝**。
|
|
21
|
-
* @group 创建
|
|
22
|
-
* @inputs 0
|
|
23
|
-
* @async true
|
|
24
|
-
* @qual ok
|
|
25
|
-
* @name load
|
|
26
|
-
* @note 语言正常化后 loadFile/loadUrl/loadByKey 别名已删除(A4),统一为 `load` 一个函数。
|
|
27
|
-
* @returns Shape 加载的几何,永远是 part 的第一条语句,后面可接特征链。
|
|
28
|
-
* @param params.key - faicad 缓存中的资产 key(内容按 key 取)。type:string
|
|
29
|
-
* @param params.path - 本地绝对路径(非 web 环境)。type:string
|
|
30
|
-
* @param params.url - 网络地址。type:string
|
|
31
|
-
* @param params.format - 格式提示(如 'step'/'stl';CAD 源走 BREP 精确路径,STL 等三角化源走 mesh 路径)。type:string
|
|
32
|
-
* @note key/path/url 是优先级分流(key 优先,其次 path,最后 url),三者只需其一;同时给多个时按优先级取。`format` 是提示而非强约束——CAD 源(step/stp/brep 等)与三角化源(stl 等)由 `isCadFormat` 静态判定路径。
|
|
33
|
-
* @note 本 op 要求导入物含实体(历史契约)。非实体(wire/face/shell)的导入是平台 `cad.import_brep` 的一等能力,不由本 op 承担。
|
|
34
|
-
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用的「文件导入 Feature」提供——key/path/url 三键分流读的是应用侧 `FileRef`,产物语句位置、命名与 partIndex 都是画布语义。不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。平台侧导入请用 `cad.import_brep`(冻结 BREP 资产)。
|
|
35
|
-
* @example
|
|
36
|
-
* const p = await cad.load({ key: 'file_abc123' })
|
|
37
|
-
* const p = await cad.load({ path: 'D:/models/box.step', format: 'step' })
|
|
38
|
-
* const p = await cad.load({ url: 'https://…/box.3mf' })
|
|
39
|
-
*/
|
|
40
|
-
export declare function load(params: Record<string, unknown>): Promise<Shape>;
|
|
41
|
-
//# sourceMappingURL=load.d.ts.map
|
package/dist/api/load.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/api/load.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAS1C;;;;;;;;;GASG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA8C1E"}
|
package/dist/api/load.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib load — 加载库函数(统一 load 函数)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* buffer 经宿主资产解析器解析,isCadFormat 静态判定 brep/mesh,
|
|
6
|
-
* 产物经 solid()/fromBrep() 构造器创建。
|
|
7
|
-
*/
|
|
8
|
-
import { cad } from '../mesh/index.js';
|
|
9
|
-
import { isCadFormat } from '../brep/brep-chain.js';
|
|
10
|
-
import { loadBrep } from '../brep/brep-ops.js';
|
|
11
|
-
import { OpError } from './internal/result-unwrap.js';
|
|
12
|
-
import { getBackends, BrepUnsupportedError } from '../runtime-state.js';
|
|
13
|
-
import { solid, fromBrep } from '../shape.js';
|
|
14
|
-
/**
|
|
15
|
-
* 执行加载操作(统一 load 函数)
|
|
16
|
-
*
|
|
17
|
-
* 按 params 中存在的 key/path/url 分流解析 buffer,全部经宿主资产解析器。
|
|
18
|
-
*
|
|
19
|
-
* 静态分派:
|
|
20
|
-
* - CAD 源 + kernel + 非 mesh 模式 → BREP 路径(loadBrep 异常 = 未预期错误,冒泡上报)
|
|
21
|
-
* - 非 CAD 源 / 无 kernel / mesh 模式 → mesh 路径
|
|
22
|
-
* - brep 模式且将走 mesh 路径 → 调用前抛 BrepUnsupportedError(不静默回退)
|
|
23
|
-
*/
|
|
24
|
-
/**
|
|
25
|
-
* 加载几何资产。key / path / url 三选一(按此优先级分流),内容经宿主资产解析器解析,**引用而非拷贝**。
|
|
26
|
-
* @group 创建
|
|
27
|
-
* @inputs 0
|
|
28
|
-
* @async true
|
|
29
|
-
* @qual ok
|
|
30
|
-
* @name load
|
|
31
|
-
* @note 语言正常化后 loadFile/loadUrl/loadByKey 别名已删除(A4),统一为 `load` 一个函数。
|
|
32
|
-
* @returns Shape 加载的几何,永远是 part 的第一条语句,后面可接特征链。
|
|
33
|
-
* @param params.key - faicad 缓存中的资产 key(内容按 key 取)。type:string
|
|
34
|
-
* @param params.path - 本地绝对路径(非 web 环境)。type:string
|
|
35
|
-
* @param params.url - 网络地址。type:string
|
|
36
|
-
* @param params.format - 格式提示(如 'step'/'stl';CAD 源走 BREP 精确路径,STL 等三角化源走 mesh 路径)。type:string
|
|
37
|
-
* @note key/path/url 是优先级分流(key 优先,其次 path,最后 url),三者只需其一;同时给多个时按优先级取。`format` 是提示而非强约束——CAD 源(step/stp/brep 等)与三角化源(stl 等)由 `isCadFormat` 静态判定路径。
|
|
38
|
-
* @note 本 op 要求导入物含实体(历史契约)。非实体(wire/face/shell)的导入是平台 `cad.import_brep` 的一等能力,不由本 op 承担。
|
|
39
|
-
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用的「文件导入 Feature」提供——key/path/url 三键分流读的是应用侧 `FileRef`,产物语句位置、命名与 partIndex 都是画布语义。不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。平台侧导入请用 `cad.import_brep`(冻结 BREP 资产)。
|
|
40
|
-
* @example
|
|
41
|
-
* const p = await cad.load({ key: 'file_abc123' })
|
|
42
|
-
* const p = await cad.load({ path: 'D:/models/box.step', format: 'step' })
|
|
43
|
-
* const p = await cad.load({ url: 'https://…/box.3mf' })
|
|
44
|
-
*/
|
|
45
|
-
export async function load(params) {
|
|
46
|
-
const assets = getBackends().assets;
|
|
47
|
-
if (!assets) {
|
|
48
|
-
throw new OpError('load', 'E_OP_FAILED', '[stdlib/load] assets is required for load op');
|
|
49
|
-
}
|
|
50
|
-
// 按 key/path/url 分流解析 buffer
|
|
51
|
-
let buffer;
|
|
52
|
-
if (params.key !== undefined && params.key !== null) {
|
|
53
|
-
buffer = (await assets.resolveByKey(params.key)).bytes;
|
|
54
|
-
}
|
|
55
|
-
else if (params.path !== undefined && params.path !== null) {
|
|
56
|
-
buffer = await assets.resolveFile(params.path);
|
|
57
|
-
}
|
|
58
|
-
else if (params.url !== undefined && params.url !== null) {
|
|
59
|
-
buffer = await assets.resolveUrl(params.url);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
throw new OpError('load', 'E_OP_FAILED', '[stdlib/load] load op requires exactly one of key/path/url');
|
|
63
|
-
}
|
|
64
|
-
// 静态判定路径:mesh 模式 / 无 kernel / 非 CAD 源 → mesh 路径;否则 BREP 路径
|
|
65
|
-
const { config, kernel: kernels } = getBackends();
|
|
66
|
-
const kernel = kernels.brep;
|
|
67
|
-
const useBrep = config.mode !== 'mesh' && !!kernel && isCadFormat(params, true);
|
|
68
|
-
// brep 模式且将走 mesh-only 路径 → 调用前抛错,不静默回退
|
|
69
|
-
if (!useBrep && config.mode === 'brep') {
|
|
70
|
-
throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: load op has no BREP implementation for this source');
|
|
71
|
-
}
|
|
72
|
-
// mesh 路径
|
|
73
|
-
if (!useBrep) {
|
|
74
|
-
return solid(await cad.load(buffer, params.format));
|
|
75
|
-
}
|
|
76
|
-
// BREP 路径(直接执行,不包 try-catch!异常 = 未预期错误,冒泡上报)
|
|
77
|
-
// P2:brepChain(meshShapeCache)归引擎侧,loadBrep 不再传
|
|
78
|
-
// partIndex:多 part 文件(如多 solid STEP)逐 part 加载——宿主为每个 part
|
|
79
|
-
// 生成独立 load 语句并携带 partIndex,提取 Compound 中对应子 solid。
|
|
80
|
-
const partIndex = typeof params.partIndex === 'number' ? params.partIndex : undefined;
|
|
81
|
-
const { solid: solidHandle, shape } = loadBrep(kernel, buffer, undefined, undefined, partIndex);
|
|
82
|
-
return fromBrep(shape, { solid: solidHandle });
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=load.js.map
|
package/dist/api/load.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/api/load.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAG1C;;;;;;;;;GASG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAA+B;IACxD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAIhB,CAAA;IACb,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,8CAA8C,CAAC,CAAA;IAC1F,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAmB,CAAA;IACvB,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAa,CAAC,CAAC,CAAC,KAAK,CAAA;IAClE,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC7D,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAc,CAAC,CAAA;IAC1D,CAAC;SAAM,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QAC3D,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAa,CAAC,CAAA;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,4DAA4D,CAAC,CAAA;IACxG,CAAC;IAED,2DAA2D;IAC3D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,IAA4B,CAAA;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAE/E,wCAAwC;IACxC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvC,MAAM,IAAI,oBAAoB,CAAC,wEAAwE,CAAC,CAAA;IAC1G,CAAC;IAED,UAAU;IACV,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAA4B,CAAC,CAAC,CAAA;IAC3E,CAAC;IAED,6CAA6C;IAC7C,gDAAgD;IAChD,0DAA0D;IAC1D,oDAAoD;IACpD,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;IACrF,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,QAAQ,CAC5C,MAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CACjD,CAAA;IACD,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;AAChD,CAAC","sourcesContent":["/**\n * stdlib load — 加载库函数(统一 load 函数)\n *\n *\n * buffer 经宿主资产解析器解析,isCadFormat 静态判定 brep/mesh,\n * 产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { isCadFormat } from '../brep/brep-chain'\nimport { loadBrep } from '../brep/brep-ops'\nimport { OpError } from './internal/result-unwrap'\nimport { getBackends, BrepUnsupportedError } from '../runtime-state'\nimport { solid, fromBrep } from '../shape'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * 执行加载操作(统一 load 函数)\n *\n * 按 params 中存在的 key/path/url 分流解析 buffer,全部经宿主资产解析器。\n *\n * 静态分派:\n * - CAD 源 + kernel + 非 mesh 模式 → BREP 路径(loadBrep 异常 = 未预期错误,冒泡上报)\n * - 非 CAD 源 / 无 kernel / mesh 模式 → mesh 路径\n * - brep 模式且将走 mesh 路径 → 调用前抛 BrepUnsupportedError(不静默回退)\n */\n/**\n * 加载几何资产。key / path / url 三选一(按此优先级分流),内容经宿主资产解析器解析,**引用而非拷贝**。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name load\n * @note 语言正常化后 loadFile/loadUrl/loadByKey 别名已删除(A4),统一为 `load` 一个函数。\n * @returns Shape 加载的几何,永远是 part 的第一条语句,后面可接特征链。\n * @param params.key - faicad 缓存中的资产 key(内容按 key 取)。type:string\n * @param params.path - 本地绝对路径(非 web 环境)。type:string\n * @param params.url - 网络地址。type:string\n * @param params.format - 格式提示(如 'step'/'stl';CAD 源走 BREP 精确路径,STL 等三角化源走 mesh 路径)。type:string\n * @note key/path/url 是优先级分流(key 优先,其次 path,最后 url),三者只需其一;同时给多个时按优先级取。`format` 是提示而非强约束——CAD 源(step/stp/brep 等)与三角化源(stl 等)由 `isCadFormat` 静态判定路径。\n * @note 本 op 要求导入物含实体(历史契约)。非实体(wire/face/shell)的导入是平台 `cad.import_brep` 的一等能力,不由本 op 承担。\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用的「文件导入 Feature」提供——key/path/url 三键分流读的是应用侧 `FileRef`,产物语句位置、命名与 partIndex 都是画布语义。不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。平台侧导入请用 `cad.import_brep`(冻结 BREP 资产)。\n * @example\n * const p = await cad.load({ key: 'file_abc123' })\n * const p = await cad.load({ path: 'D:/models/box.step', format: 'step' })\n * const p = await cad.load({ url: 'https://…/box.3mf' })\n */\nexport async function load(params: Record<string, unknown>): Promise<Shape> {\n const assets = getBackends().assets as {\n resolveByKey(key: string): Promise<{ bytes: ArrayBuffer }>\n resolveFile(path: string): Promise<ArrayBuffer>\n resolveUrl(url: string): Promise<ArrayBuffer>\n } | undefined\n if (!assets) {\n throw new OpError('load', 'E_OP_FAILED', '[stdlib/load] assets is required for load op')\n }\n\n // 按 key/path/url 分流解析 buffer\n let buffer: ArrayBuffer\n if (params.key !== undefined && params.key !== null) {\n buffer = (await assets.resolveByKey(params.key as string)).bytes\n } else if (params.path !== undefined && params.path !== null) {\n buffer = await assets.resolveFile(params.path as string)\n } else if (params.url !== undefined && params.url !== null) {\n buffer = await assets.resolveUrl(params.url as string)\n } else {\n throw new OpError('load', 'E_OP_FAILED', '[stdlib/load] load op requires exactly one of key/path/url')\n }\n\n // 静态判定路径:mesh 模式 / 无 kernel / 非 CAD 源 → mesh 路径;否则 BREP 路径\n const { config, kernel: kernels } = getBackends()\n const kernel = kernels.brep as BrepEngineApi | null\n const useBrep = config.mode !== 'mesh' && !!kernel && isCadFormat(params, true)\n\n // brep 模式且将走 mesh-only 路径 → 调用前抛错,不静默回退\n if (!useBrep && config.mode === 'brep') {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: load op has no BREP implementation for this source')\n }\n\n // mesh 路径\n if (!useBrep) {\n return solid(await cad.load(buffer, params.format as string | undefined))\n }\n\n // BREP 路径(直接执行,不包 try-catch!异常 = 未预期错误,冒泡上报)\n // P2:brepChain(meshShapeCache)归引擎侧,loadBrep 不再传\n // partIndex:多 part 文件(如多 solid STEP)逐 part 加载——宿主为每个 part\n // 生成独立 load 语句并携带 partIndex,提取 Compound 中对应子 solid。\n const partIndex = typeof params.partIndex === 'number' ? params.partIndex : undefined\n const { solid: solidHandle, shape } = loadBrep(\n kernel!, buffer, undefined, undefined, partIndex,\n )\n return fromBrep(shape, { solid: solidHandle })\n}\n"]}
|
package/dist/api/svgExtrude.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib svgExtrude — SVG 挤出创建库函数(creator 函数,无输入)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
|
|
6
|
-
*/
|
|
7
|
-
import type { Shape } from '../mesh/types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Validate svgExtrude parameters: `svg` is required and `depth` must be a
|
|
10
|
-
* positive number.
|
|
11
|
-
* @param params - the raw svgExtrude operation parameters.
|
|
12
|
-
*/
|
|
13
|
-
export declare function assertSvgExtrudeParams(params: Record<string, unknown>): void;
|
|
14
|
-
/**
|
|
15
|
-
* 从二维 SVG 轮廓挤出零件(拓扑操作)。
|
|
16
|
-
* @group 创建
|
|
17
|
-
* @inputs 0
|
|
18
|
-
* @async true
|
|
19
|
-
* @qual warn
|
|
20
|
-
* @name svgExtrude
|
|
21
|
-
* @note SVG 是外部资产,应优先用资产引用(`cad.asset(key)` 经 CallRefIR)而非整份 XML 内联拷贝。自然尺寸(viewBox)与缩放已显式成参数(mesh/BREP 两条路径都解析 viewBox 并传递 naturalWidth/naturalHeight),尺寸语义不再依赖两套实现各自推导。
|
|
22
|
-
* @returns Shape SVG 挤出几何,生成独立零件。
|
|
23
|
-
* @param params.svg - SVG 内容:资产 key(推荐)或整份 SVG 文本(兼容)。type:string required:true
|
|
24
|
-
* @param params.depth - 挤出深度(mm)。type:number required:true
|
|
25
|
-
* @param params.targetLongSide - 长边目标尺寸(mm)。type:number 默认 20
|
|
26
|
-
* @example
|
|
27
|
-
* const s = await cad.svgExtrude({ svg: 'logo.svg', depth: 5, targetLongSide: 20 })
|
|
28
|
-
*/
|
|
29
|
-
export declare const svgExtrude: ((params: Record<string, unknown>) => Promise<Shape>) & {
|
|
30
|
-
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=svgExtrude.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"svgExtrude.d.ts","sourceRoot":"","sources":["../../src/api/svgExtrude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAc1C;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAK5E;AAeD;;;;;;;;;;;;;;IAcI;AACJ,eAAO,MAAM,UAAU;;CAoBrB,CAAA"}
|
package/dist/api/svgExtrude.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib svgExtrude — SVG 挤出创建库函数(creator 函数,无输入)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
|
|
6
|
-
*/
|
|
7
|
-
import { cad } from '../mesh/index.js';
|
|
8
|
-
import { parseSvgNaturalSize } from '../primitives/parse-svg-size.js';
|
|
9
|
-
import { svgToSolid } from '../brep/svg/svg-to-solid.js';
|
|
10
|
-
import { solidToShape } from '../brep/brep-ops.js';
|
|
11
|
-
import { resolveSvgArg } from './internal/svg-asset-resolver.js';
|
|
12
|
-
import { getBackends } from '../runtime-state.js';
|
|
13
|
-
import { fromBrep } from '../shape.js';
|
|
14
|
-
import { defineOp } from '../sdk.js';
|
|
15
|
-
import { assertPositiveNumber } from './assert.js';
|
|
16
|
-
/**
|
|
17
|
-
* Validate svgExtrude parameters: `svg` is required and `depth` must be a
|
|
18
|
-
* positive number.
|
|
19
|
-
* @param params - the raw svgExtrude operation parameters.
|
|
20
|
-
*/
|
|
21
|
-
export function assertSvgExtrudeParams(params) {
|
|
22
|
-
if (params.svg === undefined || params.svg === null || params.svg === '') {
|
|
23
|
-
throw new Error(`[stdlib/svgExtrude] svg is required, got ${JSON.stringify(params.svg)}`);
|
|
24
|
-
}
|
|
25
|
-
assertPositiveNumber(params.depth, 'svgExtrude.depth');
|
|
26
|
-
}
|
|
27
|
-
/** BREP 路径:SVG path 解析 → OCCT wire/face → extrude + fromBrep 登记。 */
|
|
28
|
-
function svgExtrudeBrep(params, svgText) {
|
|
29
|
-
const kernel = getBackends().kernel.brep;
|
|
30
|
-
if (!kernel)
|
|
31
|
-
throw new Error('[stdlib/svgExtrude] no OCCT kernel');
|
|
32
|
-
const solidHandle = svgToSolid(kernel, svgText, {
|
|
33
|
-
depth: params.depth,
|
|
34
|
-
targetLongSide: params.targetLongSide ?? 20,
|
|
35
|
-
});
|
|
36
|
-
return fromBrep(solidToShape(kernel, solidHandle), { solid: solidHandle });
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* 从二维 SVG 轮廓挤出零件(拓扑操作)。
|
|
40
|
-
* @group 创建
|
|
41
|
-
* @inputs 0
|
|
42
|
-
* @async true
|
|
43
|
-
* @qual warn
|
|
44
|
-
* @name svgExtrude
|
|
45
|
-
* @note SVG 是外部资产,应优先用资产引用(`cad.asset(key)` 经 CallRefIR)而非整份 XML 内联拷贝。自然尺寸(viewBox)与缩放已显式成参数(mesh/BREP 两条路径都解析 viewBox 并传递 naturalWidth/naturalHeight),尺寸语义不再依赖两套实现各自推导。
|
|
46
|
-
* @returns Shape SVG 挤出几何,生成独立零件。
|
|
47
|
-
* @param params.svg - SVG 内容:资产 key(推荐)或整份 SVG 文本(兼容)。type:string required:true
|
|
48
|
-
* @param params.depth - 挤出深度(mm)。type:number required:true
|
|
49
|
-
* @param params.targetLongSide - 长边目标尺寸(mm)。type:number 默认 20
|
|
50
|
-
* @example
|
|
51
|
-
* const s = await cad.svgExtrude({ svg: 'logo.svg', depth: 5, targetLongSide: 20 })
|
|
52
|
-
*/
|
|
53
|
-
export const svgExtrude = defineOp({
|
|
54
|
-
mesh: async (params) => {
|
|
55
|
-
assertSvgExtrudeParams(params);
|
|
56
|
-
const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets });
|
|
57
|
-
// mesh 路径:与 BREP 路径一致,内部解析 SVG 自然尺寸后缩放
|
|
58
|
-
const { naturalWidth, naturalHeight } = parseSvgNaturalSize(svgText);
|
|
59
|
-
return cad.svgExtrude({
|
|
60
|
-
svg: svgText,
|
|
61
|
-
depth: params.depth,
|
|
62
|
-
targetLongSide: params.targetLongSide ?? 20,
|
|
63
|
-
naturalWidth,
|
|
64
|
-
naturalHeight,
|
|
65
|
-
});
|
|
66
|
-
},
|
|
67
|
-
brep: async (params) => {
|
|
68
|
-
assertSvgExtrudeParams(params);
|
|
69
|
-
const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets });
|
|
70
|
-
return svgExtrudeBrep(params, svgText);
|
|
71
|
-
},
|
|
72
|
-
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } },
|
|
73
|
-
});
|
|
74
|
-
//# sourceMappingURL=svgExtrude.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"svgExtrude.js","sourceRoot":"","sources":["../../src/api/svgExtrude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAG/C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA+B;IACpE,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3F,CAAC;IACD,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;AACxD,CAAC;AAED,oEAAoE;AACpE,SAAS,cAAc,CAAC,MAA+B,EAAE,OAAe;IACtE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAElE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;QAC9C,KAAK,EAAE,MAAM,CAAC,KAAe;QAC7B,cAAc,EAAG,MAAM,CAAC,cAAqC,IAAI,EAAE;KACpE,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;;;;;IAcI;AACJ,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,KAAK,EAAE,MAA+B,EAAE,EAAE;QAC9C,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAmC,EAAE,CAAC,CAAA;QAC9G,uCAAuC;QACvC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACpE,OAAO,GAAG,CAAC,UAAU,CAAC;YACpB,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,MAAM,CAAC,KAAe;YAC7B,cAAc,EAAG,MAAM,CAAC,cAAqC,IAAI,EAAE;YACnE,YAAY;YACZ,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,MAA+B,EAAE,EAAE;QAC9C,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAmC,EAAE,CAAC,CAAA;QAC9G,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,EAAgB;CACtF,CAAC,CAAA","sourcesContent":["/**\n * stdlib svgExtrude — SVG 挤出创建库函数(creator 函数,无输入)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { AssetResolver } from '../cad-runtime/ports'\nimport { cad } from '../mesh'\nimport { parseSvgNaturalSize } from '../primitives/parse-svg-size'\nimport { svgToSolid } from '../brep/svg/svg-to-solid'\nimport { solidToShape } from '../brep/brep-ops'\nimport { resolveSvgArg } from './internal/svg-asset-resolver'\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 svgExtrude parameters: `svg` is required and `depth` must be a\n * positive number.\n * @param params - the raw svgExtrude operation parameters.\n */\nexport function assertSvgExtrudeParams(params: Record<string, unknown>): void {\n if (params.svg === undefined || params.svg === null || params.svg === '') {\n throw new Error(`[stdlib/svgExtrude] svg is required, got ${JSON.stringify(params.svg)}`)\n }\n assertPositiveNumber(params.depth, 'svgExtrude.depth')\n}\n\n/** BREP 路径:SVG path 解析 → OCCT wire/face → extrude + fromBrep 登记。 */\nfunction svgExtrudeBrep(params: Record<string, unknown>, svgText: string): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/svgExtrude] no OCCT kernel')\n\n const solidHandle = svgToSolid(kernel, svgText, {\n depth: params.depth as number,\n targetLongSide: (params.targetLongSide as number | undefined) ?? 20,\n })\n\n return fromBrep(solidToShape(kernel, solidHandle), { solid: solidHandle })\n}\n\n/**\n * 从二维 SVG 轮廓挤出零件(拓扑操作)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual warn\n * @name svgExtrude\n * @note SVG 是外部资产,应优先用资产引用(`cad.asset(key)` 经 CallRefIR)而非整份 XML 内联拷贝。自然尺寸(viewBox)与缩放已显式成参数(mesh/BREP 两条路径都解析 viewBox 并传递 naturalWidth/naturalHeight),尺寸语义不再依赖两套实现各自推导。\n * @returns Shape SVG 挤出几何,生成独立零件。\n * @param params.svg - SVG 内容:资产 key(推荐)或整份 SVG 文本(兼容)。type:string required:true\n * @param params.depth - 挤出深度(mm)。type:number required:true\n * @param params.targetLongSide - 长边目标尺寸(mm)。type:number 默认 20\n * @example\n * const s = await cad.svgExtrude({ svg: 'logo.svg', depth: 5, targetLongSide: 20 })\n */\nexport const svgExtrude = defineOp({\n mesh: async (params: Record<string, unknown>) => {\n assertSvgExtrudeParams(params)\n const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets as AssetResolver | undefined })\n // mesh 路径:与 BREP 路径一致,内部解析 SVG 自然尺寸后缩放\n const { naturalWidth, naturalHeight } = parseSvgNaturalSize(svgText)\n return cad.svgExtrude({\n svg: svgText,\n depth: params.depth as number,\n targetLongSide: (params.targetLongSide as number | undefined) ?? 20,\n naturalWidth,\n naturalHeight,\n })\n },\n brep: async (params: Record<string, unknown>) => {\n assertSvgExtrudeParams(params)\n const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets as AssetResolver | undefined })\n return svgExtrudeBrep(params, svgText)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
package/dist/api/text.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stdlib text — 文字创建库函数(text)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
|
|
6
|
-
*/
|
|
7
|
-
import type { Shape } from '../mesh/types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Validate text parameters: `text` must be a non-empty string, and `size` and
|
|
10
|
-
* `depth` must be positive numbers.
|
|
11
|
-
* @param params - the raw text operation parameters.
|
|
12
|
-
*/
|
|
13
|
-
export declare function assertTextParams(params: Record<string, unknown>): void;
|
|
14
|
-
/**
|
|
15
|
-
* 生成文字零件(文字轮廓挤出,X/Z 居中、Y 底部对齐原点)。
|
|
16
|
-
* @group 创建
|
|
17
|
-
* @inputs 0
|
|
18
|
-
* @async true
|
|
19
|
-
* @qual warn
|
|
20
|
-
* @name text
|
|
21
|
-
* @returns Shape 文字几何,生成独立零件。
|
|
22
|
-
* @param maybeParams - 兼容形态的补充参数(正常不传)。type:Record<string, unknown> required:false
|
|
23
|
-
* @param inputOrParams.text - 要生成的文字。type:string required:true
|
|
24
|
-
* @param inputOrParams.size - 字号(mm)。type:number required:true
|
|
25
|
-
* @param inputOrParams.depth - 挤出深度(mm)。type:number required:true
|
|
26
|
-
* @param inputOrParams.font - 字体。type:string 默认 默认字体
|
|
27
|
-
* @note font 语义未定(当前只有默认字体),⚠️ 暂不要传。兼容 `cad.text(part0, {...})` 带输入形态(输入被忽略),正常写 `cad.text({...})` 即可。
|
|
28
|
-
* @example
|
|
29
|
-
* const t = await cad.text({ text: 'Hello', size: 20, depth: 5 })
|
|
30
|
-
*/
|
|
31
|
-
export declare const text: ((inputOrParams: unknown, maybeParams?: Record<string, unknown> | undefined) => Promise<Shape>) & {
|
|
32
|
-
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=text.d.ts.map
|
package/dist/api/text.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/api/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAc1C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMtE;AAmDD;;;;;;;;;;;;;;;;IAgBI;AACJ,eAAO,MAAM,IAAI;;CAYf,CAAA"}
|