@faicad/faijs 0.33.2 → 0.35.8

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 (429) hide show
  1. package/dist/api/api-namespace.d.ts +14 -14
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +40 -14
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/appearance.d.ts +47 -6
  6. package/dist/api/appearance.d.ts.map +1 -1
  7. package/dist/api/appearance.js.map +1 -1
  8. package/dist/api/assembly/entities.js +14 -4
  9. package/dist/api/assembly/entities.js.map +1 -1
  10. package/dist/api/assembly/solve-tree.d.ts +1 -0
  11. package/dist/api/assembly/solve-tree.d.ts.map +1 -1
  12. package/dist/api/assembly/solve-tree.js +42 -17
  13. package/dist/api/assembly/solve-tree.js.map +1 -1
  14. package/dist/api/assembly/solve.d.ts +1 -0
  15. package/dist/api/assembly/solve.d.ts.map +1 -1
  16. package/dist/api/assembly/solve.js.map +1 -1
  17. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  18. package/dist/api/assembly/solvers/global-solver.js +130 -23
  19. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  20. package/dist/api/assembly/solvers/pose-from-delta.d.ts +9 -0
  21. package/dist/api/assembly/solvers/pose-from-delta.d.ts.map +1 -1
  22. package/dist/api/assembly/solvers/pose-from-delta.js +23 -0
  23. package/dist/api/assembly/solvers/pose-from-delta.js.map +1 -1
  24. package/dist/api/assembly/solvers/types.d.ts +20 -2
  25. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  26. package/dist/api/assembly/solvers/types.js.map +1 -1
  27. package/dist/api/chamfer.d.ts +7 -4
  28. package/dist/api/chamfer.d.ts.map +1 -1
  29. package/dist/api/chamfer.js +57 -13
  30. package/dist/api/chamfer.js.map +1 -1
  31. package/dist/api/draft.d.ts +7 -4
  32. package/dist/api/draft.d.ts.map +1 -1
  33. package/dist/api/draft.js +11 -6
  34. package/dist/api/draft.js.map +1 -1
  35. package/dist/api/edge-ref.d.ts +4 -4
  36. package/dist/api/edge-ref.js +4 -4
  37. package/dist/api/edge-ref.js.map +1 -1
  38. package/dist/api/extrude.d.ts +10 -6
  39. package/dist/api/extrude.d.ts.map +1 -1
  40. package/dist/api/extrude.js +54 -26
  41. package/dist/api/extrude.js.map +1 -1
  42. package/dist/api/face-ref.d.ts +4 -4
  43. package/dist/api/face-ref.js +4 -4
  44. package/dist/api/face-ref.js.map +1 -1
  45. package/dist/api/feature-repair.d.ts +6 -3
  46. package/dist/api/feature-repair.d.ts.map +1 -1
  47. package/dist/api/feature-repair.js +12 -7
  48. package/dist/api/feature-repair.js.map +1 -1
  49. package/dist/api/fillet-variable.d.ts +6 -2
  50. package/dist/api/fillet-variable.d.ts.map +1 -1
  51. package/dist/api/fillet-variable.js +24 -6
  52. package/dist/api/fillet-variable.js.map +1 -1
  53. package/dist/api/fillet.d.ts +7 -4
  54. package/dist/api/fillet.d.ts.map +1 -1
  55. package/dist/api/fillet.js +92 -12
  56. package/dist/api/fillet.js.map +1 -1
  57. package/dist/api/generated/script-face-manifest.js +1 -1
  58. package/dist/api/generated/script-face-manifest.js.map +1 -1
  59. package/dist/api/generated/topology.js +1 -1
  60. package/dist/api/generated/topology.js.map +1 -1
  61. package/dist/api/helix.d.ts +13 -13
  62. package/dist/api/helix.d.ts.map +1 -1
  63. package/dist/api/helix.js +19 -24
  64. package/dist/api/helix.js.map +1 -1
  65. package/dist/api/import-brep.d.ts +10 -18
  66. package/dist/api/import-brep.d.ts.map +1 -1
  67. package/dist/api/import-brep.js +17 -25
  68. package/dist/api/import-brep.js.map +1 -1
  69. package/dist/api/import-step.d.ts +10 -15
  70. package/dist/api/import-step.d.ts.map +1 -1
  71. package/dist/api/import-step.js +24 -29
  72. package/dist/api/import-step.js.map +1 -1
  73. package/dist/api/index.js +2 -2
  74. package/dist/api/index.js.map +1 -1
  75. package/dist/api/internal/export-members.js.map +1 -1
  76. package/dist/api/loft-advanced.d.ts +4 -0
  77. package/dist/api/loft-advanced.d.ts.map +1 -1
  78. package/dist/api/loft-advanced.js +4 -0
  79. package/dist/api/loft-advanced.js.map +1 -1
  80. package/dist/api/loft.d.ts +5 -3
  81. package/dist/api/loft.d.ts.map +1 -1
  82. package/dist/api/loft.js +5 -3
  83. package/dist/api/loft.js.map +1 -1
  84. package/dist/api/meta.d.ts +42 -6
  85. package/dist/api/meta.d.ts.map +1 -1
  86. package/dist/api/meta.js.map +1 -1
  87. package/dist/api/primitives.d.ts +3 -2
  88. package/dist/api/primitives.d.ts.map +1 -1
  89. package/dist/api/primitives.js +3 -2
  90. package/dist/api/primitives.js.map +1 -1
  91. package/dist/api/punch-hole.d.ts +5 -2
  92. package/dist/api/punch-hole.d.ts.map +1 -1
  93. package/dist/api/punch-hole.js +4 -1
  94. package/dist/api/punch-hole.js.map +1 -1
  95. package/dist/api/replicate.d.ts +4 -5
  96. package/dist/api/replicate.d.ts.map +1 -1
  97. package/dist/api/replicate.js +4 -5
  98. package/dist/api/replicate.js.map +1 -1
  99. package/dist/api/selectors-to-refs.d.ts +83 -0
  100. package/dist/api/selectors-to-refs.d.ts.map +1 -0
  101. package/dist/api/selectors-to-refs.js +211 -0
  102. package/dist/api/selectors-to-refs.js.map +1 -0
  103. package/dist/api/shell.d.ts +17 -8
  104. package/dist/api/shell.d.ts.map +1 -1
  105. package/dist/api/shell.js +45 -15
  106. package/dist/api/shell.js.map +1 -1
  107. package/dist/api/sketch-on-face.d.ts +12 -6
  108. package/dist/api/sketch-on-face.d.ts.map +1 -1
  109. package/dist/api/sketch-on-face.js +31 -4
  110. package/dist/api/sketch-on-face.js.map +1 -1
  111. package/dist/api/sketch-on-plane.d.ts +3 -0
  112. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  113. package/dist/api/sketch-on-plane.js +3 -0
  114. package/dist/api/sketch-on-plane.js.map +1 -1
  115. package/dist/api/sketch-on-surface.d.ts +4 -1
  116. package/dist/api/sketch-on-surface.d.ts.map +1 -1
  117. package/dist/api/sketch-on-surface.js +4 -1
  118. package/dist/api/sketch-on-surface.js.map +1 -1
  119. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  120. package/dist/api/surface/arg-spec.js +5 -6
  121. package/dist/api/surface/arg-spec.js.map +1 -1
  122. package/dist/api/topo-resolve.d.ts.map +1 -1
  123. package/dist/api/topo-resolve.js +24 -5
  124. package/dist/api/topo-resolve.js.map +1 -1
  125. package/dist/api/view/view-projection.d.ts.map +1 -1
  126. package/dist/api/view/view-projection.js +9 -2
  127. package/dist/api/view/view-projection.js.map +1 -1
  128. package/dist/brep/brep-chain.js +2 -2
  129. package/dist/brep/brep-chain.js.map +1 -1
  130. package/dist/brep/brep-ops.d.ts +1 -1
  131. package/dist/brep/brep-ops.js +1 -1
  132. package/dist/brep/brep-ops.js.map +1 -1
  133. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  134. package/dist/brep/engine/adapters/brep-mock.js +45 -0
  135. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  136. package/dist/brep/engine/primitives.d.ts +87 -3
  137. package/dist/brep/engine/primitives.d.ts.map +1 -1
  138. package/dist/brep/engine/primitives.js +1 -1
  139. package/dist/brep/engine/primitives.js.map +1 -1
  140. package/dist/brep/engine/registry.d.ts +33 -7
  141. package/dist/brep/engine/registry.d.ts.map +1 -1
  142. package/dist/brep/engine/registry.js +47 -16
  143. package/dist/brep/engine/registry.js.map +1 -1
  144. package/dist/brep/handle-bridge.d.ts +14 -15
  145. package/dist/brep/handle-bridge.d.ts.map +1 -1
  146. package/dist/brep/handle-bridge.js +35 -15
  147. package/dist/brep/handle-bridge.js.map +1 -1
  148. package/dist/brep/primitives-brep.js +2 -2
  149. package/dist/brep/primitives-brep.js.map +1 -1
  150. package/dist/brep/text/text-to-solid.d.ts +40 -3
  151. package/dist/brep/text/text-to-solid.d.ts.map +1 -1
  152. package/dist/brep/text/text-to-solid.js +104 -24
  153. package/dist/brep/text/text-to-solid.js.map +1 -1
  154. package/dist/brepkit-kernel/brepkitKernel.d.ts +2 -2
  155. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  156. package/dist/brepkit-kernel/brepkitKernel.js +328 -38
  157. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  158. package/dist/brepkit-kernel/brepkitWasm.d.ts +3 -1
  159. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  160. package/dist/brepkit-kernel/brepkitWasm.js +13 -9
  161. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  162. package/dist/brepkit-kernel/multi-version-test.d.ts +2 -2
  163. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
  164. package/dist/brepkit-kernel/multi-version-test.js +6 -6
  165. package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
  166. package/dist/browser.d.ts +2 -3
  167. package/dist/browser.d.ts.map +1 -1
  168. package/dist/browser.js +1 -2
  169. package/dist/browser.js.map +1 -1
  170. package/dist/cad-runtime/admit-compat-lib.d.ts +9 -1
  171. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  172. package/dist/cad-runtime/admit-compat-lib.js +11 -1
  173. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  174. package/dist/cad-runtime/browser-lib-loader.d.ts +16 -11
  175. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  176. package/dist/cad-runtime/browser-lib-loader.js +16 -8
  177. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  178. package/dist/cad-runtime/direct-executor.d.ts +62 -5
  179. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  180. package/dist/cad-runtime/direct-executor.js +617 -42
  181. package/dist/cad-runtime/direct-executor.js.map +1 -1
  182. package/dist/cad-runtime/interp/closure.d.ts +3 -2
  183. package/dist/cad-runtime/interp/closure.d.ts.map +1 -1
  184. package/dist/cad-runtime/interp/closure.js.map +1 -1
  185. package/dist/cad-runtime/interp/env.d.ts +9 -6
  186. package/dist/cad-runtime/interp/env.d.ts.map +1 -1
  187. package/dist/cad-runtime/interp/env.js +4 -2
  188. package/dist/cad-runtime/interp/env.js.map +1 -1
  189. package/dist/cad-runtime/lib-decl.d.ts +121 -0
  190. package/dist/cad-runtime/lib-decl.d.ts.map +1 -0
  191. package/dist/cad-runtime/lib-decl.js +100 -0
  192. package/dist/cad-runtime/lib-decl.js.map +1 -0
  193. package/dist/cad-runtime/ports.d.ts +12 -0
  194. package/dist/cad-runtime/ports.d.ts.map +1 -1
  195. package/dist/cad-runtime/ports.js.map +1 -1
  196. package/dist/cad-runtime/runtime.d.ts +59 -5
  197. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  198. package/dist/cad-runtime/runtime.js +252 -20
  199. package/dist/cad-runtime/runtime.js.map +1 -1
  200. package/dist/extra/browser.d.ts +9 -0
  201. package/dist/extra/browser.d.ts.map +1 -0
  202. package/dist/extra/browser.js +9 -0
  203. package/dist/extra/browser.js.map +1 -0
  204. package/dist/extra/editor-ops.d.ts +22 -0
  205. package/dist/extra/editor-ops.d.ts.map +1 -0
  206. package/dist/extra/editor-ops.js +21 -0
  207. package/dist/extra/editor-ops.js.map +1 -0
  208. package/dist/extra/extras/svg-extrude.d.ts +45 -0
  209. package/dist/extra/extras/svg-extrude.d.ts.map +1 -0
  210. package/dist/extra/extras/svg-extrude.js +110 -0
  211. package/dist/extra/extras/svg-extrude.js.map +1 -0
  212. package/dist/extra/extras/text-cjk.d.ts +36 -0
  213. package/dist/extra/extras/text-cjk.d.ts.map +1 -0
  214. package/dist/extra/extras/text-cjk.js +86 -0
  215. package/dist/extra/extras/text-cjk.js.map +1 -0
  216. package/dist/extra/extras/text-geometry.d.ts +69 -0
  217. package/dist/extra/extras/text-geometry.d.ts.map +1 -0
  218. package/dist/extra/extras/text-geometry.js +188 -0
  219. package/dist/extra/extras/text-geometry.js.map +1 -0
  220. package/dist/extra/index.d.ts +40 -0
  221. package/dist/extra/index.d.ts.map +1 -0
  222. package/dist/extra/index.js +40 -0
  223. package/dist/extra/index.js.map +1 -0
  224. package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts +94 -0
  225. package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
  226. package/dist/extra/mesh/drill-hole/DrillHoleCore.js +282 -0
  227. package/dist/extra/mesh/drill-hole/DrillHoleCore.js.map +1 -0
  228. package/dist/extra/mesh/drill-hole/drill-types.d.ts +34 -0
  229. package/dist/extra/mesh/drill-hole/drill-types.d.ts.map +1 -0
  230. package/dist/extra/mesh/drill-hole/drill-types.js +7 -0
  231. package/dist/extra/mesh/drill-hole/drill-types.js.map +1 -0
  232. package/dist/extra/mesh/engrave-decoration.d.ts +42 -0
  233. package/dist/extra/mesh/engrave-decoration.d.ts.map +1 -0
  234. package/dist/extra/mesh/engrave-decoration.js +39 -0
  235. package/dist/extra/mesh/engrave-decoration.js.map +1 -0
  236. package/dist/extra/mesh/fai_drill.d.ts +21 -0
  237. package/dist/extra/mesh/fai_drill.d.ts.map +1 -0
  238. package/dist/extra/mesh/fai_drill.js +89 -0
  239. package/dist/extra/mesh/fai_drill.js.map +1 -0
  240. package/dist/extra/mesh/fai_extrude.d.ts +24 -0
  241. package/dist/extra/mesh/fai_extrude.d.ts.map +1 -0
  242. package/dist/extra/mesh/fai_extrude.js +42 -0
  243. package/dist/extra/mesh/fai_extrude.js.map +1 -0
  244. package/dist/extra/mesh/fai_split.d.ts +164 -0
  245. package/dist/extra/mesh/fai_split.d.ts.map +1 -0
  246. package/dist/extra/mesh/fai_split.js +269 -0
  247. package/dist/extra/mesh/fai_split.js.map +1 -0
  248. package/dist/extra/mesh/primitives.d.ts +29 -0
  249. package/dist/extra/mesh/primitives.d.ts.map +1 -0
  250. package/dist/extra/mesh/primitives.js +41 -0
  251. package/dist/extra/mesh/primitives.js.map +1 -0
  252. package/dist/extra/op-names.d.ts +37 -0
  253. package/dist/extra/op-names.d.ts.map +1 -0
  254. package/dist/extra/op-names.js +46 -0
  255. package/dist/extra/op-names.js.map +1 -0
  256. package/dist/extra/ops/compound.d.ts +140 -0
  257. package/dist/extra/ops/compound.d.ts.map +1 -0
  258. package/dist/extra/ops/compound.js +167 -0
  259. package/dist/extra/ops/compound.js.map +1 -0
  260. package/dist/extra/ops/copy.d.ts +40 -0
  261. package/dist/extra/ops/copy.d.ts.map +1 -0
  262. package/dist/extra/ops/copy.js +83 -0
  263. package/dist/extra/ops/copy.js.map +1 -0
  264. package/dist/extra/ops/fai_drill.d.ts +51 -0
  265. package/dist/extra/ops/fai_drill.d.ts.map +1 -0
  266. package/dist/extra/ops/fai_drill.js +233 -0
  267. package/dist/extra/ops/fai_drill.js.map +1 -0
  268. package/dist/extra/ops/fai_extrude.d.ts +36 -0
  269. package/dist/extra/ops/fai_extrude.d.ts.map +1 -0
  270. package/dist/extra/ops/fai_extrude.js +84 -0
  271. package/dist/extra/ops/fai_extrude.js.map +1 -0
  272. package/dist/extra/ops/fai_split.d.ts +46 -0
  273. package/dist/extra/ops/fai_split.d.ts.map +1 -0
  274. package/dist/extra/ops/fai_split.js +235 -0
  275. package/dist/extra/ops/fai_split.js.map +1 -0
  276. package/dist/extra/ops/load.d.ts +49 -0
  277. package/dist/extra/ops/load.d.ts.map +1 -0
  278. package/dist/extra/ops/load.js +423 -0
  279. package/dist/extra/ops/load.js.map +1 -0
  280. package/dist/extra/ops/svg-extrude.d.ts +32 -0
  281. package/dist/extra/ops/svg-extrude.d.ts.map +1 -0
  282. package/dist/extra/ops/svg-extrude.js +74 -0
  283. package/dist/extra/ops/svg-extrude.js.map +1 -0
  284. package/dist/extra/ops/text.d.ts +34 -0
  285. package/dist/extra/ops/text.d.ts.map +1 -0
  286. package/dist/extra/ops/text.js +100 -0
  287. package/dist/extra/ops/text.js.map +1 -0
  288. package/dist/geometry2d/bridge/lift-on-plane.d.ts +8 -5
  289. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
  290. package/dist/geometry2d/bridge/lift-on-plane.js +8 -5
  291. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
  292. package/dist/index.d.ts +6 -2
  293. package/dist/index.d.ts.map +1 -1
  294. package/dist/index.js +8 -2
  295. package/dist/index.js.map +1 -1
  296. package/dist/lang/symbol-table.d.ts +3 -3
  297. package/dist/lang/symbol-table.generated.d.ts +10 -0
  298. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  299. package/dist/lang/symbol-table.generated.js +10 -0
  300. package/dist/lang/symbol-table.generated.js.map +1 -1
  301. package/dist/lang/symbol-table.js +3 -3
  302. package/dist/lang/symbol-table.js.map +1 -1
  303. package/dist/math3d/index.d.ts +1 -1
  304. package/dist/math3d/index.js +1 -1
  305. package/dist/math3d/index.js.map +1 -1
  306. package/dist/mesh/engrave.d.ts +2 -3
  307. package/dist/mesh/engrave.d.ts.map +1 -1
  308. package/dist/mesh/engrave.js +4 -11
  309. package/dist/mesh/engrave.js.map +1 -1
  310. package/dist/mesh/index.d.ts +0 -2
  311. package/dist/mesh/index.d.ts.map +1 -1
  312. package/dist/mesh/index.js +0 -2
  313. package/dist/mesh/index.js.map +1 -1
  314. package/dist/mesh/primitives.d.ts +7 -5
  315. package/dist/mesh/primitives.d.ts.map +1 -1
  316. package/dist/mesh/primitives.js +16 -9
  317. package/dist/mesh/primitives.js.map +1 -1
  318. package/dist/mesh/types.d.ts +4 -3
  319. package/dist/mesh/types.d.ts.map +1 -1
  320. package/dist/mesh/types.js.map +1 -1
  321. package/dist/node-host/cli.d.ts +11 -4
  322. package/dist/node-host/cli.d.ts.map +1 -1
  323. package/dist/node-host/cli.js +53 -28
  324. package/dist/node-host/cli.js.map +1 -1
  325. package/dist/node-host/execute-script.d.ts.map +1 -1
  326. package/dist/node-host/execute-script.js +3 -4
  327. package/dist/node-host/execute-script.js.map +1 -1
  328. package/dist/node-host/lib-package-json.d.ts +36 -0
  329. package/dist/node-host/lib-package-json.d.ts.map +1 -0
  330. package/dist/node-host/lib-package-json.js +73 -0
  331. package/dist/node-host/lib-package-json.js.map +1 -0
  332. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  333. package/dist/occt-kernel/occt-primitives.js +41 -0
  334. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  335. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  336. package/dist/occt-kernel/occtKernel.js +1 -1
  337. package/dist/occt-kernel/occtKernel.js.map +1 -1
  338. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  339. package/dist/primitives/brep-primitives.js +39 -12
  340. package/dist/primitives/brep-primitives.js.map +1 -1
  341. package/dist/runtime-state.d.ts +28 -1
  342. package/dist/runtime-state.d.ts.map +1 -1
  343. package/dist/runtime-state.js +14 -1
  344. package/dist/runtime-state.js.map +1 -1
  345. package/dist/sdk.d.ts +2 -2
  346. package/dist/sdk.d.ts.map +1 -1
  347. package/dist/sdk.js +11 -2
  348. package/dist/sdk.js.map +1 -1
  349. package/dist/sketch/bspline.d.ts +58 -0
  350. package/dist/sketch/bspline.d.ts.map +1 -0
  351. package/dist/sketch/bspline.js +104 -0
  352. package/dist/sketch/bspline.js.map +1 -0
  353. package/dist/sketch/canonical.d.ts +239 -0
  354. package/dist/sketch/canonical.d.ts.map +1 -0
  355. package/dist/sketch/canonical.js +17 -0
  356. package/dist/sketch/canonical.js.map +1 -0
  357. package/dist/sketch/contour.d.ts +43 -0
  358. package/dist/sketch/contour.d.ts.map +1 -0
  359. package/dist/sketch/contour.js +202 -0
  360. package/dist/sketch/contour.js.map +1 -0
  361. package/dist/sketch/dim-spec.d.ts +32 -0
  362. package/dist/sketch/dim-spec.d.ts.map +1 -0
  363. package/dist/sketch/dim-spec.js +112 -0
  364. package/dist/sketch/dim-spec.js.map +1 -0
  365. package/dist/sketch/faces.d.ts +45 -0
  366. package/dist/sketch/faces.d.ts.map +1 -0
  367. package/dist/sketch/faces.js +108 -0
  368. package/dist/sketch/faces.js.map +1 -0
  369. package/dist/sketch/fcstd-types.d.ts +194 -0
  370. package/dist/sketch/fcstd-types.d.ts.map +1 -0
  371. package/dist/sketch/fcstd-types.js +67 -0
  372. package/dist/sketch/fcstd-types.js.map +1 -0
  373. package/dist/sketch/index.d.ts +46 -0
  374. package/dist/sketch/index.d.ts.map +1 -0
  375. package/dist/sketch/index.js +39 -0
  376. package/dist/sketch/index.js.map +1 -0
  377. package/dist/sketch/node.d.ts +14 -0
  378. package/dist/sketch/node.d.ts.map +1 -0
  379. package/dist/sketch/node.js +43 -0
  380. package/dist/sketch/node.js.map +1 -0
  381. package/dist/sketch/op.d.ts +111 -0
  382. package/dist/sketch/op.d.ts.map +1 -0
  383. package/dist/sketch/op.js +185 -0
  384. package/dist/sketch/op.js.map +1 -0
  385. package/dist/sketch/planegcs-backend.d.ts +69 -0
  386. package/dist/sketch/planegcs-backend.d.ts.map +1 -0
  387. package/dist/sketch/planegcs-backend.js +812 -0
  388. package/dist/sketch/planegcs-backend.js.map +1 -0
  389. package/dist/sketch/project.d.ts +176 -0
  390. package/dist/sketch/project.d.ts.map +1 -0
  391. package/dist/sketch/project.js +656 -0
  392. package/dist/sketch/project.js.map +1 -0
  393. package/dist/sketch/shapes.d.ts +370 -0
  394. package/dist/sketch/shapes.d.ts.map +1 -0
  395. package/dist/sketch/shapes.js +959 -0
  396. package/dist/sketch/shapes.js.map +1 -0
  397. package/dist/sketch/solve.d.ts +21 -0
  398. package/dist/sketch/solve.d.ts.map +1 -0
  399. package/dist/sketch/solve.js +144 -0
  400. package/dist/sketch/solve.js.map +1 -0
  401. package/dist/sketch/solver-loader.d.ts +47 -0
  402. package/dist/sketch/solver-loader.d.ts.map +1 -0
  403. package/dist/sketch/solver-loader.js +77 -0
  404. package/dist/sketch/solver-loader.js.map +1 -0
  405. package/dist/sketch/solver.d.ts +63 -0
  406. package/dist/sketch/solver.d.ts.map +1 -0
  407. package/dist/sketch/solver.js +28 -0
  408. package/dist/sketch/solver.js.map +1 -0
  409. package/dist/sketch/verify.d.ts +53 -0
  410. package/dist/sketch/verify.d.ts.map +1 -0
  411. package/dist/sketch/verify.js +71 -0
  412. package/dist/sketch/verify.js.map +1 -0
  413. package/dist/topology/naming/geom-hint.d.ts +12 -0
  414. package/dist/topology/naming/geom-hint.d.ts.map +1 -1
  415. package/dist/topology/naming/geom-hint.js +1 -1
  416. package/dist/topology/naming/geom-hint.js.map +1 -1
  417. package/dist/topology/naming/lineage.d.ts +1 -0
  418. package/dist/topology/naming/lineage.d.ts.map +1 -1
  419. package/dist/topology/naming/lineage.js +37 -1
  420. package/dist/topology/naming/lineage.js.map +1 -1
  421. package/dist/topology/naming/resolve-face.d.ts +13 -2
  422. package/dist/topology/naming/resolve-face.d.ts.map +1 -1
  423. package/dist/topology/naming/resolve-face.js +18 -2
  424. package/dist/topology/naming/resolve-face.js.map +1 -1
  425. package/dist/weapp.d.ts +1 -1
  426. package/dist/weapp.d.ts.map +1 -1
  427. package/dist/weapp.js +1 -1
  428. package/dist/weapp.js.map +1 -1
  429. package/package.json +43 -11
