@faicad/faijs 0.13.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/dist/api/api-namespace.d.ts +7 -0
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +44 -17
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/boolean.d.ts +19 -0
  6. package/dist/api/boolean.d.ts.map +1 -1
  7. package/dist/api/boolean.js +71 -12
  8. package/dist/api/boolean.js.map +1 -1
  9. package/dist/api/chamfer.d.ts.map +1 -1
  10. package/dist/api/chamfer.js +12 -8
  11. package/dist/api/chamfer.js.map +1 -1
  12. package/dist/api/compound-geom.d.ts +45 -0
  13. package/dist/api/compound-geom.d.ts.map +1 -0
  14. package/dist/api/compound-geom.js +85 -0
  15. package/dist/api/compound-geom.js.map +1 -0
  16. package/dist/api/edge-ref.d.ts.map +1 -1
  17. package/dist/api/edge-ref.js +7 -4
  18. package/dist/api/edge-ref.js.map +1 -1
  19. package/dist/api/engrave.d.ts.map +1 -1
  20. package/dist/api/engrave.js +1 -0
  21. package/dist/api/engrave.js.map +1 -1
  22. package/dist/api/extrude.d.ts.map +1 -1
  23. package/dist/api/extrude.js +131 -3
  24. package/dist/api/extrude.js.map +1 -1
  25. package/dist/api/face-ref.d.ts.map +1 -1
  26. package/dist/api/face-ref.js +7 -4
  27. package/dist/api/face-ref.js.map +1 -1
  28. package/dist/api/fillet.d.ts.map +1 -1
  29. package/dist/api/fillet.js +6 -5
  30. package/dist/api/fillet.js.map +1 -1
  31. package/dist/api/generated/cad/script-face.d.ts +1 -1
  32. package/dist/api/generated/cad/script-face.d.ts.map +1 -1
  33. package/dist/api/generated/cad/script-face.js +1 -2
  34. package/dist/api/generated/cad/script-face.js.map +1 -1
  35. package/dist/api/generated/operations.js +16 -16
  36. package/dist/api/generated/operations.js.map +1 -1
  37. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  38. package/dist/api/generated/script-face-manifest.js +0 -2
  39. package/dist/api/generated/script-face-manifest.js.map +1 -1
  40. package/dist/api/generated/script-face.d.ts +1 -7
  41. package/dist/api/generated/script-face.d.ts.map +1 -1
  42. package/dist/api/generated/script-face.js +2 -4
  43. package/dist/api/generated/script-face.js.map +1 -1
  44. package/dist/api/generated/sketching.js +1 -1
  45. package/dist/api/generated/sketching.js.map +1 -1
  46. package/dist/api/generated/topology.d.ts +0 -56
  47. package/dist/api/generated/topology.d.ts.map +1 -1
  48. package/dist/api/generated/topology.js +19 -68
  49. package/dist/api/generated/topology.js.map +1 -1
  50. package/dist/api/import-brep.d.ts +36 -0
  51. package/dist/api/import-brep.d.ts.map +1 -0
  52. package/dist/api/import-brep.js +72 -0
  53. package/dist/api/import-brep.js.map +1 -0
  54. package/dist/api/import-step.d.ts +28 -0
  55. package/dist/api/import-step.d.ts.map +1 -0
  56. package/dist/api/import-step.js +57 -0
  57. package/dist/api/import-step.js.map +1 -0
  58. package/dist/api/index.d.ts +8 -12
  59. package/dist/api/index.d.ts.map +1 -1
  60. package/dist/api/index.js +22 -16
  61. package/dist/api/index.js.map +1 -1
  62. package/dist/api/internal/compat-op.d.ts.map +1 -1
  63. package/dist/api/internal/compat-op.js +2 -1
  64. package/dist/api/internal/compat-op.js.map +1 -1
  65. package/dist/api/internal/compat-projection.d.ts +3 -1
  66. package/dist/api/internal/compat-projection.d.ts.map +1 -1
  67. package/dist/api/internal/compat-projection.js +8 -5
  68. package/dist/api/internal/compat-projection.js.map +1 -1
  69. package/dist/api/internal/replica-role-table.d.ts +36 -0
  70. package/dist/api/internal/replica-role-table.d.ts.map +1 -0
  71. package/dist/api/internal/replica-role-table.js +73 -0
  72. package/dist/api/internal/replica-role-table.js.map +1 -0
  73. package/dist/api/internal/result-unwrap.d.ts +3 -1
  74. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  75. package/dist/api/internal/result-unwrap.js +2 -2
  76. package/dist/api/internal/result-unwrap.js.map +1 -1
  77. package/dist/api/knurl.d.ts.map +1 -1
  78. package/dist/api/knurl.js +1 -0
  79. package/dist/api/knurl.js.map +1 -1
  80. package/dist/api/occt-kernel-bridge.d.ts +105 -27
  81. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  82. package/dist/api/occt-kernel-bridge.js +255 -41
  83. package/dist/api/occt-kernel-bridge.js.map +1 -1
  84. package/dist/api/pattern.d.ts +32 -0
  85. package/dist/api/pattern.d.ts.map +1 -0
  86. package/dist/api/pattern.js +85 -0
  87. package/dist/api/pattern.js.map +1 -0
  88. package/dist/api/place.d.ts +35 -0
  89. package/dist/api/place.d.ts.map +1 -0
  90. package/dist/api/place.js +113 -0
  91. package/dist/api/place.js.map +1 -0
  92. package/dist/api/primitives.d.ts.map +1 -1
  93. package/dist/api/primitives.js +10 -3
  94. package/dist/api/primitives.js.map +1 -1
  95. package/dist/api/replicate.d.ts +145 -0
  96. package/dist/api/replicate.d.ts.map +1 -0
  97. package/dist/api/replicate.js +351 -0
  98. package/dist/api/replicate.js.map +1 -0
  99. package/dist/api/revolve.d.ts +36 -0
  100. package/dist/api/revolve.d.ts.map +1 -0
  101. package/dist/api/revolve.js +165 -0
  102. package/dist/api/revolve.js.map +1 -0
  103. package/dist/api/screw.d.ts.map +1 -1
  104. package/dist/api/screw.js +1 -0
  105. package/dist/api/screw.js.map +1 -1
  106. package/dist/api/sdf.d.ts.map +1 -1
  107. package/dist/api/sdf.js +1 -0
  108. package/dist/api/sdf.js.map +1 -1
  109. package/dist/api/sketch.d.ts.map +1 -1
  110. package/dist/api/sketch.js +1 -0
  111. package/dist/api/sketch.js.map +1 -1
  112. package/dist/api/split.d.ts +31 -0
  113. package/dist/api/split.d.ts.map +1 -0
  114. package/dist/api/split.js +96 -0
  115. package/dist/api/split.js.map +1 -0
  116. package/dist/api/surface/arg-spec.d.ts +17 -0
  117. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  118. package/dist/api/surface/arg-spec.js +86 -66
  119. package/dist/api/surface/arg-spec.js.map +1 -1
  120. package/dist/api/surface/projection-overrides.d.ts.map +1 -1
  121. package/dist/api/surface/projection-overrides.js +6 -0
  122. package/dist/api/surface/projection-overrides.js.map +1 -1
  123. package/dist/api/topo-resolve.d.ts.map +1 -1
  124. package/dist/api/topo-resolve.js +65 -3
  125. package/dist/api/topo-resolve.js.map +1 -1
  126. package/dist/api/transform.d.ts +4 -0
  127. package/dist/api/transform.d.ts.map +1 -1
  128. package/dist/api/transform.js +44 -12
  129. package/dist/api/transform.js.map +1 -1
  130. package/dist/boolean/deriveNormals.d.ts +5 -4
  131. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  132. package/dist/boolean/deriveNormals.js +24 -7
  133. package/dist/boolean/deriveNormals.js.map +1 -1
  134. package/dist/brep/brep-ops.d.ts +34 -1
  135. package/dist/brep/brep-ops.d.ts.map +1 -1
  136. package/dist/brep/brep-ops.js +62 -22
  137. package/dist/brep/brep-ops.js.map +1 -1
  138. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  139. package/dist/brep/engine/adapters/brep-mock.js +66 -0
  140. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  141. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  142. package/dist/brep/engine/adapters/brepkit.js +44 -1
  143. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  144. package/dist/brep/engine/adapters/occt.d.ts +1 -5
  145. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  146. package/dist/brep/engine/adapters/occt.js +246 -9
  147. package/dist/brep/engine/adapters/occt.js.map +1 -1
  148. package/dist/brep/engine/primitives.d.ts +96 -0
  149. package/dist/brep/engine/primitives.d.ts.map +1 -1
  150. package/dist/brep/engine/primitives.js.map +1 -1
  151. package/dist/brep/engine/types.d.ts +66 -6
  152. package/dist/brep/engine/types.d.ts.map +1 -1
  153. package/dist/brep/engine/types.js.map +1 -1
  154. package/dist/brep/export/step.d.ts.map +1 -1
  155. package/dist/brep/export/step.js +6 -1
  156. package/dist/brep/export/step.js.map +1 -1
  157. package/dist/brep/face-evolution.d.ts +78 -8
  158. package/dist/brep/face-evolution.d.ts.map +1 -1
  159. package/dist/brep/face-evolution.js +130 -17
  160. package/dist/brep/face-evolution.js.map +1 -1
  161. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  162. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  163. package/dist/brepkit-kernel/brepkitKernel.js +108 -12
  164. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  165. package/dist/browser.d.ts +6 -28
  166. package/dist/browser.d.ts.map +1 -1
  167. package/dist/browser.js +6 -17
  168. package/dist/browser.js.map +1 -1
  169. package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
  170. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  171. package/dist/cad-runtime/admit-compat-lib.js +27 -0
  172. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  173. package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
  174. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  175. package/dist/cad-runtime/backend-dispatch.js +48 -3
  176. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  177. package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
  178. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  179. package/dist/cad-runtime/browser-lib-loader.js +7 -4
  180. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  181. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  182. package/dist/cad-runtime/direct-executor.js +14 -4
  183. package/dist/cad-runtime/direct-executor.js.map +1 -1
  184. package/dist/cad-runtime/module-registry.d.ts +3 -1
  185. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  186. package/dist/cad-runtime/module-registry.js +13 -1
  187. package/dist/cad-runtime/module-registry.js.map +1 -1
  188. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  189. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  190. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  191. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  192. package/dist/cad-runtime/runtime.d.ts +52 -2
  193. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  194. package/dist/cad-runtime/runtime.js +180 -9
  195. package/dist/cad-runtime/runtime.js.map +1 -1
  196. package/dist/define-op.d.ts +22 -0
  197. package/dist/define-op.d.ts.map +1 -1
  198. package/dist/define-op.js +82 -12
  199. package/dist/define-op.js.map +1 -1
  200. package/dist/env-agnostic.d.ts +38 -0
  201. package/dist/env-agnostic.d.ts.map +1 -0
  202. package/dist/env-agnostic.js +29 -0
  203. package/dist/env-agnostic.js.map +1 -0
  204. package/dist/fcstd/attachment.d.ts +8 -1
  205. package/dist/fcstd/attachment.d.ts.map +1 -1
  206. package/dist/fcstd/attachment.js +7 -1
  207. package/dist/fcstd/attachment.js.map +1 -1
  208. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  209. package/dist/fcstd/build-fai-zip.js +12 -7
  210. package/dist/fcstd/build-fai-zip.js.map +1 -1
  211. package/dist/fcstd/codegen.d.ts +10 -1
  212. package/dist/fcstd/codegen.d.ts.map +1 -1
  213. package/dist/fcstd/codegen.js +158 -49
  214. package/dist/fcstd/codegen.js.map +1 -1
  215. package/dist/fcstd/contour.d.ts.map +1 -1
  216. package/dist/fcstd/contour.js +23 -24
  217. package/dist/fcstd/contour.js.map +1 -1
  218. package/dist/fcstd/convert.d.ts +2 -18
  219. package/dist/fcstd/convert.d.ts.map +1 -1
  220. package/dist/fcstd/convert.js +35 -53
  221. package/dist/fcstd/convert.js.map +1 -1
  222. package/dist/fcstd/expressions.d.ts +24 -0
  223. package/dist/fcstd/expressions.d.ts.map +1 -1
  224. package/dist/fcstd/expressions.js +91 -0
  225. package/dist/fcstd/expressions.js.map +1 -1
  226. package/dist/fcstd/external-geo.d.ts +12 -1
  227. package/dist/fcstd/external-geo.d.ts.map +1 -1
  228. package/dist/fcstd/external-geo.js +15 -1
  229. package/dist/fcstd/external-geo.js.map +1 -1
  230. package/dist/fcstd/feature-translate.d.ts +21 -1
  231. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  232. package/dist/fcstd/feature-translate.js +124 -8
  233. package/dist/fcstd/feature-translate.js.map +1 -1
  234. package/dist/fcstd/structural-types.d.ts +83 -0
  235. package/dist/fcstd/structural-types.d.ts.map +1 -0
  236. package/dist/fcstd/structural-types.js +121 -0
  237. package/dist/fcstd/structural-types.js.map +1 -0
  238. package/dist/index.d.ts +7 -23
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +10 -16
  241. package/dist/index.js.map +1 -1
  242. package/dist/lang/determinism-scanner.d.ts +71 -0
  243. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  244. package/dist/lang/determinism-scanner.js +625 -0
  245. package/dist/lang/determinism-scanner.js.map +1 -0
  246. package/dist/lang/symbol-table.d.ts +31 -0
  247. package/dist/lang/symbol-table.d.ts.map +1 -1
  248. package/dist/lang/symbol-table.generated.d.ts +13 -19
  249. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  250. package/dist/lang/symbol-table.generated.js +13 -19
  251. package/dist/lang/symbol-table.generated.js.map +1 -1
  252. package/dist/lang/symbol-table.js +50 -1
  253. package/dist/lang/symbol-table.js.map +1 -1
  254. package/dist/mesh/creased-normals.d.ts +50 -0
  255. package/dist/mesh/creased-normals.d.ts.map +1 -0
  256. package/dist/mesh/creased-normals.js +114 -0
  257. package/dist/mesh/creased-normals.js.map +1 -0
  258. package/dist/mesh/decoration-provider.d.ts +53 -0
  259. package/dist/mesh/decoration-provider.d.ts.map +1 -0
  260. package/dist/mesh/decoration-provider.js +21 -0
  261. package/dist/mesh/decoration-provider.js.map +1 -0
  262. package/dist/mesh/engrave.d.ts +4 -0
  263. package/dist/mesh/engrave.d.ts.map +1 -1
  264. package/dist/mesh/engrave.js +22 -31
  265. package/dist/mesh/engrave.js.map +1 -1
  266. package/dist/mesh/index.d.ts +5 -14
  267. package/dist/mesh/index.d.ts.map +1 -1
  268. package/dist/mesh/index.js +7 -18
  269. package/dist/mesh/index.js.map +1 -1
  270. package/dist/mesh/io.d.ts +2 -1
  271. package/dist/mesh/io.d.ts.map +1 -1
  272. package/dist/mesh/io.js +5 -7
  273. package/dist/mesh/io.js.map +1 -1
  274. package/dist/mesh/primitives.d.ts +5 -18
  275. package/dist/mesh/primitives.d.ts.map +1 -1
  276. package/dist/mesh/primitives.js +4 -48
  277. package/dist/mesh/primitives.js.map +1 -1
  278. package/dist/mesh/stl-loader.d.ts +23 -0
  279. package/dist/mesh/stl-loader.d.ts.map +1 -0
  280. package/dist/mesh/stl-loader.js +139 -0
  281. package/dist/mesh/stl-loader.js.map +1 -0
  282. package/dist/module-resolver/parse-imports.d.ts +37 -0
  283. package/dist/module-resolver/parse-imports.d.ts.map +1 -0
  284. package/dist/module-resolver/parse-imports.js +39 -0
  285. package/dist/module-resolver/parse-imports.js.map +1 -0
  286. package/dist/module-resolver/resolver.d.ts +1 -1
  287. package/dist/module-resolver/resolver.js +2 -2
  288. package/dist/module-resolver/resolver.js.map +1 -1
  289. package/dist/node-host/cli.d.ts.map +1 -1
  290. package/dist/node-host/cli.js +37 -4
  291. package/dist/node-host/cli.js.map +1 -1
  292. package/dist/primitives/text/cjk-font.d.ts +42 -0
  293. package/dist/primitives/text/cjk-font.d.ts.map +1 -0
  294. package/dist/primitives/text/cjk-font.js +86 -0
  295. package/dist/primitives/text/cjk-font.js.map +1 -0
  296. package/dist/runtime-state.d.ts +18 -6
  297. package/dist/runtime-state.d.ts.map +1 -1
  298. package/dist/runtime-state.js +9 -1
  299. package/dist/runtime-state.js.map +1 -1
  300. package/dist/sdk.d.ts +2 -2
  301. package/dist/sdk.js +2 -2
  302. package/dist/sdk.js.map +1 -1
  303. package/dist/shape.d.ts +15 -0
  304. package/dist/shape.d.ts.map +1 -1
  305. package/dist/shape.js +26 -3
  306. package/dist/shape.js.map +1 -1
  307. package/dist/symbol-table.d.ts +15 -0
  308. package/dist/symbol-table.d.ts.map +1 -0
  309. package/dist/symbol-table.js +14 -0
  310. package/dist/symbol-table.js.map +1 -0
  311. package/dist/topology/naming/build-naming.d.ts +14 -30
  312. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  313. package/dist/topology/naming/build-naming.js +21 -54
  314. package/dist/topology/naming/build-naming.js.map +1 -1
  315. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  316. package/dist/topology/naming/capture-topo-ref.js +5 -0
  317. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  318. package/dist/topology/naming/index.d.ts +3 -0
  319. package/dist/topology/naming/index.d.ts.map +1 -1
  320. package/dist/topology/naming/index.js +3 -0
  321. package/dist/topology/naming/index.js.map +1 -1
  322. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  323. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  324. package/dist/topology/naming/lineage-resolve.js +120 -0
  325. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  326. package/dist/topology/naming/lineage.d.ts +349 -0
  327. package/dist/topology/naming/lineage.d.ts.map +1 -0
  328. package/dist/topology/naming/lineage.js +398 -0
  329. package/dist/topology/naming/lineage.js.map +1 -0
  330. package/dist/topology/naming/migrate.d.ts +41 -0
  331. package/dist/topology/naming/migrate.d.ts.map +1 -0
  332. package/dist/topology/naming/migrate.js +88 -0
  333. package/dist/topology/naming/migrate.js.map +1 -0
  334. package/dist/topology/naming/role-name.d.ts +176 -0
  335. package/dist/topology/naming/role-name.d.ts.map +1 -0
  336. package/dist/topology/naming/role-name.js +344 -0
  337. package/dist/topology/naming/role-name.js.map +1 -0
  338. package/dist/topology/naming/roles.d.ts +20 -22
  339. package/dist/topology/naming/roles.d.ts.map +1 -1
  340. package/dist/topology/naming/roles.js +51 -49
  341. package/dist/topology/naming/roles.js.map +1 -1
  342. package/dist/topology/naming/types.d.ts +65 -18
  343. package/dist/topology/naming/types.d.ts.map +1 -1
  344. package/dist/topology/naming/types.js.map +1 -1
  345. package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
  346. package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
  347. package/dist/vendored/brepjs/kernel/index.js +11 -0
  348. package/dist/vendored/brepjs/kernel/index.js.map +1 -1
  349. package/dist/weapp.d.ts +4 -4
  350. package/dist/weapp.d.ts.map +1 -1
  351. package/dist/weapp.js +7 -4
  352. package/dist/weapp.js.map +1 -1
  353. package/package.json +16 -14
  354. package/dist/api/compat/index.d.ts +0 -173
  355. package/dist/api/compat/index.d.ts.map +0 -1
  356. package/dist/api/compat/index.js +0 -222
  357. package/dist/api/compat/index.js.map +0 -1
  358. package/dist/api/compound.d.ts +0 -108
  359. package/dist/api/compound.d.ts.map +0 -1
  360. package/dist/api/compound.js +0 -162
  361. package/dist/api/compound.js.map +0 -1
  362. package/dist/api/copy.d.ts +0 -39
  363. package/dist/api/copy.d.ts.map +0 -1
  364. package/dist/api/copy.js +0 -81
  365. package/dist/api/copy.js.map +0 -1
  366. package/dist/api/fai_drill.d.ts +0 -46
  367. package/dist/api/fai_drill.d.ts.map +0 -1
  368. package/dist/api/fai_drill.js +0 -230
  369. package/dist/api/fai_drill.js.map +0 -1
  370. package/dist/api/fai_extrude.d.ts +0 -36
  371. package/dist/api/fai_extrude.d.ts.map +0 -1
  372. package/dist/api/fai_extrude.js +0 -78
  373. package/dist/api/fai_extrude.js.map +0 -1
  374. package/dist/api/fai_split.d.ts +0 -46
  375. package/dist/api/fai_split.d.ts.map +0 -1
  376. package/dist/api/fai_split.js +0 -253
  377. package/dist/api/fai_split.js.map +0 -1
  378. package/dist/api/load.d.ts +0 -39
  379. package/dist/api/load.d.ts.map +0 -1
  380. package/dist/api/load.js +0 -82
  381. package/dist/api/load.js.map +0 -1
  382. package/dist/api/svgExtrude.d.ts +0 -32
  383. package/dist/api/svgExtrude.d.ts.map +0 -1
  384. package/dist/api/svgExtrude.js +0 -73
  385. package/dist/api/svgExtrude.js.map +0 -1
  386. package/dist/api/text.d.ts +0 -34
  387. package/dist/api/text.d.ts.map +0 -1
  388. package/dist/api/text.js +0 -100
  389. package/dist/api/text.js.map +0 -1
  390. package/dist/brep/text/fontTestHelper.d.ts +0 -30
  391. package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
  392. package/dist/brep/text/fontTestHelper.js +0 -57
  393. package/dist/brep/text/fontTestHelper.js.map +0 -1
  394. package/dist/cad-runtime/module-executor.d.ts +0 -271
  395. package/dist/cad-runtime/module-executor.d.ts.map +0 -1
  396. package/dist/cad-runtime/module-executor.js +0 -630
  397. package/dist/cad-runtime/module-executor.js.map +0 -1
  398. package/dist/cad-runtime/terminal-dag.d.ts +0 -65
  399. package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
  400. package/dist/cad-runtime/terminal-dag.js +0 -167
  401. package/dist/cad-runtime/terminal-dag.js.map +0 -1
  402. package/dist/faqts/browser.d.ts +0 -16
  403. package/dist/faqts/browser.d.ts.map +0 -1
  404. package/dist/faqts/browser.js +0 -13
  405. package/dist/faqts/browser.js.map +0 -1
  406. package/dist/faqts/exec-blob.d.ts +0 -14
  407. package/dist/faqts/exec-blob.d.ts.map +0 -1
  408. package/dist/faqts/exec-blob.js +0 -22
  409. package/dist/faqts/exec-blob.js.map +0 -1
  410. package/dist/faqts/exec-node.d.ts +0 -15
  411. package/dist/faqts/exec-node.d.ts.map +0 -1
  412. package/dist/faqts/exec-node.js +0 -29
  413. package/dist/faqts/exec-node.js.map +0 -1
  414. package/dist/faqts/imports.d.ts +0 -74
  415. package/dist/faqts/imports.d.ts.map +0 -1
  416. package/dist/faqts/imports.js +0 -95
  417. package/dist/faqts/imports.js.map +0 -1
  418. package/dist/faqts/index.d.ts +0 -22
  419. package/dist/faqts/index.d.ts.map +0 -1
  420. package/dist/faqts/index.js +0 -21
  421. package/dist/faqts/index.js.map +0 -1
  422. package/dist/faqts/node.d.ts +0 -23
  423. package/dist/faqts/node.d.ts.map +0 -1
  424. package/dist/faqts/node.js +0 -23
  425. package/dist/faqts/node.js.map +0 -1
  426. package/dist/faqts/run.d.ts +0 -62
  427. package/dist/faqts/run.d.ts.map +0 -1
  428. package/dist/faqts/run.js +0 -62
  429. package/dist/faqts/run.js.map +0 -1
  430. package/dist/faqts/transform.d.ts +0 -43
  431. package/dist/faqts/transform.d.ts.map +0 -1
  432. package/dist/faqts/transform.js +0 -35
  433. package/dist/faqts/transform.js.map +0 -1
  434. package/dist/lang/compile.d.ts +0 -50
  435. package/dist/lang/compile.d.ts.map +0 -1
  436. package/dist/lang/compile.js +0 -368
  437. package/dist/lang/compile.js.map +0 -1
  438. package/dist/lang/keep.d.ts +0 -109
  439. package/dist/lang/keep.d.ts.map +0 -1
  440. package/dist/lang/keep.js +0 -226
  441. package/dist/lang/keep.js.map +0 -1
  442. package/dist/lang/parser.d.ts +0 -91
  443. package/dist/lang/parser.d.ts.map +0 -1
  444. package/dist/lang/parser.js +0 -1594
  445. package/dist/lang/parser.js.map +0 -1
  446. package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
  447. package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
  448. package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
  449. package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
  450. package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
  451. package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
  452. package/dist/mesh/drill-hole/drill-types.js +0 -7
  453. package/dist/mesh/drill-hole/drill-types.js.map +0 -1
  454. package/dist/mesh/fai_drill.d.ts +0 -21
  455. package/dist/mesh/fai_drill.d.ts.map +0 -1
  456. package/dist/mesh/fai_drill.js +0 -92
  457. package/dist/mesh/fai_drill.js.map +0 -1
  458. package/dist/mesh/fai_extrude.d.ts +0 -24
  459. package/dist/mesh/fai_extrude.d.ts.map +0 -1
  460. package/dist/mesh/fai_extrude.js +0 -42
  461. package/dist/mesh/fai_extrude.js.map +0 -1
  462. package/dist/mesh/fai_split.d.ts +0 -164
  463. package/dist/mesh/fai_split.d.ts.map +0 -1
  464. package/dist/mesh/fai_split.js +0 -269
  465. package/dist/mesh/fai_split.js.map +0 -1
  466. package/dist/primitives/svg-extrude.d.ts +0 -43
  467. package/dist/primitives/svg-extrude.d.ts.map +0 -1
  468. package/dist/primitives/svg-extrude.js +0 -78
  469. package/dist/primitives/svg-extrude.js.map +0 -1
  470. package/dist/primitives/text/cjk.d.ts +0 -61
  471. package/dist/primitives/text/cjk.d.ts.map +0 -1
  472. package/dist/primitives/text/cjk.js +0 -215
  473. package/dist/primitives/text/cjk.js.map +0 -1
  474. package/dist/primitives/text-geometry.d.ts +0 -47
  475. package/dist/primitives/text-geometry.d.ts.map +0 -1
  476. package/dist/primitives/text-geometry.js +0 -127
  477. package/dist/primitives/text-geometry.js.map +0 -1
  478. package/dist/test-helpers.d.ts +0 -31
  479. package/dist/test-helpers.d.ts.map +0 -1
  480. package/dist/test-helpers.js +0 -55
  481. package/dist/test-helpers.js.map +0 -1
  482. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
  483. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
  484. package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
  485. package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
