@faicad/faijs 0.29.5 → 0.30.9

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 (582) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +0 -2
  7. package/dist/api/appearance.d.ts.map +1 -1
  8. package/dist/api/appearance.js +0 -2
  9. package/dist/api/appearance.js.map +1 -1
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/index.d.ts +15 -6
  257. package/dist/api/index.d.ts.map +1 -1
  258. package/dist/api/index.js +29 -8
  259. package/dist/api/index.js.map +1 -1
  260. package/dist/api/internal/compat-op.d.ts +4 -30
  261. package/dist/api/internal/compat-op.d.ts.map +1 -1
  262. package/dist/api/internal/compat-op.js +10 -42
  263. package/dist/api/internal/compat-op.js.map +1 -1
  264. package/dist/api/internal/compat-projection.d.ts +5 -5
  265. package/dist/api/internal/compat-projection.js +5 -5
  266. package/dist/api/internal/compat-projection.js.map +1 -1
  267. package/dist/api/internal/dual-form-args.d.ts +0 -2
  268. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  269. package/dist/api/internal/dual-form-args.js +1 -3
  270. package/dist/api/internal/dual-form-args.js.map +1 -1
  271. package/dist/api/internal/l3-bridge.d.ts +5 -37
  272. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  273. package/dist/api/internal/l3-bridge.js +7 -76
  274. package/dist/api/internal/l3-bridge.js.map +1 -1
  275. package/dist/api/internal/profile-wire.d.ts +1 -1
  276. package/dist/api/internal/profile-wire.js +1 -1
  277. package/dist/api/internal/profile-wire.js.map +1 -1
  278. package/dist/api/internal/result-unwrap.d.ts +4 -6
  279. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  280. package/dist/api/internal/result-unwrap.js +4 -6
  281. package/dist/api/internal/result-unwrap.js.map +1 -1
  282. package/dist/api/knurl.d.ts.map +1 -1
  283. package/dist/api/knurl.js +5 -3
  284. package/dist/api/knurl.js.map +1 -1
  285. package/dist/api/loft.d.ts +2 -2
  286. package/dist/api/loft.d.ts.map +1 -1
  287. package/dist/api/loft.js +2 -2
  288. package/dist/api/loft.js.map +1 -1
  289. package/dist/api/measurement/index.d.ts +3 -3
  290. package/dist/api/measurement/index.js +3 -3
  291. package/dist/api/measurement/index.js.map +1 -1
  292. package/dist/api/meta.d.ts +0 -2
  293. package/dist/api/meta.d.ts.map +1 -1
  294. package/dist/api/meta.js +0 -2
  295. package/dist/api/meta.js.map +1 -1
  296. package/dist/api/offset2d.d.ts +49 -0
  297. package/dist/api/offset2d.d.ts.map +1 -0
  298. package/dist/api/offset2d.js +86 -0
  299. package/dist/api/offset2d.js.map +1 -0
  300. package/dist/api/pattern.js +3 -3
  301. package/dist/api/pattern.js.map +1 -1
  302. package/dist/api/primitives.d.ts.map +1 -1
  303. package/dist/api/primitives.js +7 -6
  304. package/dist/api/primitives.js.map +1 -1
  305. package/dist/api/replicate.d.ts +2 -2
  306. package/dist/api/replicate.d.ts.map +1 -1
  307. package/dist/api/replicate.js +12 -12
  308. package/dist/api/replicate.js.map +1 -1
  309. package/dist/api/result.d.ts +1 -1
  310. package/dist/api/result.js +1 -1
  311. package/dist/api/result.js.map +1 -1
  312. package/dist/api/revolve.d.ts +2 -2
  313. package/dist/api/revolve.js +3 -3
  314. package/dist/api/revolve.js.map +1 -1
  315. package/dist/api/screw.d.ts +1 -1
  316. package/dist/api/screw.d.ts.map +1 -1
  317. package/dist/api/screw.js +5 -4
  318. package/dist/api/screw.js.map +1 -1
  319. package/dist/api/sdf.d.ts.map +1 -1
  320. package/dist/api/sdf.js +3 -2
  321. package/dist/api/sdf.js.map +1 -1
  322. package/dist/api/shape-type/index.d.ts +141 -0
  323. package/dist/api/shape-type/index.d.ts.map +1 -0
  324. package/dist/api/shape-type/index.js +182 -0
  325. package/dist/api/shape-type/index.js.map +1 -0
  326. package/dist/api/shell.d.ts +2 -2
  327. package/dist/api/shell.js +2 -2
  328. package/dist/api/shell.js.map +1 -1
  329. package/dist/api/solid-from-faces.d.ts +45 -0
  330. package/dist/api/solid-from-faces.d.ts.map +1 -0
  331. package/dist/api/solid-from-faces.js +72 -0
  332. package/dist/api/solid-from-faces.js.map +1 -0
  333. package/dist/api/solid-offset/index.d.ts +67 -0
  334. package/dist/api/solid-offset/index.d.ts.map +1 -0
  335. package/dist/api/solid-offset/index.js +132 -0
  336. package/dist/api/solid-offset/index.js.map +1 -0
  337. package/dist/api/surface/arg-spec.d.ts +35 -33
  338. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  339. package/dist/api/surface/arg-spec.js +222 -224
  340. package/dist/api/surface/arg-spec.js.map +1 -1
  341. package/dist/api/surface-face/index.d.ts +104 -0
  342. package/dist/api/surface-face/index.d.ts.map +1 -0
  343. package/dist/api/surface-face/index.js +217 -0
  344. package/dist/api/surface-face/index.js.map +1 -0
  345. package/dist/api/surface.d.ts +44 -0
  346. package/dist/api/surface.d.ts.map +1 -0
  347. package/dist/api/surface.js +66 -0
  348. package/dist/api/surface.js.map +1 -0
  349. package/dist/api/sweep.d.ts +59 -9
  350. package/dist/api/sweep.d.ts.map +1 -1
  351. package/dist/api/sweep.js +11 -6
  352. package/dist/api/sweep.js.map +1 -1
  353. package/dist/api/thicken.d.ts +1 -1
  354. package/dist/api/thicken.js +1 -1
  355. package/dist/api/thicken.js.map +1 -1
  356. package/dist/api/transform.d.ts +5 -5
  357. package/dist/api/transform.d.ts.map +1 -1
  358. package/dist/api/transform.js +11 -10
  359. package/dist/api/transform.js.map +1 -1
  360. package/dist/api/view/cameraFns.d.ts +1 -1
  361. package/dist/api/view/cameraFns.d.ts.map +1 -1
  362. package/dist/api/view/cameraFns.js +1 -1
  363. package/dist/api/view/cameraFns.js.map +1 -1
  364. package/dist/api/view/index.d.ts +0 -2
  365. package/dist/api/view/index.d.ts.map +1 -1
  366. package/dist/api/view/index.js +0 -2
  367. package/dist/api/view/index.js.map +1 -1
  368. package/dist/api/view/projectionPlanes.d.ts +1 -1
  369. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  370. package/dist/api/view/projectionPlanes.js.map +1 -1
  371. package/dist/api/view/view-camera.d.ts +7 -9
  372. package/dist/api/view/view-camera.d.ts.map +1 -1
  373. package/dist/api/view/view-camera.js +4 -6
  374. package/dist/api/view/view-camera.js.map +1 -1
  375. package/dist/api/view/view-projection.d.ts +0 -2
  376. package/dist/api/view/view-projection.d.ts.map +1 -1
  377. package/dist/api/view/view-projection.js +0 -2
  378. package/dist/api/view/view-projection.js.map +1 -1
  379. package/dist/api/view/view-sheet.d.ts +0 -2
  380. package/dist/api/view/view-sheet.d.ts.map +1 -1
  381. package/dist/api/view/view-sheet.js +0 -2
  382. package/dist/api/view/view-sheet.js.map +1 -1
  383. package/dist/api/view-export/index.d.ts +97 -0
  384. package/dist/api/view-export/index.d.ts.map +1 -0
  385. package/dist/api/view-export/index.js +118 -0
  386. package/dist/api/view-export/index.js.map +1 -0
  387. package/dist/brep/brep-ops.d.ts +89 -1
  388. package/dist/brep/brep-ops.d.ts.map +1 -1
  389. package/dist/brep/brep-ops.js +176 -10
  390. package/dist/brep/brep-ops.js.map +1 -1
  391. package/dist/brep/brep-topology.d.ts +20 -0
  392. package/dist/brep/brep-topology.d.ts.map +1 -1
  393. package/dist/brep/brep-topology.js +46 -0
  394. package/dist/brep/brep-topology.js.map +1 -1
  395. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  396. package/dist/brep/engine/adapters/occt.js +7 -7
  397. package/dist/brep/engine/adapters/occt.js.map +1 -1
  398. package/dist/brep/engine/primitives.d.ts +2 -3
  399. package/dist/brep/engine/primitives.d.ts.map +1 -1
  400. package/dist/brep/engine/primitives.js +1 -2
  401. package/dist/brep/engine/primitives.js.map +1 -1
  402. package/dist/brep/engine/registry.d.ts +1 -1
  403. package/dist/brep/engine/registry.js +1 -1
  404. package/dist/brep/engine/registry.js.map +1 -1
  405. package/dist/brep/engine/types.d.ts +2 -2
  406. package/dist/brep/engine/types.js.map +1 -1
  407. package/dist/brep/handle-bridge.d.ts +2 -2
  408. package/dist/brep/handle-bridge.js +2 -2
  409. package/dist/brep/handle-bridge.js.map +1 -1
  410. package/dist/brep/index.d.ts +6 -3
  411. package/dist/brep/index.d.ts.map +1 -1
  412. package/dist/brep/index.js +6 -3
  413. package/dist/brep/index.js.map +1 -1
  414. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  415. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  416. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  417. package/dist/browser.d.ts +2 -2
  418. package/dist/browser.d.ts.map +1 -1
  419. package/dist/browser.js +5 -4
  420. package/dist/browser.js.map +1 -1
  421. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  422. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  423. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  424. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  425. package/dist/cad-runtime/backend-dispatch.js +12 -3
  426. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  427. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  428. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  429. package/dist/cad-runtime/direct-executor.js +31 -9
  430. package/dist/cad-runtime/direct-executor.js.map +1 -1
  431. package/dist/cad-runtime/interp/env.d.ts +1 -1
  432. package/dist/cad-runtime/interp/env.js.map +1 -1
  433. package/dist/cad-runtime/lib-id.d.ts +0 -2
  434. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  435. package/dist/cad-runtime/lib-id.js +0 -2
  436. package/dist/cad-runtime/lib-id.js.map +1 -1
  437. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  438. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  439. package/dist/cad-runtime/live-shapes.js +8 -10
  440. package/dist/cad-runtime/live-shapes.js.map +1 -1
  441. package/dist/cad-runtime/ports.d.ts +3 -3
  442. package/dist/cad-runtime/ports.js.map +1 -1
  443. package/dist/cad-runtime/runtime.d.ts +21 -7
  444. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  445. package/dist/cad-runtime/runtime.js +45 -6
  446. package/dist/cad-runtime/runtime.js.map +1 -1
  447. package/dist/define-op.d.ts +4 -3
  448. package/dist/define-op.d.ts.map +1 -1
  449. package/dist/define-op.js +2 -2
  450. package/dist/define-op.js.map +1 -1
  451. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  452. package/dist/geometry2d/bridge/plane.js +1 -1
  453. package/dist/geometry2d/bridge/plane.js.map +1 -1
  454. package/dist/geometry2d/curve2d.d.ts +1 -1
  455. package/dist/geometry2d/curve2d.js +1 -1
  456. package/dist/geometry2d/curve2d.js.map +1 -1
  457. package/dist/index.d.ts +1 -1
  458. package/dist/index.d.ts.map +1 -1
  459. package/dist/index.js +10 -4
  460. package/dist/index.js.map +1 -1
  461. package/dist/io/fai-zip/container-read.d.ts +16 -0
  462. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  463. package/dist/io/fai-zip/container-read.js +22 -0
  464. package/dist/io/fai-zip/container-read.js.map +1 -1
  465. package/dist/io/fai-zip/index.d.ts +1 -1
  466. package/dist/io/fai-zip/index.d.ts.map +1 -1
  467. package/dist/io/fai-zip/index.js +1 -1
  468. package/dist/io/fai-zip/index.js.map +1 -1
  469. package/dist/lang/code-to-args.d.ts.map +1 -1
  470. package/dist/lang/code-to-args.js +10 -1
  471. package/dist/lang/code-to-args.js.map +1 -1
  472. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  473. package/dist/lang/determinism-scanner.js +22 -9
  474. package/dist/lang/determinism-scanner.js.map +1 -1
  475. package/dist/lang/metadata-extractor.d.ts +27 -6
  476. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  477. package/dist/lang/metadata-extractor.js +88 -8
  478. package/dist/lang/metadata-extractor.js.map +1 -1
  479. package/dist/lang/parse-error.d.ts +4 -0
  480. package/dist/lang/parse-error.d.ts.map +1 -1
  481. package/dist/lang/parse-error.js.map +1 -1
  482. package/dist/lang/security-scanner.d.ts +27 -2
  483. package/dist/lang/security-scanner.d.ts.map +1 -1
  484. package/dist/lang/security-scanner.js +29 -2
  485. package/dist/lang/security-scanner.js.map +1 -1
  486. package/dist/lang/source-edit.d.ts +2 -2
  487. package/dist/lang/source-edit.js.map +1 -1
  488. package/dist/lang/symbol-table.generated.d.ts +36 -0
  489. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  490. package/dist/lang/symbol-table.generated.js +36 -0
  491. package/dist/lang/symbol-table.generated.js.map +1 -1
  492. package/dist/mesh/import-model.d.ts +94 -0
  493. package/dist/mesh/import-model.d.ts.map +1 -0
  494. package/dist/mesh/import-model.js +15 -0
  495. package/dist/mesh/import-model.js.map +1 -0
  496. package/dist/mesh/index.d.ts +19 -58
  497. package/dist/mesh/index.d.ts.map +1 -1
  498. package/dist/mesh/index.js +19 -70
  499. package/dist/mesh/index.js.map +1 -1
  500. package/dist/mesh/io.d.ts +33 -16
  501. package/dist/mesh/io.d.ts.map +1 -1
  502. package/dist/mesh/io.js +144 -39
  503. package/dist/mesh/io.js.map +1 -1
  504. package/dist/mesh/primitives.js +1 -1
  505. package/dist/mesh/primitives.js.map +1 -1
  506. package/dist/mesh/threemf-bambu.d.ts +12 -1
  507. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  508. package/dist/mesh/threemf-bambu.js +68 -16
  509. package/dist/mesh/threemf-bambu.js.map +1 -1
  510. package/dist/mesh/threemf-loader.d.ts +14 -1
  511. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  512. package/dist/mesh/threemf-loader.js +24 -7
  513. package/dist/mesh/threemf-loader.js.map +1 -1
  514. package/dist/mesh/transform.d.ts +1 -1
  515. package/dist/mesh/transform.js +1 -1
  516. package/dist/mesh/transform.js.map +1 -1
  517. package/dist/mesh/types.d.ts +5 -5
  518. package/dist/mesh/types.d.ts.map +1 -1
  519. package/dist/mesh/types.js.map +1 -1
  520. package/dist/node-host/cli.d.ts +49 -1
  521. package/dist/node-host/cli.d.ts.map +1 -1
  522. package/dist/node-host/cli.js +125 -19
  523. package/dist/node-host/cli.js.map +1 -1
  524. package/dist/node-host/execute-script.d.ts +55 -0
  525. package/dist/node-host/execute-script.d.ts.map +1 -0
  526. package/dist/node-host/execute-script.js +46 -0
  527. package/dist/node-host/execute-script.js.map +1 -0
  528. package/dist/node.d.ts +2 -0
  529. package/dist/node.d.ts.map +1 -1
  530. package/dist/node.js +3 -0
  531. package/dist/node.js.map +1 -1
  532. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  533. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  534. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  535. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  536. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  537. package/dist/occt-kernel/hullGeometry.js +2 -3
  538. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  539. package/dist/occt-kernel/hullOps.d.ts +3 -3
  540. package/dist/occt-kernel/hullOps.js +4 -4
  541. package/dist/occt-kernel/hullOps.js.map +1 -1
  542. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  543. package/dist/occt-kernel/occt-primitives.js +31 -4
  544. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  545. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  546. package/dist/occt-kernel/occtKernel.js +18 -0
  547. package/dist/occt-kernel/occtKernel.js.map +1 -1
  548. package/dist/occt-scan/recognize.d.ts +58 -0
  549. package/dist/occt-scan/recognize.d.ts.map +1 -0
  550. package/dist/occt-scan/recognize.js +216 -0
  551. package/dist/occt-scan/recognize.js.map +1 -0
  552. package/dist/primitives/brep-primitives.js +7 -7
  553. package/dist/primitives/brep-primitives.js.map +1 -1
  554. package/dist/result/bug.d.ts +1 -1
  555. package/dist/result/bug.js +1 -1
  556. package/dist/result/bug.js.map +1 -1
  557. package/dist/result/errors.d.ts +2 -2
  558. package/dist/result/errors.d.ts.map +1 -1
  559. package/dist/result/errors.js +1 -1
  560. package/dist/result/errors.js.map +1 -1
  561. package/dist/result/vec3.d.ts +1 -1
  562. package/dist/result/vec3.js +1 -1
  563. package/dist/result/vec3.js.map +1 -1
  564. package/dist/runtime-state.d.ts +16 -0
  565. package/dist/runtime-state.d.ts.map +1 -1
  566. package/dist/runtime-state.js +27 -0
  567. package/dist/runtime-state.js.map +1 -1
  568. package/dist/script-globals.d.ts +24 -0
  569. package/dist/script-globals.d.ts.map +1 -0
  570. package/dist/script-globals.js +24 -0
  571. package/dist/script-globals.js.map +1 -0
  572. package/dist/shape.d.ts +24 -0
  573. package/dist/shape.d.ts.map +1 -1
  574. package/dist/shape.js +40 -0
  575. package/dist/shape.js.map +1 -1
  576. package/dist/topology/naming/lineage.d.ts +3 -2
  577. package/dist/topology/naming/lineage.d.ts.map +1 -1
  578. package/dist/topology/naming/lineage.js.map +1 -1
  579. package/dist/weapp.d.ts +1 -1
  580. package/dist/weapp.js +1 -1
  581. package/dist/weapp.js.map +1 -1
  582. package/package.json +8 -10
