@faicad/faijs 0.29.3 → 0.29.5

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.
Files changed (80) hide show
  1. package/dist/api/appearance.d.ts +138 -0
  2. package/dist/api/appearance.d.ts.map +1 -0
  3. package/dist/api/appearance.js +230 -0
  4. package/dist/api/appearance.js.map +1 -0
  5. package/dist/api/import-step.d.ts.map +1 -1
  6. package/dist/api/import-step.js +28 -0
  7. package/dist/api/import-step.js.map +1 -1
  8. package/dist/api/index.d.ts +4 -0
  9. package/dist/api/index.d.ts.map +1 -1
  10. package/dist/api/index.js +2 -0
  11. package/dist/api/index.js.map +1 -1
  12. package/dist/api/meta.d.ts +93 -0
  13. package/dist/api/meta.d.ts.map +1 -0
  14. package/dist/api/meta.js +99 -0
  15. package/dist/api/meta.js.map +1 -0
  16. package/dist/api/primitives.d.ts.map +1 -1
  17. package/dist/api/primitives.js +117 -2
  18. package/dist/api/primitives.js.map +1 -1
  19. package/dist/brep/brep-ops.d.ts.map +1 -1
  20. package/dist/brep/brep-ops.js +28 -3
  21. package/dist/brep/brep-ops.js.map +1 -1
  22. package/dist/brep/engine/adapters/occt.js +1 -1
  23. package/dist/brep/engine/adapters/occt.js.map +1 -1
  24. package/dist/brep/export/export-model.d.ts +40 -0
  25. package/dist/brep/export/export-model.d.ts.map +1 -1
  26. package/dist/brep/export/export-model.js +268 -25
  27. package/dist/brep/export/export-model.js.map +1 -1
  28. package/dist/brep/export/step-meta-header.d.ts +102 -0
  29. package/dist/brep/export/step-meta-header.d.ts.map +1 -0
  30. package/dist/brep/export/step-meta-header.js +225 -0
  31. package/dist/brep/export/step-meta-header.js.map +1 -0
  32. package/dist/brep/export/step.d.ts +5 -1
  33. package/dist/brep/export/step.d.ts.map +1 -1
  34. package/dist/brep/export/step.js +11 -2
  35. package/dist/brep/export/step.js.map +1 -1
  36. package/dist/define-op.d.ts.map +1 -1
  37. package/dist/define-op.js +63 -1
  38. package/dist/define-op.js.map +1 -1
  39. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  40. package/dist/lang/metadata-extractor.js +2 -21
  41. package/dist/lang/metadata-extractor.js.map +1 -1
  42. package/dist/lang/types.d.ts +5 -6
  43. package/dist/lang/types.d.ts.map +1 -1
  44. package/dist/lang/types.js.map +1 -1
  45. package/dist/mesh/io.d.ts +6 -0
  46. package/dist/mesh/io.d.ts.map +1 -1
  47. package/dist/mesh/io.js +25 -1
  48. package/dist/mesh/io.js.map +1 -1
  49. package/dist/mesh/primitives.d.ts.map +1 -1
  50. package/dist/mesh/primitives.js +41 -6
  51. package/dist/mesh/primitives.js.map +1 -1
  52. package/dist/mesh/threemf-loader.d.ts +23 -0
  53. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  54. package/dist/mesh/threemf-loader.js +182 -8
  55. package/dist/mesh/threemf-loader.js.map +1 -1
  56. package/dist/mesh/types.d.ts +38 -0
  57. package/dist/mesh/types.d.ts.map +1 -1
  58. package/dist/mesh/types.js.map +1 -1
  59. package/dist/occt-kernel/highLevelApi.d.ts +4 -1
  60. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  61. package/dist/occt-kernel/highLevelApi.js +4 -2
  62. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  63. package/dist/occt-kernel/occt-primitives.js +1 -1
  64. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  65. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  66. package/dist/occt-kernel/occtKernel.js +1 -1
  67. package/dist/occt-kernel/occtKernel.js.map +1 -1
  68. package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
  69. package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
  70. package/dist/occt-kernel/stepMetaParser.js +166 -0
  71. package/dist/occt-kernel/stepMetaParser.js.map +1 -0
  72. package/dist/shape.d.ts +11 -3
  73. package/dist/shape.d.ts.map +1 -1
  74. package/dist/shape.js +4 -2
  75. package/dist/shape.js.map +1 -1
  76. package/dist/step/stepMetaParser.d.ts +55 -0
  77. package/dist/step/stepMetaParser.d.ts.map +1 -0
  78. package/dist/step/stepMetaParser.js +177 -0
  79. package/dist/step/stepMetaParser.js.map +1 -0
  80. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"brep-ops.js","sourceRoot":"","sources":["../../src/brep/brep-ops.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 核心 BREP 操作 — 使用 OCCT 精确实体运算\n *\n * @platform occt — 本文件 import occt-kernel:`extrudeBrep` 用原生 `section`\n * (BRepAlgoAPI_Section,occt-only,L1 只有 sectionByPlane)构造截面 → 守卫①\n * 要求平台 import 自证身份。本文件是内部工具面(非 op 文件),文件级标注即满足\n * 守卫;调用方 op 若经本文件触达 occt-only 能力,须在 defineOp 声明 engines\n * (extrudeBrep 的 section 仅 occt 路径可达,brepkit 下由调用方引擎声明拦截)。\n *\n * See docs/api-contract.md §8 (dual-path geometry contract: BREP / Mesh).\n *\n * 与 mesh 路径(transform.ts / boolean/ / drill.ts / split.ts / extrude.ts)对照:\n * - mesh 路径:消费 Shape(三角网格),走 manifold-3d(mesh-CSG)\n * - BREP 路径:消费 BrepHandle(OCCT 实体句柄),走 OCCT 精确布尔/变换\n *\n * 所有函数都是纯函数(可 import occtWasmKernel,不读 store)。\n * 输入输出均为 OCCT BrepHandle,调用方负责句柄生命周期。\n *\n * 坐标系:Z-up、毫米,与 mesh 路径一致。\n */\n\nimport * as THREE from 'three'\nimport type { BrepHandle, BrepMeshResult } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../occt-kernel/occtKernel'\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { BrepChainState } from './brep-chain'\nimport type { PartName } from '../identity'\nimport { getSolidBoundingBox } from './brep-utils'\nimport { DEFAULT_LINEAR_DEFLECTION } from '../tolerance'\nimport { mm } from '../units'\n\n// ─── 通用工具 ───\n\n/**\n * 将 OCCT solid 三角化为 Shape(供显示用)。\n *\n * 如果传入 brepChain + stmtId,同时把完整 BrepMeshResult(含 faceGroups)缓存到\n * brepChain.meshShapeCache,供 buildBrepTopology 复用——确保拓扑 mesh 与显示 mesh\n * 完全一致(规则 1:拓扑数据生成所使用的 mesh,必须是当前用户看到的 mesh)。\n *\n * @param kernel the initialized OCCT kernel.\n * @param solid the CAD solid handle.\n * @param segments optional tessellation segment count (affects precision).\n * @param brepChain optional - caches the BrepMeshResult when provided.\n * @param partName optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @returns the tessellated Shape.\n */\nexport function solidToShape(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n segments?: number,\n brepChain?: BrepChainState,\n partName?: PartName,\n): Shape {\n const angularDeflection = segments\n ? (2 * Math.PI) / Math.max(3, segments)\n : (2 * Math.PI) / 64 // 缺省 64 = brepjs standard 等效(§5.0/§5.1)\n const mesh: BrepMeshResult = kernel.meshShape(solid, {\n linearDeflection: DEFAULT_LINEAR_DEFLECTION.as(mm),\n angularDeflection,\n })\n\n // 规则 1:缓存完整 BrepMeshResult(含 faceGroups),供 buildBrepTopology 复用\n if (brepChain?.meshShapeCache && partName) {\n brepChain.meshShapeCache.set(partName, mesh)\n }\n\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n}\n\n// ─── 变换操作 ───\n\n/**\n * BREP 平移:使用 OCCT translate(精确,不损失几何精度)。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param offset 平移量 [dx, dy, dz]\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function translateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n offset: Vec3,\n): BrepHandle {\n return kernel.translate(solid, offset[0], offset[1], offset[2])\n}\n\n/**\n * BREP 旋转:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 rotate_euler(shape, angles, pivot?) 一致:\n * - angles 为 XYZ 欧拉角(角度制)\n * - pivot 为旋转中心(可选,默认原点)\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param angles XYZ 欧拉角(角度制)\n * @param pivot 旋转中心(可选)\n * @returns 新实体\n */\nexport function rotateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n angles: Vec3,\n pivot?: Vec3,\n): BrepHandle {\n const euler = new THREE.Euler(\n (angles[0] * Math.PI) / 180,\n (angles[1] * Math.PI) / 180,\n (angles[2] * Math.PI) / 180,\n )\n const matrix = new THREE.Matrix4().makeRotationFromEuler(euler)\n if (pivot) {\n matrix.premultiply(new THREE.Matrix4().makeTranslation(pivot[0], pivot[1], pivot[2]))\n matrix.multiply(new THREE.Matrix4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n }\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n/**\n * BREP 缩放:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 scale(P6 §4.6)一致:\n * - factor 为 number(均匀缩放)或 Vec3 [sx, sy, sz](非均匀)\n * - center 为缩放不动点(p' = center + S·(p − center));缺省 [0,0,0](原点),\n * 与 vendored brepjs `scale(shape, factor, { center? })` 的默认一致。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param factor 缩放因子\n * @param center 缩放不动点(可选,默认原点)\n * @returns 新实体\n */\nexport function scaleBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n factor: number | Vec3,\n center?: Vec3,\n): BrepHandle {\n const f = typeof factor === 'number' ? [factor, factor, factor] : factor\n const scale = new THREE.Matrix4().makeScale(f[0], f[1], f[2])\n // T(c)·S·T(−c):不动点为 center;缺省时退化为原点缩放(现状行为)。\n const matrix = center\n ? new THREE.Matrix4()\n .makeTranslation(center[0], center[1], center[2])\n .multiply(scale)\n .multiply(new THREE.Matrix4().makeTranslation(-center[0], -center[1], -center[2]))\n : scale\n const isUniform = f[0] === f[1] && f[1] === f[2]\n // OCCT gp_Trsf (kernel.transform) only supports uniform scaling.\n // Non-uniform scaling requires gp_GTrsf (kernel.generalTransform).\n if (isUniform) {\n return kernel.transform(solid, matrixToArray(matrix))\n }\n return kernel.generalTransform(solid, matrixToArray(matrix))\n}\n\n// ─── 装配变换 ───\n\n/**\n * BREP 版 applyTransform:与 mesh ops/assemble.ts 的 applyTransform 同语义(绕 pivot 旋转 + 平移)。\n *\n * 数学公式:p' = R·(p − pivot) + pivot + translation\n * 等价 Matrix4 = T(pivot) · R · T(−pivot) · T(translation)\n *\n * 用四元数而非欧拉角,是因为装配变换源是 api/assembly 的四元数;\n * 转欧拉会引入顺序/万向锁歧义。与 mesh applyTransform 顶点公式完全等价。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param quaternion 旋转四元数 [x, y, z, w]\n * @param pivot 旋转中心\n * @param translation 平移量\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function applyTransformBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n quaternion: [number, number, number, number],\n pivot: [number, number, number],\n translation: [number, number, number],\n): BrepHandle {\n const rotation = new THREE.Matrix4().makeRotationFromQuaternion(\n new THREE.Quaternion(quaternion[0], quaternion[1], quaternion[2], quaternion[3]),\n )\n // T(translation) · T(pivot) · R · T(-pivot) = T(pivot+translation) · R · T(-pivot)\n // 先绕 pivot 旋转,再平移 translation(与 mesh 路径 applyTransform 一致)\n const matrix = new THREE.Matrix4()\n .makeTranslation(pivot[0] + translation[0], pivot[1] + translation[1], pivot[2] + translation[2])\n .multiply(rotation)\n .multiply(new THREE.Matrix4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n// ─── 布尔操作 ───\n\n/**\n * BREP 布尔并集:使用 OCCT fuse(BRepAlgoAPI_Fuse)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 融合后的实体\n */\nexport function fuseBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.fuse(a, b)\n}\n\n/**\n * BREP 布尔差集:使用 OCCT cut(BRepAlgoAPI_Cut)。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns 切割后的实体\n */\nexport function cutBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.cut(a, b)\n}\n\n/**\n * BREP 布尔交集:使用 OCCT common(BRepAlgoAPI_Common)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 交集实体\n */\nexport function commonBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.common(a, b)\n}\n\n// ─── 钻孔操作 ───\n\n/** drillBrep 的参数 */\nexport interface DrillBrepParams {\n /** 孔直径 */\n diameter: number\n /** 孔深度(0 = 通孔) */\n depth: number\n /** 孔位置(世界空间) */\n position: Vec3\n /** 钻孔方向(世界空间,指向材料内部) */\n direction: Vec3\n /** 面法向(世界空间) */\n faceNormal: Vec3\n /** 孔类型 */\n holeType?: 'simple' | 'screw'\n}\n\n/**\n * BREP 钻孔:创建圆柱工具实体并用 OCCT cut 减去。\n *\n * 仅支持圆柱孔(holeType='simple')。\n * 螺丝孔(holeType='screw')由调用方判断为 mesh-only,触发 BREP 链断裂。\n *\n * 通孔(depth=0):创建一个足够长的圆柱体穿透整个零件。\n * 盲孔(depth>0):创建指定深度的圆柱体。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 钻孔参数\n * @returns 钻孔后的实体\n */\n/** 钻孔几何参数(由 `DrillBrepParams` 推导;roleTable 路径与 `drillBrep` 共用同一份几何,避免重复计算)。 */\nexport interface DrillGeometry {\n readonly radius: number\n readonly holeHeight: number\n readonly holeCenter: THREE.Vector3\n readonly direction: THREE.Vector3\n}\n\n/** 从 `DrillBrepParams` 推导钻孔几何(孔中心/高度/轴向)。供 `drillBrep` 与 role-table 路径共用。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体(用于 bbox 推导通孔高度)\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔几何(半径/高度/中心/轴向)\n */\nexport function computeDrillGeometry(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): DrillGeometry {\n const radius = params.diameter / 2\n const direction = new THREE.Vector3(...params.direction).normalize()\n // 确保方向指向材料内部\n const faceNormal = new THREE.Vector3(...params.faceNormal)\n if (direction.dot(faceNormal) > 0) {\n direction.negate()\n }\n\n // 计算孔的高度和中心\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new THREE.Vector3(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n let holeHeight: number\n let holeCenter: THREE.Vector3\n const pos = new THREE.Vector3(...params.position)\n\n // 通孔:depth <= 0(契约:depth<=0 表示通孔,与 mesh 路径 `depth>0 ? 'blind':'through'` 一致)。\n // ⚠️ 只判 `=== 0` 会让 depth<0 落入盲孔分支 → safeDepth=0 → 零高圆柱 → OCCT transform 崩溃。\n if (params.depth <= 0) {\n const d = direction.clone().normalize()\n const bbMin = new THREE.Vector3(bbox.min[0], bbox.min[1], bbox.min[2])\n const bbMax = new THREE.Vector3(bbox.max[0], bbox.max[1], bbox.max[2])\n\n let tNear = -Infinity\n let tFar = Infinity\n const axes: Array<[number, number, number, number]> = [\n [0, d.x, bbMin.x, bbMax.x],\n [1, d.y, bbMin.y, bbMax.y],\n [2, d.z, bbMin.z, bbMax.z],\n ]\n const pArr = [pos.x, pos.y, pos.z]\n for (const [axis, di, lo, hi] of axes) {\n const pi = pArr[axis]\n if (Math.abs(di) > 1e-12) {\n const t1 = (lo - pi) / di\n const t2 = (hi - pi) / di\n tNear = Math.max(tNear, Math.min(t1, t2))\n tFar = Math.min(tFar, Math.max(t1, t2))\n } else if (pi < lo || pi > hi) {\n // 与 slab 平行且在外部 — 无交点(与 mesh 行为一致:几乎不钻孔)\n tNear = 0\n tFar = 0\n }\n }\n if (!isFinite(tNear) || !isFinite(tFar) || tFar < tNear) {\n // 不穿过 bbox:与 mesh 一致,只留 0.2mm 微小孔\n holeHeight = 0.2\n holeCenter = pos.clone()\n } else {\n holeHeight = tFar - tNear + 0.2\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar((tNear + tFar) / 2))\n }\n } else {\n // 盲孔:深度钳制到 bboxMax(与 mesh cad-core/drill.ts 一致)\n const safeDepth = Math.max(0, Math.min(params.depth, bboxMax))\n holeHeight = safeDepth\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar(safeDepth / 2))\n }\n\n return { radius, holeHeight, holeCenter, direction }\n}\n\n/** 由钻孔几何构造刀具实体(圆柱,旋转 + 平移到孔位)。调用方负责 release。\n * @param kernel - BREP 引擎接口\n * @param geom - 钻孔几何(半径/高度/中心/轴向)\n * @returns 刀具实体(BrepHandle,调用方负责 release)\n */\nexport function buildDrillToolSolid(kernel: BrepEngineApi, geom: DrillGeometry): BrepHandle {\n const cylinder = kernel.makeCylinder(geom.radius, geom.holeHeight)\n\n // 计算从 Z 轴到 direction 的旋转\n const zAxis = new THREE.Vector3(0, 0, 1)\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, geom.direction)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n\n // 平移矩阵:到孔中心,并减去 height/2(因为圆柱从 Z=0 开始)\n const transMatrix = new THREE.Matrix4().makeTranslation(\n geom.holeCenter.x,\n geom.holeCenter.y,\n geom.holeCenter.z,\n )\n // 组合:先旋转,再平移\n const finalMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n // 还需要补偿圆柱的起始位置(从 Z=0 开始 → 需要先下移 height/2)\n const offsetMatrix = new THREE.Matrix4().makeTranslation(0, 0, -geom.holeHeight / 2)\n const fullMatrix = new THREE.Matrix4().multiplyMatrices(finalMatrix, offsetMatrix)\n\n const toolSolid = kernel.transform(cylinder, matrixToArray(fullMatrix))\n kernel.release(cylinder)\n return toolSolid\n}\n\n/** 在实体上钻一个孔:由参数推导几何、构造刀具实体并做布尔差。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔后的实体(BrepHandle)\n */\nexport function drillBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): BrepHandle {\n const geom = computeDrillGeometry(kernel, solid, params)\n const toolSolid = buildDrillToolSolid(kernel, geom)\n try {\n const result = kernel.cut(solid, toolSolid)\n kernel.release(toolSolid)\n return result\n } catch (err) {\n kernel.release(toolSolid)\n throw new Error(`[drillBrep] OCCT cut failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 分割操作 ───\n\n/** splitBrep 的参数 */\nexport interface SplitBrepParams {\n /** 切割平面法线 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n}\n\n/** splitBrep 的结果 */\nexport interface SplitBrepResult {\n /** 法线正方向的半部分 */\n front: BrepHandle\n /** 法线负方向的半部分 */\n back: BrepHandle\n}\n\n/**\n * BREP 平面分割:使用 OCCT cut + common 实现平面分割。\n *\n * 仅支持平面分割(cutMode='plane')。\n * 燕尾/定位销/直榫等复杂分割由 joinery-brep.ts 处理。\n *\n * 实现方式:\n * 1. 创建一个大的半空间盒子(法线正方向一侧)\n * 2. common(solid, box) → 法线正方向的半部分\n * 3. cut(solid, box) → 法线负方向的半部分\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 分割参数\n * @returns 两个半部分\n */\nexport function splitBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: SplitBrepParams,\n): SplitBrepResult {\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new THREE.Vector3(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n // 创建一个大的盒子代表法线正方向的半空间\n const normal = new THREE.Vector3(...params.normal).normalize()\n const halfSize = bboxMax * 3 // 足够大\n\n // 先在局部坐标系(Z 轴 = 法线方向)创建盒子\n // 然后旋转到世界坐标系\n const zAxis = new THREE.Vector3(0, 0, 1)\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n\n // 在局部坐标系中,盒子从 Z=0(切割平面)延伸到 Z=halfSize\n const localBox = kernel.makeBoxFromCorners(\n { x: -halfSize, y: -halfSize, z: 0 },\n { x: halfSize, y: halfSize, z: halfSize },\n )\n\n // 计算切割平面的世界坐标原点(planeCenter / planeDistance 二选一必填,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n const transMatrix = new THREE.Matrix4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const finalMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n\n const halfSpaceBox = kernel.transform(localBox, matrixToArray(finalMatrix))\n kernel.release(localBox)\n\n try {\n const front = kernel.common(solid, halfSpaceBox)\n const back = kernel.cut(solid, halfSpaceBox)\n kernel.release(halfSpaceBox)\n return { front, back }\n } catch (err) {\n kernel.release(halfSpaceBox)\n throw new Error(`[splitBrep] OCCT split failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 拉伸操作 ───\n\n/** extrudeBrep 的参数 */\nexport interface ExtrudeBrepParams {\n /** 拉伸法线方向 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n /** 拉伸长度 */\n length: number\n /** 拉伸模式 */\n mode?: 'centered' | 'forward' | 'backward'\n}\n\n/** 从 planeCenter / planeDistance 收敛出切割平面上的一个点(planeOrigin)。 */\nfunction resolvePlaneOrigin(\n normal: THREE.Vector3,\n planeCenter?: Vec3,\n planeDistance?: number,\n): THREE.Vector3 {\n if (planeCenter !== undefined) {\n return new THREE.Vector3(...planeCenter)\n }\n if (planeDistance !== undefined) {\n // 平面方程 n·x = d 上的点:取法线上距原点 d 处(n 为单位向量)\n return normal.clone().multiplyScalar(planeDistance)\n }\n throw new Error(\n '[extrudeBrep] plane location missing: provide planeCenter or planeDistance (implicit bbox-center fallback is forbidden)',\n )\n}\n\n/**\n * BREP 拉伸:在切割平面处将实体切开,中段沿法线拉伸 length,三段 fuse。\n *\n * 实现方式:\n * 1. 用平面分割得到 front + back\n * 2. 获取截面线(section edges → wire → face)\n * 3. 沿法线拉伸截面 face → 中段实体\n * 4. fuse(front, extruded, back)\n *\n * 如果截面无法构建 face(开放线框等),抛出错误由调用方处理为链断裂。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 拉伸参数\n * @returns 拉伸后的实体\n */\nexport function extrudeBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: ExtrudeBrepParams,\n): BrepHandle {\n const mode = params.mode ?? 'centered'\n const normal = new THREE.Vector3(...params.normal).normalize()\n const length = params.length\n\n // 1. 确定切割平面位置(世界系,来源静态:planeCenter 或 planeDistance,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n // 2. 分割实体\n const splitResult = splitBrep(kernel, solid, {\n normal: [normal.x, normal.y, normal.z],\n planeCenter: [planeOrigin.x, planeOrigin.y, planeOrigin.z],\n })\n\n // 3. 获取截面\n // 使用 section 获取切割平面与实体的交线\n const bbox = getSolidBoundingBox(kernel, solid)\n const zAxis = new THREE.Vector3(0, 0, 1)\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n const transMatrix = new THREE.Matrix4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const planeMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n\n // 创建一个大的矩形面作为切割平面\n const bboxSize = new THREE.Vector3(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const planeSize = Math.max(bboxSize.x, bboxSize.y, bboxSize.z) * 3\n const planeRect = kernel.makeRectangle(planeSize, planeSize)\n // makeRectangle creates a face from [0,0] to [width,height] — center it at origin first\n const centerMatrix = new THREE.Matrix4().makeTranslation(-planeSize / 2, -planeSize / 2, 0)\n const centeredRect = kernel.transform(planeRect, matrixToArray(centerMatrix))\n kernel.release(planeRect)\n const planeFace = kernel.transform(centeredRect, matrixToArray(planeMatrix))\n kernel.release(centeredRect)\n\n // 获取截面边(occt-only 平台面,D3)。BrepHandle(branded number)与\n // occt-wasm ShapeHandle 运行时同构,品牌转换只发生在平台边界;转回 BrepHandle\n // 后继续用 L1 面(getSubShapes/makeWire/extrude)。\n const sectionEdges = getOcctKernel().section(\n solid as unknown as ShapeHandle,\n planeFace as unknown as ShapeHandle,\n ) as unknown as BrepHandle\n kernel.release(planeFace)\n\n // 4. 构建截面 wire → face → 拉伸\n let extrudedSolid: BrepHandle\n try {\n // 尝试从截面边构建 wire\n const subShapes = kernel.getSubShapes(sectionEdges, 'edge')\n if (subShapes.length === 0) {\n kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('no section edges from plane intersection')\n }\n\n const wire = kernel.makeWire(subShapes)\n const face = kernel.makeFace(wire)\n kernel.release(wire)\n\n // 计算拉伸向量\n let extrudeVec: THREE.Vector3\n if (mode === 'centered') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else if (mode === 'forward') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else {\n // backward\n extrudeVec = normal.clone().multiplyScalar(-length)\n }\n\n extrudedSolid = kernel.extrude(face, extrudeVec.x, extrudeVec.y, extrudeVec.z)\n kernel.release(face)\n kernel.release(sectionEdges)\n } catch {\n // 截面构建失败 — 释放资源并抛出\n if (sectionEdges) kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('[extrudeBrep] failed to build extrusion from section')\n }\n\n // 5. 中段落位补偿(修复 centered 模式中空 / 开壳)\n //\n // 切割平面位于 planeOrigin,splitBrep 产出的 front/back 其切面恰好在 planeOrigin。\n // - forward:front 偏移 +L、back 偏移 0 → 中段(从 planeOrigin 沿 +normal 拉伸 L,\n // 底面在 planeOrigin)的顶面(planeOrigin+L)正好接 front 底面,无需位移。\n // - backward:front 偏移 0、back 偏移 -L → 中段(沿 -normal 拉伸 L,顶在 planeOrigin)\n // 底面(planeOrigin-L)正好接 back 顶面,无需位移。\n // - centered:front 偏移 +L/2、back 偏移 -L/2,二者之间让出 L 的缝隙;但中段默认\n // 从 planeOrigin 沿 +normal 拉伸 L,落在 planeOrigin→planeOrigin+L,与 back 顶面\n // (planeOrigin-L/2) 和 front 底面 (planeOrigin+L/2) 各错开 L/2,形成两道 L/2 的缝隙\n // → fuse 后实体开壳 / 中空。必须对中段额外沿 -normal 位移 L/2,使其落在\n // planeOrigin-L/2 → planeOrigin+L/2,正好填补缝隙。\n const middleOffset = mode === 'centered' ? -length / 2 : 0\n if (middleOffset !== 0) {\n const translatedMiddle = kernel.translate(\n extrudedSolid,\n normal.x * middleOffset,\n normal.y * middleOffset,\n normal.z * middleOffset,\n )\n kernel.release(extrudedSolid)\n extrudedSolid = translatedMiddle\n }\n\n // 6. 计算各段位置\n let frontOffset: number\n let backOffset: number\n if (mode === 'centered') {\n frontOffset = length / 2\n backOffset = -length / 2\n } else if (mode === 'forward') {\n frontOffset = length\n backOffset = 0\n } else {\n frontOffset = 0\n backOffset = -length\n }\n\n // 平移 front 和 back\n const frontTranslated = kernel.translate(\n splitResult.front,\n normal.x * frontOffset,\n normal.y * frontOffset,\n normal.z * frontOffset,\n )\n kernel.release(splitResult.front)\n\n const backTranslated = kernel.translate(\n splitResult.back,\n normal.x * backOffset,\n normal.y * backOffset,\n normal.z * backOffset,\n )\n kernel.release(splitResult.back)\n\n // 7. Fuse 三段\n let result: BrepHandle\n try {\n const fused1 = kernel.fuse(frontTranslated, extrudedSolid)\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n result = kernel.fuse(fused1, backTranslated)\n kernel.release(fused1)\n kernel.release(backTranslated)\n } catch (err) {\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n kernel.release(backTranslated)\n throw new Error(`[extrudeBrep] fuse failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n\n return result\n}\n\n// ─── STEP/BREP 导入操作 ───\n\n/**\n * BREP-native STEP 导入:使用 OCCT kernel.importStep 导入 STEP 文件为精确实体。\n *\n * 与 mesh 路径(cad-core/io.ts importFile → loadFormat → meshes)对照:\n * - mesh 路径:STEP → 三角网格,丢弃 OCCT BrepHandle\n * - BREP 路径:STEP → kernel.importStep → 保留 BrepHandle,同时三角化为显示 mesh\n *\n * 导入的 solid 存入 brepChain.solidCache,后续操作(drillBrep/splitBrep 等)\n * 将其作为\"基座特征\"进行精确运算。\n *\n * **设计决策(I5 不准合并;fileid-container-and-nesting §5.4 单零件收敛)**:\n * - 单 solid STEP:`importStep` 返回 Compound 包裹(顶层是 `TopoDS_Compound`,\n * 内含 1 个 `TopoDS_Solid`)。此处**解包**返回真实 Solid(`solids[0]`),\n * 下游 `isValid`/编辑/导出都针对真实实体。\n * - 多 solid STEP:**只支持单零件**(§5.4)——降级取**第一个** solid 返回(单一\n * 非复合 Shape),并回传 `multiSolidCount`(≥2 表示本文件被降级取件,由 load op\n * 登记\"多零件降级\" pending,宿主据此弹警告 §5.4:166)。取件点唯一,逐 part 拆\n * 分只发生在 load op 内部,宿主不再发多条 load。\n * - **不调用 `kernel.isValid`**:`importStep` 对单 solid STEP 也返回 Compound 包裹,\n * `isValid(compound)` 返回 false(Compound 不是 Solid),这会误杀合法 STEP。\n * 合法性判据改为 `getSubShapes(top, 'solid').length >= 1`(含 ≥1 个 solid 即合法),\n * 与装配路径 `walkLabel` 一致。\n *\n * @param kernel the initialized OCCT kernel.\n * @param buffer the raw STEP file bytes (a text-encoded ArrayBuffer).\n * @param brepChain optional - caches the tessellated BrepMeshResult when provided.\n * @param stmtId optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @param opts optional - `allowNonSolid` relaxes the solid requirement so\n * a frozen wireframe/surface asset (a Draft wire, a face, a\n * shell) can be imported as addressable geometry. Callers\n * must decide this STATICALLY from the asset itself (see\n * `brepTextHasSolid`), never by retrying after a failure.\n * @returns { solid: the OCCT solid handle, shape: the display tessellated mesh,\n * multiSolidCount: total solids declared when > 1 (single-part take-first) }\n */\nexport function loadBrep(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n brepChain?: BrepChainState,\n stmtId?: PartName,\n opts?: { allowNonSolid?: boolean },\n): { solid: BrepHandle; shape: Shape; multiSolidCount?: number } {\n // BREP 文件(CASCADE Topology 文本格式)必须用 kernel.fromBREP 解析;\n // 误用 STEP 解析器(importStep)读 BREP 会抛 \"failed to read STEP data\"。\n const decoder = new TextDecoder('utf-8')\n const head = decoder.decode(buffer.slice(0, 64))\n const top = head.includes('CASCADE Topology')\n ? kernel.fromBREP(decoder.decode(buffer))\n : kernel.importStep(buffer)\n\n // 校验:含至少一个 solid 子形即合法(不调用 isValid,见上文设计决策)\n const solids = kernel.getSubShapes(top, 'solid')\n if (solids.length < 1) {\n // 非实体导入(allowNonSolid):冻结资产是 wireframe/surface(Draft 线/面/壳)\n // 时仍可作为可寻址几何导入——顶点/边/线/面/壳都算有内容。此时返回 top 本身,\n // 它独立持有几何,不能释放。\n // 注意:这类 Shape 进不了布尔运算(OCCT fuse/cut 抛 \"boolean operation\n // failed\"),调用方必须自己保证它只流向变换/聚合。\n if (opts?.allowNonSolid && hasAnyTopology(kernel, top)) {\n const shape = solidToShape(kernel, top, undefined, brepChain, stmtId)\n return { solid: top, shape }\n }\n kernel.release(top)\n throw new Error(\n `[loadBrep] imported shape contains no solid sub-shapes ` +\n `(solidCount=0) — wireframe/surface/invalid shapes are not supported ` +\n `unless allowNonSolid is set`\n )\n }\n\n // 单 solid:解包返回真实 Solid(非 Compound 包裹)\n if (solids.length === 1) {\n const realSolid = solids[0]\n kernel.release(top) // 释放 Compound 包裹,realSolid 独立持有\n const shape = solidToShape(kernel, realSolid, undefined, brepChain, stmtId)\n return { solid: realSolid, shape }\n }\n\n // 多 solid(§5.4 单零件收敛):只支持单零件 —— 降级取**第一个** solid,\n // 返回单一非复合 Shape,并回传 multiSolidCount(≥2 表示本文件被降级取件,\n // 由 `cad.load` op 登记\"多零件降级\" pending,宿主据零件数弹警告 §5.4:166)。\n // 取件点唯一:多零件拆分只发生在 load op 内部,宿主不再逐 part 拆、不再发\n // 多条 load。`solids` 是 kernel.getSubShapes(top,'solid') 的内核枚举序;对同一\n // import 路径、同一 OCCT 版本,该序是确定性的,故\"第一个\"可复现(红线 7)。\n const first = solids[0]\n if (!first) {\n kernel.release(top)\n throw new Error(`[loadBrep] imported shape has 0 solid sub-shapes`)\n }\n // 释放其余多余子形句柄(first 独立持有几何,剩下的子是 top 的子引用)\n for (const s of solids.slice(1)) {\n try { kernel.release(s) } catch { /* already released */ }\n }\n kernel.release(top) // 释放 Compound 包裹,first 独立持有(同单 solid 模式)\n const shape = solidToShape(kernel, first, undefined, brepChain, stmtId)\n return { solid: first, shape, multiSolidCount: solids.length }\n}\n\n/** Sub-shape kinds that make an imported shape \"addressable but not a solid\". */\nconst NON_SOLID_KINDS = ['vertex', 'edge', 'wire', 'face', 'shell'] as const\n\n/**\n * Does a freshly imported shape hold any sub-shape at all?\n *\n * Guards the `allowNonSolid` path: a file whose TShapes table is empty (or that\n * holds only a bare compound with nothing inside) is a broken asset, not a\n * wireframe one, and must still fail loudly.\n *\n * @param kernel - the initialized OCCT kernel.\n * @param top - the imported top-level shape handle.\n * @returns true when at least one non-solid sub-shape exists.\n */\nfunction hasAnyTopology(kernel: BrepEngineApi, top: BrepHandle): boolean {\n return NON_SOLID_KINDS.some((kind) => kernel.getSubShapes(top, kind).length > 0)\n}\n\n// ─── 辅助函数 ───\n\n/**\n * Convert a THREE.Matrix4 into the 3x4 row-major array (12 doubles) the OCCT\n * transform expects.\n *\n * OCCT transform accepts [r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz].\n * @param matrix - the source matrix to convert.\n * @returns the 3x4 row-major array of 12 doubles.\n */\nexport function matrixToArray(matrix: THREE.Matrix4): number[] {\n const e = matrix.elements\n // THREE.Matrix4 是 column-major,OCCT 需要 row-major 3x4\n return [\n e[0], e[4], e[8], e[12],\n e[1], e[5], e[9], e[13],\n e[2], e[6], e[10], e[14],\n ]\n}\n"]}