@@ -72,8 +72,11 @@ export interface HashEvolution {
72
72
  * hash→hash[] 的 1→多映射,直接按同一格式解出 hash 键版本,不需要
73
73
  * getSubShapes 逐句柄 hashCode,也不分配任何句柄。
74
74
  *
75
- * generated 刻意不进 role 传播(§1.3 事实:occt 系 generated hash 指向中间形、
76
- * 对布尔实测 0 个存活),生成面改由 DerivedFaceTopoRef 以 lineage 命名。
75
+ * generated 刻意不进 role 传播。**实测依据(2026-09-22,`brep/engine/phase0-kernel-probes.test.ts`)**:
76
+ * `generated` 与 `modified` **同构分段、键集相同**,其值是各输入面派生出的**中间形**——
77
+ * `cut` 实测 12 个 hash、结果里 **0 个存活**(`fillet`/`fuse` 里整个桶为空)。
78
+ * ⇒ 新造面**不能**由 `generated` 定位,只能由"三类命运"的补集判定
79
+ * (既不在输入 hash 集合、也不在任何 `modified` 输出里),再交 `construct`/派生词汇命名。
77
80
  *
78
81
  * @param evo - the BrepEvolutionData (from a *WithHistory API).
79
82
  * @returns the hash-keyed evolution.
@@ -97,10 +100,24 @@ export declare function splitHashEvolutionByOrigin(evo: BrepEvolutionData, hashe
97
100
  b: HashEvolution;
98
101
  };
99
102
  /**
100
- * 构造 hash 键恒等演化(§2.4:变换类 translate/rotate/scale/copy 用)。
103
+ * 构造 hash 键恒等演化:输入第 i 面 hash → 输出第 i 面 hash(按枚举序号对齐)。
101
104
  *
102
- * 刚体变换/深拷贝不改变面数量与顺序:输入第 i 面 hash → 输出第 i 面 hash,
103
- * 用 subShapeHashes 两端对齐合成 hash 恒等(避免调用 *WithHistory 的签名兼容问题)。
105
+ * ⚠️ **Phase 0.3 后本函数只用于「内核无 `*WithHistory` 可表达」的 4 个 op**:
106
+ *
107
+ * | op | 为什么不能走权威映射 |
108
+ * |---|---|
109
+ * | `rotate_euler` | 任意欧拉角 + pivot;内核只有**单轴** `rotateWithHistory` |
110
+ * | `scale3d` | 非等比;`generalTransform` 无历史(`scaleWithHistory` 只收均匀 factor) |
111
+ * | `copy` | 深拷贝;内核无 `copyWithHistory` |
112
+ * | `place` | 任意矩阵 `located`;内核无对应历史 API |
113
+ *
114
+ * `translate` / `scale`(均匀)已改走权威映射(`translateWithHashEvolution` /
115
+ * `scaleWithHashEvolution`),不再经过本函数。
116
+ *
117
+ * ⚠️ **本函数的正确性依赖一个曾经未被验证的假设**:刚体变换/深拷贝保持 OCCT 的
118
+ * 面枚举序号。该假设现由 `brep/face-evolution.ordering.test.ts` 实测钉住。
119
+ * 若该测试变红 ⇒ 本函数在这 4 个 op 上会产出**错误的身份映射**,
120
+ * 必须为它们找别的权威来源,**不是**调松测试。
104
121
  *
105
122
  * @param kernel - the OCCT kernel.
106
123
  * @param inputShape - the input shape.
@@ -108,6 +125,40 @@ export declare function splitHashEvolutionByOrigin(evo: BrepEvolutionData, hashe
108
125
  * @returns the hash identity evolution (modified: in[i] → [out[i]]).
109
126
  */
110
127
  export declare function identityHashEvolution(kernel: BrepEngineApi, inputShape: BrepHandle, resultShape: BrepHandle): HashEvolution;
128
+ /**
129
+ * 平移 + **权威**面演化(Phase 0.3):走内核 `translateWithHistory`。
130
+ *
131
+ * 与 `identityHashEvolution` 的区别:这里的 `inHash → outHash[]` 是 OCCT 自己给的,
132
+ * **不依赖**"枚举序号在变换后保持"这个此前从未验证的假设(分析文档 §7 第 6 项)。
133
+ * 实测(`brep/engine/evolution-bindings.test.ts`):刚体变换的权威映射为
134
+ * 1:1 全覆盖(`coveredInputs === 面数`、`deleted` 空、`generated` 空)。
135
+ *
136
+ * @param kernel - the OCCT kernel.
137
+ * @param shape - the input shape.
138
+ * @param d - the translation vector as [dx, dy, dz].
139
+ * @returns the translated handle plus the authority hash evolution.
140
+ */
141
+ export declare function translateWithHashEvolution(kernel: BrepEngineApi, shape: BrepHandle, d: readonly [number, number, number]): {
142
+ result: BrepHandle;
143
+ evolution: HashEvolution;
144
+ };
145
+ /**
146
+ * 均匀缩放 + **权威**面演化(Phase 0.3):走内核 `scaleWithHistory`。
147
+ *
148
+ * ⚠️ **仅均匀缩放**。非均匀缩放内核无 `*WithHistory`(`generalTransform` 无历史),
149
+ * 故 `scale3d` 无法走本函数——它退回 `identityHashEvolution`,其"面序保持"假设
150
+ * 由 `brep/face-evolution.ordering.test.ts` 钉住。
151
+ *
152
+ * @param kernel - the OCCT kernel.
153
+ * @param shape - the input shape.
154
+ * @param center - the fixed point of the scaling (not scaled).
155
+ * @param factor - the uniform scale factor.
156
+ * @returns the scaled handle plus the authority hash evolution.
157
+ */
158
+ export declare function scaleWithHashEvolution(kernel: BrepEngineApi, shape: BrepHandle, center: readonly [number, number, number], factor: number): {
159
+ result: BrepHandle;
160
+ evolution: HashEvolution;
161
+ };
111
162
  /**
112
163
  * 双输入布尔 + roleTable 合流组合封装(§3.4,stdlib boolean 链式调用用)。
113
164
  *
@@ -117,7 +168,8 @@ export declare function identityHashEvolution(kernel: BrepEngineApi, inputShape:
117
168
  * - roleTable:A/B 两侧 role 表各自传播后合并(进 roleTableCache,服务命名)
118
169
  *
119
170
  * 缝面(generated)刻意不进 role 传播(§1.3/R2:generated hash 指向中间形、
120
- * 实测 0 存活),以本次语句 LHS 为 outPart 新 origin 的位置名由调用方决定。
171
+ * 实测 0 存活)。新 origin 一律是**本次语句的 StmtId**(Phase 1.6:不再用 LHS
172
+ * 变量名——PartName 会被改名/复用,StmtId 全局唯一)。
121
173
  *
122
174
  * @param kernel - the OCCT kernel.
123
175
  * @param op - the boolean operation ('fuse' | 'cut' | 'intersect').
@@ -125,10 +177,10 @@ export declare function identityHashEvolution(kernel: BrepEngineApi, inputShape:
125
177
  * @param b - the tool shape.
126
178
  * @param tableA - the target's role table.
127
179
  * @param tableB - the tool's role table.
128
- * @param outPart - the boolean statement's LHS variable name (new origin for seam faces).
180
+ * @param outStmt - the boolean statement's StmtId (串形;新 origin for seam faces).
129
181
  * @returns the result handle, ordinal evolution and merged role table.
130
182
  */
131
- export declare function booleanWithRoleTable(kernel: BrepEngineApi, op: 'fuse' | 'cut' | 'intersect', a: BrepHandle, b: BrepHandle, tableA: ReadonlyMap<unknown, unknown>, tableB: ReadonlyMap<unknown, unknown>, outPart: string): {
183
+ export declare function booleanWithRoleTable(kernel: BrepEngineApi, op: 'fuse' | 'cut' | 'intersect', a: BrepHandle, b: BrepHandle, tableA: ReadonlyMap<unknown, unknown>, tableB: ReadonlyMap<unknown, unknown>, outStmt: string): {
132
184
  result: BrepHandle;
133
185
  faceEvolution: FaceEvolution;
134
186
  roleTable: ReadonlyMap<unknown, unknown>;
@@ -241,4 +293,22 @@ export declare function chamferWithRoleTable(kernel: BrepEngineApi, solid: BrepH
241
293
  faceEvolution: FaceEvolution;
242
294
  roleTable: ReadonlyMap<unknown, unknown>;
243
295
  };
296
+ /**
297
+ * 钻孔 roleTable 传播:底孔(圆柱 cut)产生的新造面 = 孔壁,挂**消费它的那条语句**
298
+ * 的 origin(§7.1:drill 的工具体是 op 内部临时件,无其他用户可见坐标可继承)。
299
+ * 角色形态 `hole:<j>`(j = 新造面枚举序)。沿用 `directEditWithRoleTable` 的
300
+ * 三类命运判定(原样幸存 / 改型幸存 / 新造),新造面才派生命名。
301
+ *
302
+ * @param kernel - the OCCT kernel.
303
+ * @param solid - the input solid (the drilled part).
304
+ * @param toolSolid - the drill-bit tool solid (caller-built; released by caller).
305
+ * @param inputRoleTable - the input's role table.
306
+ * @param outStmt - the drilling statement's StmtId (origin for new faces).
307
+ * @returns the result handle, ordinal evolution and role table with `hole:<j>`.
308
+ */
309
+ export declare function drillBrepWithRoleTable(kernel: BrepEngineApi, solid: BrepHandle, toolSolid: BrepHandle, inputRoleTable: ReadonlyMap<unknown, unknown>, outStmt: string): {
310
+ result: BrepHandle;
311
+ faceEvolution: FaceEvolution;
312
+ roleTable: ReadonlyMap<unknown, unknown>;
313
+ };
244
314
  //# sourceMappingURL=face-evolution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"face-evolution.d.ts","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"face-evolution.d.ts","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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"}
@@ -90,8 +90,11 @@ export function decodeEvolution(kernel, evo, inputShape, resultShape) {
90
90
  * hash→hash[] 的 1→多映射,直接按同一格式解出 hash 键版本,不需要
91
91
  * getSubShapes 逐句柄 hashCode,也不分配任何句柄。
92
92
  *
93
- * generated 刻意不进 role 传播(§1.3 事实:occt 系 generated hash 指向中间形、
94
- * 对布尔实测 0 个存活),生成面改由 DerivedFaceTopoRef 以 lineage 命名。
93
+ * generated 刻意不进 role 传播。**实测依据(2026-09-22,`brep/engine/phase0-kernel-probes.test.ts`)**:
94
+ * `generated` 与 `modified` **同构分段、键集相同**,其值是各输入面派生出的**中间形**——
95
+ * `cut` 实测 12 个 hash、结果里 **0 个存活**(`fillet`/`fuse` 里整个桶为空)。
96
+ * ⇒ 新造面**不能**由 `generated` 定位,只能由"三类命运"的补集判定
97
+ * (既不在输入 hash 集合、也不在任何 `modified` 输出里),再交 `construct`/派生词汇命名。
95
98
  *
96
99
  * @param evo - the BrepEvolutionData (from a *WithHistory API).
97
100
  * @returns the hash-keyed evolution.
@@ -148,10 +151,24 @@ export function splitHashEvolutionByOrigin(evo, hashesA, hashesB) {
148
151
  return { a: { modified: aModified, deleted: aDeleted }, b: { modified: bModified, deleted: bDeleted } };
149
152
  }
150
153
  /**
151
- * 构造 hash 键恒等演化(§2.4:变换类 translate/rotate/scale/copy 用)。
154
+ * 构造 hash 键恒等演化:输入第 i 面 hash → 输出第 i 面 hash(按枚举序号对齐)。
152
155
  *
153
- * 刚体变换/深拷贝不改变面数量与顺序:输入第 i 面 hash → 输出第 i 面 hash,
154
- * 用 subShapeHashes 两端对齐合成 hash 恒等(避免调用 *WithHistory 的签名兼容问题)。
156
+ * ⚠️ **Phase 0.3 后本函数只用于「内核无 `*WithHistory` 可表达」的 4 个 op**:
157
+ *
158
+ * | op | 为什么不能走权威映射 |
159
+ * |---|---|
160
+ * | `rotate_euler` | 任意欧拉角 + pivot;内核只有**单轴** `rotateWithHistory` |
161
+ * | `scale3d` | 非等比;`generalTransform` 无历史(`scaleWithHistory` 只收均匀 factor) |
162
+ * | `copy` | 深拷贝;内核无 `copyWithHistory` |
163
+ * | `place` | 任意矩阵 `located`;内核无对应历史 API |
164
+ *
165
+ * `translate` / `scale`(均匀)已改走权威映射(`translateWithHashEvolution` /
166
+ * `scaleWithHashEvolution`),不再经过本函数。
167
+ *
168
+ * ⚠️ **本函数的正确性依赖一个曾经未被验证的假设**:刚体变换/深拷贝保持 OCCT 的
169
+ * 面枚举序号。该假设现由 `brep/face-evolution.ordering.test.ts` 实测钉住。
170
+ * 若该测试变红 ⇒ 本函数在这 4 个 op 上会产出**错误的身份映射**,
171
+ * 必须为它们找别的权威来源,**不是**调松测试。
155
172
  *
156
173
  * @param kernel - the OCCT kernel.
157
174
  * @param inputShape - the input shape.
@@ -168,6 +185,42 @@ export function identityHashEvolution(kernel, inputShape, resultShape) {
168
185
  }
169
186
  return { modified, deleted: new Set() };
170
187
  }
188
+ /**
189
+ * 平移 + **权威**面演化(Phase 0.3):走内核 `translateWithHistory`。
190
+ *
191
+ * 与 `identityHashEvolution` 的区别:这里的 `inHash → outHash[]` 是 OCCT 自己给的,
192
+ * **不依赖**"枚举序号在变换后保持"这个此前从未验证的假设(分析文档 §7 第 6 项)。
193
+ * 实测(`brep/engine/evolution-bindings.test.ts`):刚体变换的权威映射为
194
+ * 1:1 全覆盖(`coveredInputs === 面数`、`deleted` 空、`generated` 空)。
195
+ *
196
+ * @param kernel - the OCCT kernel.
197
+ * @param shape - the input shape.
198
+ * @param d - the translation vector as [dx, dy, dz].
199
+ * @returns the translated handle plus the authority hash evolution.
200
+ */
201
+ export function translateWithHashEvolution(kernel, shape, d) {
202
+ const inputHashes = getFaceHashes(kernel, shape);
203
+ const evo = kernel.translateWithHistory(shape, d[0], d[1], d[2], inputHashes, HASH_UPPER_BOUND);
204
+ return { result: evo.result, evolution: decodeHashEvolution(evo) };
205
+ }
206
+ /**
207
+ * 均匀缩放 + **权威**面演化(Phase 0.3):走内核 `scaleWithHistory`。
208
+ *
209
+ * ⚠️ **仅均匀缩放**。非均匀缩放内核无 `*WithHistory`(`generalTransform` 无历史),
210
+ * 故 `scale3d` 无法走本函数——它退回 `identityHashEvolution`,其"面序保持"假设
211
+ * 由 `brep/face-evolution.ordering.test.ts` 钉住。
212
+ *
213
+ * @param kernel - the OCCT kernel.
214
+ * @param shape - the input shape.
215
+ * @param center - the fixed point of the scaling (not scaled).
216
+ * @param factor - the uniform scale factor.
217
+ * @returns the scaled handle plus the authority hash evolution.
218
+ */
219
+ export function scaleWithHashEvolution(kernel, shape, center, factor) {
220
+ const inputHashes = getFaceHashes(kernel, shape);
221
+ const evo = kernel.scaleWithHistory(shape, { x: center[0], y: center[1], z: center[2] }, factor, inputHashes, HASH_UPPER_BOUND);
222
+ return { result: evo.result, evolution: decodeHashEvolution(evo) };
223
+ }
171
224
  /**
172
225
  * 双输入布尔 + roleTable 合流组合封装(§3.4,stdlib boolean 链式调用用)。
173
226
  *
@@ -177,7 +230,8 @@ export function identityHashEvolution(kernel, inputShape, resultShape) {
177
230
  * - roleTable:A/B 两侧 role 表各自传播后合并(进 roleTableCache,服务命名)
178
231
  *
179
232
  * 缝面(generated)刻意不进 role 传播(§1.3/R2:generated hash 指向中间形、
180
- * 实测 0 存活),以本次语句 LHS 为 outPart 新 origin 的位置名由调用方决定。
233
+ * 实测 0 存活)。新 origin 一律是**本次语句的 StmtId**(Phase 1.6:不再用 LHS
234
+ * 变量名——PartName 会被改名/复用,StmtId 全局唯一)。
181
235
  *
182
236
  * @param kernel - the OCCT kernel.
183
237
  * @param op - the boolean operation ('fuse' | 'cut' | 'intersect').
@@ -185,10 +239,10 @@ export function identityHashEvolution(kernel, inputShape, resultShape) {
185
239
  * @param b - the tool shape.
186
240
  * @param tableA - the target's role table.
187
241
  * @param tableB - the tool's role table.
188
- * @param outPart - the boolean statement's LHS variable name (new origin for seam faces).
242
+ * @param outStmt - the boolean statement's StmtId (串形;新 origin for seam faces).
189
243
  * @returns the result handle, ordinal evolution and merged role table.
190
244
  */
191
- export function booleanWithRoleTable(kernel, op, a, b, tableA, tableB, outPart) {
245
+ export function booleanWithRoleTable(kernel, op, a, b, tableA, tableB, outStmt) {
192
246
  const inputHashes = getUnionFaceHashes(kernel, a, b);
193
247
  let evo;
194
248
  if (op === 'fuse')
@@ -202,11 +256,13 @@ export function booleanWithRoleTable(kernel, op, a, b, tableA, tableB, outPart)
202
256
  const hashesA = getFaceHashes(kernel, a);
203
257
  const hashesB = getFaceHashes(kernel, b);
204
258
  const { a: evoA, b: evoB } = splitHashEvolutionByOrigin(evo, hashesA, hashesB);
205
- const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outPart);
259
+ const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outStmt);
206
260
  return { result: evo.result, faceEvolution, roleTable: merged };
207
261
  }
208
262
  /** 合表(避免 naming/roles 循环依赖:本文件不 import naming,用结构等价实现)。 */
209
- function mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outPart) {
263
+ function mergeRoleTablesLocal(tableA, evoA, tableB, evoB,
264
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- retained for future boolean generated-face naming
265
+ outPart) {
210
266
  const result = new Map();
211
267
  for (const [origin, roles] of tableA) {
212
268
  result.set(origin, propagateOriginRoles(roles, evoA));
@@ -228,8 +284,9 @@ function mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outPart) {
228
284
  result.set(origin, advanced);
229
285
  }
230
286
  }
231
- // 缝面位置名:调用方决定是否补(generated 不可靠,默认不补)
232
- void outPart;
287
+ // 3.6: void outPart removed — boolean seam faces are handled by the "three fates"
288
+ // analysis (§4.4): cut has 0 new faces (§7 item 7), fuse seam faces are a Phase 4+ concern.
289
+ // outPart retained for future kernel/byAdjacency on boolean generated faces.
233
290
  return result;
234
291
  }
235
292
  /** 单 origin 传播(结构等价于 naming/roles.propagateRoles,避免循环依赖)。 */
@@ -363,11 +420,29 @@ export function directEditWithRoleTable(kernel, op, solid, edgeHandles, radius,
363
420
  }
364
421
  const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result);
365
422
  const hashEvo = decodeHashEvolution(evo);
366
- const roleTable = propagateAllOriginsLocal(inputRoleTable, hashEvo);
367
- // outPart used for new-origin allocation in M2 (derived faces); M1 does not
368
- // generate positional roles for transition faces.
369
- void outPart;
370
- return { result: evo.result, faceEvolution, roleTable };
423
+ const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo);
424
+ // 3.4: generated face naming — transition faces are neither input faces nor
425
+ // modified outputs (§4.4 "三类命运": 原样幸存 / 改型幸存 / 新造).
426
+ // Role format: `gen:<op>:<i>` (i = enumeration order among generated faces).
427
+ // String formatted directly (no import of role-name.ts — avoids circular dep).
428
+ const resultHashes = getFaceHashes(kernel, evo.result);
429
+ const inputHashSet = new Set(inputHashes);
430
+ const modifiedOutputHashes = new Set();
431
+ for (const outs of hashEvo.modified.values()) {
432
+ for (const h of outs)
433
+ modifiedOutputHashes.add(h);
434
+ }
435
+ const generatedHashes = resultHashes.filter((h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h));
436
+ if (generatedHashes.length > 0) {
437
+ const genRoles = new Map();
438
+ for (let i = 0; i < generatedHashes.length; i++) {
439
+ genRoles.set(`gen:${op}:${i}`, [generatedHashes[i]]);
440
+ }
441
+ const roleTable = new Map(propagated);
442
+ roleTable.set(outPart, genRoles);
443
+ return { result: evo.result, faceEvolution, roleTable };
444
+ }
445
+ return { result: evo.result, faceEvolution, roleTable: propagated };
371
446
  }