@@ -1,22 +1,22 @@
1
1
  /**
2
- * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)
2
+ * api-namespace — the complete cad namespace (platform + sketch + extra).
3
3
  *
4
+ * Assembles the full `cad` namespace: platform ops + sketch op + editor ops.
5
+ * This namespace is registered by `createRuntime` as the `cad` default library;
6
+ * `cad` is a reserved binding name — hosts cannot override it.
4
7
  *
5
- * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。
8
+ * 2026-10-13 merge: sketch and faijs-extra were absorbed into core. Their ops
9
+ * are now listed explicitly in the return literal below (not merged by the
10
+ * host). The `cad` binding is reserved (see runtime.ts reserved-binding guard).
6
11
  *
7
- * 归属(monorepo P5/E-a-1):本文件随 core 出包,是 faijs 默认库函数
8
- * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /
9
- * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)
10
- * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,
11
- * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中
12
- * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。
12
+ * K5 (引擎零函数知识) compliance: parser/compile/runtime does not branch on
13
+ * function names — all op metadata is carried by defineOp (uniform data).
14
+ * Builtin cad data going through registerLib with the same path as third-party
15
+ * libs does not violate K5.
13
16
  *
14
- * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op
15
- * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op
16
- * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经
17
- * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。
18
- * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:
19
- * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。
17
+ * IMPORTANT: gen-symbol-table.ts only discovers ShorthandPropertyAssignment
18
+ * and PropertyAssignment in this literal — it does NOT discover SpreadAssignment.
19
+ * Never use `...spread` for ops that must appear in the symbol table.
20
20
  */