1
+ {"version":3,"file":"brep-ops.js","sourceRoot":"","sources":["../../src/brep/brep-ops.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 核心 BREP 操作 — 使用 OCCT 精确实体运算\n *\n * @platform occt — 本文件 import occt-kernel:`extrudeBrep` 用原生 `section`\n * (BRepAlgoAPI_Section,occt-only,L1 只有 sectionByPlane)构造截面 → 守卫①\n * 要求平台 import 自证身份。本文件是内部工具面(非 op 文件),文件级标注即满足\n * 守卫;调用方 op 若经本文件触达 occt-only 能力,须在 defineOp 声明 engines\n * (extrudeBrep 的 section 仅 occt 路径可达,brepkit 下由调用方引擎声明拦截)。\n *\n * See docs/api-contract.md §8 (dual-path geometry contract: BREP / Mesh).\n *\n * 与 mesh 路径(transform.ts / boolean/ / drill.ts / split.ts / extrude.ts)对照:\n * - mesh 路径:消费 Shape(三角网格),走 manifold-3d(mesh-CSG)\n * - BREP 路径:消费 BrepHandle(OCCT 实体句柄),走 OCCT 精确布尔/变换\n *\n * 所有函数都是纯函数(可 import occtWasmKernel,不读 store)。\n * 输入输出均为 OCCT BrepHandle,调用方负责句柄生命周期。\n *\n * 坐标系:Z-up、毫米,与 mesh 路径一致。\n */\n\nimport * as THREE from 'three'\nimport type { BrepHandle, BrepMeshResult } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../occt-kernel/occtKernel'\nimport { getSolidColorsOrdered } from '../occt-kernel/stepColorParser'\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { BrepChainState } from './brep-chain'\nimport type { PartName } from '../identity'\nimport { getSolidBoundingBox } from './brep-utils'\nimport { DEFAULT_LINEAR_DEFLECTION } from '../tolerance'\nimport { mm } from '../units'\n\n// ─── 通用工具 ───\n\n/**\n * 将 OCCT solid 三角化为 Shape(供显示用)。\n *\n * 如果传入 brepChain + stmtId,同时把完整 BrepMeshResult(含 faceGroups)缓存到\n * brepChain.meshShapeCache,供 buildBrepTopology 复用——确保拓扑 mesh 与显示 mesh\n * 完全一致(规则 1:拓扑数据生成所使用的 mesh,必须是当前用户看到的 mesh)。\n *\n * @param kernel the initialized OCCT kernel.\n * @param solid the CAD solid handle.\n * @param segments optional tessellation segment count (affects precision).\n * @param brepChain optional - caches the BrepMeshResult when provided.\n * @param partName optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @returns the tessellated Shape.\n */\nexport function solidToShape(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n segments?: number,\n brepChain?: BrepChainState,\n partName?: PartName,\n): Shape {\n const angularDeflection = segments\n ? (2 * Math.PI) / Math.max(3, segments)\n : (2 * Math.PI) / 64 // 缺省 64 = brepjs standard 等效(§5.0/§5.1)\n const mesh: BrepMeshResult = kernel.meshShape(solid, {\n linearDeflection: DEFAULT_LINEAR_DEFLECTION.as(mm),\n angularDeflection,\n })\n\n // 规则 1:缓存完整 BrepMeshResult(含 faceGroups),供 buildBrepTopology 复用\n if (brepChain?.meshShapeCache && partName) {\n brepChain.meshShapeCache.set(partName, mesh)\n }\n\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n}\n\n// ─── 变换操作 ───\n\n/**\n * BREP 平移:使用 OCCT translate(精确,不损失几何精度)。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param offset 平移量 [dx, dy, dz]\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function translateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n offset: Vec3,\n): BrepHandle {\n return kernel.translate(solid, offset[0], offset[1], offset[2])\n}\n\n/**\n * BREP 旋转:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 rotate_euler(shape, angles, pivot?) 一致:\n * - angles 为 XYZ 欧拉角(角度制)\n * - pivot 为旋转中心(可选,默认原点)\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param angles XYZ 欧拉角(角度制)\n * @param pivot 旋转中心(可选)\n * @returns 新实体\n */\nexport function rotateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n angles: Vec3,\n pivot?: Vec3,\n): BrepHandle {\n const euler = new THREE.Euler(\n (angles[0] * Math.PI) / 180,\n (angles[1] * Math.PI) / 180,\n (angles[2] * Math.PI) / 180,\n )\n const matrix = new THREE.Matrix4().makeRotationFromEuler(euler)\n if (pivot) {\n matrix.premultiply(new THREE.Matrix4().makeTranslation(pivot[0], pivot[1], pivot[2]))\n matrix.multiply(new THREE.Matrix4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n }\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n/**\n * BREP 缩放:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 scale(P6 §4.6)一致:\n * - factor 为 number(均匀缩放)或 Vec3 [sx, sy, sz](非均匀)\n * - center 为缩放不动点(p' = center + S·(p − center));缺省 [0,0,0](原点),\n * 与 vendored brepjs `scale(shape, factor, { center? })` 的默认一致。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param factor 缩放因子\n * @param center 缩放不动点(可选,默认原点)\n * @returns 新实体\n */\nexport function scaleBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n factor: number | Vec3,\n center?: Vec3,\n): BrepHandle {\n const f = typeof factor === 'number' ? [factor, factor, factor] : factor\n const scale = new THREE.Matrix4().makeScale(f[0], f[1], f[2])\n // T(c)·S·T(−c):不动点为 center;缺省时退化为原点缩放(现状行为)。\n const matrix = center\n ? new THREE.Matrix4()\n .makeTranslation(center[0], center[1], center[2])\n .multiply(scale)\n .multiply(new THREE.Matrix4().makeTranslation(-center[0], -center[1], -center[2]))\n : scale\n const isUniform = f[0] === f[1] && f[1] === f[2]\n // OCCT gp_Trsf (kernel.transform) only supports uniform scaling.\n // Non-uniform scaling requires gp_GTrsf (kernel.generalTransform).\n if (isUniform) {\n return kernel.transform(solid, matrixToArray(matrix))\n }\n return kernel.generalTransform(solid, matrixToArray(matrix))\n}\n\n// ─── 装配变换 ───\n\n/**\n * BREP 版 applyTransform:与 mesh ops/assemble.ts 的 applyTransform 同语义(绕 pivot 旋转 + 平移)。\n *\n * 数学公式:p' = R·(p − pivot) + pivot + translation\n * 等价 Matrix4 = T(pivot) · R · T(−pivot) · T(translation)\n *\n * 用四元数而非欧拉角,是因为装配变换源是 api/assembly 的四元数;\n * 转欧拉会引入顺序/万向锁歧义。与 mesh applyTransform 顶点公式完全等价。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param quaternion 旋转四元数 [x, y, z, w]\n * @param pivot 旋转中心\n * @param translation 平移量\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function applyTransformBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n quaternion: [number, number, number, number],\n pivot: [number, number, number],\n translation: [number, number, number],\n): BrepHandle {\n const rotation = new THREE.Matrix4().makeRotationFromQuaternion(\n new THREE.Quaternion(quaternion[0], quaternion[1], quaternion[2], quaternion[3]),\n )\n // T(translation) · T(pivot) · R · T(-pivot) = T(pivot+translation) · R · T(-pivot)\n // 先绕 pivot 旋转,再平移 translation(与 mesh 路径 applyTransform 一致)\n const matrix = new THREE.Matrix4()\n .makeTranslation(pivot[0] + translation[0], pivot[1] + translation[1], pivot[2] + translation[2])\n .multiply(rotation)\n .multiply(new THREE.Matrix4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n// ─── 布尔操作 ───\n\n/**\n * BREP 布尔并集:使用 OCCT fuse(BRepAlgoAPI_Fuse)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 融合后的实体\n */\nexport function fuseBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.fuse(a, b)\n}\n\n/**\n * BREP 布尔差集:使用 OCCT cut(BRepAlgoAPI_Cut)。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns 切割后的实体\n */\nexport function cutBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.cut(a, b)\n}\n\n/**\n * BREP 布尔交集:使用 OCCT common(BRepAlgoAPI_Common)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 交集实体\n */\nexport function commonBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.common(a, b)\n}\n\n// ─── 钻孔操作 ───\n\n/** drillBrep 的参数 */\nexport interface DrillBrepParams {\n /** 孔直径 */\n diameter: number\n /** 孔深度(0 = 通孔) */\n depth: number\n /** 孔位置(世界空间) */\n position: Vec3\n /** 钻孔方向(世界空间,指向材料内部) */\n direction: Vec3\n /** 面法向(世界空间) */\n faceNormal: Vec3\n /** 孔类型 */\n holeType?: 'simple' | 'screw'\n}\n\n/**\n * BREP 钻孔:创建圆柱工具实体并用 OCCT cut 减去。\n *\n * 仅支持圆柱孔(holeType='simple')。\n * 螺丝孔(holeType='screw')由调用方判断为 mesh-only,触发 BREP 链断裂。\n *\n * 通孔(depth=0):创建一个足够长的圆柱体穿透整个零件。\n * 盲孔(depth>0):创建指定深度的圆柱体。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 钻孔参数\n * @returns 钻孔后的实体\n */\n/** 钻孔几何参数(由 `DrillBrepParams` 推导;roleTable 路径与 `drillBrep` 共用同一份几何,避免重复计算)。 */\nexport interface DrillGeometry {\n readonly radius: number\n readonly holeHeight: number\n readonly holeCenter: THREE.Vector3\n readonly direction: THREE.Vector3\n}\n\n/** 从 `DrillBrepParams` 推导钻孔几何(孔中心/高度/轴向)。供 `drillBrep` 与 role-table 路径共用。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体(用于 bbox 推导通孔高度)\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔几何(半径/高度/中心/轴向)\n */\nexport function computeDrillGeometry(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): DrillGeometry {\n const radius = params.diameter / 2\n const direction = new THREE.Vector3(...params.direction).normalize()\n // 确保方向指向材料内部\n const faceNormal = new THREE.Vector3(...params.faceNormal)\n if (direction.dot(faceNormal) > 0) {\n direction.negate()\n }\n\n // 计算孔的高度和中心\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new THREE.Vector3(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n let holeHeight: number\n let holeCenter: THREE.Vector3\n const pos = new THREE.Vector3(...params.position)\n\n // 通孔:depth <= 0(契约:depth<=0 表示通孔,与 mesh 路径 `depth>0 ? 'blind':'through'` 一致)。\n // ⚠️ 只判 `=== 0` 会让 depth<0 落入盲孔分支 → safeDepth=0 → 零高圆柱 → OCCT transform 崩溃。\n if (params.depth <= 0) {\n const d = direction.clone().normalize()\n const bbMin = new THREE.Vector3(bbox.min[0], bbox.min[1], bbox.min[2])\n const bbMax = new THREE.Vector3(bbox.max[0], bbox.max[1], bbox.max[2])\n\n let tNear = -Infinity\n let tFar = Infinity\n const axes: Array<[number, number, number, number]> = [\n [0, d.x, bbMin.x, bbMax.x],\n [1, d.y, bbMin.y, bbMax.y],\n [2, d.z, bbMin.z, bbMax.z],\n ]\n const pArr = [pos.x, pos.y, pos.z]\n for (const [axis, di, lo, hi] of axes) {\n const pi = pArr[axis]\n if (Math.abs(di) > 1e-12) {\n const t1 = (lo - pi) / di\n const t2 = (hi - pi) / di\n tNear = Math.max(tNear, Math.min(t1, t2))\n tFar = Math.min(tFar, Math.max(t1, t2))\n } else if (pi < lo || pi > hi) {\n // 与 slab 平行且在外部 — 无交点(与 mesh 行为一致:几乎不钻孔)\n tNear = 0\n tFar = 0\n }\n }\n if (!isFinite(tNear) || !isFinite(tFar) || tFar < tNear) {\n // 不穿过 bbox:与 mesh 一致,只留 0.2mm 微小孔\n holeHeight = 0.2\n holeCenter = pos.clone()\n } else {\n holeHeight = tFar - tNear + 0.2\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar((tNear + tFar) / 2))\n }\n } else {\n // 盲孔:深度钳制到 bboxMax(与 mesh cad-core/drill.ts 一致)\n const safeDepth = Math.max(0, Math.min(params.depth, bboxMax))\n holeHeight = safeDepth\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar(safeDepth / 2))\n }\n\n return { radius, holeHeight, holeCenter, direction }\n}\n\n/** 由钻孔几何构造刀具实体(圆柱,旋转 + 平移到孔位)。调用方负责 release。\n * @param kernel - BREP 引擎接口\n * @param geom - 钻孔几何(半径/高度/中心/轴向)\n * @returns 刀具实体(BrepHandle,调用方负责 release)\n */\nexport function buildDrillToolSolid(kernel: BrepEngineApi, geom: DrillGeometry): BrepHandle {\n const cylinder = kernel.makeCylinder(geom.radius, geom.holeHeight)\n\n // 计算从 Z 轴到 direction 的旋转\n const zAxis = new THREE.Vector3(0, 0, 1)\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, geom.direction)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n\n // 平移矩阵:到孔中心,并减去 height/2(因为圆柱从 Z=0 开始)\n const transMatrix = new THREE.Matrix4().makeTranslation(\n geom.holeCenter.x,\n geom.holeCenter.y,\n geom.holeCenter.z,\n )\n // 组合:先旋转,再平移\n const finalMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n // 还需要补偿圆柱的起始位置(从 Z=0 开始 → 需要先下移 height/2)\n const offsetMatrix = new THREE.Matrix4().makeTranslation(0, 0, -geom.holeHeight / 2)\n const fullMatrix = new THREE.Matrix4().multiplyMatrices(finalMatrix, offsetMatrix)\n\n const toolSolid = kernel.transform(cylinder, matrixToArray(fullMatrix))\n kernel.release(cylinder)\n return toolSolid\n}\n\n/** 在实体上钻一个孔:由参数推导几何、构造刀具实体并做布尔差。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔后的实体(BrepHandle)\n */\nexport function drillBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): BrepHandle {\n const geom = computeDrillGeometry(kernel, solid, params)\n const toolSolid = buildDrillToolSolid(kernel, geom)\n try {\n const result = kernel.cut(solid, toolSolid)\n kernel.release(toolSolid)\n return result\n } catch (err) {\n kernel.release(toolSolid)\n throw new Error(`[drillBrep] OCCT cut failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 分割操作 ───\n\n/** splitBrep 的参数 */\nexport interface SplitBrepParams {\n /** 切割平面法线 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n}\n\n/** splitBrep 的结果 */\nexport interface SplitBrepResult {\n /** 法线正方向的半部分 */\n front: BrepHandle\n /** 法线负方向的半部分 */\n back: BrepHandle\n}\n\n/**\n * BREP 平面分割:使用 OCCT cut + common 实现平面分割。\n *\n * 仅支持平面分割(cutMode='plane')。\n * 燕尾/定位销/直榫等复杂分割由 joinery-brep.ts 处理。\n *\n * 实现方式:\n * 1. 创建一个大的半空间盒子(法线正方向一侧)\n * 2. common(solid, box) → 法线正方向的半部分\n * 3. cut(solid, box) → 法线负方向的半部分\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 分割参数\n * @returns 两个半部分\n */\nexport function splitBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: SplitBrepParams,\n): SplitBrepResult {\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new THREE.Vector3(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n // 创建一个大的盒子代表法线正方向的半空间\n const normal = new THREE.Vector3(...params.normal).normalize()\n const halfSize = bboxMax * 3 // 足够大\n\n // 先在局部坐标系(Z 轴 = 法线方向)创建盒子\n // 然后旋转到世界坐标系\n const zAxis = new THREE.Vector3(0, 0, 1)\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n\n // 在局部坐标系中,盒子从 Z=0(切割平面)延伸到 Z=halfSize\n const localBox = kernel.makeBoxFromCorners(\n { x: -halfSize, y: -halfSize, z: 0 },\n { x: halfSize, y: halfSize, z: halfSize },\n )\n\n // 计算切割平面的世界坐标原点(planeCenter / planeDistance 二选一必填,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n const transMatrix = new THREE.Matrix4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const finalMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n\n const halfSpaceBox = kernel.transform(localBox, matrixToArray(finalMatrix))\n kernel.release(localBox)\n\n try {\n const front = kernel.common(solid, halfSpaceBox)\n const back = kernel.cut(solid, halfSpaceBox)\n kernel.release(halfSpaceBox)\n return { front, back }\n } catch (err) {\n kernel.release(halfSpaceBox)\n throw new Error(`[splitBrep] OCCT split failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 拉伸操作 ───\n\n/** extrudeBrep 的参数 */\nexport interface ExtrudeBrepParams {\n /** 拉伸法线方向 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n /** 拉伸长度 */\n length: number\n /** 拉伸模式 */\n mode?: 'centered' | 'forward' | 'backward'\n}\n\n/** 从 planeCenter / planeDistance 收敛出切割平面上的一个点(planeOrigin)。 */\nfunction resolvePlaneOrigin(\n normal: THREE.Vector3,\n planeCenter?: Vec3,\n planeDistance?: number,\n): THREE.Vector3 {\n if (planeCenter !== undefined) {\n return new THREE.Vector3(...planeCenter)\n }\n if (planeDistance !== undefined) {\n // 平面方程 n·x = d 上的点:取法线上距原点 d 处(n 为单位向量)\n return normal.clone().multiplyScalar(planeDistance)\n }\n throw new Error(\n '[extrudeBrep] plane location missing: provide planeCenter or planeDistance (implicit bbox-center fallback is forbidden)',\n )\n}\n\n/**\n * BREP 拉伸:在切割平面处将实体切开,中段沿法线拉伸 length,三段 fuse。\n *\n * 实现方式:\n * 1. 用平面分割得到 front + back\n * 2. 获取截面线(section edges → wire → face)\n * 3. 沿法线拉伸截面 face → 中段实体\n * 4. fuse(front, extruded, back)\n *\n * 如果截面无法构建 face(开放线框等),抛出错误由调用方处理为链断裂。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 拉伸参数\n * @returns 拉伸后的实体\n */\nexport function extrudeBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: ExtrudeBrepParams,\n): BrepHandle {\n const mode = params.mode ?? 'centered'\n const normal = new THREE.Vector3(...params.normal).normalize()\n const length = params.length\n\n // 1. 确定切割平面位置(世界系,来源静态:planeCenter 或 planeDistance,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n // 2. 分割实体\n const splitResult = splitBrep(kernel, solid, {\n normal: [normal.x, normal.y, normal.z],\n planeCenter: [planeOrigin.x, planeOrigin.y, planeOrigin.z],\n })\n\n // 3. 获取截面\n // 使用 section 获取切割平面与实体的交线\n const bbox = getSolidBoundingBox(kernel, solid)\n const zAxis = new THREE.Vector3(0, 0, 1)\n const quat = new THREE.Quaternion().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new THREE.Matrix4().makeRotationFromQuaternion(quat)\n const transMatrix = new THREE.Matrix4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const planeMatrix = new THREE.Matrix4().multiplyMatrices(transMatrix, rotMatrix)\n\n // 创建一个大的矩形面作为切割平面\n const bboxSize = new THREE.Vector3(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const planeSize = Math.max(bboxSize.x, bboxSize.y, bboxSize.z) * 3\n const planeRect = kernel.makeRectangle(planeSize, planeSize)\n // makeRectangle creates a face from [0,0] to [width,height] — center it at origin first\n const centerMatrix = new THREE.Matrix4().makeTranslation(-planeSize / 2, -planeSize / 2, 0)\n const centeredRect = kernel.transform(planeRect, matrixToArray(centerMatrix))\n kernel.release(planeRect)\n const planeFace = kernel.transform(centeredRect, matrixToArray(planeMatrix))\n kernel.release(centeredRect)\n\n // 获取截面边(occt-only 平台面,D3)。BrepHandle(branded number)与\n // occt-wasm ShapeHandle 运行时同构,品牌转换只发生在平台边界;转回 BrepHandle\n // 后继续用 L1 面(getSubShapes/makeWire/extrude)。\n const sectionEdges = getOcctKernel().section(\n solid as unknown as ShapeHandle,\n planeFace as unknown as ShapeHandle,\n ) as unknown as BrepHandle\n kernel.release(planeFace)\n\n // 4. 构建截面 wire → face → 拉伸\n let extrudedSolid: BrepHandle\n try {\n // 尝试从截面边构建 wire\n const subShapes = kernel.getSubShapes(sectionEdges, 'edge')\n if (subShapes.length === 0) {\n kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('no section edges from plane intersection')\n }\n\n const wire = kernel.makeWire(subShapes)\n const face = kernel.makeFace(wire)\n kernel.release(wire)\n\n // 计算拉伸向量\n let extrudeVec: THREE.Vector3\n if (mode === 'centered') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else if (mode === 'forward') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else {\n // backward\n extrudeVec = normal.clone().multiplyScalar(-length)\n }\n\n extrudedSolid = kernel.extrude(face, extrudeVec.x, extrudeVec.y, extrudeVec.z)\n kernel.release(face)\n kernel.release(sectionEdges)\n } catch {\n // 截面构建失败 — 释放资源并抛出\n if (sectionEdges) kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('[extrudeBrep] failed to build extrusion from section')\n }\n\n // 5. 中段落位补偿(修复 centered 模式中空 / 开壳)\n //\n // 切割平面位于 planeOrigin,splitBrep 产出的 front/back 其切面恰好在 planeOrigin。\n // - forward:front 偏移 +L、back 偏移 0 → 中段(从 planeOrigin 沿 +normal 拉伸 L,\n // 底面在 planeOrigin)的顶面(planeOrigin+L)正好接 front 底面,无需位移。\n // - backward:front 偏移 0、back 偏移 -L → 中段(沿 -normal 拉伸 L,顶在 planeOrigin)\n // 底面(planeOrigin-L)正好接 back 顶面,无需位移。\n // - centered:front 偏移 +L/2、back 偏移 -L/2,二者之间让出 L 的缝隙;但中段默认\n // 从 planeOrigin 沿 +normal 拉伸 L,落在 planeOrigin→planeOrigin+L,与 back 顶面\n // (planeOrigin-L/2) 和 front 底面 (planeOrigin+L/2) 各错开 L/2,形成两道 L/2 的缝隙\n // → fuse 后实体开壳 / 中空。必须对中段额外沿 -normal 位移 L/2,使其落在\n // planeOrigin-L/2 → planeOrigin+L/2,正好填补缝隙。\n const middleOffset = mode === 'centered' ? -length / 2 : 0\n if (middleOffset !== 0) {\n const translatedMiddle = kernel.translate(\n extrudedSolid,\n normal.x * middleOffset,\n normal.y * middleOffset,\n normal.z * middleOffset,\n )\n kernel.release(extrudedSolid)\n extrudedSolid = translatedMiddle\n }\n\n // 6. 计算各段位置\n let frontOffset: number\n let backOffset: number\n if (mode === 'centered') {\n frontOffset = length / 2\n backOffset = -length / 2\n } else if (mode === 'forward') {\n frontOffset = length\n backOffset = 0\n } else {\n frontOffset = 0\n backOffset = -length\n }\n\n // 平移 front 和 back\n const frontTranslated = kernel.translate(\n splitResult.front,\n normal.x * frontOffset,\n normal.y * frontOffset,\n normal.z * frontOffset,\n )\n kernel.release(splitResult.front)\n\n const backTranslated = kernel.translate(\n splitResult.back,\n normal.x * backOffset,\n normal.y * backOffset,\n normal.z * backOffset,\n )\n kernel.release(splitResult.back)\n\n // 7. Fuse 三段\n let result: BrepHandle\n try {\n const fused1 = kernel.fuse(frontTranslated, extrudedSolid)\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n result = kernel.fuse(fused1, backTranslated)\n kernel.release(fused1)\n kernel.release(backTranslated)\n } catch (err) {\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n kernel.release(backTranslated)\n throw new Error(`[extrudeBrep] fuse failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n\n return result\n}\n\n// ─── STEP/BREP 导入操作 ───\n\n/**\n * 单零件导入的 STEP 颜色挂载(P2,方案 §5 STEP 行)。\n *\n * `getSolidColorsOrdered`(stepColorParser)把 STYLED_ITEM → COLOUR_RGB 引用链\n * 解析为按 MANIFOLD_SOLID_BREP 文件序的颜色数组;该序与 OCCT\n * `getSubShapes(compound,'solid')` 一致(stepColorParser 注释),因此取 `[0]`\n * 即「loadBrep 单零件收敛取第一个 solid」的颜色,语义对齐。\n *\n * 宽容兼容外部数据:BREP(CASCADE Topology 文本)无颜色概念直接跳过;STEP\n * 文本无 `STYLED_ITEM` 早退(零额外开销);引用链缺失/未知预定义色返回 null,\n * 一律不挂外观、不抛错(AGENTS.md 全局铁律:不得以内部严格性拒收正常文件)。\n */\nfunction applyFirstStepColor(shape: Shape, buffer: ArrayBuffer): Shape {\n const head = new TextDecoder('utf-8').decode(buffer.slice(0, 64))\n if (head.includes('CASCADE Topology')) return shape\n const text = new TextDecoder('utf-8').decode(buffer)\n if (!text.includes('STYLED_ITEM')) return shape\n const c0 = getSolidColorsOrdered(text)[0]\n if (c0) shape.appearance = { color: [c0[0], c0[1], c0[2]] }\n return shape\n}\n\n/**\n * BREP-native STEP 导入:使用 OCCT kernel.importStep 导入 STEP 文件为精确实体。\n *\n * 与 mesh 路径(cad-core/io.ts importFile → loadFormat → meshes)对照:\n * - mesh 路径:STEP → 三角网格,丢弃 OCCT BrepHandle\n * - BREP 路径:STEP → kernel.importStep → 保留 BrepHandle,同时三角化为显示 mesh\n *\n * 导入的 solid 存入 brepChain.solidCache,后续操作(drillBrep/splitBrep 等)\n * 将其作为\"基座特征\"进行精确运算。\n *\n * **设计决策(I5 不准合并;fileid-container-and-nesting §5.4 单零件收敛)**:\n * - 单 solid STEP:`importStep` 返回 Compound 包裹(顶层是 `TopoDS_Compound`,\n * 内含 1 个 `TopoDS_Solid`)。此处**解包**返回真实 Solid(`solids[0]`),\n * 下游 `isValid`/编辑/导出都针对真实实体。\n * - 多 solid STEP:**只支持单零件**(§5.4)——降级取**第一个** solid 返回(单一\n * 非复合 Shape),并回传 `multiSolidCount`(≥2 表示本文件被降级取件,由 load op\n * 登记\"多零件降级\" pending,宿主据此弹警告 §5.4:166)。取件点唯一,逐 part 拆\n * 分只发生在 load op 内部,宿主不再发多条 load。\n * - **不调用 `kernel.isValid`**:`importStep` 对单 solid STEP 也返回 Compound 包裹,\n * `isValid(compound)` 返回 false(Compound 不是 Solid),这会误杀合法 STEP。\n * 合法性判据改为 `getSubShapes(top, 'solid').length >= 1`(含 ≥1 个 solid 即合法),\n * 与装配路径 `walkLabel` 一致。\n *\n * @param kernel the initialized OCCT kernel.\n * @param buffer the raw STEP file bytes (a text-encoded ArrayBuffer).\n * @param brepChain optional - caches the tessellated BrepMeshResult when provided.\n * @param stmtId optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @param opts optional - `allowNonSolid` relaxes the solid requirement so\n * a frozen wireframe/surface asset (a Draft wire, a face, a\n * shell) can be imported as addressable geometry. Callers\n * must decide this STATICALLY from the asset itself (see\n * `brepTextHasSolid`), never by retrying after a failure.\n * @returns { solid: the OCCT solid handle, shape: the display tessellated mesh,\n * multiSolidCount: total solids declared when > 1 (single-part take-first) }\n */\nexport function loadBrep(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n brepChain?: BrepChainState,\n stmtId?: PartName,\n opts?: { allowNonSolid?: boolean },\n): { solid: BrepHandle; shape: Shape; multiSolidCount?: number } {\n // BREP 文件(CASCADE Topology 文本格式)必须用 kernel.fromBREP 解析;\n // 误用 STEP 解析器(importStep)读 BREP 会抛 \"failed to read STEP data\"。\n const decoder = new TextDecoder('utf-8')\n const head = decoder.decode(buffer.slice(0, 64))\n const top = head.includes('CASCADE Topology')\n ? kernel.fromBREP(decoder.decode(buffer))\n : kernel.importStep(buffer)\n\n // 校验:含至少一个 solid 子形即合法(不调用 isValid,见上文设计决策)\n const solids = kernel.getSubShapes(top, 'solid')\n if (solids.length < 1) {\n // 非实体导入(allowNonSolid):冻结资产是 wireframe/surface(Draft 线/面/壳)\n // 时仍可作为可寻址几何导入——顶点/边/线/面/壳都算有内容。此时返回 top 本身,\n // 它独立持有几何,不能释放。\n // 注意:这类 Shape 进不了布尔运算(OCCT fuse/cut 抛 \"boolean operation\n // failed\"),调用方必须自己保证它只流向变换/聚合。\n if (opts?.allowNonSolid && hasAnyTopology(kernel, top)) {\n const shape = solidToShape(kernel, top, undefined, brepChain, stmtId)\n return { solid: top, shape: applyFirstStepColor(shape, buffer) }\n }\n kernel.release(top)\n throw new Error(\n `[loadBrep] imported shape contains no solid sub-shapes ` +\n `(solidCount=0) — wireframe/surface/invalid shapes are not supported ` +\n `unless allowNonSolid is set`\n )\n }\n\n // 单 solid:解包返回真实 Solid(非 Compound 包裹)\n if (solids.length === 1) {\n const realSolid = solids[0]\n kernel.release(top) // 释放 Compound 包裹,realSolid 独立持有\n const shape = solidToShape(kernel, realSolid, undefined, brepChain, stmtId)\n return { solid: realSolid, shape: applyFirstStepColor(shape, buffer) }\n }\n\n // 多 solid(§5.4 单零件收敛):只支持单零件 —— 降级取**第一个** solid,\n // 返回单一非复合 Shape,并回传 multiSolidCount(≥2 表示本文件被降级取件,\n // 由 `cad.load` op 登记\"多零件降级\" pending,宿主据零件数弹警告 §5.4:166)。\n // 取件点唯一:多零件拆分只发生在 load op 内部,宿主不再逐 part 拆、不再发\n // 多条 load。`solids` 是 kernel.getSubShapes(top,'solid') 的内核枚举序;对同一\n // import 路径、同一 OCCT 版本,该序是确定性的,故\"第一个\"可复现(红线 7)。\n const first = solids[0]\n if (!first) {\n kernel.release(top)\n throw new Error(`[loadBrep] imported shape has 0 solid sub-shapes`)\n }\n // 释放其余多余子形句柄(first 独立持有几何,剩下的子是 top 的子引用)\n for (const s of solids.slice(1)) {\n try { kernel.release(s) } catch { /* already released */ }\n }\n kernel.release(top) // 释放 Compound 包裹,first 独立持有(同单 solid 模式)\n const shape = solidToShape(kernel, first, undefined, brepChain, stmtId)\n return { solid: first, shape: applyFirstStepColor(shape, buffer), multiSolidCount: solids.length }\n}\n\n/** Sub-shape kinds that make an imported shape \"addressable but not a solid\". */\nconst NON_SOLID_KINDS = ['vertex', 'edge', 'wire', 'face', 'shell'] as const\n\n/**\n * Does a freshly imported shape hold any sub-shape at all?\n *\n * Guards the `allowNonSolid` path: a file whose TShapes table is empty (or that\n * holds only a bare compound with nothing inside) is a broken asset, not a\n * wireframe one, and must still fail loudly.\n *\n * @param kernel - the initialized OCCT kernel.\n * @param top - the imported top-level shape handle.\n * @returns true when at least one non-solid sub-shape exists.\n */\nfunction hasAnyTopology(kernel: BrepEngineApi, top: BrepHandle): boolean {\n return NON_SOLID_KINDS.some((kind) => kernel.getSubShapes(top, kind).length > 0)\n}\n\n// ─── 辅助函数 ───\n\n/**\n * Convert a THREE.Matrix4 into the 3x4 row-major array (12 doubles) the OCCT\n * transform expects.\n *\n * OCCT transform accepts [r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz].\n * @param matrix - the source matrix to convert.\n * @returns the 3x4 row-major array of 12 doubles.\n */\nexport function matrixToArray(matrix: THREE.Matrix4): number[] {\n const e = matrix.elements\n // THREE.Matrix4 是 column-major,OCCT 需要 row-major 3x4\n return [\n e[0], e[4], e[8], e[12],\n e[1], e[5], e[9], e[13],\n e[2], e[6], e[10], e[14],\n ]\n}\n"]}
@@ -21,7 +21,7 @@ export const OCCT_BREP_ENGINE_ID = 'occt';
21
21
  /**
22
22
  * OCCT 实际提供的 `*WithHistory` 核函数名(Phase 0.2:逐核函数如实声明)。
23
23
  *
24
- * 12 个全部由 `occt-wasm@3.8.4` 提供(`dist/index.d.ts` 的 `*WithHistory` 声明)。
24
+ * 12 个全部由 `occt-wasm@5.6.0` 提供(`dist/index.d.ts` 的 `*WithHistory` 声明)。
25
25
  * L1 契约只含前三员 + filletWithHistory(双方都有对齐实现);其余 8 个是 occt
26
26
  * 平台面能力(brepkit 无对应 API),存在性由本能力表如实声明,op 侧用
27
27
  * `engines: ['occt']`(Phase 5 D11)表达平台归属。
@@ -1 +1 @@
1
- {"version":3,"file":"occt.js","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/occt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAsB,EAAmB,MAAM,aAAa,CAAA;AAExG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAE3E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAEzC;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAG;IAC3B,iBAAiB;IACjB,gBAAgB;IAChB,sBAAsB;IACtB,mBAAmB;IACnB,oBAAoB;IACpB,sBAAsB;IACtB,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,oBAAoB;CAC2B,CAAA;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,iBAAiB,GAAG;IACxB,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,OAAO;IACP,eAAe;IACf,OAAO;IACP,SAAS;IACT,MAAM;IACN,cAAc;IACd,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,MAAM;IACN,KAAK;IACL,WAAW;IACX,SAAS;IACT,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,UAAU;IACV,mBAAmB;IACnB,cAAc;IACd,WAAW;IACX,YAAY;IACZ,UAAU;IACV,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,KAAK;IACL,gBAAgB;IAChB,UAAU;IACV,WAAW;IACX,UAAU;IACV,UAAU;IACV,qBAAqB;IACrB,SAAS;IACT,uBAAuB;IACvB,UAAU;IACV,OAAO;IACP,iBAAiB;IACjB,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,qBAAqB;IACrB,eAAe;IACf,aAAa;IACb,UAAU;IACV,+DAA+D;IAC/D,gEAAgE;IAChE,gBAAgB;IAChB,WAAW;IACX,gBAAgB;IAChB,WAAW;IACX,iBAAiB;IACjB,kBAAkB;IAClB,mCAAmC;IACnC,+BAA+B;IAC/B,6BAA6B;IAC7B,WAAW;IACX,oBAAoB;IACpB,oBAAoB;IACpB,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;IACV,uDAAuD;IACvD,SAAS;IACT,kBAAkB;IAClB,QAAQ;IACR,gBAAgB;IAChB,sEAAsE;IACtE,+DAA+D;IAC/D,kEAAkE;IAClE,WAAW;IACX,kBAAkB;IAClB,+FAA+F;IAC/F,qGAAqG;IACrG,oFAAoF;IACpF,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,cAAc;CAC8B,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAA;IAC/C,IAAI,sBAAsB,CAAC,mBAAmB,CAAC;QAAE,OAAM;IACvD,kBAAkB,CAAC,mBAAmB,EAAE,KAAK,IAAyB,EAAE,CAAC,CAAC;QACxE,EAAE,EAAE,mBAAmB;QACvB,UAAU;QACV,YAAY,EAAE;YACZ,2CAA2C;YAC3C,SAAS,EAAE,oBAAoB;YAC/B,+CAA+C;YAC/C,OAAO,EAAE,iBAAiB;YAC1B,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,kEAAkE;YAClE,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,cAAc;SAClC;KACF,CAAC,CAAC,CAAA;IACH,qEAAqE;IACrE,4DAA4D;IAC5D,qDAAqD;IACrD,+BAA+B;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,aAAa,EAAE;QAAE,OAAM;IAC3B,MAAM,sBAAsB,EAAE,CAAA;AAChC,CAAC","sourcesContent":["/**\n * engine/adapters/occt — OCCT BREP 引擎适配器(槽位 1 的默认实现)\n *\n * 本文件是「occt 引擎实现」的注册入口:把 `createOcctPrimitives()`(occt-kernel/\n * occt-primitives.ts,L1 契约 `BrepEngineApi` 的 occt 显式实现)注册进引擎注册表。\n * 业务层(runtime/brep ops/api)只经注册表取引擎,不直接 import occt 初始化\n * 函数——引擎本体可整体替换(换一个适配器即换引擎)。\n *\n * Phase 3(docs/plans/2026-09-24-brep-engine-api-narrowing-native-access.md):\n * 本文件不再做任何猴子补丁(旧版在 occt-wasm 单例上覆写 pattern 三方法与 33 个\n * 登记方法——全部移入 `createOcctPrimitives` 的显式对象字面量)。occt-wasm 类型\n * 耦合只存在于 occt-kernel/(A1 允许的唯一耦合区);本文件不接触 occt-wasm 类型。\n *\n * 平台独有能力(loft 族、工具实体 section/split、L1 三员之外的 *WithHistory、\n * XCAF 等)不在 L1 契约里——平台代码经原生面 `getOcctKernel()`(D3)访问。\n */\n\nimport { registerBrepEngine, hasBrepEngine, isBrepEngineRegistered, type BrepEngine } from '../registry'\nimport type { BrepEvolutionKind, BrepMethodKind } from '../types'\nimport { createOcctPrimitives } from '../../../occt-kernel/occt-primitives'\n\n/** OCCT 引擎注册 id(默认 BREP 引擎;首个注册自动成为默认)。 */\nexport const OCCT_BREP_ENGINE_ID = 'occt'\n\n/**\n * OCCT 实际提供的 `*WithHistory` 核函数名(Phase 0.2:逐核函数如实声明)。\n *\n * 12 个全部由 `occt-wasm@3.8.4` 提供(`dist/index.d.ts` 的 `*WithHistory` 声明)。\n * L1 契约只含前三员 + filletWithHistory(双方都有对齐实现);其余 8 个是 occt\n * 平台面能力(brepkit 无对应 API),存在性由本能力表如实声明,op 侧用\n * `engines: ['occt']`(Phase 5 D11)表达平台归属。\n */\nconst OCCT_EVOLUTION_KINDS = [\n 'fuseWithHistory',\n 'cutWithHistory',\n 'intersectWithHistory',\n 'filletWithHistory',\n 'chamferWithHistory',\n 'translateWithHistory',\n 'rotateWithHistory',\n 'mirrorWithHistory',\n 'scaleWithHistory',\n 'shellWithHistory',\n 'offsetWithHistory',\n 'thickenWithHistory',\n] as const satisfies readonly BrepEvolutionKind[]\n\n/**\n * 非演化内核方法全集(BrepMethodKind)——逐核如实声明(Phase 1,P2 缺口补齐)。\n *\n * ⚠️ Phase 2 修正(能力声明=可执行语义):\n * - 保留 `gridPattern`:occt-wasm 无原生 gridPattern,但适配器有组合实现\n * (嵌套 linearPattern + fuseAll,见 occt-primitives.ts)——occt 下\n * gridPattern op 可执行,声明成立;\n * - 移除 `rectangularPattern`:occt-wasm 无此内核方法,vendored rectangularPattern\n * 是纯 JS 组合(compoundOpsFns.ts translate+fuseAll,不调内核)——无 op 依赖\n * 该能力名,声明即虚假(capability-map 实证 36 op 无一依赖)。\n */\nconst OCCT_METHOD_KINDS = [\n 'linearPattern',\n 'circularPattern',\n 'gridPattern',\n 'mirror',\n 'rotate',\n 'translate',\n 'scale',\n 'makeRectangle',\n 'shell',\n 'extrude',\n 'loft',\n 'loftAdvanced',\n 'section',\n 'sweepPipeShell',\n 'simplePipe',\n 'revolveVec',\n 'buildExtrusionLaw',\n 'fuse',\n 'cut',\n 'intersect',\n 'fuseAll',\n 'makeArcEdge',\n 'makeCircleEdge',\n 'makeBezierEdge',\n 'makeCylinder',\n 'makeEllipsoid',\n 'makeFace',\n 'makeFaceOnSurface',\n 'makeLineEdge',\n 'makeTorus',\n 'makeVertex',\n 'makeWire',\n 'makeWireFromMixed',\n 'buildEdgeOnSurface',\n 'addHolesInFace',\n 'buildTriFace',\n 'sew',\n 'sewAndSolidify',\n 'healFace',\n 'healSolid',\n 'healWire',\n 'fixShape',\n 'fixSelfIntersection',\n 'isValid',\n 'removeDegenerateEdges',\n 'simplify',\n 'split',\n 'curveParameters',\n 'curvePointAtParam',\n 'curveTangent',\n 'hullFromPoints',\n 'isNull',\n 'iterShapes',\n 'locate',\n 'shapeType',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n // Phase 5(D5):测量族能力名统一为 L1 中立名(getBoundingBox/getVolume/...)——\n // vendored 面按 brepjs 自身命名(volume/area/length),core 能力表用 L1 中立名。\n 'getBoundingBox',\n 'getVolume',\n 'getSurfaceArea',\n 'getLength',\n 'getCenterOfMass',\n 'composeTransform',\n 'applyComposedTransformWithHistory',\n 'generalTransformNonOrthogonal',\n 'generalTransformWithHistory',\n 'importStl',\n 'createXCAFDocument',\n 'importXCAFFromSTEP',\n 'copyShape',\n 'dispose',\n 'downcast',\n 'hashCode',\n // chamfer/fillet 基础方法(directEdit 族逐核真名;occt-wasm 原生提供)\n 'chamfer',\n 'chamferDistAngle',\n 'fillet',\n 'filletVariable',\n // 2026-09-26 B 批:rotate/applyMatrix 从 engines:[occt] 降级为能力路由后,occt 侧须\n // 如实声明 transform(:228,BRepBuilderAPI_Transform 深拷贝,STEP-safe)/\n // generalTransform(:231,gp_GTrsf)——此前两方法在 primitives 上实现但未登记进能力表。\n 'transform',\n 'generalTransform',\n // 2026-09-26 C batch: section/drill/pocket/boss/mirrorJoin downgrade - OCCT already implements\n // sectionByPlane(:162)/makeCompound(:285)/located(:229)/getSubShapes(:314) but previously undeclared\n // (engines:[occt] bypassed the gate). Now declared honestly for capability routing.\n 'sectionByPlane',\n 'makeCompound',\n 'located',\n 'getSubShapes',\n] as const satisfies readonly BrepMethodKind[]\n\n/**\n * 装配 OCCT BREP 引擎(宿主启动时调用一次,幂等)。\n *\n * 预初始化 `createOcctPrimitives()`(内部 await initOcctWasm):wasm 加载完成后\n * 立即注册——保证注册返回后内核单例已就绪。幂等:已注册(含运行时默认装配或\n * 宿主先行注册)则跳过注册,仅确保 wasm 预初始化。\n */\nexport async function registerOcctBrepEngine(): Promise<void> {\n const primitives = await createOcctPrimitives()\n if (isBrepEngineRegistered(OCCT_BREP_ENGINE_ID)) return\n registerBrepEngine(OCCT_BREP_ENGINE_ID, async (): Promise<BrepEngine> => ({\n id: OCCT_BREP_ENGINE_ID,\n primitives,\n capabilities: {\n // 面演化:逐核函数名单(不是族级布尔——见 BrepEvolutionKind)。\n evolution: OCCT_EVOLUTION_KINDS,\n // 非演化内核方法:逐核如实声明(Phase 1,P2 缺口补齐;op 声明按此静态判定)。\n methods: OCCT_METHOD_KINDS,\n heal: true,\n directEdit: true,\n advSurface: true,\n assembly: true,\n // P7 并入(D4):OCCT 是精确 B-rep 内核——如实声明 brepjs KernelCapabilities 字段。\n exact: true,\n brepExport: true,\n exactMeasurement: true,\n tessellationModel: 'extract-time',\n },\n }))\n // 2026-09-25 core-decouple Phase 2(§5.1):删除 occt-kernel-bridge 后,本注册\n // 流程只管 core 引擎注册表,不再向 vendored kernel registry 注入——vendored\n // 兼容面(compat op)由 Phase 3 逐批自有化替换;中间态下需要 vendored 面的\n // 宿主/测试自行装配 vendored registry。\n}\n\n/**\n * 内置默认 BREP 引擎装配(OCCT):宿主未注册任何引擎时的缺省值。\n *\n * OCCT 是 faijs 的默认 BREP 引擎——低频率、静态的替换:换引擎 = 宿主在\n * 装配期显式注册其它引擎(首个注册者为默认),或改本处默认。宿主无需为\n * 每次使用自行提供引擎;本函数幂等,已注册任何引擎则 no-op。\n */\nexport async function ensureOcctDefaultEngine(): Promise<void> {\n if (hasBrepEngine()) return\n await registerOcctBrepEngine()\n}\n"]}
1
+ {"version":3,"file":"occt.js","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/occt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * engine/adapters/occt — OCCT BREP 引擎适配器(槽位 1 的默认实现)\n *\n * 本文件是「occt 引擎实现」的注册入口:把 `createOcctPrimitives()`(occt-kernel/\n * occt-primitives.ts,L1 契约 `BrepEngineApi` 的 occt 显式实现)注册进引擎注册表。\n * 业务层(runtime/brep ops/api)只经注册表取引擎,不直接 import occt 初始化\n * 函数——引擎本体可整体替换(换一个适配器即换引擎)。\n *\n * Phase 3(docs/plans/2026-09-24-brep-engine-api-narrowing-native-access.md):\n * 本文件不再做任何猴子补丁(旧版在 occt-wasm 单例上覆写 pattern 三方法与 33 个\n * 登记方法——全部移入 `createOcctPrimitives` 的显式对象字面量)。occt-wasm 类型\n * 耦合只存在于 occt-kernel/(A1 允许的唯一耦合区);本文件不接触 occt-wasm 类型。\n *\n * 平台独有能力(loft 族、工具实体 section/split、L1 三员之外的 *WithHistory、\n * XCAF 等)不在 L1 契约里——平台代码经原生面 `getOcctKernel()`(D3)访问。\n */\n\nimport { registerBrepEngine, hasBrepEngine, isBrepEngineRegistered, type BrepEngine } from '../registry'\nimport type { BrepEvolutionKind, BrepMethodKind } from '../types'\nimport { createOcctPrimitives } from '../../../occt-kernel/occt-primitives'\n\n/** OCCT 引擎注册 id(默认 BREP 引擎;首个注册自动成为默认)。 */\nexport const OCCT_BREP_ENGINE_ID = 'occt'\n\n/**\n * OCCT 实际提供的 `*WithHistory` 核函数名(Phase 0.2:逐核函数如实声明)。\n *\n * 12 个全部由 `occt-wasm@5.6.0` 提供(`dist/index.d.ts` 的 `*WithHistory` 声明)。\n * L1 契约只含前三员 + filletWithHistory(双方都有对齐实现);其余 8 个是 occt\n * 平台面能力(brepkit 无对应 API),存在性由本能力表如实声明,op 侧用\n * `engines: ['occt']`(Phase 5 D11)表达平台归属。\n */\nconst OCCT_EVOLUTION_KINDS = [\n 'fuseWithHistory',\n 'cutWithHistory',\n 'intersectWithHistory',\n 'filletWithHistory',\n 'chamferWithHistory',\n 'translateWithHistory',\n 'rotateWithHistory',\n 'mirrorWithHistory',\n 'scaleWithHistory',\n 'shellWithHistory',\n 'offsetWithHistory',\n 'thickenWithHistory',\n] as const satisfies readonly BrepEvolutionKind[]\n\n/**\n * 非演化内核方法全集(BrepMethodKind)——逐核如实声明(Phase 1,P2 缺口补齐)。\n *\n * ⚠️ Phase 2 修正(能力声明=可执行语义):\n * - 保留 `gridPattern`:occt-wasm 无原生 gridPattern,但适配器有组合实现\n * (嵌套 linearPattern + fuseAll,见 occt-primitives.ts)——occt 下\n * gridPattern op 可执行,声明成立;\n * - 移除 `rectangularPattern`:occt-wasm 无此内核方法,vendored rectangularPattern\n * 是纯 JS 组合(compoundOpsFns.ts translate+fuseAll,不调内核)——无 op 依赖\n * 该能力名,声明即虚假(capability-map 实证 36 op 无一依赖)。\n */\nconst OCCT_METHOD_KINDS = [\n 'linearPattern',\n 'circularPattern',\n 'gridPattern',\n 'mirror',\n 'rotate',\n 'translate',\n 'scale',\n 'makeRectangle',\n 'shell',\n 'extrude',\n 'loft',\n 'loftAdvanced',\n 'section',\n 'sweepPipeShell',\n 'simplePipe',\n 'revolveVec',\n 'buildExtrusionLaw',\n 'fuse',\n 'cut',\n 'intersect',\n 'fuseAll',\n 'makeArcEdge',\n 'makeCircleEdge',\n 'makeBezierEdge',\n 'makeCylinder',\n 'makeEllipsoid',\n 'makeFace',\n 'makeFaceOnSurface',\n 'makeLineEdge',\n 'makeTorus',\n 'makeVertex',\n 'makeWire',\n 'makeWireFromMixed',\n 'buildEdgeOnSurface',\n 'addHolesInFace',\n 'buildTriFace',\n 'sew',\n 'sewAndSolidify',\n 'healFace',\n 'healSolid',\n 'healWire',\n 'fixShape',\n 'fixSelfIntersection',\n 'isValid',\n 'removeDegenerateEdges',\n 'simplify',\n 'split',\n 'curveParameters',\n 'curvePointAtParam',\n 'curveTangent',\n 'hullFromPoints',\n 'isNull',\n 'iterShapes',\n 'locate',\n 'shapeType',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n // Phase 5(D5):测量族能力名统一为 L1 中立名(getBoundingBox/getVolume/...)——\n // vendored 面按 brepjs 自身命名(volume/area/length),core 能力表用 L1 中立名。\n 'getBoundingBox',\n 'getVolume',\n 'getSurfaceArea',\n 'getLength',\n 'getCenterOfMass',\n 'composeTransform',\n 'applyComposedTransformWithHistory',\n 'generalTransformNonOrthogonal',\n 'generalTransformWithHistory',\n 'importStl',\n 'createXCAFDocument',\n 'importXCAFFromSTEP',\n 'copyShape',\n 'dispose',\n 'downcast',\n 'hashCode',\n // chamfer/fillet 基础方法(directEdit 族逐核真名;occt-wasm 原生提供)\n 'chamfer',\n 'chamferDistAngle',\n 'fillet',\n 'filletVariable',\n // 2026-09-26 B 批:rotate/applyMatrix 从 engines:[occt] 降级为能力路由后,occt 侧须\n // 如实声明 transform(:228,BRepBuilderAPI_Transform 深拷贝,STEP-safe)/\n // generalTransform(:231,gp_GTrsf)——此前两方法在 primitives 上实现但未登记进能力表。\n 'transform',\n 'generalTransform',\n // 2026-09-26 C batch: section/drill/pocket/boss/mirrorJoin downgrade - OCCT already implements\n // sectionByPlane(:162)/makeCompound(:285)/located(:229)/getSubShapes(:314) but previously undeclared\n // (engines:[occt] bypassed the gate). Now declared honestly for capability routing.\n 'sectionByPlane',\n 'makeCompound',\n 'located',\n 'getSubShapes',\n] as const satisfies readonly BrepMethodKind[]\n\n/**\n * 装配 OCCT BREP 引擎(宿主启动时调用一次,幂等)。\n *\n * 预初始化 `createOcctPrimitives()`(内部 await initOcctWasm):wasm 加载完成后\n * 立即注册——保证注册返回后内核单例已就绪。幂等:已注册(含运行时默认装配或\n * 宿主先行注册)则跳过注册,仅确保 wasm 预初始化。\n */\nexport async function registerOcctBrepEngine(): Promise<void> {\n const primitives = await createOcctPrimitives()\n if (isBrepEngineRegistered(OCCT_BREP_ENGINE_ID)) return\n registerBrepEngine(OCCT_BREP_ENGINE_ID, async (): Promise<BrepEngine> => ({\n id: OCCT_BREP_ENGINE_ID,\n primitives,\n capabilities: {\n // 面演化:逐核函数名单(不是族级布尔——见 BrepEvolutionKind)。\n evolution: OCCT_EVOLUTION_KINDS,\n // 非演化内核方法:逐核如实声明(Phase 1,P2 缺口补齐;op 声明按此静态判定)。\n methods: OCCT_METHOD_KINDS,\n heal: true,\n directEdit: true,\n advSurface: true,\n assembly: true,\n // P7 并入(D4):OCCT 是精确 B-rep 内核——如实声明 brepjs KernelCapabilities 字段。\n exact: true,\n brepExport: true,\n exactMeasurement: true,\n tessellationModel: 'extract-time',\n },\n }))\n // 2026-09-25 core-decouple Phase 2(§5.1):删除 occt-kernel-bridge 后,本注册\n // 流程只管 core 引擎注册表,不再向 vendored kernel registry 注入——vendored\n // 兼容面(compat op)由 Phase 3 逐批自有化替换;中间态下需要 vendored 面的\n // 宿主/测试自行装配 vendored registry。\n}\n\n/**\n * 内置默认 BREP 引擎装配(OCCT):宿主未注册任何引擎时的缺省值。\n *\n * OCCT 是 faijs 的默认 BREP 引擎——低频率、静态的替换:换引擎 = 宿主在\n * 装配期显式注册其它引擎(首个注册者为默认),或改本处默认。宿主无需为\n * 每次使用自行提供引擎;本函数幂等,已注册任何引擎则 no-op。\n */\nexport async function ensureOcctDefaultEngine(): Promise<void> {\n if (hasBrepEngine()) return\n await registerOcctBrepEngine()\n}\n"]}
@@ -15,6 +15,8 @@
15
15
  */