372
447
  /**
373
448
  * 单输入 directEdit 的便捷别名:fillet。
@@ -397,6 +472,44 @@ export function filletWithRoleTable(kernel, solid, edgeHandles, radius, inputRol
397
472
  export function chamferWithRoleTable(kernel, solid, edgeHandles, distance, inputRoleTable, outPart) {
398
473
  return directEditWithRoleTable(kernel, 'chamfer', solid, edgeHandles, distance, inputRoleTable, outPart);
399
474
  }
475
+ /**
476
+ * 钻孔 roleTable 传播:底孔(圆柱 cut)产生的新造面 = 孔壁,挂**消费它的那条语句**
477
+ * 的 origin(§7.1:drill 的工具体是 op 内部临时件,无其他用户可见坐标可继承)。
478
+ * 角色形态 `hole:<j>`(j = 新造面枚举序)。沿用 `directEditWithRoleTable` 的
479
+ * 三类命运判定(原样幸存 / 改型幸存 / 新造),新造面才派生命名。
480
+ *
481
+ * @param kernel - the OCCT kernel.
482
+ * @param solid - the input solid (the drilled part).
483
+ * @param toolSolid - the drill-bit tool solid (caller-built; released by caller).
484
+ * @param inputRoleTable - the input's role table.
485
+ * @param outStmt - the drilling statement's StmtId (origin for new faces).
486
+ * @returns the result handle, ordinal evolution and role table with `hole:<j>`.
487
+ */
488
+ export function drillBrepWithRoleTable(kernel, solid, toolSolid, inputRoleTable, outStmt) {
489
+ const inputHashes = getFaceHashes(kernel, solid);
490
+ const evo = kernel.cutWithHistory(solid, toolSolid, inputHashes, HASH_UPPER_BOUND);
491
+ const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result);
492
+ const hashEvo = decodeHashEvolution(evo);
493
+ const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo);
494
+ // 三类命运判定:新造面 = 结果 − 输入 − 改型后继(§4.4)。
495
+ const resultHashes = getFaceHashes(kernel, evo.result);
496
+ const inputHashSet = new Set(inputHashes);
497
+ const modifiedOutputHashes = new Set();
498
+ for (const outs of hashEvo.modified.values()) {
499
+ for (const h of outs)
500
+ modifiedOutputHashes.add(h);
501
+ }
502
+ const generatedHashes = resultHashes.filter((h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h));
503
+ const roleTable = new Map(propagated);
504
+ if (generatedHashes.length > 0) {
505
+ const genRoles = new Map();
506
+ for (let i = 0; i < generatedHashes.length; i++) {
507
+ genRoles.set(`hole:${i}`, [generatedHashes[i]]);
508
+ }
509
+ roleTable.set(outStmt, genRoles);
510
+ }
511
+ return { result: evo.result, faceEvolution, roleTable };
512
+ }
400
513
  /** 单输入 roleTable 传播(结构等价于 naming/roles.propagateAllOrigins,避免循环依赖)。 */