21
21
  import type { LibNamespace } from '../runtime-state.js';
22
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAwGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CA2FjD"}
1
+ {"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAwGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAepD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAwGjD"}
@@ -1,22 +1,22 @@
1
1
  /**
2
- * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)
2
+ * api-namespace — the complete cad namespace (platform + sketch + extra).
3
3
  *
4
+ * Assembles the full `cad` namespace: platform ops + sketch op + editor ops.
5
+ * This namespace is registered by `createRuntime` as the `cad` default library;
6
+ * `cad` is a reserved binding name — hosts cannot override it.
4
7
  *
5
- * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。
8
+ * 2026-10-13 merge: sketch and faijs-extra were absorbed into core. Their ops
9
+ * are now listed explicitly in the return literal below (not merged by the
10
+ * host). The `cad` binding is reserved (see runtime.ts reserved-binding guard).
6
11
  *
7
- * 归属(monorepo P5/E-a-1):本文件随 core 出包,是 faijs 默认库函数
8
- * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /
9
- * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)
10
- * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,
11
- * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中
12
- * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。
12
+ * K5 (引擎零函数知识) compliance: parser/compile/runtime does not branch on
13
+ * function names — all op metadata is carried by defineOp (uniform data).
14
+ * Builtin cad data going through registerLib with the same path as third-party
15
+ * libs does not violate K5.
13
16
  *
14
- * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op
15
- * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op
16
- * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经
17
- * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。
18
- * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:
19
- * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。
17
+ * IMPORTANT: gen-symbol-table.ts only discovers ShorthandPropertyAssignment
18
+ * and PropertyAssignment in this literal — it does NOT discover SpreadAssignment.
19
+ * Never use `...spread` for ops that must appear in the symbol table.
20
20
  */
21
21
  import { box, sphere, cylinder, cone, wedge } from './primitives.js';
22
22
  import { translate, rotate_euler, scale, scale3d } from './transform.js';
@@ -109,6 +109,19 @@ import { place } from './place.js';
109
109
  import { scriptFaceOps } from './generated/script-face.js';
110
110
  import { revolve } from './revolve.js';
111
111
  import { CONTRACT_VERSION } from '../runtime-state.js';
112
+ // Merged sketch + extra ops (2026-10-13): sketch and faijs-extra were absorbed
113
+ // into core. These ops are now part of the cad namespace directly, not
114
+ // assembled by the host. Do NOT use spread — list each op explicitly so
115
+ // gen-symbol-table can discover them (it ignores SpreadAssignment).
116
+ import { sketch } from '../sketch/op.js';
117
+ import { fai_drill } from '../extra/ops/fai_drill.js';
118
+ import { fai_extrude } from '../extra/ops/fai_extrude.js';
119
+ import { fai_split } from '../extra/ops/fai_split.js';
120
+ import { group, assembly } from '../extra/ops/compound.js';
121
+ import { copy } from '../extra/ops/copy.js';
122
+ import { load } from '../extra/ops/load.js';
123
+ import { text } from '../extra/ops/text.js';
124
+ import { svgExtrude } from '../extra/ops/svg-extrude.js';
112
125
  /**
113
126
  * Assemble api functions into the cad namespace.
114
127
  *
@@ -192,6 +205,19 @@ export function createApiNamespace() {
192
205
  import_step,
193
206
  compound: geometricCompound,
194
207
  place,
208
+ // Merged sketch + extra ops (2026-10-13): these 10 ops were previously
209
+ // assembled by the host via merge*Namespace + register*Symbols.
210
+ // They are now part of the built-in cad namespace directly.
211
+ sketch,
212
+ fai_drill,
213
+ fai_extrude,
214
+ fai_split,
215
+ group,
216
+ assembly,
217
+ copy,
218
+ load,
219
+ text,
220
+ svgExtrude,
195
221
  ...scriptFaceOps,
196
222
  // Phase 3: override generated cut (compatOp, no roleTable propagation) with
197
223
  // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).
@@ -1 +1 @@
1
- {"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)\n *\n *\n * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。\n *\n * 归属(monorepo P5/E-a-1):本文件随 core 出包,是 faijs 默认库函数\n * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /\n * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)\n * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,\n * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中\n * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { sketchOnSurface } from './sketch-on-surface'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { surface } from './surface'\nimport { offset2d } from './offset2d'\nimport { solidFromFaces } from './solid-from-faces'\nimport { halfSpace } from './half-space'\nimport { exportStl } from './export-stl'\nimport { exportBrep } from './export-brep'\n// 2026-10-08(方案 §2.6 / DEC-3):脚本面 step / 3mf 出口。两者都是薄壳:宿主门\n// (引擎通道无门禁——库面按当前引擎分派,见 export-step.ts)之后把入参转成 ExportEntry[],\n// 序列化一律交库面 exportModelSync(单一真源),故与库面逐字节同源。只进脚本面\n// (本字面量 + check() 符号表),**不平铺 api/index.ts**(§2.7 / DEC-6)。\nimport { exportStep } from './export-step'\nimport { export3mf } from './export-3mf'\n// S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual\n// (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。\nimport {\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n} from './shape-type'\n// S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);\n// 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。\nimport { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export'\n// S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n// 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/\n// approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/\n// curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。\nimport {\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n} from './curve-sketch'\n// S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n// 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire\n// (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。\nimport { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face'\n// S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n// 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/\n// halfSpace 已由 S3 落地)。\nimport { draftPrism, pipe } from './solid-offset'\n// S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n// 13 个原生方法不在 L1 契约:containsPoint/distanceBetween/getInertia/\n// getLinearCenterOfMass/projectPointOnEdge/projectPointOnFace/classifyPointOnFace/\n// uvFromPoint/vertexPosition/subShapeCount/iterShapes 返回非 Shape,\n// 走 export-brep / shape-type 同口径的普通函数;liftCurve2d / commonCells\n// 返回 Shape,走 defineOp。\nimport {\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n} from './measure-query'\n// S4(occt-wasm op 接入):通用布尔族(平台 op engines:['occt'],方案 §3.4.5)——\n// 原生 booleanOp:带 glue/fuzzy/simplify 选项的通用形态,不在 L1 契约。\nimport { boolean as booleanWithOptions } from './boolean-op'\n// S4(occt-wasm op 接入):包围盒对齐族(平台 op engines:['occt'],方案 §3.4.9)——\n// 原生 alignX/alignY/alignZ 三轴并为一个脚本符号 alignTo。\nimport { alignTo } from './align'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { sweepAdvanced } from './sweep-advanced'\nimport { loft } from './loft'\nimport { loftAdvanced } from './loft-advanced'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { LibNamespace } from '../runtime-state'\n\n/**\n * Assemble api functions into the cad namespace.\n *\n * P23(§4.2 ②,B1):cad 面 = faijs 特有 dual op(下方字面量)+\n * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec\n * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。\n * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`\n * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。\n *\n * @returns the assembled LibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): LibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because LibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, profile, sketchOnPlane, sketchOnFace, sketchOnSurface, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样。**基础 op 两内核都支持**(进 L1 中立名\n // BrepEngineApi#sweep / #loft);只有 occt 能做的完整控制面拆成独立平台 op\n // (engines:['occt']):sweepAdvanced(transition/auxSpine/support/law/…)、\n // loftAdvanced(startPoint/tolerance)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, sweepAdvanced, loft, loftAdvanced,\n // S3(occt-wasm op 接入):控制点阵 → B 样条面(平台 op engines:['occt'])。\n surface,\n // S3(occt-wasm op 接入):2D 轮廓偏置(平台 op engines:['occt'],原生 offsetWire2D)。\n offset2d,\n // S3(occt-wasm op 接入):面集一次成型为实体(平台 op engines:['occt'],原生 buildSolidFromFaces)。\n solidFromFaces,\n // S3(occt-wasm op 接入):无限半空间实体(平台 op engines:['occt'],原生 halfSpace;\n // 无界布尔工具的来源,产物 mesh 为空——单独渲染无意义,只作 cut/common/split 的工具位)。\n halfSpace,\n // S3(occt-wasm op 接入):导出族。exportStl 中立(只序列化 Shape 自带三角载荷,\n // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。\n exportStl,\n exportBrep,\n // 方案 §2.6:step(occt 必需——装配层级走 XCAF)/ 3mf(引擎中立,纯 XML + ZIP)。\n exportStep,\n export3mf,\n // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。\n toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,\n // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,\n // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n draftPrism, pipe,\n // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n // S4(occt-wasm op 接入):通用布尔族 booleanOp(方案 §3.4.5)+ 包围盒对齐族\n // alignX/Y/Z → alignTo(方案 §3.4.9),平台 op engines:['occt']。\n boolean: booleanWithOptions,\n alignTo,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as LibNamespace\n}\n"]}
1
+ {"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api-namespace — the complete cad namespace (platform + sketch + extra).\n *\n * Assembles the full `cad` namespace: platform ops + sketch op + editor ops.\n * This namespace is registered by `createRuntime` as the `cad` default library;\n * `cad` is a reserved binding name — hosts cannot override it.\n *\n * 2026-10-13 merge: sketch and faijs-extra were absorbed into core. Their ops\n * are now listed explicitly in the return literal below (not merged by the\n * host). The `cad` binding is reserved (see runtime.ts reserved-binding guard).\n *\n * K5 (引擎零函数知识) compliance: parser/compile/runtime does not branch on\n * function names — all op metadata is carried by defineOp (uniform data).\n * Builtin cad data going through registerLib with the same path as third-party\n * libs does not violate K5.\n *\n * IMPORTANT: gen-symbol-table.ts only discovers ShorthandPropertyAssignment\n * and PropertyAssignment in this literal — it does NOT discover SpreadAssignment.\n * Never use `...spread` for ops that must appear in the symbol table.\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { sketchOnSurface } from './sketch-on-surface'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { surface } from './surface'\nimport { offset2d } from './offset2d'\nimport { solidFromFaces } from './solid-from-faces'\nimport { halfSpace } from './half-space'\nimport { exportStl } from './export-stl'\nimport { exportBrep } from './export-brep'\n// 2026-10-08(方案 §2.6 / DEC-3):脚本面 step / 3mf 出口。两者都是薄壳:宿主门\n// (引擎通道无门禁——库面按当前引擎分派,见 export-step.ts)之后把入参转成 ExportEntry[],\n// 序列化一律交库面 exportModelSync(单一真源),故与库面逐字节同源。只进脚本面\n// (本字面量 + check() 符号表),**不平铺 api/index.ts**(§2.7 / DEC-6)。\nimport { exportStep } from './export-step'\nimport { export3mf } from './export-3mf'\n// S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual\n// (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。\nimport {\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n} from './shape-type'\n// S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);\n// 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。\nimport { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export'\n// S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n// 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/\n// approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/\n// curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。\nimport {\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n} from './curve-sketch'\n// S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n// 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire\n// (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。\nimport { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face'\n// S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n// 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/\n// halfSpace 已由 S3 落地)。\nimport { draftPrism, pipe } from './solid-offset'\n// S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n// 13 个原生方法不在 L1 契约:containsPoint/distanceBetween/getInertia/\n// getLinearCenterOfMass/projectPointOnEdge/projectPointOnFace/classifyPointOnFace/\n// uvFromPoint/vertexPosition/subShapeCount/iterShapes 返回非 Shape,\n// 走 export-brep / shape-type 同口径的普通函数;liftCurve2d / commonCells\n// 返回 Shape,走 defineOp。\nimport {\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n} from './measure-query'\n// S4(occt-wasm op 接入):通用布尔族(平台 op engines:['occt'],方案 §3.4.5)——\n// 原生 booleanOp:带 glue/fuzzy/simplify 选项的通用形态,不在 L1 契约。\nimport { boolean as booleanWithOptions } from './boolean-op'\n// S4(occt-wasm op 接入):包围盒对齐族(平台 op engines:['occt'],方案 §3.4.9)——\n// 原生 alignX/alignY/alignZ 三轴并为一个脚本符号 alignTo。\nimport { alignTo } from './align'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { sweepAdvanced } from './sweep-advanced'\nimport { loft } from './loft'\nimport { loftAdvanced } from './loft-advanced'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { LibNamespace } from '../runtime-state'\n// Merged sketch + extra ops (2026-10-13): sketch and faijs-extra were absorbed\n// into core. These ops are now part of the cad namespace directly, not\n// assembled by the host. Do NOT use spread — list each op explicitly so\n// gen-symbol-table can discover them (it ignores SpreadAssignment).\nimport { sketch } from '../sketch/op'\nimport { fai_drill } from '../extra/ops/fai_drill'\nimport { fai_extrude } from '../extra/ops/fai_extrude'\nimport { fai_split } from '../extra/ops/fai_split'\nimport { group, assembly } from '../extra/ops/compound'\nimport { copy } from '../extra/ops/copy'\nimport { load } from '../extra/ops/load'\nimport { text } from '../extra/ops/text'\nimport { svgExtrude } from '../extra/ops/svg-extrude'\n\n/**\n * Assemble api functions into the cad namespace.\n *\n * P23(§4.2 ②,B1):cad 面 = faijs 特有 dual op(下方字面量)+\n * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec\n * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。\n * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`\n * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。\n *\n * @returns the assembled LibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): LibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because LibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, profile, sketchOnPlane, sketchOnFace, sketchOnSurface, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样。**基础 op 两内核都支持**(进 L1 中立名\n // BrepEngineApi#sweep / #loft);只有 occt 能做的完整控制面拆成独立平台 op\n // (engines:['occt']):sweepAdvanced(transition/auxSpine/support/law/…)、\n // loftAdvanced(startPoint/tolerance)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, sweepAdvanced, loft, loftAdvanced,\n // S3(occt-wasm op 接入):控制点阵 → B 样条面(平台 op engines:['occt'])。\n surface,\n // S3(occt-wasm op 接入):2D 轮廓偏置(平台 op engines:['occt'],原生 offsetWire2D)。\n offset2d,\n // S3(occt-wasm op 接入):面集一次成型为实体(平台 op engines:['occt'],原生 buildSolidFromFaces)。\n solidFromFaces,\n // S3(occt-wasm op 接入):无限半空间实体(平台 op engines:['occt'],原生 halfSpace;\n // 无界布尔工具的来源,产物 mesh 为空——单独渲染无意义,只作 cut/common/split 的工具位)。\n halfSpace,\n // S3(occt-wasm op 接入):导出族。exportStl 中立(只序列化 Shape 自带三角载荷,\n // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。\n exportStl,\n exportBrep,\n // 方案 §2.6:step(occt 必需——装配层级走 XCAF)/ 3mf(引擎中立,纯 XML + ZIP)。\n exportStep,\n export3mf,\n // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。\n toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,\n // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,\n // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n draftPrism, pipe,\n // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n // S4(occt-wasm op 接入):通用布尔族 booleanOp(方案 §3.4.5)+ 包围盒对齐族\n // alignX/Y/Z → alignTo(方案 §3.4.9),平台 op engines:['occt']。\n boolean: booleanWithOptions,\n alignTo,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n // Merged sketch + extra ops (2026-10-13): these 10 ops were previously\n // assembled by the host via merge*Namespace + register*Symbols.\n // They are now part of the built-in cad namespace directly.\n sketch,\n fai_drill,\n fai_extrude,\n fai_split,\n group,\n assembly,\n copy,\n load,\n text,\n svgExtrude,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as LibNamespace\n}\n"]}
@@ -74,23 +74,64 @@ export interface PbrAppearance {
74
74
  export type MaterialSpec = Omit<PbrAppearance, 'color' | 'opacity'>;
75
75
  /** Shape 外观方法签名(运行时由 attachAppearanceMethods 挂载;纯数据判定不受影响)。 */
