@faicad/faijs 0.18.3 → 0.19.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.map +1 -1
- package/dist/api/api-namespace.js +4 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/brep-mirror/joinery-brep.d.ts +1 -1
- package/dist/api/brep-mirror/joinery-brep.d.ts.map +1 -1
- package/dist/api/brep-mirror/joinery-brep.js +19 -19
- package/dist/api/brep-mirror/joinery-brep.js.map +1 -1
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +113 -182
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts +74 -0
- package/dist/api/punch-hole.d.ts.map +1 -0
- package/dist/api/punch-hole.js +207 -0
- package/dist/api/punch-hole.js.map +1 -0
- package/dist/api/sketch-on-face.d.ts +85 -0
- package/dist/api/sketch-on-face.d.ts.map +1 -0
- package/dist/api/sketch-on-face.js +136 -0
- package/dist/api/sketch-on-face.js.map +1 -0
- package/dist/api/sketch-on-plane.d.ts +81 -0
- package/dist/api/sketch-on-plane.d.ts.map +1 -0
- package/dist/api/sketch-on-plane.js +103 -0
- package/dist/api/sketch-on-plane.js.map +1 -0
- package/dist/boolean/csg-backend.d.ts +6 -6
- package/dist/boolean/csg-backend.d.ts.map +1 -1
- package/dist/boolean/csg-backend.js +9 -9
- package/dist/boolean/csg-backend.js.map +1 -1
- package/dist/boolean/csg-core.d.ts +10 -10
- package/dist/boolean/csg-core.d.ts.map +1 -1
- package/dist/boolean/csg-core.js +24 -24
- package/dist/boolean/csg-core.js.map +1 -1
- package/dist/boolean/extrude-helpers.d.ts +8 -8
- package/dist/boolean/extrude-helpers.d.ts.map +1 -1
- package/dist/boolean/extrude-helpers.js +13 -13
- package/dist/boolean/extrude-helpers.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +20 -6
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +38 -12
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/browser-host/csg-worker-protocol.d.ts +3 -3
- package/dist/browser-host/csg-worker-protocol.d.ts.map +1 -1
- package/dist/browser-host/csg-worker-protocol.js.map +1 -1
- package/dist/browser-host/csg-worker.js +3 -3
- package/dist/browser-host/csg-worker.js.map +1 -1
- package/dist/browser-host/inline-csg-backend.d.ts +3 -3
- package/dist/browser-host/inline-csg-backend.d.ts.map +1 -1
- package/dist/browser-host/inline-csg-backend.js +3 -3
- package/dist/browser-host/inline-csg-backend.js.map +1 -1
- package/dist/browser-host/worker-csg-backend.d.ts +3 -3
- package/dist/browser-host/worker-csg-backend.d.ts.map +1 -1
- package/dist/browser-host/worker-csg-backend.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/geometry2d/adapt.d.ts +46 -0
- package/dist/geometry2d/adapt.d.ts.map +1 -0
- package/dist/geometry2d/adapt.js +41 -0
- package/dist/geometry2d/adapt.js.map +1 -0
- package/dist/geometry2d/bbox2d.d.ts +82 -0
- package/dist/geometry2d/bbox2d.d.ts.map +1 -0
- package/dist/geometry2d/bbox2d.js +123 -0
- package/dist/geometry2d/bbox2d.js.map +1 -0
- package/dist/geometry2d/blueprint-sketcher.d.ts +27 -0
- package/dist/geometry2d/blueprint-sketcher.d.ts.map +1 -0
- package/dist/geometry2d/blueprint-sketcher.js +29 -0
- package/dist/geometry2d/blueprint-sketcher.js.map +1 -0
- package/dist/geometry2d/blueprint.d.ts +102 -0
- package/dist/geometry2d/blueprint.d.ts.map +1 -0
- package/dist/geometry2d/blueprint.js +225 -0
- package/dist/geometry2d/blueprint.js.map +1 -0
- package/dist/geometry2d/blueprints.d.ts +58 -0
- package/dist/geometry2d/blueprints.d.ts.map +1 -0
- package/dist/geometry2d/blueprints.js +72 -0
- package/dist/geometry2d/blueprints.js.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +50 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.js +72 -0
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -0
- package/dist/geometry2d/bridge/on-surface.d.ts +98 -0
- package/dist/geometry2d/bridge/on-surface.d.ts.map +1 -0
- package/dist/geometry2d/bridge/on-surface.js +94 -0
- package/dist/geometry2d/bridge/on-surface.js.map +1 -0
- package/dist/geometry2d/bridge/plane.d.ts +69 -0
- package/dist/geometry2d/bridge/plane.d.ts.map +1 -0
- package/dist/geometry2d/bridge/plane.js +96 -0
- package/dist/geometry2d/bridge/plane.js.map +1 -0
- package/dist/geometry2d/canned-blueprints.d.ts +44 -0
- package/dist/geometry2d/canned-blueprints.d.ts.map +1 -0
- package/dist/geometry2d/canned-blueprints.js +94 -0
- package/dist/geometry2d/canned-blueprints.js.map +1 -0
- package/dist/geometry2d/compound-blueprint.d.ts +72 -0
- package/dist/geometry2d/compound-blueprint.d.ts.map +1 -0
- package/dist/geometry2d/compound-blueprint.js +95 -0
- package/dist/geometry2d/compound-blueprint.js.map +1 -0
- package/dist/geometry2d/curve2d.d.ts +298 -0
- package/dist/geometry2d/curve2d.d.ts.map +1 -0
- package/dist/geometry2d/curve2d.js +1110 -0
- package/dist/geometry2d/curve2d.js.map +1 -0
- package/dist/geometry2d/index.d.ts +22 -0
- package/dist/geometry2d/index.d.ts.map +1 -0
- package/dist/geometry2d/index.js +21 -0
- package/dist/geometry2d/index.js.map +1 -0
- package/dist/geometry2d/organise.d.ts +28 -0
- package/dist/geometry2d/organise.d.ts.map +1 -0
- package/dist/geometry2d/organise.js +108 -0
- package/dist/geometry2d/organise.js.map +1 -0
- package/dist/geometry2d/pen-sketcher.d.ts +340 -0
- package/dist/geometry2d/pen-sketcher.d.ts.map +1 -0
- package/dist/geometry2d/pen-sketcher.js +477 -0
- package/dist/geometry2d/pen-sketcher.js.map +1 -0
- package/dist/geometry2d/point.d.ts +44 -0
- package/dist/geometry2d/point.d.ts.map +1 -0
- package/dist/geometry2d/point.js +57 -0
- package/dist/geometry2d/point.js.map +1 -0
- package/dist/geometry2d/svg-ellipse.d.ts +74 -0
- package/dist/geometry2d/svg-ellipse.d.ts.map +1 -0
- package/dist/geometry2d/svg-ellipse.js +163 -0
- package/dist/geometry2d/svg-ellipse.js.map +1 -0
- package/dist/lang/symbol-table.generated.d.ts +3 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +3 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/types.d.ts +1 -1
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/package.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA4CH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAmDpD"}
|
|
@@ -27,6 +27,9 @@ import { knurl } from './knurl.js';
|
|
|
27
27
|
import { sdf } from './sdf.js';
|
|
28
28
|
import { screw } from './screw.js';
|
|
29
29
|
import { profile } from './profile.js';
|
|
30
|
+
import { sketchOnPlane } from './sketch-on-plane.js';
|
|
31
|
+
import { sketchOnFace } from './sketch-on-face.js';
|
|
32
|
+
import { punchHole } from './punch-hole.js';
|
|
30
33
|
import { wire } from './wire.js';
|
|
31
34
|
import { helix } from './helix.js';
|
|
32
35
|
import { union, subtract, intersect, cut } from './boolean.js';
|
|
@@ -75,7 +78,7 @@ export function createApiNamespace() {
|
|
|
75
78
|
return {
|
|
76
79
|
contractVersion: CONTRACT_VERSION,
|
|
77
80
|
box, sphere, cylinder, cone, wedge,
|
|
78
|
-
screw, profile, wire, helix, sdf,
|
|
81
|
+
screw, profile, sketchOnPlane, sketchOnFace, punchHole, wire, helix, sdf,
|
|
79
82
|
// D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。
|
|
80
83
|
translate, rotate_euler, scale, scale3d,
|
|
81
84
|
engrave, chamfer, fillet, knurl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)\n *\n *\n * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。\n *\n * 归属(monorepo P5/E-a-1):本文件随 stdlib 出包,是 faijs 默认标准库\n * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /\n * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)\n * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,\n * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中\n * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { loft } from './loft'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { StdlibNamespace } from '../runtime-state'\n\n/**\n * Assemble stdlib functions into the cad namespace.\n *\n * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+\n * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec\n * 的 `scriptFace: true` 条目生成,经 `compatOp(projectBrepOp(…))` 包装的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与\n * `api/index.ts` 导出面同源于同一份清单。\n *\n * @returns the assembled StdlibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): StdlibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because StdlibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, profile, sketchOnPlane, sketchOnFace, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, loft,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as StdlibNamespace\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joinery-brep.d.ts","sourceRoot":"","sources":["../../../src/api/brep-mirror/joinery-brep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAM5C,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,MAAM,EAAE,IAAI,CAAA;IACZ,oBAAoB;IACpB,QAAQ,EAAE,IAAI,CAAA;IACd,gDAAgD;IAChD,QAAQ,EAAE,IAAI,CAAA;IACd,aAAa;IACb,WAAW,EAAE,IAAI,CAAA;IACjB,wCAAwC;IACxC,
|
|
1
|
+
{"version":3,"file":"joinery-brep.d.ts","sourceRoot":"","sources":["../../../src/api/brep-mirror/joinery-brep.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ class SimpleUnionFind {
|
|
|
57
57
|
* 2. 用 union-find 按共享顶点分组
|
|
58
58
|
* 3. 返回每分量的顶点索引集合
|
|
59
59
|
*/
|
|
60
|
-
function detectCapComponentsFromMesh(mesh, normal,
|
|
60
|
+
function detectCapComponentsFromMesh(mesh, normal, planeDistance) {
|
|
61
61
|
const eps = 0.001;
|
|
62
62
|
const { positions, indices } = mesh;
|
|
63
63
|
const vertCount = positions.length / 3;
|
|
@@ -73,13 +73,13 @@ function detectCapComponentsFromMesh(mesh, normal, originOffset) {
|
|
|
73
73
|
const i2 = indices[t * 3 + 2];
|
|
74
74
|
const d0 = Math.abs(positions[i0 * 3] * normal[0] +
|
|
75
75
|
positions[i0 * 3 + 1] * normal[1] +
|
|
76
|
-
positions[i0 * 3 + 2] * normal[2] -
|
|
76
|
+
positions[i0 * 3 + 2] * normal[2] - planeDistance);
|
|
77
77
|
const d1 = Math.abs(positions[i1 * 3] * normal[0] +
|
|
78
78
|
positions[i1 * 3 + 1] * normal[1] +
|
|
79
|
-
positions[i1 * 3 + 2] * normal[2] -
|
|
79
|
+
positions[i1 * 3 + 2] * normal[2] - planeDistance);
|
|
80
80
|
const d2 = Math.abs(positions[i2 * 3] * normal[0] +
|
|
81
81
|
positions[i2 * 3 + 1] * normal[1] +
|
|
82
|
-
positions[i2 * 3 + 2] * normal[2] -
|
|
82
|
+
positions[i2 * 3 + 2] * normal[2] - planeDistance);
|
|
83
83
|
if (d0 < eps && d1 < eps && d2 < eps) {
|
|
84
84
|
capTris.push({ v0: i0, v1: i1, v2: i2 });
|
|
85
85
|
capVertSet.add(i0);
|
|
@@ -111,7 +111,7 @@ function detectCapComponentsFromMesh(mesh, normal, originOffset) {
|
|
|
111
111
|
*
|
|
112
112
|
* 与 csg-worker.ts computeCrossSectionCentroid 算法一致。
|
|
113
113
|
*/
|
|
114
|
-
function computeCrossSectionCentroidFromMesh(mesh, normal,
|
|
114
|
+
function computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, fallback, comp) {
|
|
115
115
|
const eps = 0.001;
|
|
116
116
|
const { positions } = mesh;
|
|
117
117
|
let cx = 0, cy = 0, cz = 0;
|
|
@@ -123,7 +123,7 @@ function computeCrossSectionCentroidFromMesh(mesh, normal, originOffset, fallbac
|
|
|
123
123
|
const x = positions[i * 3];
|
|
124
124
|
const y = positions[i * 3 + 1];
|
|
125
125
|
const z = positions[i * 3 + 2];
|
|
126
|
-
const dist = x * normal[0] + y * normal[1] + z * normal[2] -
|
|
126
|
+
const dist = x * normal[0] + y * normal[1] + z * normal[2] - planeDistance;
|
|
127
127
|
if (Math.abs(dist) < eps) {
|
|
128
128
|
cx += x;
|
|
129
129
|
cy += y;
|
|
@@ -140,7 +140,7 @@ function computeCrossSectionCentroidFromMesh(mesh, normal, originOffset, fallbac
|
|
|
140
140
|
*
|
|
141
141
|
* 与 csg-worker.ts computeCrossSectionWidth 算法一致。
|
|
142
142
|
*/
|
|
143
|
-
function computeCrossSectionWidthFromMesh(mesh, normal,
|
|
143
|
+
function computeCrossSectionWidthFromMesh(mesh, normal, planeDistance, widthDir, comp) {
|
|
144
144
|
const eps = 0.001;
|
|
145
145
|
const { positions } = mesh;
|
|
146
146
|
let minProj = Infinity;
|
|
@@ -153,7 +153,7 @@ function computeCrossSectionWidthFromMesh(mesh, normal, originOffset, widthDir,
|
|
|
153
153
|
const x = positions[i * 3];
|
|
154
154
|
const y = positions[i * 3 + 1];
|
|
155
155
|
const z = positions[i * 3 + 2];
|
|
156
|
-
const dist = x * normal[0] + y * normal[1] + z * normal[2] -
|
|
156
|
+
const dist = x * normal[0] + y * normal[1] + z * normal[2] - planeDistance;
|
|
157
157
|
if (Math.abs(dist) < eps) {
|
|
158
158
|
const proj = x * widthDir[0] + y * widthDir[1] + z * widthDir[2];
|
|
159
159
|
if (proj < minProj)
|
|
@@ -312,17 +312,17 @@ export function buildTenonSolid(kernel, centroid, basis, sideLength, height) {
|
|
|
312
312
|
* @returns the detected cross-section components (centroid + area).
|
|
313
313
|
*/
|
|
314
314
|
export function detectCrossSectionComponents(kernel, upper, basis) {
|
|
315
|
-
const { normal,
|
|
315
|
+
const { normal, planeDistance, widthDir, depthDir, planeCenter } = basis;
|
|
316
316
|
const mesh = solidToMeshData(kernel, upper);
|
|
317
|
-
const components = detectCapComponentsFromMesh(mesh, normal,
|
|
317
|
+
const components = detectCapComponentsFromMesh(mesh, normal, planeDistance);
|
|
318
318
|
if (components.length === 0) {
|
|
319
319
|
// 无帽面 → 返回单个全局质心(planeCenter)作为回退
|
|
320
320
|
return [{ centroid: planeCenter, area: 0 }];
|
|
321
321
|
}
|
|
322
322
|
return components.map(comp => {
|
|
323
|
-
const centroid = computeCrossSectionCentroidFromMesh(mesh, normal,
|
|
324
|
-
const compWidth = computeCrossSectionWidthFromMesh(mesh, normal,
|
|
325
|
-
const compDepth = computeCrossSectionWidthFromMesh(mesh, normal,
|
|
323
|
+
const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, planeCenter, comp);
|
|
324
|
+
const compWidth = computeCrossSectionWidthFromMesh(mesh, normal, planeDistance, widthDir, comp);
|
|
325
|
+
const compDepth = computeCrossSectionWidthFromMesh(mesh, normal, planeDistance, depthDir, comp);
|
|
326
326
|
return { centroid, area: compWidth * compDepth };
|
|
327
327
|
});
|
|
328
328
|
}
|
|
@@ -342,9 +342,9 @@ export function detectCrossSectionComponents(kernel, upper, basis) {
|
|
|
342
342
|
* @returns the split result with front (upper + wedge) and back (lower - cavity) handles.
|
|
343
343
|
*/
|
|
344
344
|
export function dovetailBooleanSplitBrep(kernel, original, basis, groove) {
|
|
345
|
-
const { normal, widthDir, planeCenter,
|
|
345
|
+
const { normal, widthDir, planeCenter, planeDistance } = basis;
|
|
346
346
|
// Step 1: 平面分割 → upper + lower
|
|
347
|
-
const splitResult = splitBrep(kernel, original, { normal,
|
|
347
|
+
const splitResult = splitBrep(kernel, original, { normal, planeDistance, planeCenter });
|
|
348
348
|
let upper = splitResult.front;
|
|
349
349
|
let lower = splitResult.back;
|
|
350
350
|
// Step 2: 计算截面宽度(bbox 投影近似,后续 common 会裁回真实边界)
|
|
@@ -397,9 +397,9 @@ export function dovetailBooleanSplitBrep(kernel, original, basis, groove) {
|
|
|
397
397
|
* @returns the split result with front (upper + shape) and back (lower - hole) handles.
|
|
398
398
|
*/
|
|
399
399
|
export function dowelOrTenonBooleanSplitBrep(kernel, original, basis, shape, params, selectedSections) {
|
|
400
|
-
const { normal, planeCenter,
|
|
400
|
+
const { normal, planeCenter, planeDistance } = basis;
|
|
401
401
|
// Step 1: 平面分割 → upper + lower
|
|
402
|
-
const splitResult = splitBrep(kernel, original, { normal,
|
|
402
|
+
const splitResult = splitBrep(kernel, original, { normal, planeDistance, planeCenter });
|
|
403
403
|
let upper = splitResult.front;
|
|
404
404
|
let lower = splitResult.back;
|
|
405
405
|
// Step 2: 检测截面分量
|
|
@@ -408,7 +408,7 @@ export function dowelOrTenonBooleanSplitBrep(kernel, original, basis, shape, par
|
|
|
408
408
|
if (components.length <= 1 || !selectedSections || selectedSections.length === 0) {
|
|
409
409
|
// 单截面或无选择 → 全局质心(向后兼容)
|
|
410
410
|
const mesh = solidToMeshData(kernel, upper);
|
|
411
|
-
const centroid = computeCrossSectionCentroidFromMesh(mesh, normal,
|
|
411
|
+
const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, planeCenter);
|
|
412
412
|
placements = [{ centroid }];
|
|
413
413
|
}
|
|
414
414
|
else {
|
|
@@ -422,7 +422,7 @@ export function dowelOrTenonBooleanSplitBrep(kernel, original, basis, shape, par
|
|
|
422
422
|
}
|
|
423
423
|
if (placements.length === 0) {
|
|
424
424
|
const mesh = solidToMeshData(kernel, upper);
|
|
425
|
-
const centroid = computeCrossSectionCentroidFromMesh(mesh, normal,
|
|
425
|
+
const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, planeCenter);
|
|
426
426
|
placements = [{ centroid }];
|
|
427
427
|
}
|
|
428
428
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joinery-brep.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/joinery-brep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BREP 榫卯结构操作 — 用 OCCT 精确实体复刻 mesh 路径的榫卯布尔序列\n *\n * See docs/api-contract.md §8 (dual-path geometry contract) and §10.5 (split).\n *\n * 与 mesh 路径(joinery-shapes.ts + csg-worker.ts)对照:\n * - mesh 路径:buildWedgeGeometry/buildDowelGeometry/buildStraightTenonGeometry → Manifold CSG\n * - BREP 路径:buildWedgeSolid/buildDowelSolid/buildTenonSolid → OCCT fuse/cut/common\n *\n * 坐标框架与 mesh 路径完全一致:\n * - normal: 切割平面法线(单位向量,指向上方)\n * - widthDir: 挤出方向(单位向量)\n * - depthDir = normalize(cross(normal, widthDir))\n * - planeCenter: 切割平面中心\n *\n * 所有函数都是纯函数,输入输出均为 OCCT BrepHandle,调用方负责句柄生命周期。\n */\n\nimport * as THREE from 'three'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { Vec3 } from '../../mesh/types'\nimport { getSolidBoundingBox } from '../../brep/brep-utils'\nimport { splitBrep, matrixToArray } from '../../brep/brep-ops'\n\n// ─── 坐标框架 ───\n\n/** 榫卯操作的坐标框架(与 joinery-shapes.ts 一致) */\nexport interface JoineryBasis {\n /** 切割平面法线(单位向量) */\n normal: Vec3\n /** 宽度/挤出方向(单位向量) */\n widthDir: Vec3\n /** 深度方向 = normalize(cross(normal, widthDir)) */\n depthDir: Vec3\n /** 切割平面中心 */\n planeCenter: Vec3\n /** 平面原点偏移 = dot(normal, planeCenter) */\n originOffset: number\n}\n\n// ─── Union-Find(与 csg-worker.ts SimpleUnionFind 一致) ───\n\nclass SimpleUnionFind {\n private parent: number[]\n private rank: number[]\n\n constructor(n: number) {\n this.parent = Array.from({ length: n }, (_, i) => i)\n this.rank = new Array(n).fill(0)\n }\n\n find(x: number): number {\n if (this.parent[x] !== x) {\n this.parent[x] = this.find(this.parent[x])\n }\n return this.parent[x]\n }\n\n union(x: number, y: number): void {\n const px = this.find(x)\n const py = this.find(y)\n if (px === py) return\n if (this.rank[px] < this.rank[py]) {\n this.parent[px] = py\n } else if (this.rank[px] > this.rank[py]) {\n this.parent[py] = px\n } else {\n this.parent[py] = px\n this.rank[px]++\n }\n }\n}\n\n// ─── 截面分析(从 mesh 三角化提取截面信息,与 csg-worker.ts 算法一致) ───\n\ninterface MeshData {\n positions: Float32Array\n indices: Uint32Array\n}\n\n/**\n * 检测切割平面上的帽面连通分量。\n *\n * 与 csg-worker.ts detectCapComponents 算法一致:\n * 1. 找到所有顶点在切割平面上的三角形\n * 2. 用 union-find 按共享顶点分组\n * 3. 返回每分量的顶点索引集合\n */\nfunction detectCapComponentsFromMesh(\n mesh: MeshData,\n normal: Vec3,\n originOffset: number,\n): Set<number>[] {\n const eps = 0.001\n const { positions, indices } = mesh\n const vertCount = positions.length / 3\n if (indices.length === 0) return []\n\n // 找到所有帽面三角形\n const capVertSet = new Set<number>()\n interface CapTri { v0: number; v1: number; v2: number }\n const capTris: CapTri[] = []\n const triCount = indices.length / 3\n for (let t = 0; t < triCount; t++) {\n const i0 = indices[t * 3]\n const i1 = indices[t * 3 + 1]\n const i2 = indices[t * 3 + 2]\n const d0 = Math.abs(\n positions[i0 * 3] * normal[0] +\n positions[i0 * 3 + 1] * normal[1] +\n positions[i0 * 3 + 2] * normal[2] - originOffset,\n )\n const d1 = Math.abs(\n positions[i1 * 3] * normal[0] +\n positions[i1 * 3 + 1] * normal[1] +\n positions[i1 * 3 + 2] * normal[2] - originOffset,\n )\n const d2 = Math.abs(\n positions[i2 * 3] * normal[0] +\n positions[i2 * 3 + 1] * normal[1] +\n positions[i2 * 3 + 2] * normal[2] - originOffset,\n )\n if (d0 < eps && d1 < eps && d2 < eps) {\n capTris.push({ v0: i0, v1: i1, v2: i2 })\n capVertSet.add(i0); capVertSet.add(i1); capVertSet.add(i2)\n }\n }\n if (capTris.length === 0) return []\n\n // Union-find 按共享顶点分组\n const uf = new SimpleUnionFind(vertCount)\n for (const tri of capTris) {\n uf.union(tri.v0, tri.v1)\n uf.union(tri.v1, tri.v2)\n uf.union(tri.v0, tri.v2)\n }\n\n // 按根节点分组\n const compMap = new Map<number, Set<number>>()\n for (const vi of capVertSet) {\n const root = uf.find(vi)\n if (!compMap.has(root)) compMap.set(root, new Set<number>())\n compMap.get(root)!.add(vi)\n }\n\n return Array.from(compMap.values())\n}\n\n/**\n * 计算切割平面上截面顶点的质心。\n *\n * 与 csg-worker.ts computeCrossSectionCentroid 算法一致。\n */\nfunction computeCrossSectionCentroidFromMesh(\n mesh: MeshData,\n normal: Vec3,\n originOffset: number,\n fallback: Vec3,\n comp?: Set<number>,\n): Vec3 {\n const eps = 0.001\n const { positions } = mesh\n let cx = 0, cy = 0, cz = 0\n let count = 0\n\n const vertCount = positions.length / 3\n for (let i = 0; i < vertCount; i++) {\n if (comp && !comp.has(i)) continue\n\n const x = positions[i * 3]\n const y = positions[i * 3 + 1]\n const z = positions[i * 3 + 2]\n\n const dist = x * normal[0] + y * normal[1] + z * normal[2] - originOffset\n if (Math.abs(dist) < eps) {\n cx += x\n cy += y\n cz += z\n count++\n }\n }\n\n if (count === 0) return fallback\n return [cx / count, cy / count, cz / count]\n}\n\n/**\n * 计算切割平面上截面沿指定方向的宽度。\n *\n * 与 csg-worker.ts computeCrossSectionWidth 算法一致。\n */\nfunction computeCrossSectionWidthFromMesh(\n mesh: MeshData,\n normal: Vec3,\n originOffset: number,\n widthDir: Vec3,\n comp?: Set<number>,\n): number {\n const eps = 0.001\n const { positions } = mesh\n let minProj = Infinity\n let maxProj = -Infinity\n let found = false\n\n const vertCount = positions.length / 3\n for (let i = 0; i < vertCount; i++) {\n if (comp && !comp.has(i)) continue\n\n const x = positions[i * 3]\n const y = positions[i * 3 + 1]\n const z = positions[i * 3 + 2]\n\n const dist = x * normal[0] + y * normal[1] + z * normal[2] - originOffset\n if (Math.abs(dist) < eps) {\n const proj = x * widthDir[0] + y * widthDir[1] + z * widthDir[2]\n if (proj < minProj) minProj = proj\n if (proj > maxProj) maxProj = proj\n found = true\n }\n }\n\n if (!found) return 0\n return maxProj - minProj\n}\n\n/** 将 OCCT solid 三角化为 MeshData(用于截面分析) */\nfunction solidToMeshData(kernel: BrepEngineApi, solid: BrepHandle): MeshData {\n const mesh = kernel.meshShape(solid, {\n linearDeflection: 0.1,\n angularDeflection: (2 * Math.PI) / 32,\n })\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n}\n\n// ─── 基本体构造(BREP 等价物) ───\n\n/**\n * 构造局部的变换矩阵:local X → widthDir, Y → depthDir, Z → normal,再平移到 origin。\n */\nfunction makeBasisTransform(basis: JoineryBasis, origin: Vec3): THREE.Matrix4 {\n const basisMatrix = new THREE.Matrix4().makeBasis(\n new THREE.Vector3(...basis.widthDir),\n new THREE.Vector3(...basis.depthDir),\n new THREE.Vector3(...basis.normal),\n )\n const transMatrix = new THREE.Matrix4().makeTranslation(origin[0], origin[1], origin[2])\n return new THREE.Matrix4().multiplyMatrices(transMatrix, basisMatrix)\n}\n\n/**\n * 梯形棱柱(燕尾楔)— BREP 等价物。\n *\n * 复刻 joinery-shapes.ts buildWedgeGeometry 的 8 顶点拓扑:\n * - 梯形截面在 normal-depthDir 平面\n * - 底边(宽)在 planeCenter - normal*depth\n * - 顶边(窄)在 planeCenter\n * - 沿 widthDir 拉伸 extrudeLength,居中于 planeCenter\n *\n * 用 kernel.makeLineEdge + makeWire + makeFace + extrude 构造实体,\n * 然后用 transform 对齐到世界坐标系。\n * @param kernel - the BREP engine API.\n * @param basis - the joinery coordinate frame (normal/widthDir/depthDir/planeCenter).\n * @param depth - the wedge depth along the normal direction.\n * @param width - the wedge bottom width.\n * @param angleDeg - the dovetail flap angle in degrees.\n * @param extrudeLength - the extrusion length along the width direction.\n * @returns the constructed wedge solid handle.\n */\nexport function buildWedgeSolid(\n kernel: BrepEngineApi,\n basis: JoineryBasis,\n depth: number,\n width: number,\n angleDeg: number,\n extrudeLength: number,\n): BrepHandle {\n const { planeCenter } = basis\n const angleRad = (angleDeg * Math.PI) / 180\n\n const halfWidth = width / 2\n const halfTopWidth = Math.max(0, halfWidth - depth / Math.tan(angleRad))\n const halfExtrude = extrudeLength / 2\n\n // 在局部坐标系中构造梯形面(YZ 平面,X = -halfExtrude)\n // 局部: X → widthDir, Y → depthDir, Z → normal\n const xLocal = -halfExtrude\n const v0 = { x: xLocal, y: -halfWidth, z: -depth } // bottomLeft\n const v1 = { x: xLocal, y: halfWidth, z: -depth } // bottomRight\n const v2 = { x: xLocal, y: halfTopWidth, z: 0 } // topRight\n const v3 = { x: xLocal, y: -halfTopWidth, z: 0 } // topLeft\n\n // 构建梯形 wire\n const edges: BrepHandle[] = []\n edges.push(kernel.makeLineEdge(v0, v1))\n edges.push(kernel.makeLineEdge(v1, v2))\n edges.push(kernel.makeLineEdge(v2, v3))\n edges.push(kernel.makeLineEdge(v3, v0))\n\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n\n // 沿 X 轴(= widthDir)拉伸 extrudeLength\n const extruded = kernel.extrude(face, extrudeLength, 0, 0)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n\n // 变换到世界坐标系\n const fullMatrix = makeBasisTransform(basis, planeCenter)\n const result = kernel.transform(extruded, matrixToArray(fullMatrix))\n kernel.release(extruded)\n\n return result\n}\n\n/**\n * 圆柱(定位销)— BREP 等价物。\n *\n * 复刻 joinery-shapes.ts buildDowelGeometry:\n * - 圆截面在 widthDir-depthDir 平面,中心在 centroid\n * - 从切割平面向下延伸 height(沿 -normal)\n *\n * 用 kernel.makeCylinder + transform 对齐方向。\n * @param kernel - the BREP engine API.\n * @param centroid - the centroid where the dowel is placed.\n * @param basis - the joinery coordinate frame.\n * @param diameter - the dowel diameter.\n * @param height - the dowel height along the normal direction.\n * @returns the constructed dowel solid handle.\n */\nexport function buildDowelSolid(\n kernel: BrepEngineApi,\n centroid: Vec3,\n basis: JoineryBasis,\n diameter: number,\n height: number,\n): BrepHandle {\n const radius = diameter / 2\n const { normal } = basis\n\n // OCCT makeCylinder 创建 Z 轴方向圆柱(Z=0 → Z=height)\n // 需要旋转使 Z 轴对齐 -normal(圆柱向下延伸),且顶部在 centroid\n const cyl = kernel.makeCylinder(radius, height)\n\n // 旋转 Z → -normal\n const zAxis = new THREE.Vector3(0, 0, 1)\n const negNormal = new THREE.Vector3(-normal[0], -normal[1], -normal[2]).normalize()\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, negNormal)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n\n // 平移到 centroid(旋转后 Z=0 对应 centroid,即切割平面上的顶面)\n const transMatrix = new THREE.Matrix4().makeTranslation(centroid[0], centroid[1], centroid[2])\n const fullMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n\n const result = kernel.transform(cyl, matrixToArray(fullMatrix))\n kernel.release(cyl)\n\n return result\n}\n\n/**\n * 长方体(直榫)— BREP 等价物。\n *\n * 复刻 joinery-shapes.ts buildStraightTenonGeometry:\n * - 方截面在 widthDir-depthDir 平面,中心在 centroid\n * - 从切割平面向下延伸 height(沿 -normal)\n *\n * 用 kernel.makeBoxFromCorners + transform 对齐方向。\n * @param kernel - the BREP engine API.\n * @param centroid - the centroid where the tenon is placed.\n * @param basis - the joinery coordinate frame.\n * @param sideLength - the tenon square side length.\n * @param height - the tenon height along the normal direction.\n * @returns the constructed tenon solid handle.\n */\nexport function buildTenonSolid(\n kernel: BrepEngineApi,\n centroid: Vec3,\n basis: JoineryBasis,\n sideLength: number,\n height: number,\n): BrepHandle {\n const half = sideLength / 2\n\n // 在局部坐标系中创建盒子:X ∈ [-half, half], Y ∈ [-half, half], Z ∈ [-height, 0]\n // 局部: X → widthDir, Y → depthDir, Z → normal\n const localBox = kernel.makeBoxFromCorners(\n { x: -half, y: -half, z: -height },\n { x: half, y: half, z: 0 },\n )\n\n // 变换到世界坐标系\n const fullMatrix = makeBasisTransform(basis, centroid)\n const result = kernel.transform(localBox, matrixToArray(fullMatrix))\n kernel.release(localBox)\n\n return result\n}\n\n// ─── 截面质心 / 多截面检测 ───\n\n/** 截面分量信息 */\nexport interface CrossSectionComponent {\n /** 分量质心 */\n centroid: Vec3\n /** 分量面积(近似,用于排序) */\n area: number\n}\n\n/**\n * 检测上部实体在切割平面上的截面连通分量。\n *\n * BREP 等价物:将 upper solid 三角化后,用与 mesh 路径 detectCapComponents\n * 完全相同的算法(找帽面三角形 → union-find)检测连通分量。\n *\n * 与 csg-worker.ts detectCapComponents + computeCrossSectionCentroid 一致。\n * @param kernel - the BREP engine API.\n * @param upper - the upper solid whose cross section is analyzed.\n * @param basis - the joinery coordinate frame.\n * @returns the detected cross-section components (centroid + area).\n */\nexport function detectCrossSectionComponents(\n kernel: BrepEngineApi,\n upper: BrepHandle,\n basis: JoineryBasis,\n): CrossSectionComponent[] {\n const { normal, originOffset, widthDir, depthDir, planeCenter } = basis\n const mesh = solidToMeshData(kernel, upper)\n const components = detectCapComponentsFromMesh(mesh, normal, originOffset)\n\n if (components.length === 0) {\n // 无帽面 → 返回单个全局质心(planeCenter)作为回退\n return [{ centroid: planeCenter, area: 0 }]\n }\n\n return components.map(comp => {\n const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, originOffset, planeCenter, comp)\n const compWidth = computeCrossSectionWidthFromMesh(mesh, normal, originOffset, widthDir, comp)\n const compDepth = computeCrossSectionWidthFromMesh(mesh, normal, originOffset, depthDir, comp)\n return { centroid, area: compWidth * compDepth }\n })\n}\n\n// ─── 布尔序列(1:1 复刻 csg-worker.ts) ───\n\n/** dovetail 布尔分割的结果 */\nexport interface DovetailSplitBrepResult {\n /** 上部 + 楔(法线正方向半部分加燕尾榫) */\n front: BrepHandle\n /** 下部 - 凹腔(法线负方向半部分减燕尾槽) */\n back: BrepHandle\n}\n\n/** dowel/tenon 布尔分割的结果 */\nexport interface DowelOrTenonSplitBrepResult {\n /** 上部 + 销/榫(法线正方向半部分加圆柱/方柱) */\n front: BrepHandle\n /** 下部 - 孔(法线负方向半部分减圆柱/方柱) */\n back: BrepHandle\n}\n\n/** groove 参数 */\nexport interface GrooveParams {\n depth: number\n depthTolerance: number\n width: number\n widthTolerance: number\n flapsAngle: number\n}\n\n/**\n * Dovetail(燕尾)布尔分割 — BREP 等价物。\n *\n * 1:1 复刻 csg-worker.ts dovetailBooleanSplit:\n * 1. splitBrep → upper + lower\n * 2. 计算 crossSectionWidth(bbox 投影近似)\n * 3. buildWedgeSolid(overhang=20)→ common(wedge, lower) 裁剪贴合\n * 4. fuse(upper, wedgeTrimmed) → upper'\n * 5. buildWedgeSolid(公差)→ cut(lower, wedgeTol) → lower'\n * @param kernel - the BREP engine API.\n * @param original - the original solid to split.\n * @param basis - the joinery coordinate frame.\n * @param groove - the dovetail groove parameters.\n * @returns the split result with front (upper + wedge) and back (lower - cavity) handles.\n */\nexport function dovetailBooleanSplitBrep(\n kernel: BrepEngineApi,\n original: BrepHandle,\n basis: JoineryBasis,\n groove: GrooveParams,\n): DovetailSplitBrepResult {\n const { normal, widthDir, planeCenter, originOffset } = basis\n\n // Step 1: 平面分割 → upper + lower\n const splitResult = splitBrep(kernel, original, { normal, originOffset, planeCenter })\n let upper = splitResult.front\n let lower = splitResult.back\n\n // Step 2: 计算截面宽度(bbox 投影近似,后续 common 会裁回真实边界)\n const upperBbox = getSolidBoundingBox(kernel, upper)\n const upperSize: Vec3 = [\n upperBbox.max[0] - upperBbox.min[0],\n upperBbox.max[1] - upperBbox.min[1],\n upperBbox.max[2] - upperBbox.min[2],\n ]\n let crossSectionWidth =\n Math.abs(upperSize[0] * widthDir[0]) +\n Math.abs(upperSize[1] * widthDir[1]) +\n Math.abs(upperSize[2] * widthDir[2])\n if (crossSectionWidth <= 0) crossSectionWidth = 10 // 安全回退\n const extrudeLength = crossSectionWidth + 0.2\n const overhang = 20\n\n // Step 3: 构造楔(带 overhang)\n const wedgeW = buildWedgeSolid(kernel, basis, groove.depth, groove.width, groove.flapsAngle, extrudeLength + overhang)\n\n // Step 4: common(wedge, lower) → 裁剪楔贴合模型边界\n const wedgeTrimmed = kernel.common(wedgeW, lower)\n kernel.release(wedgeW)\n\n // Step 5: fuse(upper, wedgeTrimmed) → upper'\n const newUpper = kernel.fuse(upper, wedgeTrimmed)\n kernel.release(upper)\n kernel.release(wedgeTrimmed)\n upper = newUpper\n\n // Step 6: 构造公差楔\n const wedgeTol = buildWedgeSolid(\n kernel, basis,\n groove.depth + groove.depthTolerance,\n groove.width + groove.widthTolerance,\n groove.flapsAngle,\n extrudeLength + overhang,\n )\n\n // Step 7: cut(lower, wedgeTol) → lower'\n const newLower = kernel.cut(lower, wedgeTol)\n kernel.release(lower)\n kernel.release(wedgeTol)\n lower = newLower\n\n return { front: upper, back: lower }\n}\n\n/** dowel/tenon 参数 */\nexport interface DowelOrTenonParams {\n /** 直径(dowel)或边长(tenon) */\n size: number\n /** 尺寸公差 */\n sizeTolerance: number\n /** 高度 */\n height: number\n /** 高度公差 */\n heightTolerance: number\n}\n\n/**\n * Dowel(定位销)/ Tenon(直榫)布尔分割 — BREP 等价物。\n *\n * 1:1 复刻 csg-worker.ts dowelOrTenonBooleanSplit:\n * 1. splitBrep → upper + lower\n * 2. detectCrossSectionComponents → 截面质心列表\n * 3. 对每个质心:buildShapeSolid → fuse(upper, shape) → upper'\n * 4. 对每个质心:buildShapeSolid(公差)→ cut(lower, shapeTol) → lower'\n * @param kernel - the BREP engine API.\n * @param original - the original solid to split.\n * @param basis - the joinery coordinate frame.\n * @param shape - whether to build a dowel or a tenon.\n * @param params - the dowel/tenon size and tolerance parameters.\n * @param selectedSections - optional indices of cross-section components to place shapes on.\n * @returns the split result with front (upper + shape) and back (lower - hole) handles.\n */\nexport function dowelOrTenonBooleanSplitBrep(\n kernel: BrepEngineApi,\n original: BrepHandle,\n basis: JoineryBasis,\n shape: 'dowel' | 'tenon',\n params: DowelOrTenonParams,\n selectedSections?: number[] | null,\n): DowelOrTenonSplitBrepResult {\n const { normal, planeCenter, originOffset } = basis\n\n // Step 1: 平面分割 → upper + lower\n const splitResult = splitBrep(kernel, original, { normal, originOffset, planeCenter })\n let upper = splitResult.front\n let lower = splitResult.back\n\n // Step 2: 检测截面分量\n const components = detectCrossSectionComponents(kernel, upper, basis)\n\n // 构建放置位置列表\n interface Placement { centroid: Vec3 }\n let placements: Placement[]\n\n if (components.length <= 1 || !selectedSections || selectedSections.length === 0) {\n // 单截面或无选择 → 全局质心(向后兼容)\n const mesh = solidToMeshData(kernel, upper)\n const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, originOffset, planeCenter)\n placements = [{ centroid }]\n } else {\n // 多截面:按面积降序排,取选择的分量\n const sorted = [...components].sort((a, b) => b.area - a.area)\n placements = []\n for (const selId of selectedSections) {\n if (selId < sorted.length) {\n placements.push({ centroid: sorted[selId].centroid })\n }\n }\n if (placements.length === 0) {\n const mesh = solidToMeshData(kernel, upper)\n const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, originOffset, planeCenter)\n placements = [{ centroid }]\n }\n }\n\n // Step 3: 对每个质心构造基本体并 fuse 到 upper\n for (const { centroid } of placements) {\n let shapeC: BrepHandle\n if (shape === 'dowel') {\n shapeC = buildDowelSolid(kernel, centroid, basis, params.size, params.height)\n } else {\n shapeC = buildTenonSolid(kernel, centroid, basis, params.size, params.height)\n }\n\n const newUpper = kernel.fuse(upper, shapeC)\n kernel.release(upper)\n kernel.release(shapeC)\n upper = newUpper\n }\n\n // Step 4: 对每个质心构造公差体并 cut 从 lower\n const tolSize = params.size + params.sizeTolerance\n const tolHeight = params.height + params.heightTolerance\n\n for (const { centroid } of placements) {\n let shapeCTol: BrepHandle\n if (shape === 'dowel') {\n shapeCTol = buildDowelSolid(kernel, centroid, basis, tolSize, tolHeight)\n } else {\n shapeCTol = buildTenonSolid(kernel, centroid, basis, tolSize, tolHeight)\n }\n\n const newLower = kernel.cut(lower, shapeCTol)\n kernel.release(lower)\n kernel.release(shapeCTol)\n lower = newLower\n }\n\n return { front: upper, back: lower }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"joinery-brep.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/joinery-brep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BREP 榫卯结构操作 — 用 OCCT 精确实体复刻 mesh 路径的榫卯布尔序列\n *\n * See docs/api-contract.md §8 (dual-path geometry contract) and §10.5 (split).\n *\n * 与 mesh 路径(joinery-shapes.ts + csg-worker.ts)对照:\n * - mesh 路径:buildWedgeGeometry/buildDowelGeometry/buildStraightTenonGeometry → Manifold CSG\n * - BREP 路径:buildWedgeSolid/buildDowelSolid/buildTenonSolid → OCCT fuse/cut/common\n *\n * 坐标框架与 mesh 路径完全一致:\n * - normal: 切割平面法线(单位向量,指向上方)\n * - widthDir: 挤出方向(单位向量)\n * - depthDir = normalize(cross(normal, widthDir))\n * - planeCenter: 切割平面中心\n *\n * 所有函数都是纯函数,输入输出均为 OCCT BrepHandle,调用方负责句柄生命周期。\n */\n\nimport * as THREE from 'three'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { Vec3 } from '../../mesh/types'\nimport { getSolidBoundingBox } from '../../brep/brep-utils'\nimport { splitBrep, matrixToArray } from '../../brep/brep-ops'\n\n// ─── 坐标框架 ───\n\n/** 榫卯操作的坐标框架(与 joinery-shapes.ts 一致) */\nexport interface JoineryBasis {\n /** 切割平面法线(单位向量) */\n normal: Vec3\n /** 宽度/挤出方向(单位向量) */\n widthDir: Vec3\n /** 深度方向 = normalize(cross(normal, widthDir)) */\n depthDir: Vec3\n /** 切割平面中心 */\n planeCenter: Vec3\n /** 平面原点偏移 = dot(normal, planeCenter) */\n planeDistance: number\n}\n\n// ─── Union-Find(与 csg-worker.ts SimpleUnionFind 一致) ───\n\nclass SimpleUnionFind {\n private parent: number[]\n private rank: number[]\n\n constructor(n: number) {\n this.parent = Array.from({ length: n }, (_, i) => i)\n this.rank = new Array(n).fill(0)\n }\n\n find(x: number): number {\n if (this.parent[x] !== x) {\n this.parent[x] = this.find(this.parent[x])\n }\n return this.parent[x]\n }\n\n union(x: number, y: number): void {\n const px = this.find(x)\n const py = this.find(y)\n if (px === py) return\n if (this.rank[px] < this.rank[py]) {\n this.parent[px] = py\n } else if (this.rank[px] > this.rank[py]) {\n this.parent[py] = px\n } else {\n this.parent[py] = px\n this.rank[px]++\n }\n }\n}\n\n// ─── 截面分析(从 mesh 三角化提取截面信息,与 csg-worker.ts 算法一致) ───\n\ninterface MeshData {\n positions: Float32Array\n indices: Uint32Array\n}\n\n/**\n * 检测切割平面上的帽面连通分量。\n *\n * 与 csg-worker.ts detectCapComponents 算法一致:\n * 1. 找到所有顶点在切割平面上的三角形\n * 2. 用 union-find 按共享顶点分组\n * 3. 返回每分量的顶点索引集合\n */\nfunction detectCapComponentsFromMesh(\n mesh: MeshData,\n normal: Vec3,\n planeDistance: number,\n): Set<number>[] {\n const eps = 0.001\n const { positions, indices } = mesh\n const vertCount = positions.length / 3\n if (indices.length === 0) return []\n\n // 找到所有帽面三角形\n const capVertSet = new Set<number>()\n interface CapTri { v0: number; v1: number; v2: number }\n const capTris: CapTri[] = []\n const triCount = indices.length / 3\n for (let t = 0; t < triCount; t++) {\n const i0 = indices[t * 3]\n const i1 = indices[t * 3 + 1]\n const i2 = indices[t * 3 + 2]\n const d0 = Math.abs(\n positions[i0 * 3] * normal[0] +\n positions[i0 * 3 + 1] * normal[1] +\n positions[i0 * 3 + 2] * normal[2] - planeDistance,\n )\n const d1 = Math.abs(\n positions[i1 * 3] * normal[0] +\n positions[i1 * 3 + 1] * normal[1] +\n positions[i1 * 3 + 2] * normal[2] - planeDistance,\n )\n const d2 = Math.abs(\n positions[i2 * 3] * normal[0] +\n positions[i2 * 3 + 1] * normal[1] +\n positions[i2 * 3 + 2] * normal[2] - planeDistance,\n )\n if (d0 < eps && d1 < eps && d2 < eps) {\n capTris.push({ v0: i0, v1: i1, v2: i2 })\n capVertSet.add(i0); capVertSet.add(i1); capVertSet.add(i2)\n }\n }\n if (capTris.length === 0) return []\n\n // Union-find 按共享顶点分组\n const uf = new SimpleUnionFind(vertCount)\n for (const tri of capTris) {\n uf.union(tri.v0, tri.v1)\n uf.union(tri.v1, tri.v2)\n uf.union(tri.v0, tri.v2)\n }\n\n // 按根节点分组\n const compMap = new Map<number, Set<number>>()\n for (const vi of capVertSet) {\n const root = uf.find(vi)\n if (!compMap.has(root)) compMap.set(root, new Set<number>())\n compMap.get(root)!.add(vi)\n }\n\n return Array.from(compMap.values())\n}\n\n/**\n * 计算切割平面上截面顶点的质心。\n *\n * 与 csg-worker.ts computeCrossSectionCentroid 算法一致。\n */\nfunction computeCrossSectionCentroidFromMesh(\n mesh: MeshData,\n normal: Vec3,\n planeDistance: number,\n fallback: Vec3,\n comp?: Set<number>,\n): Vec3 {\n const eps = 0.001\n const { positions } = mesh\n let cx = 0, cy = 0, cz = 0\n let count = 0\n\n const vertCount = positions.length / 3\n for (let i = 0; i < vertCount; i++) {\n if (comp && !comp.has(i)) continue\n\n const x = positions[i * 3]\n const y = positions[i * 3 + 1]\n const z = positions[i * 3 + 2]\n\n const dist = x * normal[0] + y * normal[1] + z * normal[2] - planeDistance\n if (Math.abs(dist) < eps) {\n cx += x\n cy += y\n cz += z\n count++\n }\n }\n\n if (count === 0) return fallback\n return [cx / count, cy / count, cz / count]\n}\n\n/**\n * 计算切割平面上截面沿指定方向的宽度。\n *\n * 与 csg-worker.ts computeCrossSectionWidth 算法一致。\n */\nfunction computeCrossSectionWidthFromMesh(\n mesh: MeshData,\n normal: Vec3,\n planeDistance: number,\n widthDir: Vec3,\n comp?: Set<number>,\n): number {\n const eps = 0.001\n const { positions } = mesh\n let minProj = Infinity\n let maxProj = -Infinity\n let found = false\n\n const vertCount = positions.length / 3\n for (let i = 0; i < vertCount; i++) {\n if (comp && !comp.has(i)) continue\n\n const x = positions[i * 3]\n const y = positions[i * 3 + 1]\n const z = positions[i * 3 + 2]\n\n const dist = x * normal[0] + y * normal[1] + z * normal[2] - planeDistance\n if (Math.abs(dist) < eps) {\n const proj = x * widthDir[0] + y * widthDir[1] + z * widthDir[2]\n if (proj < minProj) minProj = proj\n if (proj > maxProj) maxProj = proj\n found = true\n }\n }\n\n if (!found) return 0\n return maxProj - minProj\n}\n\n/** 将 OCCT solid 三角化为 MeshData(用于截面分析) */\nfunction solidToMeshData(kernel: BrepEngineApi, solid: BrepHandle): MeshData {\n const mesh = kernel.meshShape(solid, {\n linearDeflection: 0.1,\n angularDeflection: (2 * Math.PI) / 32,\n })\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n}\n\n// ─── 基本体构造(BREP 等价物) ───\n\n/**\n * 构造局部的变换矩阵:local X → widthDir, Y → depthDir, Z → normal,再平移到 origin。\n */\nfunction makeBasisTransform(basis: JoineryBasis, origin: Vec3): THREE.Matrix4 {\n const basisMatrix = new THREE.Matrix4().makeBasis(\n new THREE.Vector3(...basis.widthDir),\n new THREE.Vector3(...basis.depthDir),\n new THREE.Vector3(...basis.normal),\n )\n const transMatrix = new THREE.Matrix4().makeTranslation(origin[0], origin[1], origin[2])\n return new THREE.Matrix4().multiplyMatrices(transMatrix, basisMatrix)\n}\n\n/**\n * 梯形棱柱(燕尾楔)— BREP 等价物。\n *\n * 复刻 joinery-shapes.ts buildWedgeGeometry 的 8 顶点拓扑:\n * - 梯形截面在 normal-depthDir 平面\n * - 底边(宽)在 planeCenter - normal*depth\n * - 顶边(窄)在 planeCenter\n * - 沿 widthDir 拉伸 extrudeLength,居中于 planeCenter\n *\n * 用 kernel.makeLineEdge + makeWire + makeFace + extrude 构造实体,\n * 然后用 transform 对齐到世界坐标系。\n * @param kernel - the BREP engine API.\n * @param basis - the joinery coordinate frame (normal/widthDir/depthDir/planeCenter).\n * @param depth - the wedge depth along the normal direction.\n * @param width - the wedge bottom width.\n * @param angleDeg - the dovetail flap angle in degrees.\n * @param extrudeLength - the extrusion length along the width direction.\n * @returns the constructed wedge solid handle.\n */\nexport function buildWedgeSolid(\n kernel: BrepEngineApi,\n basis: JoineryBasis,\n depth: number,\n width: number,\n angleDeg: number,\n extrudeLength: number,\n): BrepHandle {\n const { planeCenter } = basis\n const angleRad = (angleDeg * Math.PI) / 180\n\n const halfWidth = width / 2\n const halfTopWidth = Math.max(0, halfWidth - depth / Math.tan(angleRad))\n const halfExtrude = extrudeLength / 2\n\n // 在局部坐标系中构造梯形面(YZ 平面,X = -halfExtrude)\n // 局部: X → widthDir, Y → depthDir, Z → normal\n const xLocal = -halfExtrude\n const v0 = { x: xLocal, y: -halfWidth, z: -depth } // bottomLeft\n const v1 = { x: xLocal, y: halfWidth, z: -depth } // bottomRight\n const v2 = { x: xLocal, y: halfTopWidth, z: 0 } // topRight\n const v3 = { x: xLocal, y: -halfTopWidth, z: 0 } // topLeft\n\n // 构建梯形 wire\n const edges: BrepHandle[] = []\n edges.push(kernel.makeLineEdge(v0, v1))\n edges.push(kernel.makeLineEdge(v1, v2))\n edges.push(kernel.makeLineEdge(v2, v3))\n edges.push(kernel.makeLineEdge(v3, v0))\n\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n\n // 沿 X 轴(= widthDir)拉伸 extrudeLength\n const extruded = kernel.extrude(face, extrudeLength, 0, 0)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n\n // 变换到世界坐标系\n const fullMatrix = makeBasisTransform(basis, planeCenter)\n const result = kernel.transform(extruded, matrixToArray(fullMatrix))\n kernel.release(extruded)\n\n return result\n}\n\n/**\n * 圆柱(定位销)— BREP 等价物。\n *\n * 复刻 joinery-shapes.ts buildDowelGeometry:\n * - 圆截面在 widthDir-depthDir 平面,中心在 centroid\n * - 从切割平面向下延伸 height(沿 -normal)\n *\n * 用 kernel.makeCylinder + transform 对齐方向。\n * @param kernel - the BREP engine API.\n * @param centroid - the centroid where the dowel is placed.\n * @param basis - the joinery coordinate frame.\n * @param diameter - the dowel diameter.\n * @param height - the dowel height along the normal direction.\n * @returns the constructed dowel solid handle.\n */\nexport function buildDowelSolid(\n kernel: BrepEngineApi,\n centroid: Vec3,\n basis: JoineryBasis,\n diameter: number,\n height: number,\n): BrepHandle {\n const radius = diameter / 2\n const { normal } = basis\n\n // OCCT makeCylinder 创建 Z 轴方向圆柱(Z=0 → Z=height)\n // 需要旋转使 Z 轴对齐 -normal(圆柱向下延伸),且顶部在 centroid\n const cyl = kernel.makeCylinder(radius, height)\n\n // 旋转 Z → -normal\n const zAxis = new THREE.Vector3(0, 0, 1)\n const negNormal = new THREE.Vector3(-normal[0], -normal[1], -normal[2]).normalize()\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, negNormal)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n\n // 平移到 centroid(旋转后 Z=0 对应 centroid,即切割平面上的顶面)\n const transMatrix = new THREE.Matrix4().makeTranslation(centroid[0], centroid[1], centroid[2])\n const fullMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n\n const result = kernel.transform(cyl, matrixToArray(fullMatrix))\n kernel.release(cyl)\n\n return result\n}\n\n/**\n * 长方体(直榫)— BREP 等价物。\n *\n * 复刻 joinery-shapes.ts buildStraightTenonGeometry:\n * - 方截面在 widthDir-depthDir 平面,中心在 centroid\n * - 从切割平面向下延伸 height(沿 -normal)\n *\n * 用 kernel.makeBoxFromCorners + transform 对齐方向。\n * @param kernel - the BREP engine API.\n * @param centroid - the centroid where the tenon is placed.\n * @param basis - the joinery coordinate frame.\n * @param sideLength - the tenon square side length.\n * @param height - the tenon height along the normal direction.\n * @returns the constructed tenon solid handle.\n */\nexport function buildTenonSolid(\n kernel: BrepEngineApi,\n centroid: Vec3,\n basis: JoineryBasis,\n sideLength: number,\n height: number,\n): BrepHandle {\n const half = sideLength / 2\n\n // 在局部坐标系中创建盒子:X ∈ [-half, half], Y ∈ [-half, half], Z ∈ [-height, 0]\n // 局部: X → widthDir, Y → depthDir, Z → normal\n const localBox = kernel.makeBoxFromCorners(\n { x: -half, y: -half, z: -height },\n { x: half, y: half, z: 0 },\n )\n\n // 变换到世界坐标系\n const fullMatrix = makeBasisTransform(basis, centroid)\n const result = kernel.transform(localBox, matrixToArray(fullMatrix))\n kernel.release(localBox)\n\n return result\n}\n\n// ─── 截面质心 / 多截面检测 ───\n\n/** 截面分量信息 */\nexport interface CrossSectionComponent {\n /** 分量质心 */\n centroid: Vec3\n /** 分量面积(近似,用于排序) */\n area: number\n}\n\n/**\n * 检测上部实体在切割平面上的截面连通分量。\n *\n * BREP 等价物:将 upper solid 三角化后,用与 mesh 路径 detectCapComponents\n * 完全相同的算法(找帽面三角形 → union-find)检测连通分量。\n *\n * 与 csg-worker.ts detectCapComponents + computeCrossSectionCentroid 一致。\n * @param kernel - the BREP engine API.\n * @param upper - the upper solid whose cross section is analyzed.\n * @param basis - the joinery coordinate frame.\n * @returns the detected cross-section components (centroid + area).\n */\nexport function detectCrossSectionComponents(\n kernel: BrepEngineApi,\n upper: BrepHandle,\n basis: JoineryBasis,\n): CrossSectionComponent[] {\n const { normal, planeDistance, widthDir, depthDir, planeCenter } = basis\n const mesh = solidToMeshData(kernel, upper)\n const components = detectCapComponentsFromMesh(mesh, normal, planeDistance)\n\n if (components.length === 0) {\n // 无帽面 → 返回单个全局质心(planeCenter)作为回退\n return [{ centroid: planeCenter, area: 0 }]\n }\n\n return components.map(comp => {\n const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, planeCenter, comp)\n const compWidth = computeCrossSectionWidthFromMesh(mesh, normal, planeDistance, widthDir, comp)\n const compDepth = computeCrossSectionWidthFromMesh(mesh, normal, planeDistance, depthDir, comp)\n return { centroid, area: compWidth * compDepth }\n })\n}\n\n// ─── 布尔序列(1:1 复刻 csg-worker.ts) ───\n\n/** dovetail 布尔分割的结果 */\nexport interface DovetailSplitBrepResult {\n /** 上部 + 楔(法线正方向半部分加燕尾榫) */\n front: BrepHandle\n /** 下部 - 凹腔(法线负方向半部分减燕尾槽) */\n back: BrepHandle\n}\n\n/** dowel/tenon 布尔分割的结果 */\nexport interface DowelOrTenonSplitBrepResult {\n /** 上部 + 销/榫(法线正方向半部分加圆柱/方柱) */\n front: BrepHandle\n /** 下部 - 孔(法线负方向半部分减圆柱/方柱) */\n back: BrepHandle\n}\n\n/** groove 参数 */\nexport interface GrooveParams {\n depth: number\n depthTolerance: number\n width: number\n widthTolerance: number\n flapsAngle: number\n}\n\n/**\n * Dovetail(燕尾)布尔分割 — BREP 等价物。\n *\n * 1:1 复刻 csg-worker.ts dovetailBooleanSplit:\n * 1. splitBrep → upper + lower\n * 2. 计算 crossSectionWidth(bbox 投影近似)\n * 3. buildWedgeSolid(overhang=20)→ common(wedge, lower) 裁剪贴合\n * 4. fuse(upper, wedgeTrimmed) → upper'\n * 5. buildWedgeSolid(公差)→ cut(lower, wedgeTol) → lower'\n * @param kernel - the BREP engine API.\n * @param original - the original solid to split.\n * @param basis - the joinery coordinate frame.\n * @param groove - the dovetail groove parameters.\n * @returns the split result with front (upper + wedge) and back (lower - cavity) handles.\n */\nexport function dovetailBooleanSplitBrep(\n kernel: BrepEngineApi,\n original: BrepHandle,\n basis: JoineryBasis,\n groove: GrooveParams,\n): DovetailSplitBrepResult {\n const { normal, widthDir, planeCenter, planeDistance } = basis\n\n // Step 1: 平面分割 → upper + lower\n const splitResult = splitBrep(kernel, original, { normal, planeDistance, planeCenter })\n let upper = splitResult.front\n let lower = splitResult.back\n\n // Step 2: 计算截面宽度(bbox 投影近似,后续 common 会裁回真实边界)\n const upperBbox = getSolidBoundingBox(kernel, upper)\n const upperSize: Vec3 = [\n upperBbox.max[0] - upperBbox.min[0],\n upperBbox.max[1] - upperBbox.min[1],\n upperBbox.max[2] - upperBbox.min[2],\n ]\n let crossSectionWidth =\n Math.abs(upperSize[0] * widthDir[0]) +\n Math.abs(upperSize[1] * widthDir[1]) +\n Math.abs(upperSize[2] * widthDir[2])\n if (crossSectionWidth <= 0) crossSectionWidth = 10 // 安全回退\n const extrudeLength = crossSectionWidth + 0.2\n const overhang = 20\n\n // Step 3: 构造楔(带 overhang)\n const wedgeW = buildWedgeSolid(kernel, basis, groove.depth, groove.width, groove.flapsAngle, extrudeLength + overhang)\n\n // Step 4: common(wedge, lower) → 裁剪楔贴合模型边界\n const wedgeTrimmed = kernel.common(wedgeW, lower)\n kernel.release(wedgeW)\n\n // Step 5: fuse(upper, wedgeTrimmed) → upper'\n const newUpper = kernel.fuse(upper, wedgeTrimmed)\n kernel.release(upper)\n kernel.release(wedgeTrimmed)\n upper = newUpper\n\n // Step 6: 构造公差楔\n const wedgeTol = buildWedgeSolid(\n kernel, basis,\n groove.depth + groove.depthTolerance,\n groove.width + groove.widthTolerance,\n groove.flapsAngle,\n extrudeLength + overhang,\n )\n\n // Step 7: cut(lower, wedgeTol) → lower'\n const newLower = kernel.cut(lower, wedgeTol)\n kernel.release(lower)\n kernel.release(wedgeTol)\n lower = newLower\n\n return { front: upper, back: lower }\n}\n\n/** dowel/tenon 参数 */\nexport interface DowelOrTenonParams {\n /** 直径(dowel)或边长(tenon) */\n size: number\n /** 尺寸公差 */\n sizeTolerance: number\n /** 高度 */\n height: number\n /** 高度公差 */\n heightTolerance: number\n}\n\n/**\n * Dowel(定位销)/ Tenon(直榫)布尔分割 — BREP 等价物。\n *\n * 1:1 复刻 csg-worker.ts dowelOrTenonBooleanSplit:\n * 1. splitBrep → upper + lower\n * 2. detectCrossSectionComponents → 截面质心列表\n * 3. 对每个质心:buildShapeSolid → fuse(upper, shape) → upper'\n * 4. 对每个质心:buildShapeSolid(公差)→ cut(lower, shapeTol) → lower'\n * @param kernel - the BREP engine API.\n * @param original - the original solid to split.\n * @param basis - the joinery coordinate frame.\n * @param shape - whether to build a dowel or a tenon.\n * @param params - the dowel/tenon size and tolerance parameters.\n * @param selectedSections - optional indices of cross-section components to place shapes on.\n * @returns the split result with front (upper + shape) and back (lower - hole) handles.\n */\nexport function dowelOrTenonBooleanSplitBrep(\n kernel: BrepEngineApi,\n original: BrepHandle,\n basis: JoineryBasis,\n shape: 'dowel' | 'tenon',\n params: DowelOrTenonParams,\n selectedSections?: number[] | null,\n): DowelOrTenonSplitBrepResult {\n const { normal, planeCenter, planeDistance } = basis\n\n // Step 1: 平面分割 → upper + lower\n const splitResult = splitBrep(kernel, original, { normal, planeDistance, planeCenter })\n let upper = splitResult.front\n let lower = splitResult.back\n\n // Step 2: 检测截面分量\n const components = detectCrossSectionComponents(kernel, upper, basis)\n\n // 构建放置位置列表\n interface Placement { centroid: Vec3 }\n let placements: Placement[]\n\n if (components.length <= 1 || !selectedSections || selectedSections.length === 0) {\n // 单截面或无选择 → 全局质心(向后兼容)\n const mesh = solidToMeshData(kernel, upper)\n const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, planeCenter)\n placements = [{ centroid }]\n } else {\n // 多截面:按面积降序排,取选择的分量\n const sorted = [...components].sort((a, b) => b.area - a.area)\n placements = []\n for (const selId of selectedSections) {\n if (selId < sorted.length) {\n placements.push({ centroid: sorted[selId].centroid })\n }\n }\n if (placements.length === 0) {\n const mesh = solidToMeshData(kernel, upper)\n const centroid = computeCrossSectionCentroidFromMesh(mesh, normal, planeDistance, planeCenter)\n placements = [{ centroid }]\n }\n }\n\n // Step 3: 对每个质心构造基本体并 fuse 到 upper\n for (const { centroid } of placements) {\n let shapeC: BrepHandle\n if (shape === 'dowel') {\n shapeC = buildDowelSolid(kernel, centroid, basis, params.size, params.height)\n } else {\n shapeC = buildTenonSolid(kernel, centroid, basis, params.size, params.height)\n }\n\n const newUpper = kernel.fuse(upper, shapeC)\n kernel.release(upper)\n kernel.release(shapeC)\n upper = newUpper\n }\n\n // Step 4: 对每个质心构造公差体并 cut 从 lower\n const tolSize = params.size + params.sizeTolerance\n const tolHeight = params.height + params.heightTolerance\n\n for (const { centroid } of placements) {\n let shapeCTol: BrepHandle\n if (shape === 'dowel') {\n shapeCTol = buildDowelSolid(kernel, centroid, basis, tolSize, tolHeight)\n } else {\n shapeCTol = buildTenonSolid(kernel, centroid, basis, tolSize, tolHeight)\n }\n\n const newLower = kernel.cut(lower, shapeCTol)\n kernel.release(lower)\n kernel.release(shapeCTol)\n lower = newLower\n }\n\n return { front: upper, back: lower }\n}\n"]}
|
package/dist/api/index.d.ts
CHANGED
|
@@ -25,6 +25,10 @@ export { sectionByPlane, type SectionByPlaneParams } from './section-by-plane.js
|
|
|
25
25
|
export { screw } from './screw.js';
|
|
26
26
|
export { profile, buildProfileShape, assertProfileParams } from './profile.js';
|
|
27
27
|
export type { ProfileLineSeg, ProfileArcSeg, ProfileSeg, ProfileLoop, ProfileParams } from './profile.js';
|
|
28
|
+
export { sketchOnPlane, buildSketchOnPlaneWith } from './sketch-on-plane.js';
|
|
29
|
+
export { sketchOnFace, buildSketchOnFaceWith } from './sketch-on-face.js';
|
|
30
|
+
export { punchHole, buildPunchHole, punchSolidOf } from './punch-hole.js';
|
|
31
|
+
export type { SketchOnPlaneParams, PlaneSpec } from './sketch-on-plane.js';
|
|
28
32
|
export { wire } from './wire.js';
|
|
29
33
|
export { helix } from './helix.js';
|
|
30
34
|
export { split } from './split.js';
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.js
CHANGED
|
@@ -31,6 +31,9 @@ export { splitByPlane } from './split-by-plane.js';
|
|
|
31
31
|
export { sectionByPlane } from './section-by-plane.js';
|
|
32
32
|
export { screw } from './screw.js';
|
|
33
33
|
export { profile, buildProfileShape, assertProfileParams } from './profile.js';
|
|
34
|
+
export { sketchOnPlane, buildSketchOnPlaneWith } from './sketch-on-plane.js';
|
|
35
|
+
export { sketchOnFace, buildSketchOnFaceWith } from './sketch-on-face.js';
|
|
36
|
+
export { punchHole, buildPunchHole, punchSolidOf } from './punch-hole.js';
|
|
34
37
|
export { wire } from './wire.js';
|
|
35
38
|
export { helix } from './helix.js';
|
|
36
39
|
export { split } from './split.js';
|
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 API 面(api/)— faijs 库函数命名空间(替代原 packages/stdlib)\n *\n * 设计文档:docs/plans/2026-09-01-layered-api-architecture.md §D1/D2(P6 迁入 core)\n *\n * 导出全部官方库函数、Shape 构造器与 schema 表。\n * 库函数签名 = .fai.js 源码里的调用形态(无隐式参数);\n * 后端资源经 getBackends() 获取,保留声明经 keep() 表达。\n * 实现来源按 D11:mesh 侧复用 mesh/ 层,brep 侧复用既有 brep/ 层;\n * 缺失 brep 能力时经 D10 桥接调移植树 L2(见各 op 实现)。\n */\n\nexport { box, sphere, cylinder, cone, wedge } from './primitives'\n// `../3d_editor` 消费面(**不是废弃项**,措辞于 2026-09-22 校正):transform 家族\n// (translate/rotate_euler/scale/scale3d)为编辑器应用提供(拖拽 / 时间线语句),\n// 不属 faijs 平台面,但服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**;\n// 各 op 的 JSDoc 已带校正后的 @deprecated。\n//\n// D1(2026-09-23 扩展库拆分,选项 C):四个 transform op **全部留 core**——\n// `translate` 是通用几何变换且是小程序端唯一在用的 transform op,同族不拆散。\nexport { translate, rotate_euler, scale, scale3d } from './transform'\nexport { union, subtract, intersect, cut } from './boolean'\nexport { engrave } from './engrave'\nexport { chamfer } from './chamfer'\nexport { fillet } from './fillet'\nexport { shell, type ShellParams } from './shell'\nexport { draft, type DraftParams } from './draft'\nexport { thicken } from './thicken'\nexport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace, type SewParams } from './feature-repair'\nexport { filletVariable } from './fillet-variable'\nexport { splitByPlane, type SplitByPlaneParams } from './split-by-plane'\nexport { sectionByPlane, type SectionByPlaneParams } from './section-by-plane'\nexport { screw } from './screw'\nexport { profile, buildProfileShape, assertProfileParams } from './profile'\nexport type { ProfileLineSeg, ProfileArcSeg, ProfileSeg, ProfileLoop, ProfileParams } from './profile'\nexport { wire } from './wire'\nexport { helix } from './helix'\nexport { split } from './split'\nexport { sweep } from './sweep'\nexport { loft } from './loft'\nexport { knurl } from './knurl'\nexport { sdf } from './sdf'\n// 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:\n// 引擎不得 import stdlib/compound;公共 API 经本 re-export 保持)。\nexport { applyTransform } from '../mesh/rigid-transform'\n// P2-f3:装配子层全量导出(solvePreview/entityFromGeometry 等经此到门面)。\n// A/B 组 op(fai_* / group / assembly / copy / load / text / svgExtrude)已迁出\n// core,见 @faicad/faijs-extra;装配**求解器**(solve/validate/joints/solvers)\n// 仍是平台能力,留在此处。\nexport * from './assembly'\n// ── H11:平台几何 op(方案 §4,替代 FCStd 迁移对编辑器 op 的借用)──\nexport { import_brep } from './import-brep'\nexport { import_step } from './import-step'\nexport { compound } from './compound-geom'\nexport { place } from './place'\nexport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nexport { edgeRef } from './edge-ref'\nexport { faceRef } from './face-ref'\nexport { asset } from './asset'\nexport { solid, isShape, isCompound } from '../shape'\nexport { compound as structCompound } from '../shape'\nexport type { ShapeSlot, SolidShape, CompoundShape, CurveShape, StdShape, ShapeKind } from '../shape'\nexport type { Shape } from '../mesh/types'\n\n// ── P23:brepjs 兼容面接线(§4.2 / B1 三源一致)──\n//\n// ① 生成脚本面 op(与 api-namespace 的 cad 面同源:api/generated/script-face.ts)。\n// 这批 op 经 `compatOp(projectBrepOp(…))` 包装,faijs 形态(Shape 进 / Shape 出、\n// 布尔双形态、brep-only),TS 侧与 `.fai.js` 侧同语义。\nexport * from './generated/script-face'\n// P25: compat extrude/revolve (brep-only, face→prism / face→lathe) share one\n// definition between the TS surface and the cad scripting surface. The fcstd\n// codegen wires Pad/Pocket/Extrusion/Revolution through these (sketch face →\n// cad.extrude / cad.revolve).\n// extrude 是平台手写 op(承载 upTo;长度形态委托生成投影)——见 api/extrude.ts;\n// revolve 仍直接取生成投影。\nexport { extrude } from './extrude'\nexport { revolve } from './generated/operations'\n//\n// ② 2026-09-25 core-decouple:brepjsCompat 命名空间与全部 op 投影随 vendored\n// 树删除(§5.5 第 3 条,裁决 9)。此处只平铺**无 op 语义**的组合器与纯工具\n// (Result / 向量 / 平面 / 错误 / 常量),它们为 core 内联实现(§5.2),\n// 在两个面之间语义一致且无同名冲突。\nexport {\n ok, err, isOk, isErr, unwrap, unwrapOr,\n vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize,\n createPlane, createNamedPlane, resolvePlane,\n kernelError, validationError,\n DEG2RAD, RAD2DEG,\n} from './brepjs-compat'\nexport type {\n Result, Ok, Err,\n BrepError,\n Plane, PlaneName, PlaneInput,\n Vec3, PointInput,\n} from './brepjs-compat'\n// ── 2026-09-25 core-decouple:vendored 库建造工厂(makeExternalGear /\n// makeInternalGear / makePlanetaryGear / thread)与其句柄类型\n// (Vertex/Edge/…/Shape3D/ValidSolid/Bounds3D/Gear*)随裁决 9 删除;\n// Result 组合器 map/andThen 为 core 内联(§5.2),保留平铺;\n// brepjsCompat 命名空间整体删除(§5.5 第 3 条)。\nexport { map, andThen } from './brepjs-compat'\n// ── 2026-09-25 core-decouple wrapup §2.2:sheetmetal 拓扑查询 / 构造 / 测量\n// 出口(faijs 风格,裁决 3 补进公开导出)。isValid 不在此面——cad 脚本面\n// 已有同语义出口(见 brep-topology.ts 头部注释)。同步测量(measureVolume\n// / measureArea / measureLength)为 api/generated/measurement.ts 第一方\n// 同步版,一并平铺(cad 面的 volume/area/length 为 async 脚本面重命名)。\nexport * from './brep-topology'\nexport { measureVolume, measureArea, measureLength } from './generated/measurement'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 API 面(api/)— faijs 库函数命名空间(替代原 packages/stdlib)\n *\n * 设计文档:docs/plans/2026-09-01-layered-api-architecture.md §D1/D2(P6 迁入 core)\n *\n * 导出全部官方库函数、Shape 构造器与 schema 表。\n * 库函数签名 = .fai.js 源码里的调用形态(无隐式参数);\n * 后端资源经 getBackends() 获取,保留声明经 keep() 表达。\n * 实现来源按 D11:mesh 侧复用 mesh/ 层,brep 侧复用既有 brep/ 层;\n * 缺失 brep 能力时经 D10 桥接调移植树 L2(见各 op 实现)。\n */\n\nexport { box, sphere, cylinder, cone, wedge } from './primitives'\n// `../3d_editor` 消费面(**不是废弃项**,措辞于 2026-09-22 校正):transform 家族\n// (translate/rotate_euler/scale/scale3d)为编辑器应用提供(拖拽 / 时间线语句),\n// 不属 faijs 平台面,但服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**;\n// 各 op 的 JSDoc 已带校正后的 @deprecated。\n//\n// D1(2026-09-23 扩展库拆分,选项 C):四个 transform op **全部留 core**——\n// `translate` 是通用几何变换且是小程序端唯一在用的 transform op,同族不拆散。\nexport { translate, rotate_euler, scale, scale3d } from './transform'\nexport { union, subtract, intersect, cut } from './boolean'\nexport { engrave } from './engrave'\nexport { chamfer } from './chamfer'\nexport { fillet } from './fillet'\nexport { shell, type ShellParams } from './shell'\nexport { draft, type DraftParams } from './draft'\nexport { thicken } from './thicken'\nexport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace, type SewParams } from './feature-repair'\nexport { filletVariable } from './fillet-variable'\nexport { splitByPlane, type SplitByPlaneParams } from './split-by-plane'\nexport { sectionByPlane, type SectionByPlaneParams } from './section-by-plane'\nexport { screw } from './screw'\nexport { profile, buildProfileShape, assertProfileParams } from './profile'\nexport type { ProfileLineSeg, ProfileArcSeg, ProfileSeg, ProfileLoop, ProfileParams } from './profile'\nexport { sketchOnPlane, buildSketchOnPlaneWith } from './sketch-on-plane'\nexport { sketchOnFace, buildSketchOnFaceWith } from './sketch-on-face'\nexport { punchHole, buildPunchHole, punchSolidOf } from './punch-hole'\nexport type { SketchOnPlaneParams, PlaneSpec } from './sketch-on-plane'\nexport { wire } from './wire'\nexport { helix } from './helix'\nexport { split } from './split'\nexport { sweep } from './sweep'\nexport { loft } from './loft'\nexport { knurl } from './knurl'\nexport { sdf } from './sdf'\n// 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:\n// 引擎不得 import stdlib/compound;公共 API 经本 re-export 保持)。\nexport { applyTransform } from '../mesh/rigid-transform'\n// P2-f3:装配子层全量导出(solvePreview/entityFromGeometry 等经此到门面)。\n// A/B 组 op(fai_* / group / assembly / copy / load / text / svgExtrude)已迁出\n// core,见 @faicad/faijs-extra;装配**求解器**(solve/validate/joints/solvers)\n// 仍是平台能力,留在此处。\nexport * from './assembly'\n// ── H11:平台几何 op(方案 §4,替代 FCStd 迁移对编辑器 op 的借用)──\nexport { import_brep } from './import-brep'\nexport { import_step } from './import-step'\nexport { compound } from './compound-geom'\nexport { place } from './place'\nexport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nexport { edgeRef } from './edge-ref'\nexport { faceRef } from './face-ref'\nexport { asset } from './asset'\nexport { solid, isShape, isCompound } from '../shape'\nexport { compound as structCompound } from '../shape'\nexport type { ShapeSlot, SolidShape, CompoundShape, CurveShape, StdShape, ShapeKind } from '../shape'\nexport type { Shape } from '../mesh/types'\n\n// ── P23:brepjs 兼容面接线(§4.2 / B1 三源一致)──\n//\n// ① 生成脚本面 op(与 api-namespace 的 cad 面同源:api/generated/script-face.ts)。\n// 这批 op 经 `compatOp(projectBrepOp(…))` 包装,faijs 形态(Shape 进 / Shape 出、\n// 布尔双形态、brep-only),TS 侧与 `.fai.js` 侧同语义。\nexport * from './generated/script-face'\n// P25: compat extrude/revolve (brep-only, face→prism / face→lathe) share one\n// definition between the TS surface and the cad scripting surface. The fcstd\n// codegen wires Pad/Pocket/Extrusion/Revolution through these (sketch face →\n// cad.extrude / cad.revolve).\n// extrude 是平台手写 op(承载 upTo;长度形态委托生成投影)——见 api/extrude.ts;\n// revolve 仍直接取生成投影。\nexport { extrude } from './extrude'\nexport { revolve } from './generated/operations'\n//\n// ② 2026-09-25 core-decouple:brepjsCompat 命名空间与全部 op 投影随 vendored\n// 树删除(§5.5 第 3 条,裁决 9)。此处只平铺**无 op 语义**的组合器与纯工具\n// (Result / 向量 / 平面 / 错误 / 常量),它们为 core 内联实现(§5.2),\n// 在两个面之间语义一致且无同名冲突。\nexport {\n ok, err, isOk, isErr, unwrap, unwrapOr,\n vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize,\n createPlane, createNamedPlane, resolvePlane,\n kernelError, validationError,\n DEG2RAD, RAD2DEG,\n} from './brepjs-compat'\nexport type {\n Result, Ok, Err,\n BrepError,\n Plane, PlaneName, PlaneInput,\n Vec3, PointInput,\n} from './brepjs-compat'\n// ── 2026-09-25 core-decouple:vendored 库建造工厂(makeExternalGear /\n// makeInternalGear / makePlanetaryGear / thread)与其句柄类型\n// (Vertex/Edge/…/Shape3D/ValidSolid/Bounds3D/Gear*)随裁决 9 删除;\n// Result 组合器 map/andThen 为 core 内联(§5.2),保留平铺;\n// brepjsCompat 命名空间整体删除(§5.5 第 3 条)。\nexport { map, andThen } from './brepjs-compat'\n// ── 2026-09-25 core-decouple wrapup §2.2:sheetmetal 拓扑查询 / 构造 / 测量\n// 出口(faijs 风格,裁决 3 补进公开导出)。isValid 不在此面——cad 脚本面\n// 已有同语义出口(见 brep-topology.ts 头部注释)。同步测量(measureVolume\n// / measureArea / measureLength)为 api/generated/measurement.ts 第一方\n// 同步版,一并平铺(cad 面的 volume/area/length 为 async 脚本面重命名)。\nexport * from './brep-topology'\nexport { measureVolume, measureArea, measureLength } from './generated/measurement'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/api/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/api/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAe1C,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,0BAA0B;AAC1B,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,aAAa,CAAA;AAEvD,yBAAyB;AACzB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACrB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAazE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAmD9D;AA+ED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,OAAO;;CAOlB,CAAA"}
|