401
514
  function propagateAllOriginsLocal(roles, evolution) {
402
515
  const result = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"face-evolution.js","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 面演化(face evolution)工具:hash 映射 ↔ ordinal 映射转换\n *\n * See docs/api-contract.md §11 (topology contract) for face evolution context.\n *\n * occt-wasm 的 *WithHistory API 返回 BrepEvolutionData,其中 modified/generated\n * 用面 hash(内存指针哈希)编码。本模块将其解码为 ordinal 映射(面枚举序号),\n * 可安全持久化进 faijs 文本。\n *\n * 核心原理(分析文档 §4.4):\n * getSubShapes(shape,'face')[i] ↔ subShapeHashes(shape,'face',B)[i] 一一对应\n * 因此可以把 hash 映射无损转换为 ordinal 映射。\n */\n\nimport type { BrepHandle, BrepEvolutionData } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\n\n/** hash 上界(与 occt-wasm kernel.cpp 一致:`% 2147483647`) */\nexport const HASH_UPPER_BOUND = 2147483647\n\n/**\n * 面演化映射:输入面 ordinal → 输出面 ordinal 列表\n *\n * - 1→1:面被修改但未被切割(如面带孔仍是单面)\n * - 1→N:面被切割成多个面\n * - 不在 map 中:面未被修改或被删除\n */\nexport type FaceEvolution = Map<number, number[]>\n\n/**\n * Collect the hash list of all faces of a shape (via subShapeHashes; efficient, no handles allocated).\n * @param kernel - the OCCT kernel.\n * @param shape - the shape whose face hashes to collect.\n * @returns the array of face hashes.\n */\nexport function getFaceHashes(kernel: BrepEngineApi, shape: BrepHandle): number[] {\n return Array.from(kernel.subShapeHashes(shape, 'face', HASH_UPPER_BOUND))\n}\n\n/**\n * Collect the union of face hashes of two shapes (for WithHistory calls of binary boolean operations).\n *\n * Analysis doc §4.2: fuse/cut/intersect must pass subShapeHashes(A) ∪ subShapeHashes(B)\n * to track both inputs' face evolution.\n * @param kernel - the OCCT kernel.\n * @param shapeA - the first input shape.\n * @param shapeB - the second input shape.\n * @returns the union of the two shapes' face hashes.\n */\nexport function getUnionFaceHashes(\n kernel: BrepEngineApi,\n shapeA: BrepHandle,\n shapeB: BrepHandle,\n): number[] {\n const hashesA = getFaceHashes(kernel, shapeA)\n const hashesB = getFaceHashes(kernel, shapeB)\n return [...new Set([...hashesA, ...hashesB])]\n}\n\n/**\n * 解码 BrepEvolutionData 的 modified 数组为 ordinal 映射。\n *\n * modified 分段编码格式:[inputHash, count, outHash1, outHash2, ...] × N\n *\n * @param kernel the OCCT kernel.\n * @param evo the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape the input shape (for the input face hash → ordinal mapping).\n * @param resultShape the result shape (for the output face hash → ordinal mapping).\n * @returns the FaceEvolution: inOrdinal → outOrdinal[].\n */\nexport function decodeEvolution(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): FaceEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n\n // 构建 hash → ordinal 查找表\n const resultHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < resultHashes.length; i++) {\n resultHashToOrdinal.set(resultHashes[i], i)\n }\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n // 解码 modified 数组\n const evolution: FaceEvolution = new Map()\n const modified = evo.modified\n let idx = 0\n while (idx < modified.length) {\n const inHash = modified[idx]\n const count = modified[idx + 1]\n const outOrdinals: number[] = []\n for (let j = 0; j < count; j++) {\n const outHash = modified[idx + 2 + j]\n const outOrdinal = resultHashToOrdinal.get(outHash)\n if (outOrdinal !== undefined) {\n outOrdinals.push(outOrdinal)\n }\n }\n const inOrdinal = inputHashToOrdinal.get(inHash)\n if (inOrdinal !== undefined) {\n evolution.set(inOrdinal, outOrdinals)\n }\n idx += 2 + count\n }\n\n return evolution\n}\n\n\n/**\n * Hash 键面演化:输入面 hash → 输出面 hash 列表(1→多分裂时多个)。\n *\n * 与序号键 FaceEvolution 并列、同源(同一次 *WithHistory 打包结果解出),\n * 一个供 role 传播(hash 键)、一个供选择器/文本(序号键),零额外 wasm 调用。\n */\nexport interface HashEvolution {\n /** 输入面 hash → 输出面 hash 列表(1→多分裂时多个)。 */\n readonly modified: ReadonlyMap<number, readonly number[]>\n /** 输入面中已不存在的面 hash。 */\n readonly deleted: ReadonlySet<number>\n}\n\n/**\n * 把 BrepEvolutionData 解码为 hash 键演化(§2.4)。\n *\n * modified 分段编码格式:[inHash, count, outHash1, ...] × N —— 本身就是\n * hash→hash[] 的 1→多映射,直接按同一格式解出 hash 键版本,不需要\n * getSubShapes 逐句柄 hashCode,也不分配任何句柄。\n *\n * generated 刻意不进 role 传播(§1.3 事实:occt 系 generated hash 指向中间形、\n * 对布尔实测 0 个存活),生成面改由 DerivedFaceTopoRef 以 lineage 命名。\n *\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @returns the hash-keyed evolution.\n */\nexport function decodeHashEvolution(evo: BrepEvolutionData): HashEvolution {\n const modified = new Map<number, number[]>()\n const m = evo.modified\n let idx = 0\n while (idx < m.length) {\n const inHash = m[idx]\n const count = m[idx + 1]\n const outHashes: number[] = []\n for (let j = 0; j < count; j++) {\n outHashes.push(m[idx + 2 + j])\n }\n modified.set(inHash, outHashes)\n idx += 2 + count\n }\n return { modified, deleted: new Set(evo.deleted) }\n}\n\n/**\n * 把一次双输入布尔(cut/fuse/intersect)的打包演化按「inHash 属于 A 还是 B」\n * 拆成 A、B 两张 hash 演化(§3.4 布尔合流,faijs 对 brepjs 的必要扩展)。\n *\n * 现有 *WithHistoryBrep 包装只用 getUnionFaceHashes 传入 A∪B 两边 hash、且只对\n * 基体 a 解码序号演化。本函数对同一份 evo 零额外内核调用:用 subShapeHashes(a)\n * / subShapeHashes(b) 两个集合判定每个 inHash 的归属,各自传播各自的 role 表。\n *\n * @param evo - the BrepEvolutionData (from a binary boolean *WithHistory API).\n * @param hashesA - the face hashes of input A (target), via subShapeHashes.\n * @param hashesB - the face hashes of input B (tool), via subShapeHashes.\n * @returns the A/B split hash evolutions (faces from neither input are dropped).\n */\nexport function splitHashEvolutionByOrigin(\n evo: BrepEvolutionData,\n hashesA: readonly number[],\n hashesB: readonly number[],\n): { a: HashEvolution; b: HashEvolution } {\n const raw = decodeHashEvolution(evo)\n const setA = new Set(hashesA)\n const setB = new Set(hashesB)\n\n const aModified = new Map<number, number[]>()\n const bModified = new Map<number, number[]>()\n for (const [inHash, outs] of raw.modified) {\n if (setA.has(inHash)) aModified.set(inHash, [...outs])\n else if (setB.has(inHash)) bModified.set(inHash, [...outs])\n }\n\n const aDeleted = new Set<number>()\n const bDeleted = new Set<number>()\n for (const h of raw.deleted) {\n if (setA.has(h)) aDeleted.add(h)\n else if (setB.has(h)) bDeleted.add(h)\n }\n\n return { a: { modified: aModified, deleted: aDeleted }, b: { modified: bModified, deleted: bDeleted } }\n}\n\n/**\n * 构造 hash 键恒等演化(§2.4:变换类 translate/rotate/scale/copy 用)。\n *\n * 刚体变换/深拷贝不改变面数量与顺序:输入第 i 面 hash → 输出第 i 面 hash,\n * 用 subShapeHashes 两端对齐合成 hash 恒等(避免调用 *WithHistory 的签名兼容问题)。\n *\n * @param kernel - the OCCT kernel.\n * @param inputShape - the input shape.\n * @param resultShape - the transformed/copied output shape.\n * @returns the hash identity evolution (modified: in[i] → [out[i]]).\n */\nexport function identityHashEvolution(\n kernel: BrepEngineApi,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): HashEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n const count = Math.min(inputHashes.length, resultHashes.length)\n const modified = new Map<number, number[]>()\n for (let i = 0; i < count; i++) {\n modified.set(inputHashes[i], [resultHashes[i]])\n }\n return { modified, deleted: new Set() }\n}\n\n/**\n * 双输入布尔 + roleTable 合流组合封装(§3.4,stdlib boolean 链式调用用)。\n *\n * 一次 *WithHistory 内核调用同时产出:\n * - result:结果实体\n * - faceEvolution:序号键演化(进 faceEvolutionCache,服务选择器/可视化)\n * - roleTable:A/B 两侧 role 表各自传播后合并(进 roleTableCache,服务命名)\n *\n * 缝面(generated)刻意不进 role 传播(§1.3/R2:generated hash 指向中间形、\n * 实测 0 存活),以本次语句 LHS 为 outPart 新 origin 的位置名由调用方决定。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the boolean operation ('fuse' | 'cut' | 'intersect').\n * @param a - the target shape.\n * @param b - the tool shape.\n * @param tableA - the target's role table.\n * @param tableB - the tool's role table.\n * @param outPart - the boolean statement's LHS variable name (new origin for seam faces).\n * @returns the result handle, ordinal evolution and merged role table.\n */\nexport function booleanWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fuse' | 'cut' | 'intersect',\n a: BrepHandle,\n b: BrepHandle,\n tableA: ReadonlyMap<unknown, unknown>,\n tableB: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n let evo: BrepEvolutionData\n if (op === 'fuse') evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else if (op === 'cut') evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n\n // A/B 拆流 → 各自传播 → 合表(§3.4)\n const hashesA = getFaceHashes(kernel, a)\n const hashesB = getFaceHashes(kernel, b)\n const { a: evoA, b: evoB } = splitHashEvolutionByOrigin(evo, hashesA, hashesB)\n const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outPart)\n\n return { result: evo.result, faceEvolution, roleTable: merged }\n}\n\n/** 合表(避免 naming/roles 循环依赖:本文件不 import naming,用结构等价实现)。 */\nfunction mergeRoleTablesLocal(\n tableA: ReadonlyMap<unknown, unknown>,\n evoA: HashEvolution,\n tableB: ReadonlyMap<unknown, unknown>,\n evoB: HashEvolution,\n outPart: string,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, roles] of tableA) {\n result.set(origin, propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoA))\n }\n for (const [origin, roles] of tableB) {\n const existing = result.get(origin) as ReadonlyMap<string, readonly number[]> | undefined\n const advanced = propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoB)\n if (existing) {\n const merged = new Map<string, number[]>()\n for (const [role, hs] of existing) merged.set(role, [...hs])\n for (const [role, hs] of advanced) {\n const prev = merged.get(role)\n merged.set(role, prev ? [...new Set([...prev, ...hs])] : [...hs])\n }\n result.set(origin, merged)\n } else {\n result.set(origin, advanced)\n }\n }\n // 缝面位置名:调用方决定是否补(generated 不可靠,默认不补)\n void outPart\n return result\n}\n\n/** 单 origin 传播(结构等价于 naming/roles.propagateRoles,避免循环依赖)。 */\nfunction propagateOriginRoles(\n roles: ReadonlyMap<string, readonly number[]>,\n evolution: HashEvolution,\n): ReadonlyMap<string, readonly number[]> {\n const updated = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors: number[] = []\n for (const hash of hashes) {\n if (evolution.deleted.has(hash)) continue\n const modified = evolution.modified.get(hash)\n const targets = modified !== undefined && modified.length > 0 ? modified : [hash]\n for (const h of targets) if (!successors.includes(h)) successors.push(h)\n }\n if (successors.length > 0) updated.set(role, successors)\n }\n return updated\n}\n\n/**\n * Decode a BrepEvolutionData deleted array into the ordinal list of deleted faces.\n * @param kernel - the OCCT kernel.\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape - the input shape (for the hash → ordinal mapping).\n * @returns the array of deleted face ordinals.\n */\nexport function decodeDeleted(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n): number[] {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n const deletedOrdinals: number[] = []\n for (const hash of evo.deleted) {\n const ordinal = inputHashToOrdinal.get(hash)\n if (ordinal !== undefined) {\n deletedOrdinals.push(ordinal)\n }\n }\n return deletedOrdinals\n}\n\n// ─── WithHistory 封装函数 ───\n\n/**\n * cutWithHistory 封装:执行切割并返回结果 + 面演化映射。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns { result: 结果 BrepHandle, faceEvolution: 面演化映射 }\n */\nexport function cutWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * fuseWithHistory wrapper: performs the fuse and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the base shape.\n * @param b - the tool shape to fuse into the base.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function fuseWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * intersectWithHistory wrapper: performs the intersection and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the first input shape.\n * @param b - the second input shape.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function intersectWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n// ─── 变换操作面演化 ───\n\n/**\n * 构造恒等面演化映射(用于 translate/rotate/scale 等不改变拓扑的操作)。\n *\n * 变换操作不改变面的数量和顺序,每个面 ordinal i → [i]。\n * 避免调用 *WithHistory API(rotate/scale 的 WithHistory 签名与现有 Euler/Vec3 参数不兼容)。\n *\n * @param kernel OCCT 内核\n * @param shape 输入形状(用于获取面数量)\n * @returns 恒等 FaceEvolution\n */\nexport function identityEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n): FaceEvolution {\n const faceCount = getFaceHashes(kernel, shape).length\n const evolution: FaceEvolution = new Map()\n for (let i = 0; i < faceCount; i++) {\n evolution.set(i, [i])\n }\n return evolution\n}\n\n// ─── directEdit WithHistory 封装(fillet / chamfer:单输入) ───\n\n/**\n * 单输入 directEdit(fillet/chamfer)+ roleTable 传播封装。\n *\n * 与 `booleanWithRoleTable`(双输入)对应:单输入只有一张输入 role 表,\n * 一次 `*WithHistory` 内核调用产出结果 + 面演化,沿 hash 演化推进所有 origin。\n *\n * generated 刻意不进 role 传播(§1.3 事实:generated hash 指向中间形,\n * 实测 0 存活),过渡面的命名由 DerivedFaceTopoRef 在 M2 处理。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the directEdit operation ('fillet' | 'chamfer').\n * @param solid - the input solid (single input, unlike boolean's a/b).\n * @param edgeHandles - the resolved Edge handles to fillet/chamfer.\n * @param radius - the fillet radius or chamfer distance (uniform only).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name (for new origin allocation).\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function directEditWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fillet' | 'chamfer',\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n let evo: BrepEvolutionData\n if (op === 'fillet') {\n evo = kernel.filletWithHistory(solid, edgeHandles, radius, inputHashes, HASH_UPPER_BOUND)\n } else {\n evo = kernel.chamferWithHistory(solid, edgeHandles, radius, inputHashes, HASH_UPPER_BOUND)\n }\n\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const roleTable = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // outPart used for new-origin allocation in M2 (derived faces); M1 does not\n // generate positional roles for transition faces.\n void outPart\n\n return { result: evo.result, faceEvolution, roleTable }\n}\n\n/**\n * 单输入 directEdit 的便捷别名:fillet。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param radius - the fillet radius (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function filletWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'fillet', solid, edgeHandles, radius, inputRoleTable, outPart)\n}\n\n/**\n * 单输入 directEdit 的便捷别名:chamfer。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param distance - the chamfer distance (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function chamferWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n distance: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'chamfer', solid, edgeHandles, distance, inputRoleTable, outPart)\n}\n\n/** 单输入 roleTable 传播(结构等价于 naming/roles.propagateAllOrigins,避免循环依赖)。 */\nfunction propagateAllOriginsLocal(\n roles: ReadonlyMap<unknown, unknown>,\n evolution: HashEvolution,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, originRoles] of roles) {\n result.set(origin, propagateOriginRoles(originRoles as ReadonlyMap<string, readonly number[]>, evolution))\n }\n return result\n}\n"]}