76
76
  export interface ShapeAppearanceMethods {
77
- /** 合并外观:`{...cur, ...spec}`,spec 中 undefined 字段保留旧值。 */
77
+ /**
78
+ * 合并外观:`{...cur, ...spec}`,spec 中 undefined 字段保留旧值。
79
+ * @param spec - 待合并的外观字段(color / opacity / roughness / metalness / …)。
80
+ * @returns this(可链式调用)。
81
+ * @example
82
+ * part0.setAppearance({ roughness: 0.4, metalness: 0.8 })
83
+ */
78
84
  setAppearance(spec: PbrAppearance): this;
79
- /** 便捷:等价 setAppearance({ color });#rrggbbaa / [r,g,b,a] 的 alpha 归一为 opacity。 */
85
+ /**
86
+ * 便捷:等价 setAppearance({ color });#rrggbbaa / [r,g,b,a] 的 alpha 归一为 opacity。
87
+ * @param color - `#rgb` / `#rrggbb` / `#rrggbbaa` 十六进制串,或 `[r,g,b]` / `[r,g,b,a]`(0–1)。
88
+ * @returns this(可链式调用)。
89
+ * @example
90
+ * part0.setColor('#2e8b57')
91
+ */
80
92
  setColor(color: PbrColor): this;
81
- /** 便捷:等价 setAppearance(spec)。 */
93
+ /**
94
+ * 便捷:等价 setAppearance(spec)。
95
+ * @param spec - 材质参数(不含 color / opacity)。
96
+ * @returns this(可链式调用)。
97
+ * @example
98
+ * part0.setMaterial({ metalness: 0.9, roughness: 0.2 })
99
+ */
82
100
  setMaterial(spec: MaterialSpec): this;
83
- /** 便捷:透明度权威字段(0–1)。 */
101
+ /**
102
+ * 便捷:透明度权威字段(0–1)。
103
+ * @param opacity - 0(全透明)–1(不透明)。
104
+ * @returns this(可链式调用)。
105
+ * @example
106
+ * part0.setOpacity(0.5)
107
+ */
84
108
  setOpacity(opacity: number): this;
85
- /** 读取当前外观(可能 undefined)。 */
109
+ /**
110
+ * 读取当前外观(可能 undefined)。
111
+ * @returns 当前外观的只读快照;从未设置过时为 `undefined`。
112
+ * @example
113
+ * const appearance = part0.getAppearance()
114
+ */
86
115
  getAppearance(): Readonly<PbrAppearance> | undefined;
87
116
  /**
88
117
  * 面级设色:把 faceIds 指定的面(面序号契约见 `Shape.faceRanges`,参数化
89
118
  * primitives 才有)写入 `materialGroups`。无面结构(布尔/组合/导入产物)抛
90
119
  * `E_FACE_UNAVAILABLE`;面序号越界抛 `E_FACE_INDEX`。
120
+ * @param faces - 面序号数组(0 起,契约见 `Shape.faceRanges`)。
121
+ * @param color - 同 setColor 的颜色入参。
122
+ * @returns this(可链式调用)。
123
+ * @example
124
+ * box(20, 20, 20).setFaceColor([0], '#c0392b')
91
125
  */
92
126
  setFaceColor(faces: number[], color: PbrColor): this;
93
- /** 面级材质:等价 setFaceColor 的 material 版本。 */
127
+ /**
128
+ * 面级材质:等价 setFaceColor 的 material 版本。
129
+ * @param faces - 面序号数组(0 起,契约见 `Shape.faceRanges`)。
130
+ * @param spec - 材质参数(不含 color / opacity)。
131
+ * @returns this(可链式调用)。
132
+ * @example
133
+ * box(20, 20, 20).setFaceMaterial([0], { roughness: 0.1 })
134
+ */
94
135
  setFaceMaterial(faces: number[], spec: MaterialSpec): this;
95
136
  }