16
16
  import { type UnitName } from '../../units.js';
17
17
  import type { BrepHandle } from '../engine/types.js';
18
+ import type { PbrAppearance } from '../../api/appearance.js';
19
+ import type { ShapeMeta, FileMeta } from '../../api/meta.js';
18
20
  /** 导出条目:一个 part 的几何来源。精确 BREP 与三角网格二选一,solid 优先。 */
19
21
  export interface ExportEntry {
20
22
  /** 精确 BREP 句柄(来自 brep 链,导出 ADVANCED_FACE)。 */
@@ -28,6 +30,20 @@ export interface ExportEntry {
28
30
  name?: string;
29
31
  /** sRGB 0..1 颜色(STEP 走 XCAF COLOUR_RGB,3MF 走 basematerials)。 */
30
32
  color?: readonly [number, number, number];
33
+ /**
34
+ * 逐三角形材质分组(P4,3MF 走多 basematerials + `<triangle pid p1..p3>`):
35
+ * start/count 为**三角形索引**区间,appearance.color 为该组基色。
36
+ */
37
+ materialGroups?: Array<{
38
+ start: number;
39
+ count: number;
40
+ appearance: PbrAppearance;
41
+ }>;
42
+ /**
43
+ * 零件级说明性元数据(设计文档 2026-10-05-meta §6.1):写 3MF
44
+ * `<object name/partnumber>` + `<metadatagroup>`;STEP 走 PRODUCT name(既有)。
45
+ */
46
+ meta?: ShapeMeta;
31
47
  }
32
48
  /** Output formats supported by the unified {@link exportModel} entry. */
33
49
  export type ExportFormat = 'stl' | 'step' | '3mf';
@@ -43,9 +59,33 @@ export interface ExportOptions {
43
59
  unit?: UnitName;
44
60
  /** 3MF 打印配置(可选,原样进 model 层)。 */
45
61
  printConfig?: unknown;
62
+ /** 整体级元数据(设计文档 2026-10-05-meta §6.1):3MF 写 `<model>` 级 `<metadata>`。 */
63
+ fileMeta?: FileMeta;
46
64
  }
47
65
  /** UnitName → 3MF <model unit> 枚举全名(唯一真源;yard 无对应值)。 */
48
66
  export declare const UNIT_NAME_TO_3MF: Partial<Record<UnitName, 'micron' | 'millimeter' | 'centimeter' | 'inch' | 'foot' | 'meter'>>;
67
+ /**
68
+ * STEP 文件级元数据 → P21 header 重写(`FILE_NAME`/`FILE_DESCRIPTION`)。
69
+ *
70
+ * 设计文档 2026-10-05-meta §6.2 第 6 步:`exportModel` 已有 SI_UNIT 声明重写的
71
+ * 先例——同样只对 header 里 FILE_NAME(...)/FILE_DESCRIPTION(...) 行做文本替换,
72
+ * 绝不碰 DATA 段几何实体(红线 §10.3 3a:文本层只改声明/元数据,坐标不动)。
73
+ *
74
+ * FILE_NAME(name, time_stamp, author, organization, preprocessor_version, ...)
75
+ * FILE_DESCRIPTION(description_list, implementation_level)
76
+ * 映射(§3.3):title→name, creationDate→time_stamp, author|designer→author 列表,
77
+ * organization→organization, application→preprocessor, description→description。
78
+ * 无对应的字段(copyright/licenseTerms/rating/modificationDate)**不写**(§5.3 头:
79
+ * STEP 无标准位置,不发明)。
80
+ *
81
+ * 宽容失败:找不到 FILE_NAME/FILE_DESCRIPTION 行则留空(P21 头由内核写出,形态
82
+ * 已知为 `FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');` 一行,但在字符串内)。
83
+ *
84
+ * @param stepText 内核产出的 STEP 全文(ISO-10303-21)。
85
+ * @param fileMeta 目标文件级元数据。
86
+ * @returns 改写后的 STEP 文本。
87
+ */
88
+ export declare function rewriteFileMetaHeader(stepText: string, fileMeta: FileMeta): string;
49
89
  /**
50
90
  * Synchronous twin of {@link exportModel} for hosts already holding a live
51
91
  * kernel (CLI, in-process consumers). Same invariants: declared unit ==
@@ -1 +1 @@
1
- {"version":3,"file":"export-model.d.ts","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAMjD,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,uCAAuC;IACvC,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAA;IACxD,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C;AAED,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAQ1H,CAAA;AA6HD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,WAAW,CA0Db;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,CAAC,CA+EtB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,CAgBtG"}
1
+ {"version":3,"file":"export-model.d.ts","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAKjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzD,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,uCAAuC;IACvC,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAA;IACxD,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IACnF;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAQ1H,CAAA;AAuED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA6ClF;AAsND;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,WAAW,CA6Db;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,CAAC,CA6EtB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,CAgBtG"}