1
+ {"version":3,"file":"face-evolution.js","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAA;AAW1C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,KAAiB;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAC3E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAqB,EACrB,MAAkB,EAClB,MAAkB;IAElB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAqB,EACrB,GAAsB,EACtB,UAAsB,EACtB,WAAuB;IAEvB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAEvD,wBAAwB;IACxB,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAA;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAA;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAA;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC7B,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QAC/B,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACnD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACvC,CAAC;QACD,GAAG,IAAI,CAAC,GAAG,KAAK,CAAA;IAClB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAgBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAsB;IACxD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAA;IACtB,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QACxB,MAAM,SAAS,GAAa,EAAE,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC/B,GAAG,IAAI,CAAC,GAAG,KAAK,CAAA;IAClB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CACxC,GAAsB,EACtB,OAA0B,EAC1B,OAA0B;IAE1B,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAE7B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC7C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;aACjD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;aAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAA;AACzG,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAqB,EACrB,UAAsB,EACtB,WAAuB;IAEvB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAA;AACzC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAqB,EACrB,KAAiB,EACjB,CAAoC;IAEpC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAC/F,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAA;AACpE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAqB,EACrB,KAAiB,EACjB,MAAyC,EACzC,MAAc;IAEd,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CACjC,KAAK,EACL,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAC5C,MAAM,EACN,WAAW,EACX,gBAAgB,CACjB,CAAA;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAA;AACpE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,EAAgC,EAChC,CAAa,EACb,CAAa,EACb,MAAqC,EACrC,MAAqC,EACrC,OAAe;IAEf,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,IAAI,GAAsB,CAAA;IAC1B,IAAI,EAAE,KAAK,MAAM;QAAE,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;SAC/E,IAAI,EAAE,KAAK,KAAK;QAAE,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;;QAClF,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAE3E,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAEjE,2BAA2B;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACxC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9E,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAExE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;AACjE,CAAC;AAED,2DAA2D;AAC3D,SAAS,oBAAoB,CAC3B,MAAqC,EACrC,IAAmB,EACnB,MAAqC,EACrC,IAAmB;AACnB,kHAAkH;AAClH,OAAe;IAEf,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAA+C,EAAE,IAAI,CAAC,CAAC,CAAA;IACjG,CAAC;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAuD,CAAA;QACzF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAA+C,EAAE,IAAI,CAAC,CAAA;QAC5F,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;YAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ;gBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5D,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACnE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IACD,kFAAkF;IAClF,4FAA4F;IAC5F,6EAA6E;IAC7E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,6DAA6D;AAC7D,SAAS,oBAAoB,CAC3B,KAA6C,EAC7C,SAAwB;IAExB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACnC,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAQ;YACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACjF,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1E,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC1D,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,GAAsB,EACtB,UAAsB;IAEtB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAA;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,2BAA2B;AAE3B;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAqB,EACrB,CAAa,EACb,CAAa;IAEb,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IACtE,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACjE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAA;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAqB,EACrB,CAAa,EACb,CAAa;IAEb,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IACvE,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACjE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAA;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAqB,EACrB,CAAa,EACb,CAAa;IAEb,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAC5E,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACjE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAA;AAC9C,CAAC;AAED,kBAAkB;AAElB;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,KAAiB;IAEjB,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAA;IACrD,MAAM,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAA;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,0DAA0D;AAE1D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAqB,EACrB,EAAwB,EACxB,KAAiB,EACjB,WAAyB,EACzB,MAAc,EACd,cAA6C,EAC7C,OAAe;IAEf,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAChD,IAAI,GAAsB,CAAA;IAC1B,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAC3F,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAC5F,CAAC;IAED,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,UAAU,GAAG,wBAAwB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAEpE,4EAA4E;IAC5E,oDAAoD;IACpD,6EAA6E;IAC7E,+EAA+E;IAC/E,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;IACzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAC5D,CAAA;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;QACvD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA;QACrC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAChC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAAA;IACzD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;AACrE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAqB,EACrB,KAAiB,EACjB,WAAyB,EACzB,MAAc,EACd,cAA6C,EAC7C,OAAe;IAEf,OAAO,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;AACvG,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,KAAiB,EACjB,WAAyB,EACzB,QAAgB,EAChB,cAA6C,EAC7C,OAAe;IAEf,OAAO,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;AAC1G,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAqB,EACrB,KAAiB,EACjB,SAAqB,EACrB,cAA6C,EAC7C,OAAe;IAEf,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAClF,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,UAAU,GAAG,wBAAwB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAEpE,qCAAqC;IACrC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;IACzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAC5D,CAAA;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA;IACrC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAAA;AACzD,CAAC;AAED,uEAAuE;AACvE,SAAS,wBAAwB,CAC/B,KAAoC,EACpC,SAAwB;IAExB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,WAAqD,EAAE,SAAS,CAAC,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["/**\n * 面演化(face evolution)工具:hash 映射 ↔ ordinal 映射转换\n *\n * See docs/api-contract.md §11 (topology contract) for face evolution context.\n *\n * occt-wasm 的 *WithHistory API 返回 BrepEvolutionData,其中 modified/generated\n * 用面 hash(内存指针哈希)编码。本模块将其解码为 ordinal 映射(面枚举序号),\n * 可安全持久化进 faijs 文本。\n *\n * 核心原理(分析文档 §4.4):\n * getSubShapes(shape,'face')[i] ↔ subShapeHashes(shape,'face',B)[i] 一一对应\n * 因此可以把 hash 映射无损转换为 ordinal 映射。\n */\n\nimport type { BrepHandle, BrepEvolutionData } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\n\n/** hash 上界(与 occt-wasm kernel.cpp 一致:`% 2147483647`) */\nexport const HASH_UPPER_BOUND = 2147483647\n\n/**\n * 面演化映射:输入面 ordinal → 输出面 ordinal 列表\n *\n * - 1→1:面被修改但未被切割(如面带孔仍是单面)\n * - 1→N:面被切割成多个面\n * - 不在 map 中:面未被修改或被删除\n */\nexport type FaceEvolution = Map<number, number[]>\n\n/**\n * Collect the hash list of all faces of a shape (via subShapeHashes; efficient, no handles allocated).\n * @param kernel - the OCCT kernel.\n * @param shape - the shape whose face hashes to collect.\n * @returns the array of face hashes.\n */\nexport function getFaceHashes(kernel: BrepEngineApi, shape: BrepHandle): number[] {\n return Array.from(kernel.subShapeHashes(shape, 'face', HASH_UPPER_BOUND))\n}\n\n/**\n * Collect the union of face hashes of two shapes (for WithHistory calls of binary boolean operations).\n *\n * Analysis doc §4.2: fuse/cut/intersect must pass subShapeHashes(A) ∪ subShapeHashes(B)\n * to track both inputs' face evolution.\n * @param kernel - the OCCT kernel.\n * @param shapeA - the first input shape.\n * @param shapeB - the second input shape.\n * @returns the union of the two shapes' face hashes.\n */\nexport function getUnionFaceHashes(\n kernel: BrepEngineApi,\n shapeA: BrepHandle,\n shapeB: BrepHandle,\n): number[] {\n const hashesA = getFaceHashes(kernel, shapeA)\n const hashesB = getFaceHashes(kernel, shapeB)\n return [...new Set([...hashesA, ...hashesB])]\n}\n\n/**\n * 解码 BrepEvolutionData 的 modified 数组为 ordinal 映射。\n *\n * modified 分段编码格式:[inputHash, count, outHash1, outHash2, ...] × N\n *\n * @param kernel the OCCT kernel.\n * @param evo the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape the input shape (for the input face hash → ordinal mapping).\n * @param resultShape the result shape (for the output face hash → ordinal mapping).\n * @returns the FaceEvolution: inOrdinal → outOrdinal[].\n */\nexport function decodeEvolution(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): FaceEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n\n // 构建 hash → ordinal 查找表\n const resultHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < resultHashes.length; i++) {\n resultHashToOrdinal.set(resultHashes[i], i)\n }\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n // 解码 modified 数组\n const evolution: FaceEvolution = new Map()\n const modified = evo.modified\n let idx = 0\n while (idx < modified.length) {\n const inHash = modified[idx]\n const count = modified[idx + 1]\n const outOrdinals: number[] = []\n for (let j = 0; j < count; j++) {\n const outHash = modified[idx + 2 + j]\n const outOrdinal = resultHashToOrdinal.get(outHash)\n if (outOrdinal !== undefined) {\n outOrdinals.push(outOrdinal)\n }\n }\n const inOrdinal = inputHashToOrdinal.get(inHash)\n if (inOrdinal !== undefined) {\n evolution.set(inOrdinal, outOrdinals)\n }\n idx += 2 + count\n }\n\n return evolution\n}\n\n\n/**\n * Hash 键面演化:输入面 hash → 输出面 hash 列表(1→多分裂时多个)。\n *\n * 与序号键 FaceEvolution 并列、同源(同一次 *WithHistory 打包结果解出),\n * 一个供 role 传播(hash 键)、一个供选择器/文本(序号键),零额外 wasm 调用。\n */\nexport interface HashEvolution {\n /** 输入面 hash → 输出面 hash 列表(1→多分裂时多个)。 */\n readonly modified: ReadonlyMap<number, readonly number[]>\n /** 输入面中已不存在的面 hash。 */\n readonly deleted: ReadonlySet<number>\n}\n\n/**\n * 把 BrepEvolutionData 解码为 hash 键演化(§2.4)。\n *\n * modified 分段编码格式:[inHash, count, outHash1, ...] × N —— 本身就是\n * hash→hash[] 的 1→多映射,直接按同一格式解出 hash 键版本,不需要\n * getSubShapes 逐句柄 hashCode,也不分配任何句柄。\n *\n * generated 刻意不进 role 传播。**实测依据(2026-09-22,`brep/engine/phase0-kernel-probes.test.ts`)**:\n * `generated` 与 `modified` **同构分段、键集相同**,其值是各输入面派生出的**中间形**——\n * `cut` 实测 12 个 hash、结果里 **0 个存活**(`fillet`/`fuse` 里整个桶为空)。\n * ⇒ 新造面**不能**由 `generated` 定位,只能由\"三类命运\"的补集判定\n * (既不在输入 hash 集合、也不在任何 `modified` 输出里),再交 `construct`/派生词汇命名。\n *\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @returns the hash-keyed evolution.\n */\nexport function decodeHashEvolution(evo: BrepEvolutionData): HashEvolution {\n const modified = new Map<number, number[]>()\n const m = evo.modified\n let idx = 0\n while (idx < m.length) {\n const inHash = m[idx]\n const count = m[idx + 1]\n const outHashes: number[] = []\n for (let j = 0; j < count; j++) {\n outHashes.push(m[idx + 2 + j])\n }\n modified.set(inHash, outHashes)\n idx += 2 + count\n }\n return { modified, deleted: new Set(evo.deleted) }\n}\n\n/**\n * 把一次双输入布尔(cut/fuse/intersect)的打包演化按「inHash 属于 A 还是 B」\n * 拆成 A、B 两张 hash 演化(§3.4 布尔合流,faijs 对 brepjs 的必要扩展)。\n *\n * 现有 *WithHistoryBrep 包装只用 getUnionFaceHashes 传入 A∪B 两边 hash、且只对\n * 基体 a 解码序号演化。本函数对同一份 evo 零额外内核调用:用 subShapeHashes(a)\n * / subShapeHashes(b) 两个集合判定每个 inHash 的归属,各自传播各自的 role 表。\n *\n * @param evo - the BrepEvolutionData (from a binary boolean *WithHistory API).\n * @param hashesA - the face hashes of input A (target), via subShapeHashes.\n * @param hashesB - the face hashes of input B (tool), via subShapeHashes.\n * @returns the A/B split hash evolutions (faces from neither input are dropped).\n */\nexport function splitHashEvolutionByOrigin(\n evo: BrepEvolutionData,\n hashesA: readonly number[],\n hashesB: readonly number[],\n): { a: HashEvolution; b: HashEvolution } {\n const raw = decodeHashEvolution(evo)\n const setA = new Set(hashesA)\n const setB = new Set(hashesB)\n\n const aModified = new Map<number, number[]>()\n const bModified = new Map<number, number[]>()\n for (const [inHash, outs] of raw.modified) {\n if (setA.has(inHash)) aModified.set(inHash, [...outs])\n else if (setB.has(inHash)) bModified.set(inHash, [...outs])\n }\n\n const aDeleted = new Set<number>()\n const bDeleted = new Set<number>()\n for (const h of raw.deleted) {\n if (setA.has(h)) aDeleted.add(h)\n else if (setB.has(h)) bDeleted.add(h)\n }\n\n return { a: { modified: aModified, deleted: aDeleted }, b: { modified: bModified, deleted: bDeleted } }\n}\n\n/**\n * 构造 hash 键恒等演化:输入第 i 面 hash → 输出第 i 面 hash(按枚举序号对齐)。\n *\n * ⚠️ **Phase 0.3 后本函数只用于「内核无 `*WithHistory` 可表达」的 4 个 op**:\n *\n * | op | 为什么不能走权威映射 |\n * |---|---|\n * | `rotate_euler` | 任意欧拉角 + pivot;内核只有**单轴** `rotateWithHistory` |\n * | `scale3d` | 非等比;`generalTransform` 无历史(`scaleWithHistory` 只收均匀 factor) |\n * | `copy` | 深拷贝;内核无 `copyWithHistory` |\n * | `place` | 任意矩阵 `located`;内核无对应历史 API |\n *\n * `translate` / `scale`(均匀)已改走权威映射(`translateWithHashEvolution` /\n * `scaleWithHashEvolution`),不再经过本函数。\n *\n * ⚠️ **本函数的正确性依赖一个曾经未被验证的假设**:刚体变换/深拷贝保持 OCCT 的\n * 面枚举序号。该假设现由 `brep/face-evolution.ordering.test.ts` 实测钉住。\n * 若该测试变红 ⇒ 本函数在这 4 个 op 上会产出**错误的身份映射**,\n * 必须为它们找别的权威来源,**不是**调松测试。\n *\n * @param kernel - the OCCT kernel.\n * @param inputShape - the input shape.\n * @param resultShape - the transformed/copied output shape.\n * @returns the hash identity evolution (modified: in[i] → [out[i]]).\n */\nexport function identityHashEvolution(\n kernel: BrepEngineApi,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): HashEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n const count = Math.min(inputHashes.length, resultHashes.length)\n const modified = new Map<number, number[]>()\n for (let i = 0; i < count; i++) {\n modified.set(inputHashes[i], [resultHashes[i]])\n }\n return { modified, deleted: new Set() }\n}\n\n/**\n * 平移 + **权威**面演化(Phase 0.3):走内核 `translateWithHistory`。\n *\n * 与 `identityHashEvolution` 的区别:这里的 `inHash → outHash[]` 是 OCCT 自己给的,\n * **不依赖**\"枚举序号在变换后保持\"这个此前从未验证的假设(分析文档 §7 第 6 项)。\n * 实测(`brep/engine/evolution-bindings.test.ts`):刚体变换的权威映射为\n * 1:1 全覆盖(`coveredInputs === 面数`、`deleted` 空、`generated` 空)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the input shape.\n * @param d - the translation vector as [dx, dy, dz].\n * @returns the translated handle plus the authority hash evolution.\n */\nexport function translateWithHashEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n d: readonly [number, number, number],\n): { result: BrepHandle; evolution: HashEvolution } {\n const inputHashes = getFaceHashes(kernel, shape)\n const evo = kernel.translateWithHistory(shape, d[0], d[1], d[2], inputHashes, HASH_UPPER_BOUND)\n return { result: evo.result, evolution: decodeHashEvolution(evo) }\n}\n\n/**\n * 均匀缩放 + **权威**面演化(Phase 0.3):走内核 `scaleWithHistory`。\n *\n * ⚠️ **仅均匀缩放**。非均匀缩放内核无 `*WithHistory`(`generalTransform` 无历史),\n * 故 `scale3d` 无法走本函数——它退回 `identityHashEvolution`,其\"面序保持\"假设\n * 由 `brep/face-evolution.ordering.test.ts` 钉住。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the input shape.\n * @param center - the fixed point of the scaling (not scaled).\n * @param factor - the uniform scale factor.\n * @returns the scaled handle plus the authority hash evolution.\n */\nexport function scaleWithHashEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n center: readonly [number, number, number],\n factor: number,\n): { result: BrepHandle; evolution: HashEvolution } {\n const inputHashes = getFaceHashes(kernel, shape)\n const evo = kernel.scaleWithHistory(\n shape,\n { x: center[0], y: center[1], z: center[2] },\n factor,\n inputHashes,\n HASH_UPPER_BOUND,\n )\n return { result: evo.result, evolution: decodeHashEvolution(evo) }\n}\n\n/**\n * 双输入布尔 + roleTable 合流组合封装(§3.4,stdlib boolean 链式调用用)。\n *\n * 一次 *WithHistory 内核调用同时产出:\n * - result:结果实体\n * - faceEvolution:序号键演化(进 faceEvolutionCache,服务选择器/可视化)\n * - roleTable:A/B 两侧 role 表各自传播后合并(进 roleTableCache,服务命名)\n *\n * 缝面(generated)刻意不进 role 传播(§1.3/R2:generated hash 指向中间形、\n * 实测 0 存活)。新 origin 一律是**本次语句的 StmtId**(Phase 1.6:不再用 LHS\n * 变量名——PartName 会被改名/复用,StmtId 全局唯一)。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the boolean operation ('fuse' | 'cut' | 'intersect').\n * @param a - the target shape.\n * @param b - the tool shape.\n * @param tableA - the target's role table.\n * @param tableB - the tool's role table.\n * @param outStmt - the boolean statement's StmtId (串形;新 origin for seam faces).\n * @returns the result handle, ordinal evolution and merged role table.\n */\nexport function booleanWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fuse' | 'cut' | 'intersect',\n a: BrepHandle,\n b: BrepHandle,\n tableA: ReadonlyMap<unknown, unknown>,\n tableB: ReadonlyMap<unknown, unknown>,\n outStmt: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n let evo: BrepEvolutionData\n if (op === 'fuse') evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else if (op === 'cut') evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n\n // A/B 拆流 → 各自传播 → 合表(§3.4)\n const hashesA = getFaceHashes(kernel, a)\n const hashesB = getFaceHashes(kernel, b)\n const { a: evoA, b: evoB } = splitHashEvolutionByOrigin(evo, hashesA, hashesB)\n const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outStmt)\n\n return { result: evo.result, faceEvolution, roleTable: merged }\n}\n\n/** 合表(避免 naming/roles 循环依赖:本文件不 import naming,用结构等价实现)。 */\nfunction mergeRoleTablesLocal(\n tableA: ReadonlyMap<unknown, unknown>,\n evoA: HashEvolution,\n tableB: ReadonlyMap<unknown, unknown>,\n evoB: HashEvolution,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- retained for future boolean generated-face naming\n outPart: string,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, roles] of tableA) {\n result.set(origin, propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoA))\n }\n for (const [origin, roles] of tableB) {\n const existing = result.get(origin) as ReadonlyMap<string, readonly number[]> | undefined\n const advanced = propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoB)\n if (existing) {\n const merged = new Map<string, number[]>()\n for (const [role, hs] of existing) merged.set(role, [...hs])\n for (const [role, hs] of advanced) {\n const prev = merged.get(role)\n merged.set(role, prev ? [...new Set([...prev, ...hs])] : [...hs])\n }\n result.set(origin, merged)\n } else {\n result.set(origin, advanced)\n }\n }\n // 3.6: void outPart removed — boolean seam faces are handled by the \"three fates\"\n // analysis (§4.4): cut has 0 new faces (§7 item 7), fuse seam faces are a Phase 4+ concern.\n // outPart retained for future kernel/byAdjacency on boolean generated faces.\n return result\n}\n\n/** 单 origin 传播(结构等价于 naming/roles.propagateRoles,避免循环依赖)。 */\nfunction propagateOriginRoles(\n roles: ReadonlyMap<string, readonly number[]>,\n evolution: HashEvolution,\n): ReadonlyMap<string, readonly number[]> {\n const updated = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors: number[] = []\n for (const hash of hashes) {\n if (evolution.deleted.has(hash)) continue\n const modified = evolution.modified.get(hash)\n const targets = modified !== undefined && modified.length > 0 ? modified : [hash]\n for (const h of targets) if (!successors.includes(h)) successors.push(h)\n }\n if (successors.length > 0) updated.set(role, successors)\n }\n return updated\n}\n\n/**\n * Decode a BrepEvolutionData deleted array into the ordinal list of deleted faces.\n * @param kernel - the OCCT kernel.\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape - the input shape (for the hash → ordinal mapping).\n * @returns the array of deleted face ordinals.\n */\nexport function decodeDeleted(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n): number[] {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n const deletedOrdinals: number[] = []\n for (const hash of evo.deleted) {\n const ordinal = inputHashToOrdinal.get(hash)\n if (ordinal !== undefined) {\n deletedOrdinals.push(ordinal)\n }\n }\n return deletedOrdinals\n}\n\n// ─── WithHistory 封装函数 ───\n\n/**\n * cutWithHistory 封装:执行切割并返回结果 + 面演化映射。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns { result: 结果 BrepHandle, faceEvolution: 面演化映射 }\n */\nexport function cutWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * fuseWithHistory wrapper: performs the fuse and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the base shape.\n * @param b - the tool shape to fuse into the base.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function fuseWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * intersectWithHistory wrapper: performs the intersection and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the first input shape.\n * @param b - the second input shape.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function intersectWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n// ─── 变换操作面演化 ───\n\n/**\n * 构造恒等面演化映射(用于 translate/rotate/scale 等不改变拓扑的操作)。\n *\n * 变换操作不改变面的数量和顺序,每个面 ordinal i → [i]。\n * 避免调用 *WithHistory API(rotate/scale 的 WithHistory 签名与现有 Euler/Vec3 参数不兼容)。\n *\n * @param kernel OCCT 内核\n * @param shape 输入形状(用于获取面数量)\n * @returns 恒等 FaceEvolution\n */\nexport function identityEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n): FaceEvolution {\n const faceCount = getFaceHashes(kernel, shape).length\n const evolution: FaceEvolution = new Map()\n for (let i = 0; i < faceCount; i++) {\n evolution.set(i, [i])\n }\n return evolution\n}\n\n// ─── directEdit WithHistory 封装(fillet / chamfer:单输入) ───\n\n/**\n * 单输入 directEdit(fillet/chamfer)+ roleTable 传播封装。\n *\n * 与 `booleanWithRoleTable`(双输入)对应:单输入只有一张输入 role 表,\n * 一次 `*WithHistory` 内核调用产出结果 + 面演化,沿 hash 演化推进所有 origin。\n *\n * generated 刻意不进 role 传播(§1.3 事实:generated hash 指向中间形,\n * 实测 0 存活),过渡面的命名由 DerivedFaceTopoRef 在 M2 处理。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the directEdit operation ('fillet' | 'chamfer').\n * @param solid - the input solid (single input, unlike boolean's a/b).\n * @param edgeHandles - the resolved Edge handles to fillet/chamfer.\n * @param radius - the fillet radius or chamfer distance (uniform only).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name (for new origin allocation).\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function directEditWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fillet' | 'chamfer',\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n let evo: BrepEvolutionData\n if (op === 'fillet') {\n evo = kernel.filletWithHistory(solid, edgeHandles, radius, inputHashes, HASH_UPPER_BOUND)\n } else {\n evo = kernel.chamferWithHistory(solid, edgeHandles, radius, inputHashes, HASH_UPPER_BOUND)\n }\n\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // 3.4: generated face naming — transition faces are neither input faces nor\n // modified outputs (§4.4 \"三类命运\": 原样幸存 / 改型幸存 / 新造).\n // Role format: `gen:<op>:<i>` (i = enumeration order among generated faces).\n // String formatted directly (no import of role-name.ts — avoids circular dep).\n const resultHashes = getFaceHashes(kernel, evo.result)\n const inputHashSet = new Set(inputHashes)\n const modifiedOutputHashes = new Set<number>()\n for (const outs of hashEvo.modified.values()) {\n for (const h of outs) modifiedOutputHashes.add(h)\n }\n const generatedHashes = resultHashes.filter(\n (h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h),\n )\n\n if (generatedHashes.length > 0) {\n const genRoles = new Map<string, number[]>()\n for (let i = 0; i < generatedHashes.length; i++) {\n genRoles.set(`gen:${op}:${i}`, [generatedHashes[i]!])\n }\n const roleTable = new Map(propagated)\n roleTable.set(outPart, genRoles)\n return { result: evo.result, faceEvolution, roleTable }\n }\n\n return { result: evo.result, faceEvolution, roleTable: propagated }\n}\n\n/**\n * 单输入 directEdit 的便捷别名:fillet。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param radius - the fillet radius (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function filletWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'fillet', solid, edgeHandles, radius, inputRoleTable, outPart)\n}\n\n/**\n * 单输入 directEdit 的便捷别名:chamfer。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param distance - the chamfer distance (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function chamferWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n distance: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'chamfer', solid, edgeHandles, distance, inputRoleTable, outPart)\n}\n\n/**\n * 钻孔 roleTable 传播:底孔(圆柱 cut)产生的新造面 = 孔壁,挂**消费它的那条语句**\n * 的 origin(§7.1:drill 的工具体是 op 内部临时件,无其他用户可见坐标可继承)。\n * 角色形态 `hole:<j>`(j = 新造面枚举序)。沿用 `directEditWithRoleTable` 的\n * 三类命运判定(原样幸存 / 改型幸存 / 新造),新造面才派生命名。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid (the drilled part).\n * @param toolSolid - the drill-bit tool solid (caller-built; released by caller).\n * @param inputRoleTable - the input's role table.\n * @param outStmt - the drilling statement's StmtId (origin for new faces).\n * @returns the result handle, ordinal evolution and role table with `hole:<j>`.\n */\nexport function drillBrepWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n toolSolid: BrepHandle,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outStmt: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n const evo = kernel.cutWithHistory(solid, toolSolid, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // 三类命运判定:新造面 = 结果 − 输入 − 改型后继(§4.4)。\n const resultHashes = getFaceHashes(kernel, evo.result)\n const inputHashSet = new Set(inputHashes)\n const modifiedOutputHashes = new Set<number>()\n for (const outs of hashEvo.modified.values()) {\n for (const h of outs) modifiedOutputHashes.add(h)\n }\n const generatedHashes = resultHashes.filter(\n (h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h),\n )\n\n const roleTable = new Map(propagated)\n if (generatedHashes.length > 0) {\n const genRoles = new Map<string, number[]>()\n for (let i = 0; i < generatedHashes.length; i++) {\n genRoles.set(`hole:${i}`, [generatedHashes[i]!])\n }\n roleTable.set(outStmt, genRoles)\n }\n return { result: evo.result, faceEvolution, roleTable }\n}\n\n/** 单输入 roleTable 传播(结构等价于 naming/roles.propagateAllOrigins,避免循环依赖)。 */\nfunction propagateAllOriginsLocal(\n roles: ReadonlyMap<unknown, unknown>,\n evolution: HashEvolution,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, originRoles] of roles) {\n result.set(origin, propagateOriginRoles(originRoles as ReadonlyMap<string, readonly number[]>, evolution))\n }\n return result\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * brepkit-kernel/brepkitKernel — brepkit 内核 → faijs BrepEngineApi 适配器(v1 白名单)
3
3
  *
4
- * 设计要点(对应 3d_editor/docs/plans/2026-09-18-weapp-voice-ai-modeling-design.md §5):
4
+ * 设计要点(对应 3d_editor 项目的 weapp-voice-ai-modeling 设计计划 §5):
5
5
  * - 句柄:brepkit u32 句柄与 faijs BrepHandle(number) 同构,直通零转换;
6
6
  * - 拓扑红线:meshShape 用 tessellateSolidGrouped 输出 faceGroups,与三角化几何同源;
7
7
  * - 面溯源:布尔/倒角走 *WithEvolution,映射为 BrepEvolutionData(hash 编码);
@@ -1 +1 @@
1
- {"version":3,"file":"brepkitKernel.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitKernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAkI9D,oDAAoD;AACpD,KAAK,mBAAmB,GAAG,aAAa,GAAG;IAAE,oBAAoB,IAAI,MAAM,CAAA;CAAE,CAAA;AAE7E;;;;;GAKG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAgX5E;AAwCD,8BAA8B;AAC9B,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"brepkitKernel.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitKernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAkI9D,oDAAoD;AACpD,KAAK,mBAAmB,GAAG,aAAa,GAAG;IAAE,oBAAoB,IAAI,MAAM,CAAA;CAAE,CAAA;AAE7E;;;;;GAKG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAwc5E;AA0DD,8BAA8B;AAC9B,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAA"}