package/NOTICE CHANGED
@@ -1,11 +1,12 @@
1
1
  faijs — @faicad/faijs NOTICE
2
2
  ============================
3
3
 
4
- This product's brepjs-compat facade contains code ported from the
5
- `brepjs` project (https://github.com/OpenCascade/brepjs, licensed under
6
- the Apache License 2.0, locked at upstream commit 8685273a).
7
- The ported sources now live in the standalone `@faicad/faijs-brepjs`
8
- package; its NOTICE and LICENSE carry the full attribution.
4
+ This product includes code ported from the `brepjs` project
5
+ (https://github.com/OpenCascade/brepjs), licensed under the Apache
6
+ License 2.0. Ported as of brepjs commit 8685273a (locked upstream
7
+ reference; no two-way sync). The ported files retain their original
8
+ Apache-2.0 attribution; the ported sources have been inlined into
9
+ the core engine (`@faicad/faijs`).
9
10
 
10
11
  Full Apache-2.0 text: https://www.apache.org/licenses/LICENSE-2.0
11
12
 
@@ -24,7 +24,7 @@ import type { LibNamespace } from '../runtime-state.js';
24
24
  *
25
25
  * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+
26
26
  * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec
27
- * 的 `scriptFace: true` 条目生成,经 `compatOp(projectBrepOp(…))` 包装的
27
+ * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的
28
28
  * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与
29
29
  * `api/index.ts` 导出面同源于同一份清单。
30
30
  *
@@ -1 +1 @@
1
- {"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA4CH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAmDjD"}
1
+ {"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA6EH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CA4EjD"}
@@ -32,6 +32,33 @@ import { sketchOnFace } from './sketch-on-face.js';
32
32
  import { punchHole } from './punch-hole.js';
33
33
  import { wire } from './wire.js';
34
34
  import { helix } from './helix.js';
35
+ import { surface } from './surface.js';
36
+ import { offset2d } from './offset2d.js';
37
+ import { solidFromFaces } from './solid-from-faces.js';
38
+ import { halfSpace } from './half-space.js';
39
+ import { exportStl } from './export-stl.js';
40
+ import { exportBrep } from './export-brep.js';
41
+ // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。
42
+ // 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual
43
+ // (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。
44
+ import { isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual, } from './shape-type/index.js';
45
+ // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。
46
+ // 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);
47
+ // 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。
48
+ import { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export/index.js';
49
+ // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。
50
+ // 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/
51
+ // approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/
52
+ // curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。
53
+ import { edge, circleArc, ellipseEdge, ellipseArc, tangentArc, approximatePoints, interpolateWithTangents, curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic, } from './curve-sketch/index.js';
54
+ // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。
55
+ // 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire
56
+ // (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。
57
+ import { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face/index.js';
58
+ // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。
59
+ // 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/
60
+ // halfSpace 已由 S3 落地)。
61
+ import { draftPrism, pipe } from './solid-offset/index.js';
35
62
  import { union, subtract, intersect, cut } from './boolean.js';
36
63
  import { split } from './split.js';
37
64
  import { sweep } from './sweep.js';
@@ -65,7 +92,7 @@ import { CONTRACT_VERSION } from '../runtime-state.js';
65
92
  *
66
93
  * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+
67
94
  * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec
68
- * 的 `scriptFace: true` 条目生成,经 `compatOp(projectBrepOp(…))` 包装的
95
+ * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的
69
96
  * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与
70
97
  * `api/index.ts` 导出面同源于同一份清单。
71
98
  *
@@ -91,6 +118,31 @@ export function createApiNamespace() {
91
118
  // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,
92
119
  // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。
93
120
  sweep, loft,
121
+ // S3(occt-wasm op 接入):控制点阵 → B 样条面(平台 op engines:['occt'])。
122
+ surface,
123
+ // S3(occt-wasm op 接入):2D 轮廓偏置(平台 op engines:['occt'],原生 offsetWire2D)。
124
+ offset2d,
125
+ // S3(occt-wasm op 接入):面集一次成型为实体(平台 op engines:['occt'],原生 buildSolidFromFaces)。
126
+ solidFromFaces,
127
+ // S3(occt-wasm op 接入):无限半空间实体(平台 op engines:['occt'],原生 halfSpace;
128
+ // 无界布尔工具的来源,产物 mesh 为空——单独渲染无意义,只作 cut/common/split 的工具位)。
129
+ halfSpace,
130
+ // S3(occt-wasm op 接入):导出族。exportStl 中立(只序列化 Shape 自带三角载荷,
131
+ // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。
132
+ exportStl,
133
+ exportBrep,
134
+ // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。
135
+ isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,
136
+ // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。
137
+ toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,
138
+ // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。
139
+ edge, circleArc, ellipseEdge, ellipseArc, tangentArc,
140
+ approximatePoints, interpolateWithTangents,
141
+ curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,
142
+ // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。
143
+ faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,
144
+ // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。
145
+ draftPrism, pipe,
94
146
  faceNormal, bboxCenter, bboxMin, bboxMax,
95
147
  edgeRef,
96
148
  faceRef,
@@ -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/createRuntimeWithCad.ts)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { loft } from './loft'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { 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` 条目生成,经 `compatOp(projectBrepOp(…))` 包装的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与\n * `api/index.ts` 导出面同源于同一份清单。\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, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, loft,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as 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 — 把 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/createRuntimeWithCad.ts)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { 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// 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'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { loft } from './loft'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { 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 * `api/index.ts` 导出面同源于同一份清单。\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, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, loft,\n // 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 // 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 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,8 +1,6 @@
1
1
  /**
2
2
  * api/appearance — faijs PBR 外观规格(颜色/材质/透明度)权威类型与 Shape 方法
3
3
  *
4
- * 设计文档:docs/plans/2026-10-05-faijs-pbr-appearance-api-design.md(v2)
5
- *
6
4
  * 定位:
7
5
  * - 外观设置**不是 op**(不进 defineOp/api-namespace/args-schema),是 Shape
8
6
  * 实例方法(`box1.setColor(...)`,复用 `asm1.solve()` 的成员调用语句形态)。
@@ -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,8 +1,6 @@
1
1
  /**
2
2
  * api/appearance — faijs PBR 外观规格(颜色/材质/透明度)权威类型与 Shape 方法
3
3
  *
4
- * 设计文档:docs/plans/2026-10-05-faijs-pbr-appearance-api-design.md(v2)
5
- *
6
4
  * 定位:
7
5
  * - 外观设置**不是 op**(不进 defineOp/api-namespace/args-schema),是 Shape
8
6
  * 实例方法(`box1.setColor(...)`,复用 `asm1.solve()` 的成员调用语句形态)。
@@ -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 * 设计文档:docs/plans/2026-10-05-faijs-pbr-appearance-api-design.md(v2)\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 /** 合并外观:`{...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"]}
@@ -6,7 +6,7 @@
6
6
  * 2. 解析在执行期:TopoRef 复用 topo-resolve 的解析通道(BREP 现场 / mesh 行快照);
7
7
  * 3. 句柄是瞬态:解析出的几何立即转成纯数据 SolverEntity,句柄不跨语句。
8
8
  *
9
- * 输出契约对齐 brepjs solverAdapter 的 SolverEntity:{ type: 'plane'|'axis'|'point',
9
+ * 输出契约对齐约束求解器的 SolverEntity:{ type: 'plane'|'axis'|'point',
10
10
  * origin, normal?/direction? }。dependent 侧填本地坐标(部件自身坐标系),
11
11
  * reference 侧世界变换由 solverAdapter 的 transformEntity 负责——本层不做。
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * 2. 解析在执行期:TopoRef 复用 topo-resolve 的解析通道(BREP 现场 / mesh 行快照);
7
7
  * 3. 句柄是瞬态:解析出的几何立即转成纯数据 SolverEntity,句柄不跨语句。
8
8
  *
9
- * 输出契约对齐 brepjs solverAdapter 的 SolverEntity:{ type: 'plane'|'axis'|'point',
9
+ * 输出契约对齐约束求解器的 SolverEntity:{ type: 'plane'|'axis'|'point',
10
10
  * origin, normal?/direction? }。dependent 侧填本地坐标(部件自身坐标系),
11
11
  * reference 侧世界变换由 solverAdapter 的 transformEntity 负责——本层不做。
12
12
  *
@@ -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 * 输出契约对齐 brepjs solverAdapter 的 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 } 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"]}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 分层(方案 §4.1):normalize(规范化 + face_mate 兼容)→ lower(直译降级,
5
5
  * mate/align 寄生在 concentric 上)→ entities(TopoRef → SolverEntity,双链路)
6
- * → solve(委派 brepjs solveConstraints)→ pose(位姿转换契约)。
6
+ * → solve(core 自持 solveConstraints)→ pose(位姿转换契约)。
7
7
  */
8
8
  export * from './types.js';
9
9
  export * from './normalize.js';
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 分层(方案 §4.1):normalize(规范化 + face_mate 兼容)→ lower(直译降级,
5
5
  * mate/align 寄生在 concentric 上)→ entities(TopoRef → SolverEntity,双链路)
6
- * → solve(委派 brepjs solveConstraints)→ pose(位姿转换契约)。
6
+ * → solve(core 自持 solveConstraints)→ pose(位姿转换契约)。
7
7
  */
8
8
  export * from './types.js';
9
9
  export * from './normalize.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/assembly/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA","sourcesContent":["/**\n * api/assembly — 装配约束求解层(P1)\n *\n * 分层(方案 §4.1):normalize(规范化 + face_mate 兼容)→ lower(直译降级,\n * mate/align 寄生在 concentric 上)→ entities(TopoRef → SolverEntity,双链路)\n * → solve(委派 brepjs solveConstraints)→ pose(位姿转换契约)。\n */\n\nexport * from './types'\nexport * from './normalize'\nexport * from './entities'\nexport * from './lower'\nexport * from './pose'\nexport * from './solve'\nexport * from './preview'\nexport * from './joints'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/assembly/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA","sourcesContent":["/**\n * api/assembly — 装配约束求解层(P1)\n *\n * 分层(方案 §4.1):normalize(规范化 + face_mate 兼容)→ lower(直译降级,\n * mate/align 寄生在 concentric 上)→ entities(TopoRef → SolverEntity,双链路)\n * → solve(core 自持 solveConstraints)→ pose(位姿转换契约)。\n */\n\nexport * from './types'\nexport * from './normalize'\nexport * from './entities'\nexport * from './lower'\nexport * from './pose'\nexport * from './solve'\nexport * from './preview'\nexport * from './joints'\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * api/assembly/joints — 运动副声明与运动学解算(P3)
3
3
  *
4
- * JointSpec 是 .fai.js 可序列化子集(派生字段 dofs 由 vendored 工厂构造,
4
+ * JointSpec 是 .fai.js 可序列化子集(派生字段 dofs 由 brepjs 工厂构造,
5
5
  * 与 brepjs Joint.dofs 的组合顺序对齐:cylindrical → [rotation, translation]、
6
6
  * planar → [u, v, rotation]、spherical → [x, y, z])。
7
7
  *
@@ -9,8 +9,8 @@
9
9
  * spherical 在 buildJoint 里显式抛错(绝不静默降级成单 DOF),待 per-DOF ranges
10
10
  * 启用(JointSpec.dofs 已按此预留)。
11
11
  *
12
- * 链路:JointSpec[] → buildJoint(vendored 工厂)→ buildKinematicTree(建树三步
13
- * + 校验)→ solveKinematics(vendored forwardKinematics)→ per-member 位姿。
12
+ * 链路:JointSpec[] → buildJoint(brepjs 工厂)→ buildKinematicTree(建树三步
13
+ * + 校验)→ solveKinematics(brepjs forwardKinematics)→ per-member 位姿。
14
14
  *
15
15
  * cad.* 查询函数(jointTrajectory / inverseKinematics / mechanismDOF)是无副作用
16
16
  * 纯函数:输入纯数据、输出纯数据,不挂在 assembly receiver 上。
@@ -33,7 +33,7 @@ export interface JointDofSpec {
33
33
  }
34
34
  /**
35
35
  * 可序列化运动副声明(.fai.js 对象字面量)。派生字段(dofs)由 buildJoint 内
36
- * vendored 工厂构造——脚本里只写纯数据。
36
+ * brepjs 工厂构造——脚本里只写纯数据。
37
37
  */
38
38
  export interface JointSpec {
39
39
  type: JointType;
@@ -74,18 +74,18 @@ export interface JointSpec {
74
74
  /**
75
75
  * 由 JointSpec 构造 brepjs Joint。
76
76
  *
77
- * revolute/prismatic 走 vendored 工厂(主 DOF 的 value 在工厂内 clamp 到
77
+ * revolute/prismatic 走 brepjs 工厂(主 DOF 的 value 在工厂内 clamp 到
78
78
  * [min,max]);cylindrical/planar/spherical 显式抛错(多 DOF 未启用,绝不
79
79
  * 静默降级)。offset 的四元数经 toBrepjsQuat 换序(faijs [x,y,z,w] → brepjs
80
80
  * [w,x,y,z])。
81
81
  *
82
82
  * @param spec - the serializable joint declaration.
83
- * @returns the vendored brepjs Joint (with offset attached when declared).
83
+ * @returns the Joint (with offset attached when declared).
84
84
  * @throws Error on multi-DOF joint types and unknown joint types.
85
85
  */
86
86
  export declare function buildJoint(spec: JointSpec): Joint;
87
87
  /**
88
- * 由成员名 + JointSpec[] 构建 kinematic AssemblyNode 树(vendored
88
+ * 由成员名 + JointSpec[] 构建 kinematic AssemblyNode 树(brepjs
89
89
  * forwardKinematics 只接受单个根;多成员必须有唯一合成根)。
90
90
  *
91
91
  * 校验(求解前,绝不静默):
@@ -119,7 +119,7 @@ export interface KinematicsSolveResult {
119
119
  kinematics: Record<string, KinematicsPose>;
120
120
  }
121
121
  /**
122
- * 运动学正解:buildKinematicTree → vendored forwardKinematics → per-member 位姿。
122
+ * 运动学正解:buildKinematicTree → brepjs forwardKinematics → per-member 位姿。
123
123
  *
124
124
  * 校验(求解前):成员名空串 / parent-child ∈ members / child 唯一驱动(都收在
125
125
  * buildKinematicTree 内);drive 键必须 ∈ joints 的 child 集(多余键是笔误,
@@ -160,8 +160,14 @@ export interface FaijsTrajectorySample {
160
160
  * 产出 steps+1 个采样(含两端点);joints 缺省值在两端取存储值。
161
161
  * 无 endEffector 参数(关节空间插值,不追踪端点)。
162
162
  *
163
- * @param p - trajectory query parameters.
164
- * @returns the sampled trajectory (poses with faijs-order quaternions).
163
+ * @group 查询
164
+ * @inputs 0
165
+ * @async false
166
+ * @qual ok
167
+ * @name jointTrajectory
168
+ * @note 纯函数:输入输出都是纯数据,不产 Shape、不依赖引擎;装配面契约见 `docs/api-contract.md` §12。
169
+ * @returns FaijsTrajectorySample[] 采样序列(steps+1 个,含两端点)。
170
+ * @param p - 轨迹查询参数。type:JointTrajectoryParams required:true
165
171
  */
166
172
  export declare function jointTrajectory(p: JointTrajectoryParams): FaijsTrajectorySample[];
167
173
  /** `cad.inverseKinematics({ joints, endEffector, target, options? })` 参数。 */
@@ -176,7 +182,7 @@ export interface InverseKinematicsParams {
176
182
  };
177
183
  options?: BrepjsIKOptions;
178
184
  }
179
- /** IK 结果(与 vendored IKResult 同构;values 键 = child 成员名)。 */
185
+ /** IK 结果(与 brepjs IKResult 同构;values 键 = child 成员名)。 */
180
186
  export interface IKResult {
181
187
  values: Record<string, number[]>;
182
188
  converged: boolean;
@@ -188,8 +194,14 @@ export interface IKResult {
188
194
  * damped-least-squares IK:求使末端到达 target 的关节值。关节范围在每个迭代
189
195
  * clamp;不可达目标返回 converged:false 与最优配置。纯函数,无副作用。
190
196
  *
191
- * @param p - IK query parameters.
192
- * @returns the solved joint values plus convergence diagnostics.
197
+ * @group 查询
198
+ * @inputs 0
199
+ * @async false
200
+ * @qual ok
201
+ * @name inverseKinematics
202
+ * @note 纯函数:输入输出都是纯数据,不产 Shape、不依赖引擎;装配面契约见 `docs/api-contract.md` §12。
203
+ * @returns IKResult 关节值 + 收敛诊断(converged / iterations / error)。
204
+ * @param p - IK 查询参数。type:InverseKinematicsParams required:true
193
205
  */
194
206
  export declare function inverseKinematics(p: InverseKinematicsParams): IKResult;
195
207
  /** `cad.mechanismDOF({ joints })` 参数。 */
@@ -200,8 +212,14 @@ export interface MechanismDOFParams {
200
212
  * `cad.mechanismDOF({ joints })` — 开链机构自由度 = 各 joint DOF 数之和
201
213
  * (revolute/prismatic 各 1;串联两 revolute = 2)。纯函数,无副作用。
202
214
  *
203
- * @param p - DOF query parameters.
204
- * @returns the mechanism's total degree of freedom.
215
+ * @group 查询
216
+ * @inputs 0
217
+ * @async false
218
+ * @qual ok
219
+ * @name mechanismDOF
220
+ * @note 纯函数:输入输出都是纯数据,不产 Shape、不依赖引擎;装配面契约见 `docs/api-contract.md` §12。
221
+ * @returns number 机构总自由度。
222
+ * @param p - 自由度查询参数。type:MechanismDOFParams required:true
205
223
  */
206
224
  export declare function mechanismDOF(p: MechanismDOFParams): number;
207
225
  export type { JointPose, BrepjsIKOptions as IKOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"joints.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/joints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"joints.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/joints.ts"],"names":[],"mappings":"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"}