96
137
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../src/api/appearance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../src/api/appearance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../src/api/appearance.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/appearance — faijs PBR 外观规格(颜色/材质/透明度)权威类型与 Shape 方法\n *\n * 定位:\n * - 外观设置**不是 op**(不进 defineOp/api-namespace/args-schema),是 Shape\n * 实例方法(`box1.setColor(...)`,复用 `asm1.solve()` 的成员调用语句形态)。\n * - `PbrAppearance` 引擎无关、JSON 可序列化,随 Shape 走 mesh/brep 双链路\n * (`Shape.appearance`),编辑器/查看器只读字段,不依赖方法。\n * - 本文件零依赖(不 import THREE / occt / store);唯一 import 是 mesh/types\n * 的 `Shape` 类型(type-only),mesh/types 亦只 type-import 本文件的类型,\n * 两者为类型环、无运行时环(值依赖单向:shape.ts → api/appearance.ts)。\n *\n * 颜色约定:\n * - 内部归一形态:`color: [r, g, b]`(sRGB,0–1);`opacity` 是透明度的唯一\n * 权威字段(0–1)。\n * - 输入接受 hex(#rgb / #rrggbb / #rrggbbaa)与数组([r,g,b] / [r,g,b,a]);\n * `#rrggbbaa` / 数组第 4 分量的 alpha 等价于 `opacity`(显式 setOpacity 后\n * 写入的 opacity 优先于后续无 alpha 的 setColor 推导,见 setColor 注释)。\n * - CSS 颜色名:P1 不支持(抛错),由宿主或后续版本扩展。\n */\n\nimport type { Shape } from '../mesh/types'\n\n// ── 类型 ──\n\n/** 颜色输入:hex(#rgb/#rrggbb/#rrggbbaa)或 sRGB 0–1 数组([r,g,b] / [r,g,b,a])。 */\nexport type PbrColor = string | [number, number, number] | [number, number, number, number]\n\n/** glTF 透明度约定(与 3d_editor MaterialAppearance.alphaMode 对齐)。 */\nexport type PbrAlphaMode = 'OPAQUE' | 'MASK' | 'BLEND'\n\n/**\n * faijs PBR 外观规格 —— 引擎无关、JSON 可序列化、随 Shape 走双链路。\n *\n * 全字段可选:未设置字段 = 继承上游 / 宿主默认,不隐式清零。\n * 归一形态约定:`color` 为 [r,g,b](sRGB 0–1)数组;`opacity`(0–1)为\n * 透明度唯一权威字段(color 的 aa 分量在 set 时归一为 opacity)。\n */\nexport interface PbrAppearance {\n /** 基色(sRGB 0–1)。 */\n color?: [number, number, number]\n /** 透明度 0–1。 */\n opacity?: number\n /** 金属度 0–1;粗糙度 0–1。 */\n metalness?: number\n roughness?: number\n\n /** 自发光:颜色 + 强度(>0 时启用,默认 1)。 */\n emissive?: [number, number, number]\n emissiveIntensity?: number\n\n /** 透射/玻璃。 */\n transmission?: number\n thickness?: number\n ior?: number\n attenuationColor?: [number, number, number]\n attenuationDistance?: number\n\n /** 清漆。 */\n clearcoat?: number\n clearcoatRoughness?: number\n\n /** 织物/丝绒。 */\n sheen?: number\n sheenColor?: [number, number, number]\n sheenRoughness?: number\n\n /** 拉丝金属。 */\n anisotropy?: number\n anisotropyRotation?: number\n\n /** 高光工作流(替代 metalness 工作流)。 */\n specularIntensity?: number\n specularColor?: [number, number, number]\n\n /** 环境光强度(IBL 贡献)。 */\n envMapIntensity?: number\n\n /** 透明度模式:默认 OPAQUE;opacity<1 未显式指定时宿主按 BLEND 处理。 */\n alphaMode?: PbrAlphaMode\n alphaCutoff?: number\n /** 双面渲染。 */\n doubleSided?: boolean\n /** 无光照。 */\n unlit?: boolean\n}\n\n/** 材质参数(不含颜色/透明度,`cad` 便捷方法 setMaterial 的入参)。 */\nexport type MaterialSpec = Omit<PbrAppearance, 'color' | 'opacity'>\n\n/** Shape 外观方法签名(运行时由 attachAppearanceMethods 挂载;纯数据判定不受影响)。 */\nexport interface ShapeAppearanceMethods {\n /** 合并外观:`{...cur, ...spec}`,spec 中 undefined 字段保留旧值。 */\n setAppearance(spec: PbrAppearance): this\n /** 便捷:等价 setAppearance({ color });#rrggbbaa / [r,g,b,a] 的 alpha 归一为 opacity。 */\n setColor(color: PbrColor): this\n /** 便捷:等价 setAppearance(spec)。 */\n setMaterial(spec: MaterialSpec): this\n /** 便捷:透明度权威字段(0–1)。 */\n setOpacity(opacity: number): this\n /** 读取当前外观(可能 undefined)。 */\n getAppearance(): Readonly<PbrAppearance> | undefined\n /**\n * 面级设色:把 faceIds 指定的面(面序号契约见 `Shape.faceRanges`,参数化\n * primitives 才有)写入 `materialGroups`。无面结构(布尔/组合/导入产物)抛\n * `E_FACE_UNAVAILABLE`;面序号越界抛 `E_FACE_INDEX`。\n */\n setFaceColor(faces: number[], color: PbrColor): this\n /** 面级材质:等价 setFaceColor 的 material 版本。 */\n setFaceMaterial(faces: number[], spec: MaterialSpec): this\n}\n\n// ── 归一化 ──\n\n/** hex #rgb/#rrggbb/#rrggbbaa → sRGB 0–1(+可选 alpha)。 */\nfunction parseHexColor(hex: string): { rgb: [number, number, number]; alpha?: number } {\n let h = hex.startsWith('#') ? hex.slice(1) : hex\n if (h.length === 3) {\n h = h.split('').map((c) => c + c).join('')\n }\n if (h.length !== 6 && h.length !== 8) {\n throw new Error(`[faijs/appearance] invalid hex color \"${hex}\" (expected #rgb/#rrggbb/#rrggbbaa)`)\n }\n if (!/^[0-9a-fA-F]+$/.test(h)) {\n throw new Error(`[faijs/appearance] invalid hex color \"${hex}\" (non-hex digit)`)\n }\n const r = parseInt(h.slice(0, 2), 16) / 255\n const g = parseInt(h.slice(2, 4), 16) / 255\n const b = parseInt(h.slice(4, 6), 16) / 255\n const rgb: [number, number, number] = [r, g, b]\n if (h.length === 8) return { rgb, alpha: parseInt(h.slice(6, 8), 16) / 255 }\n return { rgb }\n}\n\nfunction assertComponent01(v: number, label: string): void {\n if (v < 0 || v > 1 || !Number.isFinite(v)) {\n throw new Error(`[faijs/appearance] ${label} must be in 0..1, got ${v}`)\n }\n}\n\n/**\n * 归一颜色输入 → { rgb, alpha? }。\n * hex 与 [r,g,b] / [r,g,b,a](sRGB 0–1);CSS 颜色名 P1 不支持。\n * @param color 颜色输入:`#rgb` / `#rrggbb` / `#rrggbbaa`,或 `[r,g,b]` / `[r,g,b,a]`(sRGB 0–1)\n * @returns 归一后的 sRGB 颜色(0–1)与可选 alpha;带 alpha 的输入在 alpha 通道返回\n */\nexport function normalizeColor(color: PbrColor): { rgb: [number, number, number]; alpha?: number } {\n if (typeof color === 'string') {\n if (color.startsWith('#')) return parseHexColor(color)\n throw new Error(\n `[faijs/appearance] unsupported color \"${color}\" (P1: hex #rgb/#rrggbb/#rrggbbaa or [r,g,b] expected; CSS names not supported)`,\n )\n }\n const [r, g, b, a] = color\n assertComponent01(r, 'color.r')\n assertComponent01(g, 'color.g')\n assertComponent01(b, 'color.b')\n if (a !== undefined) {\n assertComponent01(a, 'color.a')\n return { rgb: [r, g, b], alpha: a }\n }\n return { rgb: [r, g, b] }\n}\n\n/**\n * 合并外观:spec 中 undefined 字段不覆盖旧值。\n * @param cur 当前外观(可为 undefined)\n * @param spec 待合并字段(undefined 字段被跳过)\n * @returns 合并后的外观(新对象;cur 为 undefined 时仅含 spec 非空字段)\n */\nexport function mergeAppearance(cur: PbrAppearance | undefined, spec: PbrAppearance): PbrAppearance {\n const clean: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(spec)) {\n if (v !== undefined) clean[k] = v\n }\n return { ...(cur ?? {}), ...clean } as PbrAppearance\n}\n\n/** 两外观等价判定(字段级深比较;undefined 视同空对象)。 */\nfunction sameAppearance(a: PbrAppearance | undefined, b: PbrAppearance | undefined): boolean {\n const ka = Object.keys(a ?? {}).filter((k) => (a as Record<string, unknown>)[k] !== undefined).sort()\n const kb = Object.keys(b ?? {}).filter((k) => (b as Record<string, unknown>)[k] !== undefined).sort()\n if (ka.length !== kb.length) return false\n for (const k of ka) {\n const va = (a as Record<string, unknown>)[k]\n const vb = (b as Record<string, unknown>)[k]\n if (Array.isArray(va) || Array.isArray(vb)) {\n if (!Array.isArray(va) || !Array.isArray(vb) || va.length !== vb.length) return false\n for (let i = 0; i < va.length; i++) if (va[i] !== vb[i]) return false\n } else if (va !== vb) {\n return false\n }\n }\n return true\n}\n\n// ── 面级外观 ──\n\n/** 面区间跨度(内部表示,end 为开区间上界)。 */\ninterface FaceSpan {\n start: number\n end: number\n appearance: PbrAppearance | undefined\n}\n\n/**\n * 把 faceIds 指定的面(面序号 → `Shape.faceRanges` 三角形区间)合并进\n * `shape.materialGroups`。多次设置同一面 → 外观合并(spec 未设置字段保留旧值);\n * 不同面同外观 → 相邻区间合并为一个分组。输出按三角形起始排序。\n *\n * 无面结构(`faceRanges` 缺失——布尔/组合/导入产物)抛 `E_FACE_UNAVAILABLE`;\n * 面序号越界/非整数抛 `E_FACE_INDEX`。\n * @param shape 目标 Shape(必须携带 faceRanges)\n * @param faceIds 面序号列表(PbrAppearance 面序契约见 mesh/primitives.ts 各构造点注释)\n * @param spec 待合并到目标面的外观字段\n */\nexport function mergeFaceAppearance(shape: Shape, faceIds: number[], spec: PbrAppearance): void {\n const ranges = shape.faceRanges\n if (!ranges || ranges.length === 0) {\n throw new Error(\n '[faijs/appearance] E_FACE_UNAVAILABLE: shape has no face structure — ' +\n 'face-level methods only apply to parameterized primitives (box/cylinder/cone); ' +\n 'boolean/combined/imported shapes have no CAD faces',\n )\n }\n const targets: Array<{ start: number; count: number }> = []\n for (const id of faceIds) {\n if (!Number.isInteger(id) || id < 0 || id >= ranges.length) {\n throw new Error(\n `[faijs/appearance] E_FACE_INDEX: face index ${id} out of range 0..${ranges.length - 1}`,\n )\n }\n targets.push(ranges[id])\n }\n\n const spans: FaceSpan[] = []\n for (const g of shape.materialGroups ?? []) {\n spans.push({ start: g.start, end: g.start + g.count, appearance: g.appearance })\n }\n // 每个目标区间与现有 spans 求并:重叠部分 mergeAppearance,保留两侧未覆盖段。\n for (const t of targets) {\n const ts = t.start\n const te = t.start + t.count\n let applied = false\n for (const h of spans) {\n const is = Math.max(ts, h.start)\n const ie = Math.min(te, h.end)\n if (is >= ie) continue\n applied = true\n const left = h.start < is ? { start: h.start, end: is, appearance: h.appearance } : null\n const right = ie < h.end ? { start: ie, end: h.end, appearance: h.appearance } : null\n const merged: FaceSpan = { start: is, end: ie, appearance: mergeAppearance(h.appearance, spec) }\n const idx = spans.indexOf(h)\n spans.splice(idx, 1, ...(left ? [left] : []), merged, ...(right ? [right] : []))\n }\n if (!applied) spans.push({ start: ts, end: te, appearance: spec })\n }\n // 归一化:按 start 排序 + 相邻同外观合并。\n spans.sort((a, b) => a.start - b.start)\n const out: FaceSpan[] = []\n for (const s of spans) {\n const last = out[out.length - 1]\n if (last && last.end === s.start && sameAppearance(last.appearance, s.appearance)) {\n last.end = s.end\n } else {\n out.push({ ...s })\n }\n }\n shape.materialGroups = out.map((s) => ({\n start: s.start,\n count: s.end - s.start,\n appearance: s.appearance ?? {},\n }))\n}\n\n// ── Shape 方法挂载 ──\n\n/**\n * 给 Shape 实例挂载外观方法(幂等:已有 setAppearance 则跳过)。\n *\n * 所有产物构造点(solid/curve → fromBrep/fromMeshSolid/fromBrepCurve)统一\n * 调用本函数,保证 mesh/brep 双链路产物都可用 `box1.setColor(...)`。\n * 方法**不序列化**(JSON 丢弃函数);`appearance` 字段随产物跨 worker 传递,\n * 编辑器/查看器只读字段即可,不依赖方法。\n * @param shape 产物 Shape 实例(solid/curve 产物)\n * @returns 挂载后的 shape(类型提升为 `Shape & ShapeAppearanceMethods`;同一实例原地挂载)\n */\nexport function attachAppearanceMethods(shape: Shape): Shape & ShapeAppearanceMethods {\n const s = shape as Shape & ShapeAppearanceMethods\n if (typeof s.setAppearance === 'function') return s\n s.setAppearance = function setAppearance(this: Shape & ShapeAppearanceMethods, spec: PbrAppearance) {\n this.appearance = mergeAppearance(this.appearance, spec)\n return this\n }\n s.setColor = function setColor(this: Shape & ShapeAppearanceMethods, color: PbrColor) {\n const { rgb, alpha } = normalizeColor(color)\n const spec: PbrAppearance = { color: rgb }\n // #rrggbbaa / [r,g,b,a] 的 alpha 归一为 opacity(权威字段)。已显式\n // setOpacity 的旧值:仅当本次 color 自带 alpha 时覆盖;无 alpha 的\n // setColor 不动 opacity。\n if (alpha !== undefined) spec.opacity = alpha\n this.appearance = mergeAppearance(this.appearance, spec)\n return this\n }\n s.setMaterial = function setMaterial(this: Shape & ShapeAppearanceMethods, spec: MaterialSpec) {\n this.appearance = mergeAppearance(this.appearance, spec as PbrAppearance)\n return this\n }\n s.setOpacity = function setOpacity(this: Shape & ShapeAppearanceMethods, opacity: number) {\n assertComponent01(opacity, 'opacity')\n this.appearance = mergeAppearance(this.appearance, { opacity })\n return this\n }\n s.getAppearance = function getAppearance(this: Shape) {\n return this.appearance\n }\n s.setFaceColor = function setFaceColor(this: Shape & ShapeAppearanceMethods, faces: number[], color: PbrColor) {\n const { rgb, alpha } = normalizeColor(color)\n const spec: PbrAppearance = { color: rgb }\n if (alpha !== undefined) spec.opacity = alpha\n mergeFaceAppearance(this, faces, spec)\n return this\n }\n s.setFaceMaterial = function setFaceMaterial(this: Shape & ShapeAppearanceMethods, faces: number[], spec: MaterialSpec) {\n mergeFaceAppearance(this, faces, spec as PbrAppearance)\n return this\n }\n return s\n}\n"]}
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../src/api/appearance.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/appearance — faijs PBR 外观规格(颜色/材质/透明度)权威类型与 Shape 方法\n *\n * 定位:\n * - 外观设置**不是 op**(不进 defineOp/api-namespace/args-schema),是 Shape\n * 实例方法(`box1.setColor(...)`,复用 `asm1.solve()` 的成员调用语句形态)。\n * - `PbrAppearance` 引擎无关、JSON 可序列化,随 Shape 走 mesh/brep 双链路\n * (`Shape.appearance`),编辑器/查看器只读字段,不依赖方法。\n * - 本文件零依赖(不 import THREE / occt / store);唯一 import 是 mesh/types\n * 的 `Shape` 类型(type-only),mesh/types 亦只 type-import 本文件的类型,\n * 两者为类型环、无运行时环(值依赖单向:shape.ts → api/appearance.ts)。\n *\n * 颜色约定:\n * - 内部归一形态:`color: [r, g, b]`(sRGB,0–1);`opacity` 是透明度的唯一\n * 权威字段(0–1)。\n * - 输入接受 hex(#rgb / #rrggbb / #rrggbbaa)与数组([r,g,b] / [r,g,b,a]);\n * `#rrggbbaa` / 数组第 4 分量的 alpha 等价于 `opacity`(显式 setOpacity 后\n * 写入的 opacity 优先于后续无 alpha 的 setColor 推导,见 setColor 注释)。\n * - CSS 颜色名:P1 不支持(抛错),由宿主或后续版本扩展。\n */\n\nimport type { Shape } from '../mesh/types'\n\n// ── 类型 ──\n\n/** 颜色输入:hex(#rgb/#rrggbb/#rrggbbaa)或 sRGB 0–1 数组([r,g,b] / [r,g,b,a])。 */\nexport type PbrColor = string | [number, number, number] | [number, number, number, number]\n\n/** glTF 透明度约定(与 3d_editor MaterialAppearance.alphaMode 对齐)。 */\nexport type PbrAlphaMode = 'OPAQUE' | 'MASK' | 'BLEND'\n\n/**\n * faijs PBR 外观规格 —— 引擎无关、JSON 可序列化、随 Shape 走双链路。\n *\n * 全字段可选:未设置字段 = 继承上游 / 宿主默认,不隐式清零。\n * 归一形态约定:`color` 为 [r,g,b](sRGB 0–1)数组;`opacity`(0–1)为\n * 透明度唯一权威字段(color 的 aa 分量在 set 时归一为 opacity)。\n */\nexport interface PbrAppearance {\n /** 基色(sRGB 0–1)。 */\n color?: [number, number, number]\n /** 透明度 0–1。 */\n opacity?: number\n /** 金属度 0–1;粗糙度 0–1。 */\n metalness?: number\n roughness?: number\n\n /** 自发光:颜色 + 强度(>0 时启用,默认 1)。 */\n emissive?: [number, number, number]\n emissiveIntensity?: number\n\n /** 透射/玻璃。 */\n transmission?: number\n thickness?: number\n ior?: number\n attenuationColor?: [number, number, number]\n attenuationDistance?: number\n\n /** 清漆。 */\n clearcoat?: number\n clearcoatRoughness?: number\n\n /** 织物/丝绒。 */\n sheen?: number\n sheenColor?: [number, number, number]\n sheenRoughness?: number\n\n /** 拉丝金属。 */\n anisotropy?: number\n anisotropyRotation?: number\n\n /** 高光工作流(替代 metalness 工作流)。 */\n specularIntensity?: number\n specularColor?: [number, number, number]\n\n /** 环境光强度(IBL 贡献)。 */\n envMapIntensity?: number\n\n /** 透明度模式:默认 OPAQUE;opacity<1 未显式指定时宿主按 BLEND 处理。 */\n alphaMode?: PbrAlphaMode\n alphaCutoff?: number\n /** 双面渲染。 */\n doubleSided?: boolean\n /** 无光照。 */\n unlit?: boolean\n}\n\n/** 材质参数(不含颜色/透明度,`cad` 便捷方法 setMaterial 的入参)。 */\nexport type MaterialSpec = Omit<PbrAppearance, 'color' | 'opacity'>\n\n/** Shape 外观方法签名(运行时由 attachAppearanceMethods 挂载;纯数据判定不受影响)。 */\nexport interface ShapeAppearanceMethods {\n /**\n * 合并外观:`{...cur, ...spec}`,spec 中 undefined 字段保留旧值。\n * @param spec - 待合并的外观字段(color / opacity / roughness / metalness / …)。\n * @returns this(可链式调用)。\n * @example\n * part0.setAppearance({ roughness: 0.4, metalness: 0.8 })\n */\n setAppearance(spec: PbrAppearance): this\n /**\n * 便捷:等价 setAppearance({ color });#rrggbbaa / [r,g,b,a] 的 alpha 归一为 opacity。\n * @param color - `#rgb` / `#rrggbb` / `#rrggbbaa` 十六进制串,或 `[r,g,b]` / `[r,g,b,a]`(0–1)。\n * @returns this(可链式调用)。\n * @example\n * part0.setColor('#2e8b57')\n */\n setColor(color: PbrColor): this\n /**\n * 便捷:等价 setAppearance(spec)。\n * @param spec - 材质参数(不含 color / opacity)。\n * @returns this(可链式调用)。\n * @example\n * part0.setMaterial({ metalness: 0.9, roughness: 0.2 })\n */\n setMaterial(spec: MaterialSpec): this\n /**\n * 便捷:透明度权威字段(0–1)。\n * @param opacity - 0(全透明)–1(不透明)。\n * @returns this(可链式调用)。\n * @example\n * part0.setOpacity(0.5)\n */\n setOpacity(opacity: number): this\n /**\n * 读取当前外观(可能 undefined)。\n * @returns 当前外观的只读快照;从未设置过时为 `undefined`。\n * @example\n * const appearance = part0.getAppearance()\n */\n getAppearance(): Readonly<PbrAppearance> | undefined\n /**\n * 面级设色:把 faceIds 指定的面(面序号契约见 `Shape.faceRanges`,参数化\n * primitives 才有)写入 `materialGroups`。无面结构(布尔/组合/导入产物)抛\n * `E_FACE_UNAVAILABLE`;面序号越界抛 `E_FACE_INDEX`。\n * @param faces - 面序号数组(0 起,契约见 `Shape.faceRanges`)。\n * @param color - 同 setColor 的颜色入参。\n * @returns this(可链式调用)。\n * @example\n * box(20, 20, 20).setFaceColor([0], '#c0392b')\n */\n setFaceColor(faces: number[], color: PbrColor): this\n /**\n * 面级材质:等价 setFaceColor 的 material 版本。\n * @param faces - 面序号数组(0 起,契约见 `Shape.faceRanges`)。\n * @param spec - 材质参数(不含 color / opacity)。\n * @returns this(可链式调用)。\n * @example\n * box(20, 20, 20).setFaceMaterial([0], { roughness: 0.1 })\n */\n setFaceMaterial(faces: number[], spec: MaterialSpec): this\n}\n\n// ── 归一化 ──\n\n/** hex #rgb/#rrggbb/#rrggbbaa → sRGB 0–1(+可选 alpha)。 */\nfunction parseHexColor(hex: string): { rgb: [number, number, number]; alpha?: number } {\n let h = hex.startsWith('#') ? hex.slice(1) : hex\n if (h.length === 3) {\n h = h.split('').map((c) => c + c).join('')\n }\n if (h.length !== 6 && h.length !== 8) {\n throw new Error(`[faijs/appearance] invalid hex color \"${hex}\" (expected #rgb/#rrggbb/#rrggbbaa)`)\n }\n if (!/^[0-9a-fA-F]+$/.test(h)) {\n throw new Error(`[faijs/appearance] invalid hex color \"${hex}\" (non-hex digit)`)\n }\n const r = parseInt(h.slice(0, 2), 16) / 255\n const g = parseInt(h.slice(2, 4), 16) / 255\n const b = parseInt(h.slice(4, 6), 16) / 255\n const rgb: [number, number, number] = [r, g, b]\n if (h.length === 8) return { rgb, alpha: parseInt(h.slice(6, 8), 16) / 255 }\n return { rgb }\n}\n\nfunction assertComponent01(v: number, label: string): void {\n if (v < 0 || v > 1 || !Number.isFinite(v)) {\n throw new Error(`[faijs/appearance] ${label} must be in 0..1, got ${v}`)\n }\n}\n\n/**\n * 归一颜色输入 → { rgb, alpha? }。\n * hex 与 [r,g,b] / [r,g,b,a](sRGB 0–1);CSS 颜色名 P1 不支持。\n * @param color 颜色输入:`#rgb` / `#rrggbb` / `#rrggbbaa`,或 `[r,g,b]` / `[r,g,b,a]`(sRGB 0–1)\n * @returns 归一后的 sRGB 颜色(0–1)与可选 alpha;带 alpha 的输入在 alpha 通道返回\n */\nexport function normalizeColor(color: PbrColor): { rgb: [number, number, number]; alpha?: number } {\n if (typeof color === 'string') {\n if (color.startsWith('#')) return parseHexColor(color)\n throw new Error(\n `[faijs/appearance] unsupported color \"${color}\" (P1: hex #rgb/#rrggbb/#rrggbbaa or [r,g,b] expected; CSS names not supported)`,\n )\n }\n const [r, g, b, a] = color\n assertComponent01(r, 'color.r')\n assertComponent01(g, 'color.g')\n assertComponent01(b, 'color.b')\n if (a !== undefined) {\n assertComponent01(a, 'color.a')\n return { rgb: [r, g, b], alpha: a }\n }\n return { rgb: [r, g, b] }\n}\n\n/**\n * 合并外观:spec 中 undefined 字段不覆盖旧值。\n * @param cur 当前外观(可为 undefined)\n * @param spec 待合并字段(undefined 字段被跳过)\n * @returns 合并后的外观(新对象;cur 为 undefined 时仅含 spec 非空字段)\n */\nexport function mergeAppearance(cur: PbrAppearance | undefined, spec: PbrAppearance): PbrAppearance {\n const clean: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(spec)) {\n if (v !== undefined) clean[k] = v\n }\n return { ...(cur ?? {}), ...clean } as PbrAppearance\n}\n\n/** 两外观等价判定(字段级深比较;undefined 视同空对象)。 */\nfunction sameAppearance(a: PbrAppearance | undefined, b: PbrAppearance | undefined): boolean {\n const ka = Object.keys(a ?? {}).filter((k) => (a as Record<string, unknown>)[k] !== undefined).sort()\n const kb = Object.keys(b ?? {}).filter((k) => (b as Record<string, unknown>)[k] !== undefined).sort()\n if (ka.length !== kb.length) return false\n for (const k of ka) {\n const va = (a as Record<string, unknown>)[k]\n const vb = (b as Record<string, unknown>)[k]\n if (Array.isArray(va) || Array.isArray(vb)) {\n if (!Array.isArray(va) || !Array.isArray(vb) || va.length !== vb.length) return false\n for (let i = 0; i < va.length; i++) if (va[i] !== vb[i]) return false\n } else if (va !== vb) {\n return false\n }\n }\n return true\n}\n\n// ── 面级外观 ──\n\n/** 面区间跨度(内部表示,end 为开区间上界)。 */\ninterface FaceSpan {\n start: number\n end: number\n appearance: PbrAppearance | undefined\n}\n\n/**\n * 把 faceIds 指定的面(面序号 → `Shape.faceRanges` 三角形区间)合并进\n * `shape.materialGroups`。多次设置同一面 → 外观合并(spec 未设置字段保留旧值);\n * 不同面同外观 → 相邻区间合并为一个分组。输出按三角形起始排序。\n *\n * 无面结构(`faceRanges` 缺失——布尔/组合/导入产物)抛 `E_FACE_UNAVAILABLE`;\n * 面序号越界/非整数抛 `E_FACE_INDEX`。\n * @param shape 目标 Shape(必须携带 faceRanges)\n * @param faceIds 面序号列表(PbrAppearance 面序契约见 mesh/primitives.ts 各构造点注释)\n * @param spec 待合并到目标面的外观字段\n */\nexport function mergeFaceAppearance(shape: Shape, faceIds: number[], spec: PbrAppearance): void {\n const ranges = shape.faceRanges\n if (!ranges || ranges.length === 0) {\n throw new Error(\n '[faijs/appearance] E_FACE_UNAVAILABLE: shape has no face structure — ' +\n 'face-level methods only apply to parameterized primitives (box/cylinder/cone); ' +\n 'boolean/combined/imported shapes have no CAD faces',\n )\n }\n const targets: Array<{ start: number; count: number }> = []\n for (const id of faceIds) {\n if (!Number.isInteger(id) || id < 0 || id >= ranges.length) {\n throw new Error(\n `[faijs/appearance] E_FACE_INDEX: face index ${id} out of range 0..${ranges.length - 1}`,\n )\n }\n targets.push(ranges[id])\n }\n\n const spans: FaceSpan[] = []\n for (const g of shape.materialGroups ?? []) {\n spans.push({ start: g.start, end: g.start + g.count, appearance: g.appearance })\n }\n // 每个目标区间与现有 spans 求并:重叠部分 mergeAppearance,保留两侧未覆盖段。\n for (const t of targets) {\n const ts = t.start\n const te = t.start + t.count\n let applied = false\n for (const h of spans) {\n const is = Math.max(ts, h.start)\n const ie = Math.min(te, h.end)\n if (is >= ie) continue\n applied = true\n const left = h.start < is ? { start: h.start, end: is, appearance: h.appearance } : null\n const right = ie < h.end ? { start: ie, end: h.end, appearance: h.appearance } : null\n const merged: FaceSpan = { start: is, end: ie, appearance: mergeAppearance(h.appearance, spec) }\n const idx = spans.indexOf(h)\n spans.splice(idx, 1, ...(left ? [left] : []), merged, ...(right ? [right] : []))\n }\n if (!applied) spans.push({ start: ts, end: te, appearance: spec })\n }\n // 归一化:按 start 排序 + 相邻同外观合并。\n spans.sort((a, b) => a.start - b.start)\n const out: FaceSpan[] = []\n for (const s of spans) {\n const last = out[out.length - 1]\n if (last && last.end === s.start && sameAppearance(last.appearance, s.appearance)) {\n last.end = s.end\n } else {\n out.push({ ...s })\n }\n }\n shape.materialGroups = out.map((s) => ({\n start: s.start,\n count: s.end - s.start,\n appearance: s.appearance ?? {},\n }))\n}\n\n// ── Shape 方法挂载 ──\n\n/**\n * 给 Shape 实例挂载外观方法(幂等:已有 setAppearance 则跳过)。\n *\n * 所有产物构造点(solid/curve → fromBrep/fromMeshSolid/fromBrepCurve)统一\n * 调用本函数,保证 mesh/brep 双链路产物都可用 `box1.setColor(...)`。\n * 方法**不序列化**(JSON 丢弃函数);`appearance` 字段随产物跨 worker 传递,\n * 编辑器/查看器只读字段即可,不依赖方法。\n * @param shape 产物 Shape 实例(solid/curve 产物)\n * @returns 挂载后的 shape(类型提升为 `Shape & ShapeAppearanceMethods`;同一实例原地挂载)\n */\nexport function attachAppearanceMethods(shape: Shape): Shape & ShapeAppearanceMethods {\n const s = shape as Shape & ShapeAppearanceMethods\n if (typeof s.setAppearance === 'function') return s\n s.setAppearance = function setAppearance(this: Shape & ShapeAppearanceMethods, spec: PbrAppearance) {\n this.appearance = mergeAppearance(this.appearance, spec)\n return this\n }\n s.setColor = function setColor(this: Shape & ShapeAppearanceMethods, color: PbrColor) {\n const { rgb, alpha } = normalizeColor(color)\n const spec: PbrAppearance = { color: rgb }\n // #rrggbbaa / [r,g,b,a] 的 alpha 归一为 opacity(权威字段)。已显式\n // setOpacity 的旧值:仅当本次 color 自带 alpha 时覆盖;无 alpha 的\n // setColor 不动 opacity。\n if (alpha !== undefined) spec.opacity = alpha\n this.appearance = mergeAppearance(this.appearance, spec)\n return this\n }\n s.setMaterial = function setMaterial(this: Shape & ShapeAppearanceMethods, spec: MaterialSpec) {\n this.appearance = mergeAppearance(this.appearance, spec as PbrAppearance)\n return this\n }\n s.setOpacity = function setOpacity(this: Shape & ShapeAppearanceMethods, opacity: number) {\n assertComponent01(opacity, 'opacity')\n this.appearance = mergeAppearance(this.appearance, { opacity })\n return this\n }\n s.getAppearance = function getAppearance(this: Shape) {\n return this.appearance\n }\n s.setFaceColor = function setFaceColor(this: Shape & ShapeAppearanceMethods, faces: number[], color: PbrColor) {\n const { rgb, alpha } = normalizeColor(color)\n const spec: PbrAppearance = { color: rgb }\n if (alpha !== undefined) spec.opacity = alpha\n mergeFaceAppearance(this, faces, spec)\n return this\n }\n s.setFaceMaterial = function setFaceMaterial(this: Shape & ShapeAppearanceMethods, faces: number[], spec: MaterialSpec) {\n mergeFaceAppearance(this, faces, spec as PbrAppearance)\n return this\n }\n return s\n}\n"]}
@@ -14,7 +14,7 @@
14
14
  * E_TOPO_NOT_FOUND(方案 R4/P0 验收③:绝不静默降级)。
15
15
  */
16
16
  import { TopoRefError } from '../../topology/naming/index.js';
17
- import { resolveTopoRef, captureEdgeAxis, captureFaceHint } from '../../topology/naming/index.js';
17
+ import { resolveTopoRef, captureEdgeAxis, captureFaceHint, captureCylinderFaceAxis } from '../../topology/naming/index.js';
18
18
  import { buildShapeResolutionContext, buildEdgeResolutionContext, resolveFaceGeometry, } from '../topo-resolve.js';
19
19
  /** 无轴可用的报错信息后缀(E_TOPO_NOT_FOUND)。 */
20
20
  function missingAxisReason(geom) {
@@ -132,10 +132,13 @@ export function resolveSolverEntity(ref, env) {
132
132
  }
133
133
  /**
134
134
  * faceIndex 简写的面几何(从解析上下文候选行直接取):
135
- * BREP 候选(活句柄)→ captureFaceHint 现场;行快照候选 → 行几何。
135
+ * **行快照优先**(与 `toScoringCandidate` / `resolveFaceGeometry` 同口径——
136
+ * brepkit 的 kernel 现场 center 会退化:uvBounds ±1e6 哨兵 → surfaceCenterOfMass
137
+ * 在参数原点求值,非居中模型上 center 全错 → 装配解算拿错面几何);无行快照才
138
+ * captureFaceHint 现场。
136
139
  */
137
140
  function faceGeometryFromContextEntry(env, entry, part) {
138
- if (entry.handle && env.kernel) {
141
+ if (entry.row === undefined && entry.handle && env.kernel) {
139
142
  const hint = captureFaceHint(env.kernel, entry.handle);
140
143
  return {
141
144
  surfaceType: hint.surfaceType,
@@ -148,11 +151,18 @@ function faceGeometryFromContextEntry(env, entry, part) {
148
151
  if (!hint?.center || !hint?.normal) {
149
152
  throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceIndex row has no geometry (part=${part})`);
150
153
  }
154
+ // 圆柱轴补采(同 resolveFaceGeometry):行快照不带 axis,圆柱轴一向现场采,
155
+ // 由 pointOnSurface + getFaceCylinderData 量出——不经过退化的
156
+ // surfaceCenterOfMass,现场值可靠。守住 P0①。
157
+ let axis = hint.axis;
158
+ if (axis === undefined && hint.surfaceType === 'cylinder' && entry.handle && env.kernel) {
159
+ axis = captureCylinderFaceAxis(env.kernel, entry.handle);
160
+ }
151
161
  return {
152
162
  surfaceType: hint.surfaceType,
153
163
  center: hint.center,
154
164
  normal: hint.normal,
155
- ...(hint.axis ? { axis: hint.axis } : {}),
165
+ ...(axis ? { axis } : {}),
156
166
  };
157
167
  }
158
168
  //# sourceMappingURL=entities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/api/assembly/entities.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/entities — EntityRef → SolverEntity 实体抽取(P1,方案 §3.6 / §5.2)\n *\n * 三要素范式(与 chamfer 同构,方案 §3.5):\n * 1. 引用可序列化:EntityRef 进 .fai.js;\n * 2. 解析在执行期:TopoRef 复用 topo-resolve 的解析通道(BREP 现场 / mesh 行快照);\n * 3. 句柄是瞬态:解析出的几何立即转成纯数据 SolverEntity,句柄不跨语句。\n *\n * 输出契约对齐约束求解器的 SolverEntity:{ type: 'plane'|'axis'|'point',\n * origin, normal?/direction? }。dependent 侧填本地坐标(部件自身坐标系),\n * reference 侧世界变换由 solverAdapter 的 transformEntity 负责——本层不做。\n *\n * 缺轴(mesh 行快照无宿主注入的 axis、sphere 等无轴面类型)→ 抛\n * E_TOPO_NOT_FOUND(方案 R4/P0 验收③:绝不静默降级)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { PartName } from '../../identity'\nimport type { SolverEntity } from './solvers/types'\nimport { TopoRefError, type AxisHint } from '../../topology/naming'\nimport { resolveTopoRef, captureEdgeAxis, captureFaceHint } from '../../topology/naming'\nimport {\n buildShapeResolutionContext,\n buildEdgeResolutionContext,\n resolveFaceGeometry,\n type ResolvedFaceGeometry,\n} from '../topo-resolve'\nimport type { EntityRef, AssemblyVec3 } from './types'\n\n/** 实体抽取环境:内核(null = mesh/primitive 行快照路径)+ 成员查找。 */\nexport interface EntityResolutionEnv {\n kernel: BrepEngineApi | null\n /** part 变量名 → 成员 Shape。 */\n memberOf: (part: string) => Shape | undefined\n}\n\n/** 无轴可用的报错信息后缀(E_TOPO_NOT_FOUND)。 */\nfunction missingAxisReason(geom: ResolvedFaceGeometry): string {\n return `face needs an axis (surfaceType=${geom.surfaceType ?? 'unknown'}) but none is available ` +\n `(BREP path: captureFaceHint; mesh path: host must inject axis into the naming row)`\n}\n\n/**\n * 面几何 → SolverEntity(方案 §5.2 抽取规则表)。\n * 平面 → plane;圆柱/圆锥(有轴)→ axis;其它/缺轴 → E_TOPO_NOT_FOUND。\n *\n * @param geom - the resolved face geometry (live BREP or mesh row snapshot).\n * @returns the solver entity (plane or axis).\n * @throws TopoRefError with code E_TOPO_NOT_FOUND when the surface has no usable axis or is unsupported.\n */\nexport function faceGeometryToSolverEntity(geom: ResolvedFaceGeometry): SolverEntity {\n const st = geom.surfaceType\n if (st === 'cylinder' || st === 'cone') {\n if (!geom.axis) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', missingAxisReason(geom))\n }\n return { type: 'axis', origin: geom.axis.origin, direction: geom.axis.direction }\n }\n if (!st || st === 'plane') {\n return { type: 'plane', origin: geom.center, normal: geom.normal }\n }\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `unsupported surface type for an assembly entity: ${st}` +\n (geom.axis ? '' : ` (${missingAxisReason(geom)})`),\n )\n}\n\n/** 快照形态 FaceRef → ResolvedFaceGeometry(无 axis——贴合语义只需 center+normal)。 */\nfunction snapshotFaceGeometry(face: { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 }): ResolvedFaceGeometry {\n return { surfaceType: face.surfaceType, center: face.center, normal: face.normal }\n}\n\n/**\n * 解析一个 EntityRef 的面几何(mate/align 降级路径用:只需 center + normal,\n * 圆柱面轴不参与贴合——方案 §3.7.4 适用边界)。\n *\n * @param ref - the entity reference (must be a face reference).\n * @param env - the resolution environment.\n * @returns the resolved face geometry.\n * @throws Error when the ref is not a face reference or the part is unknown.\n */\nexport function resolveFaceGeometryOfRef(ref: EntityRef, env: EntityResolutionEnv): ResolvedFaceGeometry {\n if (!('face' in ref)) {\n throw new Error('[assembly] mate/align constraints require face references on both sides')\n }\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n const face = ref.face as { topoRef?: unknown; center?: AssemblyVec3; normal?: AssemblyVec3; surfaceType?: string }\n if (face.topoRef) {\n return resolveFaceGeometry(env.kernel, shape, face.topoRef as Parameters<typeof resolveFaceGeometry>[2])\n }\n if (!face.center || !face.normal) {\n throw new Error('[assembly] face snapshot requires center and normal')\n }\n return snapshotFaceGeometry(face as { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 })\n}\n\n/** 边 TopoRef → 轴(BREP 现场;mesh 无邻接能力 → E_TOPO_NOT_FOUND)。 */\nfunction resolveEdgeAxisFromTopoRef(\n kernel: BrepEngineApi,\n shape: Shape,\n edgeTopoRef: Parameters<typeof resolveTopoRef>[0],\n part: PartName,\n): AxisHint {\n const ctx = buildEdgeResolutionContext(kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge entity needs a BREP naming context (part=${part}); mesh parts have no edge adjacency`,\n )\n }\n const resolved = resolveTopoRef(edgeTopoRef, ctx)\n const entry = ctx.edges?.[resolved.ordinal - 1]\n if (!entry?.handle) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `resolved edge ordinal ${resolved.ordinal} has no live handle (part=${part})`,\n )\n }\n const axis = captureEdgeAxis(kernel, entry.handle)\n if (!axis) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge ordinal ${resolved.ordinal} is not a line or circle — no axis entity available`,\n )\n }\n return axis\n}\n\n/**\n * 解析一个 EntityRef → SolverEntity(coincident/concentric/distance/angle 直译路径)。\n *\n * @param ref - the entity reference.\n * @param env - the resolution environment.\n * @returns the solver entity (pure data).\n * @throws TopoRefError / Error on unresolvable or unsupported references.\n */\nexport function resolveSolverEntity(ref: EntityRef, env: EntityResolutionEnv): SolverEntity {\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n\n if ('point' in ref) {\n return { type: 'point', origin: ref.point }\n }\n if ('face' in ref) {\n return faceGeometryToSolverEntity(resolveFaceGeometryOfRef(ref, env))\n }\n if ('faceIndex' in ref) {\n // 序号简写(1 起,调试用):直接按 ordinal 取候选面几何(不走 TopoRef 打分)\n const ctx = buildShapeResolutionContext(env.kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} has no naming context on part ${ref.part}`,\n )\n }\n const entry = ctx.faces[ref.faceIndex - 1]\n if (!entry) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} out of range (part ${ref.part} has ${ctx.faces.length} faces)`,\n )\n }\n return faceGeometryToSolverEntity(faceGeometryFromContextEntry(env, entry, ref.part))\n }\n // edge 引用\n const edge = ref.edge as { topoRef?: unknown; axis?: { origin: AssemblyVec3; direction: AssemblyVec3 } }\n if (edge.axis) {\n return { type: 'axis', origin: edge.axis.origin, direction: edge.axis.direction }\n }\n if (!env.kernel) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge TopoRef needs a live kernel (part=${ref.part}); mesh path supports only axis snapshots`,\n )\n }\n const axis = resolveEdgeAxisFromTopoRef(env.kernel, shape, edge.topoRef as Parameters<typeof resolveTopoRef>[0], ref.part)\n return { type: 'axis', origin: axis.origin, direction: axis.direction }\n}\n\n/**\n * faceIndex 简写的面几何(从解析上下文候选行直接取):\n * BREP 候选(活句柄)→ captureFaceHint 现场;行快照候选 → 行几何。\n */\nfunction faceGeometryFromContextEntry(\n env: EntityResolutionEnv,\n entry: { handle?: unknown; row?: unknown },\n part: PartName,\n): ResolvedFaceGeometry {\n if (entry.handle && env.kernel) {\n const hint = captureFaceHint(env.kernel, entry.handle as Parameters<typeof captureFaceHint>[1])\n return {\n surfaceType: hint.surfaceType,\n center: hint.center ?? [0, 0, 0],\n normal: hint.normal ?? [0, 0, 1],\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n }\n const hint = entry.row as\n | { surfaceType?: string; center?: AssemblyVec3; normal?: AssemblyVec3; axis?: AxisHint }\n | undefined\n if (!hint?.center || !hint?.normal) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceIndex row has no geometry (part=${part})`)\n }\n return {\n surfaceType: hint.surfaceType,\n center: hint.center,\n normal: hint.normal,\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n}\n"]}
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/api/assembly/entities.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/entities — EntityRef → SolverEntity 实体抽取(P1,方案 §3.6 / §5.2)\n *\n * 三要素范式(与 chamfer 同构,方案 §3.5):\n * 1. 引用可序列化:EntityRef 进 .fai.js;\n * 2. 解析在执行期:TopoRef 复用 topo-resolve 的解析通道(BREP 现场 / mesh 行快照);\n * 3. 句柄是瞬态:解析出的几何立即转成纯数据 SolverEntity,句柄不跨语句。\n *\n * 输出契约对齐约束求解器的 SolverEntity:{ type: 'plane'|'axis'|'point',\n * origin, normal?/direction? }。dependent 侧填本地坐标(部件自身坐标系),\n * reference 侧世界变换由 solverAdapter 的 transformEntity 负责——本层不做。\n *\n * 缺轴(mesh 行快照无宿主注入的 axis、sphere 等无轴面类型)→ 抛\n * E_TOPO_NOT_FOUND(方案 R4/P0 验收③:绝不静默降级)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { PartName } from '../../identity'\nimport type { SolverEntity } from './solvers/types'\nimport { TopoRefError, type AxisHint } from '../../topology/naming'\nimport { resolveTopoRef, captureEdgeAxis, captureFaceHint, captureCylinderFaceAxis } from '../../topology/naming'\nimport {\n buildShapeResolutionContext,\n buildEdgeResolutionContext,\n resolveFaceGeometry,\n type ResolvedFaceGeometry,\n} from '../topo-resolve'\nimport type { EntityRef, AssemblyVec3 } from './types'\n\n/** 实体抽取环境:内核(null = mesh/primitive 行快照路径)+ 成员查找。 */\nexport interface EntityResolutionEnv {\n kernel: BrepEngineApi | null\n /** part 变量名 → 成员 Shape。 */\n memberOf: (part: string) => Shape | undefined\n}\n\n/** 无轴可用的报错信息后缀(E_TOPO_NOT_FOUND)。 */\nfunction missingAxisReason(geom: ResolvedFaceGeometry): string {\n return `face needs an axis (surfaceType=${geom.surfaceType ?? 'unknown'}) but none is available ` +\n `(BREP path: captureFaceHint; mesh path: host must inject axis into the naming row)`\n}\n\n/**\n * 面几何 → SolverEntity(方案 §5.2 抽取规则表)。\n * 平面 → plane;圆柱/圆锥(有轴)→ axis;其它/缺轴 → E_TOPO_NOT_FOUND。\n *\n * @param geom - the resolved face geometry (live BREP or mesh row snapshot).\n * @returns the solver entity (plane or axis).\n * @throws TopoRefError with code E_TOPO_NOT_FOUND when the surface has no usable axis or is unsupported.\n */\nexport function faceGeometryToSolverEntity(geom: ResolvedFaceGeometry): SolverEntity {\n const st = geom.surfaceType\n if (st === 'cylinder' || st === 'cone') {\n if (!geom.axis) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', missingAxisReason(geom))\n }\n return { type: 'axis', origin: geom.axis.origin, direction: geom.axis.direction }\n }\n if (!st || st === 'plane') {\n return { type: 'plane', origin: geom.center, normal: geom.normal }\n }\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `unsupported surface type for an assembly entity: ${st}` +\n (geom.axis ? '' : ` (${missingAxisReason(geom)})`),\n )\n}\n\n/** 快照形态 FaceRef → ResolvedFaceGeometry(无 axis——贴合语义只需 center+normal)。 */\nfunction snapshotFaceGeometry(face: { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 }): ResolvedFaceGeometry {\n return { surfaceType: face.surfaceType, center: face.center, normal: face.normal }\n}\n\n/**\n * 解析一个 EntityRef 的面几何(mate/align 降级路径用:只需 center + normal,\n * 圆柱面轴不参与贴合——方案 §3.7.4 适用边界)。\n *\n * @param ref - the entity reference (must be a face reference).\n * @param env - the resolution environment.\n * @returns the resolved face geometry.\n * @throws Error when the ref is not a face reference or the part is unknown.\n */\nexport function resolveFaceGeometryOfRef(ref: EntityRef, env: EntityResolutionEnv): ResolvedFaceGeometry {\n if (!('face' in ref)) {\n throw new Error('[assembly] mate/align constraints require face references on both sides')\n }\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n const face = ref.face as { topoRef?: unknown; center?: AssemblyVec3; normal?: AssemblyVec3; surfaceType?: string }\n if (face.topoRef) {\n return resolveFaceGeometry(env.kernel, shape, face.topoRef as Parameters<typeof resolveFaceGeometry>[2])\n }\n if (!face.center || !face.normal) {\n throw new Error('[assembly] face snapshot requires center and normal')\n }\n return snapshotFaceGeometry(face as { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 })\n}\n\n/** 边 TopoRef → 轴(BREP 现场;mesh 无邻接能力 → E_TOPO_NOT_FOUND)。 */\nfunction resolveEdgeAxisFromTopoRef(\n kernel: BrepEngineApi,\n shape: Shape,\n edgeTopoRef: Parameters<typeof resolveTopoRef>[0],\n part: PartName,\n): AxisHint {\n const ctx = buildEdgeResolutionContext(kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge entity needs a BREP naming context (part=${part}); mesh parts have no edge adjacency`,\n )\n }\n const resolved = resolveTopoRef(edgeTopoRef, ctx)\n const entry = ctx.edges?.[resolved.ordinal - 1]\n if (!entry?.handle) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `resolved edge ordinal ${resolved.ordinal} has no live handle (part=${part})`,\n )\n }\n const axis = captureEdgeAxis(kernel, entry.handle)\n if (!axis) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge ordinal ${resolved.ordinal} is not a line or circle — no axis entity available`,\n )\n }\n return axis\n}\n\n/**\n * 解析一个 EntityRef → SolverEntity(coincident/concentric/distance/angle 直译路径)。\n *\n * @param ref - the entity reference.\n * @param env - the resolution environment.\n * @returns the solver entity (pure data).\n * @throws TopoRefError / Error on unresolvable or unsupported references.\n */\nexport function resolveSolverEntity(ref: EntityRef, env: EntityResolutionEnv): SolverEntity {\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n\n if ('point' in ref) {\n return { type: 'point', origin: ref.point }\n }\n if ('face' in ref) {\n return faceGeometryToSolverEntity(resolveFaceGeometryOfRef(ref, env))\n }\n if ('faceIndex' in ref) {\n // 序号简写(1 起,调试用):直接按 ordinal 取候选面几何(不走 TopoRef 打分)\n const ctx = buildShapeResolutionContext(env.kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} has no naming context on part ${ref.part}`,\n )\n }\n const entry = ctx.faces[ref.faceIndex - 1]\n if (!entry) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} out of range (part ${ref.part} has ${ctx.faces.length} faces)`,\n )\n }\n return faceGeometryToSolverEntity(faceGeometryFromContextEntry(env, entry, ref.part))\n }\n // edge 引用\n const edge = ref.edge as { topoRef?: unknown; axis?: { origin: AssemblyVec3; direction: AssemblyVec3 } }\n if (edge.axis) {\n return { type: 'axis', origin: edge.axis.origin, direction: edge.axis.direction }\n }\n if (!env.kernel) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge TopoRef needs a live kernel (part=${ref.part}); mesh path supports only axis snapshots`,\n )\n }\n const axis = resolveEdgeAxisFromTopoRef(env.kernel, shape, edge.topoRef as Parameters<typeof resolveTopoRef>[0], ref.part)\n return { type: 'axis', origin: axis.origin, direction: axis.direction }\n}\n\n/**\n * faceIndex 简写的面几何(从解析上下文候选行直接取):\n * **行快照优先**(与 `toScoringCandidate` / `resolveFaceGeometry` 同口径——\n * brepkit 的 kernel 现场 center 会退化:uvBounds ±1e6 哨兵 → surfaceCenterOfMass\n * 在参数原点求值,非居中模型上 center 全错 → 装配解算拿错面几何);无行快照才\n * captureFaceHint 现场。\n */\nfunction faceGeometryFromContextEntry(\n env: EntityResolutionEnv,\n entry: { handle?: unknown; row?: unknown },\n part: PartName,\n): ResolvedFaceGeometry {\n if (entry.row === undefined && entry.handle && env.kernel) {\n const hint = captureFaceHint(env.kernel, entry.handle as Parameters<typeof captureFaceHint>[1])\n return {\n surfaceType: hint.surfaceType,\n center: hint.center ?? [0, 0, 0],\n normal: hint.normal ?? [0, 0, 1],\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n }\n const hint = entry.row as\n | { surfaceType?: string; center?: AssemblyVec3; normal?: AssemblyVec3; axis?: AxisHint }\n | undefined\n if (!hint?.center || !hint?.normal) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceIndex row has no geometry (part=${part})`)\n }\n // 圆柱轴补采(同 resolveFaceGeometry):行快照不带 axis,圆柱轴一向现场采,\n // 由 pointOnSurface + getFaceCylinderData 量出——不经过退化的\n // surfaceCenterOfMass,现场值可靠。守住 P0①。\n let axis = hint.axis\n if (axis === undefined && hint.surfaceType === 'cylinder' && entry.handle && env.kernel) {\n axis = captureCylinderFaceAxis(env.kernel, entry.handle as Parameters<typeof captureCylinderFaceAxis>[1])\n }\n return {\n surfaceType: hint.surfaceType,\n center: hint.center,\n normal: hint.normal,\n ...(axis ? { axis } : {}),\n }\n}\n"]}
@@ -32,6 +32,7 @@ export interface AssemblyTreeSolveResult {
32
32
  */
33
33
  underdetermined?: {
34
34
  dof: number;
35
+ freeDirs?: number[][];
35
36
  };
36
37
  }
37
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"solve-tree.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/solve-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAO3D,qCAAqC;AACrC,MAAM,WAAW,uBAAuB;IACtC,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC7C,gBAAgB;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,iBAAiB;IACjB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,eAAe;IACf,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAkFD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,IAAI,CAAC,EAAE,YAAY,GAClB,uBAAuB,CAkDzB"}
1
+ {"version":3,"file":"solve-tree.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/solve-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAO3D,qCAAqC;AACrC,MAAM,WAAW,uBAAuB;IACtC,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC7C,gBAAgB;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,iBAAiB;IACjB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,eAAe;IACf,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;KAAE,CAAA;CACzD;AA+FD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,IAAI,CAAC,EAAE,YAAY,GAClB,uBAAuB,CA6DzB"}