@faicad/faijs 0.29.5 → 0.31.1

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 (722) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/align/index.d.ts +64 -0
  3. package/dist/api/align/index.d.ts.map +1 -0
  4. package/dist/api/align/index.js +101 -0
  5. package/dist/api/align/index.js.map +1 -0
  6. package/dist/api/api-namespace.d.ts +6 -5
  7. package/dist/api/api-namespace.d.ts.map +1 -1
  8. package/dist/api/api-namespace.js +89 -5
  9. package/dist/api/api-namespace.js.map +1 -1
  10. package/dist/api/appearance.d.ts +0 -2
  11. package/dist/api/appearance.d.ts.map +1 -1
  12. package/dist/api/appearance.js +0 -2
  13. package/dist/api/appearance.js.map +1 -1
  14. package/dist/api/assembly/entities.d.ts +1 -1
  15. package/dist/api/assembly/entities.js +1 -1
  16. package/dist/api/assembly/entities.js.map +1 -1
  17. package/dist/api/assembly/index.d.ts +1 -1
  18. package/dist/api/assembly/index.js +1 -1
  19. package/dist/api/assembly/index.js.map +1 -1
  20. package/dist/api/assembly/joints.d.ts +33 -15
  21. package/dist/api/assembly/joints.d.ts.map +1 -1
  22. package/dist/api/assembly/joints.js +31 -13
  23. package/dist/api/assembly/joints.js.map +1 -1
  24. package/dist/api/assembly/preview.d.ts +1 -1
  25. package/dist/api/assembly/preview.js +1 -1
  26. package/dist/api/assembly/preview.js.map +1 -1
  27. package/dist/api/assembly/solve.d.ts +1 -1
  28. package/dist/api/assembly/solve.js +1 -1
  29. package/dist/api/assembly/solve.js.map +1 -1
  30. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  31. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  32. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  33. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  36. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  37. package/dist/api/assembly/solvers/global-solver.js +3 -4
  38. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  39. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  41. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  42. package/dist/api/assembly/solvers/linalg.js +2 -2
  43. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  44. package/dist/api/assembly/solvers/types.d.ts +2 -5
  45. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  46. package/dist/api/assembly/solvers/types.js +1 -4
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean-op/index.d.ts +65 -0
  49. package/dist/api/boolean-op/index.d.ts.map +1 -0
  50. package/dist/api/boolean-op/index.js +113 -0
  51. package/dist/api/boolean-op/index.js.map +1 -0
  52. package/dist/api/boolean.d.ts.map +1 -1
  53. package/dist/api/boolean.js +22 -33
  54. package/dist/api/boolean.js.map +1 -1
  55. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  56. package/dist/api/brep-mirror/booleanFns.js +5 -5
  57. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  58. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  59. package/dist/api/brep-mirror/compoundFns.js +4 -4
  60. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  61. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  62. package/dist/api/brep-mirror/healingFns.js +4 -4
  63. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  64. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  65. package/dist/api/brep-mirror/hullFns.js +2 -2
  66. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  67. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  68. package/dist/api/brep-mirror/patternFns.js +10 -10
  69. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  70. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  71. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  72. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  73. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  74. package/dist/api/brep-mirror/roofFns.js +7 -7
  75. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  76. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  77. package/dist/api/brep-mirror/sweepFns.js +14 -14
  78. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  79. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  80. package/dist/api/brep-mirror/threadFns.js +1 -1
  81. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  82. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  83. package/dist/api/brep-mirror/topologyFns.js +8 -8
  84. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  85. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  86. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/booleanFns.js +104 -0
  88. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  89. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  90. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  91. package/dist/api/brep-operations/brepHelpers.js +131 -0
  92. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  93. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  94. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/compoundFns.js +299 -0
  96. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  97. package/dist/api/brep-operations/healingFns.d.ts +91 -0
  98. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  99. package/dist/api/brep-operations/healingFns.js +321 -0
  100. package/dist/api/brep-operations/healingFns.js.map +1 -0
  101. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  102. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/hullFns.js +46 -0
  104. package/dist/api/brep-operations/hullFns.js.map +1 -0
  105. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  106. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  107. package/dist/api/brep-operations/joinery-brep.js +463 -0
  108. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  109. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  110. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/patternFns.js +178 -0
  112. package/dist/api/brep-operations/patternFns.js.map +1 -0
  113. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  114. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  115. package/dist/api/brep-operations/primitiveFns.js +104 -0
  116. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  117. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  118. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/roofFns.js +229 -0
  120. package/dist/api/brep-operations/roofFns.js.map +1 -0
  121. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  122. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  123. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  124. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  125. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  126. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/sweepFns.js +323 -0
  128. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  129. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  130. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  131. package/dist/api/brep-operations/threadFns.js +138 -0
  132. package/dist/api/brep-operations/threadFns.js.map +1 -0
  133. package/dist/api/brep-operations/topologyFns.d.ts +111 -0
  134. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  135. package/dist/api/brep-operations/topologyFns.js +300 -0
  136. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  137. package/dist/api/brep-topology.d.ts +1 -1
  138. package/dist/api/brep-topology.d.ts.map +1 -1
  139. package/dist/api/brep-topology.js +1 -1
  140. package/dist/api/brep-topology.js.map +1 -1
  141. package/dist/api/brepjs-compat/index.d.ts +1 -1
  142. package/dist/api/brepjs-compat/index.js +3 -3
  143. package/dist/api/brepjs-compat/index.js.map +1 -1
  144. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  145. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  146. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  147. package/dist/api/chamfer.d.ts +5 -4
  148. package/dist/api/chamfer.d.ts.map +1 -1
  149. package/dist/api/chamfer.js +12 -11
  150. package/dist/api/chamfer.js.map +1 -1
  151. package/dist/api/curve-sketch/index.d.ts +235 -0
  152. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  153. package/dist/api/curve-sketch/index.js +493 -0
  154. package/dist/api/curve-sketch/index.js.map +1 -0
  155. package/dist/api/draft.d.ts.map +1 -1
  156. package/dist/api/draft.js +1 -3
  157. package/dist/api/draft.js.map +1 -1
  158. package/dist/api/engrave.d.ts.map +1 -1
  159. package/dist/api/engrave.js +6 -15
  160. package/dist/api/engrave.js.map +1 -1
  161. package/dist/api/export-3mf.d.ts +73 -0
  162. package/dist/api/export-3mf.d.ts.map +1 -0
  163. package/dist/api/export-3mf.js +121 -0
  164. package/dist/api/export-3mf.js.map +1 -0
  165. package/dist/api/export-brep.d.ts +47 -0
  166. package/dist/api/export-brep.d.ts.map +1 -0
  167. package/dist/api/export-brep.js +67 -0
  168. package/dist/api/export-brep.js.map +1 -0
  169. package/dist/api/export-step.d.ts +67 -0
  170. package/dist/api/export-step.d.ts.map +1 -0
  171. package/dist/api/export-step.js +98 -0
  172. package/dist/api/export-step.js.map +1 -0
  173. package/dist/api/export-stl.d.ts +58 -0
  174. package/dist/api/export-stl.d.ts.map +1 -0
  175. package/dist/api/export-stl.js +114 -0
  176. package/dist/api/export-stl.js.map +1 -0
  177. package/dist/api/extrude.d.ts +8 -11
  178. package/dist/api/extrude.d.ts.map +1 -1
  179. package/dist/api/extrude.js +11 -14
  180. package/dist/api/extrude.js.map +1 -1
  181. package/dist/api/feature-repair.d.ts +1 -1
  182. package/dist/api/feature-repair.d.ts.map +1 -1
  183. package/dist/api/feature-repair.js +1 -7
  184. package/dist/api/feature-repair.js.map +1 -1
  185. package/dist/api/fillet-variable.d.ts +2 -2
  186. package/dist/api/fillet-variable.d.ts.map +1 -1
  187. package/dist/api/fillet-variable.js +2 -3
  188. package/dist/api/fillet-variable.js.map +1 -1
  189. package/dist/api/fillet.d.ts +5 -7
  190. package/dist/api/fillet.d.ts.map +1 -1
  191. package/dist/api/fillet.js +5 -8
  192. package/dist/api/fillet.js.map +1 -1
  193. package/dist/api/generated/2d.d.ts +4 -0
  194. package/dist/api/generated/2d.d.ts.map +1 -1
  195. package/dist/api/generated/2d.js +4 -0
  196. package/dist/api/generated/2d.js.map +1 -1
  197. package/dist/api/generated/core.d.ts +4 -0
  198. package/dist/api/generated/core.d.ts.map +1 -1
  199. package/dist/api/generated/core.js +4 -0
  200. package/dist/api/generated/core.js.map +1 -1
  201. package/dist/api/generated/gear.d.ts +4 -0
  202. package/dist/api/generated/gear.d.ts.map +1 -1
  203. package/dist/api/generated/gear.js +4 -0
  204. package/dist/api/generated/gear.js.map +1 -1
  205. package/dist/api/generated/io.d.ts +4 -0
  206. package/dist/api/generated/io.d.ts.map +1 -1
  207. package/dist/api/generated/io.js +4 -0
  208. package/dist/api/generated/io.js.map +1 -1
  209. package/dist/api/generated/kernel.d.ts +4 -0
  210. package/dist/api/generated/kernel.d.ts.map +1 -1
  211. package/dist/api/generated/kernel.js +4 -0
  212. package/dist/api/generated/kernel.js.map +1 -1
  213. package/dist/api/generated/measurement.d.ts +21 -21
  214. package/dist/api/generated/measurement.d.ts.map +1 -1
  215. package/dist/api/generated/measurement.js +25 -21
  216. package/dist/api/generated/measurement.js.map +1 -1
  217. package/dist/api/generated/ns.d.ts +4 -0
  218. package/dist/api/generated/ns.d.ts.map +1 -1
  219. package/dist/api/generated/ns.js +4 -0
  220. package/dist/api/generated/ns.js.map +1 -1
  221. package/dist/api/generated/operations.d.ts +32 -32
  222. package/dist/api/generated/operations.d.ts.map +1 -1
  223. package/dist/api/generated/operations.js +58 -54
  224. package/dist/api/generated/operations.js.map +1 -1
  225. package/dist/api/generated/projection.d.ts +4 -0
  226. package/dist/api/generated/projection.d.ts.map +1 -1
  227. package/dist/api/generated/projection.js +4 -0
  228. package/dist/api/generated/projection.js.map +1 -1
  229. package/dist/api/generated/query.d.ts +4 -0
  230. package/dist/api/generated/query.d.ts.map +1 -1
  231. package/dist/api/generated/query.js +4 -0
  232. package/dist/api/generated/query.js.map +1 -1
  233. package/dist/api/generated/script-face-manifest.d.ts +1 -1
  234. package/dist/api/generated/script-face-manifest.js +3 -3
  235. package/dist/api/generated/script-face-manifest.js.map +1 -1
  236. package/dist/api/generated/script-face.d.ts +1 -1
  237. package/dist/api/generated/script-face.js +1 -1
  238. package/dist/api/generated/script-face.js.map +1 -1
  239. package/dist/api/generated/sketching.d.ts +2 -2
  240. package/dist/api/generated/sketching.d.ts.map +1 -1
  241. package/dist/api/generated/sketching.js +8 -4
  242. package/dist/api/generated/sketching.js.map +1 -1
  243. package/dist/api/generated/text.d.ts +4 -0
  244. package/dist/api/generated/text.d.ts.map +1 -1
  245. package/dist/api/generated/text.js +4 -0
  246. package/dist/api/generated/text.js.map +1 -1
  247. package/dist/api/generated/topology.d.ts +45 -45
  248. package/dist/api/generated/topology.d.ts.map +1 -1
  249. package/dist/api/generated/topology.js +77 -73
  250. package/dist/api/generated/topology.js.map +1 -1
  251. package/dist/api/generated/view.d.ts +4 -0
  252. package/dist/api/generated/view.d.ts.map +1 -1
  253. package/dist/api/generated/view.js +4 -0
  254. package/dist/api/generated/view.js.map +1 -1
  255. package/dist/api/geom-types/constants.d.ts +11 -0
  256. package/dist/api/geom-types/constants.d.ts.map +1 -0
  257. package/dist/api/geom-types/constants.js +11 -0
  258. package/dist/api/geom-types/constants.js.map +1 -0
  259. package/dist/api/geom-types/index.d.ts +21 -0
  260. package/dist/api/geom-types/index.d.ts.map +1 -0
  261. package/dist/api/geom-types/index.js +22 -0
  262. package/dist/api/geom-types/index.js.map +1 -0
  263. package/dist/api/geom-types/planeOps.d.ts +98 -0
  264. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  265. package/dist/api/geom-types/planeOps.js +170 -0
  266. package/dist/api/geom-types/planeOps.js.map +1 -0
  267. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  268. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  269. package/dist/api/geom-types/planeTypes.js +8 -0
  270. package/dist/api/geom-types/planeTypes.js.map +1 -0
  271. package/dist/api/geom-types/types.d.ts +64 -0
  272. package/dist/api/geom-types/types.d.ts.map +1 -0
  273. package/dist/api/geom-types/types.js +48 -0
  274. package/dist/api/geom-types/types.js.map +1 -0
  275. package/dist/api/geom-types/vecOps.d.ts +124 -0
  276. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  277. package/dist/api/geom-types/vecOps.js +202 -0
  278. package/dist/api/geom-types/vecOps.js.map +1 -0
  279. package/dist/api/geom.d.ts.map +1 -1
  280. package/dist/api/geom.js +6 -5
  281. package/dist/api/geom.js.map +1 -1
  282. package/dist/api/half-space.d.ts +56 -0
  283. package/dist/api/half-space.d.ts.map +1 -0
  284. package/dist/api/half-space.js +82 -0
  285. package/dist/api/half-space.js.map +1 -0
  286. package/dist/api/helix.d.ts +11 -2
  287. package/dist/api/helix.d.ts.map +1 -1
  288. package/dist/api/helix.js +20 -4
  289. package/dist/api/helix.js.map +1 -1
  290. package/dist/api/index.d.ts +19 -7
  291. package/dist/api/index.d.ts.map +1 -1
  292. package/dist/api/index.js +44 -11
  293. package/dist/api/index.js.map +1 -1
  294. package/dist/api/internal/compat-op.d.ts +10 -36
  295. package/dist/api/internal/compat-op.d.ts.map +1 -1
  296. package/dist/api/internal/compat-op.js +17 -51
  297. package/dist/api/internal/compat-op.js.map +1 -1
  298. package/dist/api/internal/compat-projection.d.ts +5 -5
  299. package/dist/api/internal/compat-projection.js +5 -5
  300. package/dist/api/internal/compat-projection.js.map +1 -1
  301. package/dist/api/internal/dual-form-args.d.ts +0 -2
  302. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  303. package/dist/api/internal/dual-form-args.js +1 -3
  304. package/dist/api/internal/dual-form-args.js.map +1 -1
  305. package/dist/api/internal/export-members.d.ts +80 -0
  306. package/dist/api/internal/export-members.d.ts.map +1 -0
  307. package/dist/api/internal/export-members.js +104 -0
  308. package/dist/api/internal/export-members.js.map +1 -0
  309. package/dist/api/internal/l3-bridge.d.ts +22 -37
  310. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  311. package/dist/api/internal/l3-bridge.js +30 -77
  312. package/dist/api/internal/l3-bridge.js.map +1 -1
  313. package/dist/api/internal/profile-wire.d.ts +1 -1
  314. package/dist/api/internal/profile-wire.js +1 -1
  315. package/dist/api/internal/profile-wire.js.map +1 -1
  316. package/dist/api/internal/result-unwrap.d.ts +4 -6
  317. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  318. package/dist/api/internal/result-unwrap.js +4 -6
  319. package/dist/api/internal/result-unwrap.js.map +1 -1
  320. package/dist/api/knurl.d.ts.map +1 -1
  321. package/dist/api/knurl.js +5 -3
  322. package/dist/api/knurl.js.map +1 -1
  323. package/dist/api/loft.d.ts +2 -2
  324. package/dist/api/loft.d.ts.map +1 -1
  325. package/dist/api/loft.js +2 -2
  326. package/dist/api/loft.js.map +1 -1
  327. package/dist/api/measure-query/index.d.ts +262 -0
  328. package/dist/api/measure-query/index.d.ts.map +1 -0
  329. package/dist/api/measure-query/index.js +390 -0
  330. package/dist/api/measure-query/index.js.map +1 -0
  331. package/dist/api/measurement/index.d.ts +3 -3
  332. package/dist/api/measurement/index.js +3 -3
  333. package/dist/api/measurement/index.js.map +1 -1
  334. package/dist/api/meta.d.ts +0 -2
  335. package/dist/api/meta.d.ts.map +1 -1
  336. package/dist/api/meta.js +0 -2
  337. package/dist/api/meta.js.map +1 -1
  338. package/dist/api/offset2d.d.ts +49 -0
  339. package/dist/api/offset2d.d.ts.map +1 -0
  340. package/dist/api/offset2d.js +86 -0
  341. package/dist/api/offset2d.js.map +1 -0
  342. package/dist/api/pattern.d.ts.map +1 -1
  343. package/dist/api/pattern.js +3 -6
  344. package/dist/api/pattern.js.map +1 -1
  345. package/dist/api/primitives.d.ts +6 -6
  346. package/dist/api/primitives.d.ts.map +1 -1
  347. package/dist/api/primitives.js +19 -17
  348. package/dist/api/primitives.js.map +1 -1
  349. package/dist/api/profile.d.ts.map +1 -1
  350. package/dist/api/profile.js +0 -1
  351. package/dist/api/profile.js.map +1 -1
  352. package/dist/api/punch-hole.d.ts.map +1 -1
  353. package/dist/api/punch-hole.js +0 -1
  354. package/dist/api/punch-hole.js.map +1 -1
  355. package/dist/api/replicate.d.ts +6 -8
  356. package/dist/api/replicate.d.ts.map +1 -1
  357. package/dist/api/replicate.js +27 -65
  358. package/dist/api/replicate.js.map +1 -1
  359. package/dist/api/result.d.ts +1 -1
  360. package/dist/api/result.js +1 -1
  361. package/dist/api/result.js.map +1 -1
  362. package/dist/api/revolve.d.ts +2 -2
  363. package/dist/api/revolve.js +3 -3
  364. package/dist/api/revolve.js.map +1 -1
  365. package/dist/api/screw.d.ts +1 -1
  366. package/dist/api/screw.d.ts.map +1 -1
  367. package/dist/api/screw.js +5 -4
  368. package/dist/api/screw.js.map +1 -1
  369. package/dist/api/sdf.d.ts.map +1 -1
  370. package/dist/api/sdf.js +3 -2
  371. package/dist/api/sdf.js.map +1 -1
  372. package/dist/api/section-by-plane.d.ts.map +1 -1
  373. package/dist/api/section-by-plane.js +0 -1
  374. package/dist/api/section-by-plane.js.map +1 -1
  375. package/dist/api/shape-type/index.d.ts +141 -0
  376. package/dist/api/shape-type/index.d.ts.map +1 -0
  377. package/dist/api/shape-type/index.js +182 -0
  378. package/dist/api/shape-type/index.js.map +1 -0
  379. package/dist/api/shell.d.ts +2 -2
  380. package/dist/api/shell.d.ts.map +1 -1
  381. package/dist/api/shell.js +12 -3
  382. package/dist/api/shell.js.map +1 -1
  383. package/dist/api/sketch-on-face.d.ts +3 -3
  384. package/dist/api/sketch-on-face.d.ts.map +1 -1
  385. package/dist/api/sketch-on-face.js +6 -4
  386. package/dist/api/sketch-on-face.js.map +1 -1
  387. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  388. package/dist/api/sketch-on-plane.js +0 -1
  389. package/dist/api/sketch-on-plane.js.map +1 -1
  390. package/dist/api/solid-from-faces.d.ts +45 -0
  391. package/dist/api/solid-from-faces.d.ts.map +1 -0
  392. package/dist/api/solid-from-faces.js +72 -0
  393. package/dist/api/solid-from-faces.js.map +1 -0
  394. package/dist/api/solid-offset/index.d.ts +67 -0
  395. package/dist/api/solid-offset/index.d.ts.map +1 -0
  396. package/dist/api/solid-offset/index.js +132 -0
  397. package/dist/api/solid-offset/index.js.map +1 -0
  398. package/dist/api/split-by-plane.d.ts.map +1 -1
  399. package/dist/api/split-by-plane.js +0 -1
  400. package/dist/api/split-by-plane.js.map +1 -1
  401. package/dist/api/split.d.ts +1 -1
  402. package/dist/api/split.js +1 -1
  403. package/dist/api/split.js.map +1 -1
  404. package/dist/api/surface/arg-spec.d.ts +37 -44
  405. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  406. package/dist/api/surface/arg-spec.js +224 -233
  407. package/dist/api/surface/arg-spec.js.map +1 -1
  408. package/dist/api/surface-face/index.d.ts +104 -0
  409. package/dist/api/surface-face/index.d.ts.map +1 -0
  410. package/dist/api/surface-face/index.js +217 -0
  411. package/dist/api/surface-face/index.js.map +1 -0
  412. package/dist/api/surface.d.ts +44 -0
  413. package/dist/api/surface.d.ts.map +1 -0
  414. package/dist/api/surface.js +66 -0
  415. package/dist/api/surface.js.map +1 -0
  416. package/dist/api/sweep.d.ts +71 -9
  417. package/dist/api/sweep.d.ts.map +1 -1
  418. package/dist/api/sweep.js +13 -6
  419. package/dist/api/sweep.js.map +1 -1
  420. package/dist/api/thicken.d.ts +1 -1
  421. package/dist/api/thicken.d.ts.map +1 -1
  422. package/dist/api/thicken.js +12 -3
  423. package/dist/api/thicken.js.map +1 -1
  424. package/dist/api/transform.d.ts +8 -8
  425. package/dist/api/transform.d.ts.map +1 -1
  426. package/dist/api/transform.js +58 -27
  427. package/dist/api/transform.js.map +1 -1
  428. package/dist/api/view/cameraFns.d.ts +1 -1
  429. package/dist/api/view/cameraFns.d.ts.map +1 -1
  430. package/dist/api/view/cameraFns.js +1 -1
  431. package/dist/api/view/cameraFns.js.map +1 -1
  432. package/dist/api/view/index.d.ts +0 -2
  433. package/dist/api/view/index.d.ts.map +1 -1
  434. package/dist/api/view/index.js +0 -2
  435. package/dist/api/view/index.js.map +1 -1
  436. package/dist/api/view/projectionPlanes.d.ts +1 -1
  437. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  438. package/dist/api/view/projectionPlanes.js.map +1 -1
  439. package/dist/api/view/view-camera.d.ts +7 -9
  440. package/dist/api/view/view-camera.d.ts.map +1 -1
  441. package/dist/api/view/view-camera.js +4 -6
  442. package/dist/api/view/view-camera.js.map +1 -1
  443. package/dist/api/view/view-projection.d.ts +0 -2
  444. package/dist/api/view/view-projection.d.ts.map +1 -1
  445. package/dist/api/view/view-projection.js +0 -2
  446. package/dist/api/view/view-projection.js.map +1 -1
  447. package/dist/api/view/view-sheet.d.ts +0 -2
  448. package/dist/api/view/view-sheet.d.ts.map +1 -1
  449. package/dist/api/view/view-sheet.js +0 -2
  450. package/dist/api/view/view-sheet.js.map +1 -1
  451. package/dist/api/view-export/index.d.ts +97 -0
  452. package/dist/api/view-export/index.d.ts.map +1 -0
  453. package/dist/api/view-export/index.js +118 -0
  454. package/dist/api/view-export/index.js.map +1 -0
  455. package/dist/boolean/index.d.ts +23 -0
  456. package/dist/boolean/index.d.ts.map +1 -0
  457. package/dist/boolean/index.js +27 -0
  458. package/dist/boolean/index.js.map +1 -0
  459. package/dist/brep/brep-chain.d.ts +1 -19
  460. package/dist/brep/brep-chain.d.ts.map +1 -1
  461. package/dist/brep/brep-chain.js +0 -1
  462. package/dist/brep/brep-chain.js.map +1 -1
  463. package/dist/brep/brep-ops.d.ts +93 -2
  464. package/dist/brep/brep-ops.d.ts.map +1 -1
  465. package/dist/brep/brep-ops.js +185 -15
  466. package/dist/brep/brep-ops.js.map +1 -1
  467. package/dist/brep/brep-topology.d.ts +20 -0
  468. package/dist/brep/brep-topology.d.ts.map +1 -1
  469. package/dist/brep/brep-topology.js +46 -0
  470. package/dist/brep/brep-topology.js.map +1 -1
  471. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  472. package/dist/brep/engine/adapters/brep-mock.js +0 -3
  473. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  474. package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
  475. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  476. package/dist/brep/engine/adapters/brepkit.js +4 -98
  477. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  478. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  479. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  480. package/dist/brep/engine/adapters/occt.js +4 -148
  481. package/dist/brep/engine/adapters/occt.js.map +1 -1
  482. package/dist/brep/engine/native-history.d.ts +27 -0
  483. package/dist/brep/engine/native-history.d.ts.map +1 -0
  484. package/dist/brep/engine/native-history.js +54 -0
  485. package/dist/brep/engine/native-history.js.map +1 -0
  486. package/dist/brep/engine/primitives.d.ts +2 -3
  487. package/dist/brep/engine/primitives.d.ts.map +1 -1
  488. package/dist/brep/engine/primitives.js +1 -2
  489. package/dist/brep/engine/primitives.js.map +1 -1
  490. package/dist/brep/engine/registry.d.ts +3 -5
  491. package/dist/brep/engine/registry.d.ts.map +1 -1
  492. package/dist/brep/engine/registry.js +2 -2
  493. package/dist/brep/engine/registry.js.map +1 -1
  494. package/dist/brep/engine/types.d.ts +35 -77
  495. package/dist/brep/engine/types.d.ts.map +1 -1
  496. package/dist/brep/engine/types.js.map +1 -1
  497. package/dist/brep/export/export-model.d.ts +21 -0
  498. package/dist/brep/export/export-model.d.ts.map +1 -1
  499. package/dist/brep/export/export-model.js +171 -73
  500. package/dist/brep/export/export-model.js.map +1 -1
  501. package/dist/brep/export/step.d.ts +17 -1
  502. package/dist/brep/export/step.d.ts.map +1 -1
  503. package/dist/brep/export/step.js +133 -0
  504. package/dist/brep/export/step.js.map +1 -1
  505. package/dist/brep/export/stl.d.ts +22 -1
  506. package/dist/brep/export/stl.d.ts.map +1 -1
  507. package/dist/brep/export/stl.js +58 -10
  508. package/dist/brep/export/stl.js.map +1 -1
  509. package/dist/brep/export/transform12.d.ts +47 -0
  510. package/dist/brep/export/transform12.d.ts.map +1 -0
  511. package/dist/brep/export/transform12.js +87 -0
  512. package/dist/brep/export/transform12.js.map +1 -0
  513. package/dist/brep/face-evolution.d.ts +53 -0
  514. package/dist/brep/face-evolution.d.ts.map +1 -1
  515. package/dist/brep/face-evolution.js +65 -0
  516. package/dist/brep/face-evolution.js.map +1 -1
  517. package/dist/brep/handle-bridge.d.ts +2 -2
  518. package/dist/brep/handle-bridge.js +2 -2
  519. package/dist/brep/handle-bridge.js.map +1 -1
  520. package/dist/brep/index.d.ts +6 -3
  521. package/dist/brep/index.d.ts.map +1 -1
  522. package/dist/brep/index.js +6 -3
  523. package/dist/brep/index.js.map +1 -1
  524. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  525. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  526. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  527. package/dist/browser-host/index.d.ts +4 -1
  528. package/dist/browser-host/index.d.ts.map +1 -1
  529. package/dist/browser-host/index.js +7 -1
  530. package/dist/browser-host/index.js.map +1 -1
  531. package/dist/browser.d.ts +5 -9
  532. package/dist/browser.d.ts.map +1 -1
  533. package/dist/browser.js +5 -26
  534. package/dist/browser.js.map +1 -1
  535. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  536. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  537. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  538. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  539. package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
  540. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  541. package/dist/cad-runtime/backend-dispatch.js +34 -83
  542. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  543. package/dist/cad-runtime/content-key.d.ts +3 -3
  544. package/dist/cad-runtime/content-key.js +3 -3
  545. package/dist/cad-runtime/content-key.js.map +1 -1
  546. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  547. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  548. package/dist/cad-runtime/direct-executor.js +31 -9
  549. package/dist/cad-runtime/direct-executor.js.map +1 -1
  550. package/dist/cad-runtime/interp/env.d.ts +1 -1
  551. package/dist/cad-runtime/interp/env.js.map +1 -1
  552. package/dist/cad-runtime/lib-id.d.ts +0 -2
  553. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  554. package/dist/cad-runtime/lib-id.js +0 -2
  555. package/dist/cad-runtime/lib-id.js.map +1 -1
  556. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  557. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  558. package/dist/cad-runtime/live-shapes.js +8 -10
  559. package/dist/cad-runtime/live-shapes.js.map +1 -1
  560. package/dist/cad-runtime/ports.d.ts +31 -3
  561. package/dist/cad-runtime/ports.d.ts.map +1 -1
  562. package/dist/cad-runtime/ports.js.map +1 -1
  563. package/dist/cad-runtime/runtime.d.ts +54 -19
  564. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  565. package/dist/cad-runtime/runtime.js +89 -54
  566. package/dist/cad-runtime/runtime.js.map +1 -1
  567. package/dist/define-op.d.ts +10 -14
  568. package/dist/define-op.d.ts.map +1 -1
  569. package/dist/define-op.js +5 -22
  570. package/dist/define-op.js.map +1 -1
  571. package/dist/env-agnostic.d.ts +2 -2
  572. package/dist/env-agnostic.d.ts.map +1 -1
  573. package/dist/env-agnostic.js +1 -1
  574. package/dist/env-agnostic.js.map +1 -1
  575. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  576. package/dist/geometry2d/bridge/plane.js +1 -1
  577. package/dist/geometry2d/bridge/plane.js.map +1 -1
  578. package/dist/geometry2d/curve2d.d.ts +1 -1
  579. package/dist/geometry2d/curve2d.js +1 -1
  580. package/dist/geometry2d/curve2d.js.map +1 -1
  581. package/dist/index.d.ts +14 -65
  582. package/dist/index.d.ts.map +1 -1
  583. package/dist/index.js +18 -70
  584. package/dist/index.js.map +1 -1
  585. package/dist/io/fai-zip/container-read.d.ts +16 -0
  586. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  587. package/dist/io/fai-zip/container-read.js +22 -0
  588. package/dist/io/fai-zip/container-read.js.map +1 -1
  589. package/dist/io/fai-zip/index.d.ts +1 -1
  590. package/dist/io/fai-zip/index.d.ts.map +1 -1
  591. package/dist/io/fai-zip/index.js +1 -1
  592. package/dist/io/fai-zip/index.js.map +1 -1
  593. package/dist/lang/code-to-args.d.ts.map +1 -1
  594. package/dist/lang/code-to-args.js +10 -1
  595. package/dist/lang/code-to-args.js.map +1 -1
  596. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  597. package/dist/lang/determinism-scanner.js +22 -9
  598. package/dist/lang/determinism-scanner.js.map +1 -1
  599. package/dist/lang/metadata-extractor.d.ts +27 -6
  600. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  601. package/dist/lang/metadata-extractor.js +88 -8
  602. package/dist/lang/metadata-extractor.js.map +1 -1
  603. package/dist/lang/parse-error.d.ts +4 -0
  604. package/dist/lang/parse-error.d.ts.map +1 -1
  605. package/dist/lang/parse-error.js.map +1 -1
  606. package/dist/lang/security-scanner.d.ts +27 -2
  607. package/dist/lang/security-scanner.d.ts.map +1 -1
  608. package/dist/lang/security-scanner.js +29 -2
  609. package/dist/lang/security-scanner.js.map +1 -1
  610. package/dist/lang/source-edit.d.ts +2 -2
  611. package/dist/lang/source-edit.js.map +1 -1
  612. package/dist/lang/symbol-table.generated.d.ts +53 -0
  613. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  614. package/dist/lang/symbol-table.generated.js +53 -0
  615. package/dist/lang/symbol-table.generated.js.map +1 -1
  616. package/dist/mesh/import-model.d.ts +94 -0
  617. package/dist/mesh/import-model.d.ts.map +1 -0
  618. package/dist/mesh/import-model.js +15 -0
  619. package/dist/mesh/import-model.js.map +1 -0
  620. package/dist/mesh/index.d.ts +19 -63
  621. package/dist/mesh/index.d.ts.map +1 -1
  622. package/dist/mesh/index.js +19 -72
  623. package/dist/mesh/index.js.map +1 -1
  624. package/dist/mesh/io.d.ts +62 -17
  625. package/dist/mesh/io.d.ts.map +1 -1
  626. package/dist/mesh/io.js +210 -41
  627. package/dist/mesh/io.js.map +1 -1
  628. package/dist/mesh/primitives.js +1 -1
  629. package/dist/mesh/primitives.js.map +1 -1
  630. package/dist/mesh/threemf-bambu.d.ts +12 -1
  631. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  632. package/dist/mesh/threemf-bambu.js +68 -16
  633. package/dist/mesh/threemf-bambu.js.map +1 -1
  634. package/dist/mesh/threemf-loader.d.ts +52 -5
  635. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  636. package/dist/mesh/threemf-loader.js +139 -41
  637. package/dist/mesh/threemf-loader.js.map +1 -1
  638. package/dist/mesh/transform.d.ts +1 -1
  639. package/dist/mesh/transform.js +1 -1
  640. package/dist/mesh/transform.js.map +1 -1
  641. package/dist/mesh/types.d.ts +35 -5
  642. package/dist/mesh/types.d.ts.map +1 -1
  643. package/dist/mesh/types.js.map +1 -1
  644. package/dist/node-host/cli.d.ts +49 -1
  645. package/dist/node-host/cli.d.ts.map +1 -1
  646. package/dist/node-host/cli.js +125 -19
  647. package/dist/node-host/cli.js.map +1 -1
  648. package/dist/node-host/execute-script.d.ts +56 -0
  649. package/dist/node-host/execute-script.d.ts.map +1 -0
  650. package/dist/node-host/execute-script.js +47 -0
  651. package/dist/node-host/execute-script.js.map +1 -0
  652. package/dist/node-host/index.d.ts +1 -0
  653. package/dist/node-host/index.d.ts.map +1 -1
  654. package/dist/node-host/index.js +4 -0
  655. package/dist/node-host/index.js.map +1 -1
  656. package/dist/node.d.ts +2 -0
  657. package/dist/node.d.ts.map +1 -1
  658. package/dist/node.js +3 -0
  659. package/dist/node.js.map +1 -1
  660. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  661. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  662. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  663. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  664. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  665. package/dist/occt-kernel/hullGeometry.js +2 -3
  666. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  667. package/dist/occt-kernel/hullOps.d.ts +3 -3
  668. package/dist/occt-kernel/hullOps.js +4 -4
  669. package/dist/occt-kernel/hullOps.js.map +1 -1
  670. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  671. package/dist/occt-kernel/occt-primitives.js +31 -4
  672. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  673. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  674. package/dist/occt-kernel/occtKernel.js +18 -0
  675. package/dist/occt-kernel/occtKernel.js.map +1 -1
  676. package/dist/occt-scan/recognize.d.ts +58 -0
  677. package/dist/occt-scan/recognize.d.ts.map +1 -0
  678. package/dist/occt-scan/recognize.js +216 -0
  679. package/dist/occt-scan/recognize.js.map +1 -0
  680. package/dist/primitives/brep-primitives.js +7 -7
  681. package/dist/primitives/brep-primitives.js.map +1 -1
  682. package/dist/primitives/index.d.ts +19 -0
  683. package/dist/primitives/index.d.ts.map +1 -0
  684. package/dist/primitives/index.js +21 -0
  685. package/dist/primitives/index.js.map +1 -0
  686. package/dist/result/bug.d.ts +1 -1
  687. package/dist/result/bug.js +1 -1
  688. package/dist/result/bug.js.map +1 -1
  689. package/dist/result/errors.d.ts +2 -2
  690. package/dist/result/errors.d.ts.map +1 -1
  691. package/dist/result/errors.js +1 -1
  692. package/dist/result/errors.js.map +1 -1
  693. package/dist/result/vec3.d.ts +1 -1
  694. package/dist/result/vec3.js +1 -1
  695. package/dist/result/vec3.js.map +1 -1
  696. package/dist/runtime-state.d.ts +79 -29
  697. package/dist/runtime-state.d.ts.map +1 -1
  698. package/dist/runtime-state.js +84 -0
  699. package/dist/runtime-state.js.map +1 -1
  700. package/dist/script-globals.d.ts +24 -0
  701. package/dist/script-globals.d.ts.map +1 -0
  702. package/dist/script-globals.js +24 -0
  703. package/dist/script-globals.js.map +1 -0
  704. package/dist/sdf/index.d.ts +12 -0
  705. package/dist/sdf/index.d.ts.map +1 -0
  706. package/dist/sdf/index.js +13 -0
  707. package/dist/sdf/index.js.map +1 -0
  708. package/dist/sdk.d.ts +0 -1
  709. package/dist/sdk.d.ts.map +1 -1
  710. package/dist/sdk.js.map +1 -1
  711. package/dist/shape.d.ts +24 -0
  712. package/dist/shape.d.ts.map +1 -1
  713. package/dist/shape.js +40 -0
  714. package/dist/shape.js.map +1 -1
  715. package/dist/topology/naming/lineage.d.ts +3 -2
  716. package/dist/topology/naming/lineage.d.ts.map +1 -1
  717. package/dist/topology/naming/lineage.js.map +1 -1
  718. package/dist/weapp.d.ts +3 -3
  719. package/dist/weapp.d.ts.map +1 -1
  720. package/dist/weapp.js +2 -2
  721. package/dist/weapp.js.map +1 -1
  722. package/package.json +283 -44
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
 
@@ -0,0 +1,64 @@
1
+ /**
2
+ * api align — 包围盒锚点对齐族(S4 剩余,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 三个原生方法 `alignX` / `alignY` / `alignZ`(occt-wasm 5.6.0 有)
5
+ * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 `translate` 这类按向量平移,
6
+ * 没有「把包围盒某个锚点挪到目标坐标」的成员)⇒ 平台 op。
7
+ *
8
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.9。落地为一个
9
+ * **脚本符号** `alignTo(shape, axis, options?)`:三轴的动作是同一能力的三参数形态,
10
+ * 分成三个符号会平白制造三个名字(同一治理理由见 `liftCurve2d` 与 `view-export`)。
11
+ *
12
+ * 语义:按 `anchor`(min / center / max)取形状包围盒在该轴的极值,平移使该值落到
13
+ * `target`。**输入形状不动**(原生返回新句柄)。
14
+ *
15
+ * GOTCHA(实测钉住,test/api/occt-s4-boolean-align.test.ts A4b):`target` 与 `anchor`
16
+ * 在 d.ts 里都写作可选,但原生的**默认值**是 `target = 0` 且 **`anchor = 'center'`**
17
+ * (dist/index.js:549-553 的默认参数)——不是直觉上的 min。缺省调用
18
+ * `alignTo(shape, 'z')` 会把包围盒的 **中点** 挪到 z=0,而不是把最低点抬到 z=0。
19
+ * 本 op 不替上游编默认值(缺省一律透传 undefined 让原生默认生效),因此这条语义
20
+ * 变化会直接透到脚本面。
21
+ *
22
+ * naming:本族是刚体平移 ⇒ `kernel` + `newFaces: { via: 'byAdjacency' }`,与
23
+ * api/transform.ts 的 `translate` 同口径(刚体变换不改面集,演化由邻接关系推导)。
24
+ *
25
+ * §9.5 降级路径:一旦 L1 契约补上进 bezeichnet 的对齐成员且两侧适配器同时落地,删掉
26
+ * `engines` 声明改走 getBrepApi(),三个原生方法即从 C2 转入 C1。
27
+ */
28
+ import type { Shape } from '../../mesh/types.js';
29
+ /** 对齐的目标轴。 */
30
+ export type AlignAxis = 'x' | 'y' | 'z';
31
+ /** 包围盒上被对齐的那个锚点(与 occt-wasm 的 `AlignAnchor` 字面量一致)。 */
32
+ export type AlignAnchor = 'min' | 'center' | 'max';
33
+ /** `alignTo` 的选项(两个字段都缺省时取原生默认:target 0 / anchor 'min')。 */
34
+ export interface AlignOptions {
35
+ /** 目标坐标;缺省交由原生默认(0)。type:number required:false */
36
+ target?: number;
37
+ /** 包围盒锚点;缺省交由原生默认(min)。type:string required:false */
38
+ anchor?: AlignAnchor;
39
+ }
40
+ /**
41
+ * 把形状沿某一轴平移,使其包围盒的指定锚点落到目标坐标。
42
+ * @group 变换
43
+ * @inputs 1
44
+ * @async false
45
+ * @qual ok
46
+ * @name alignTo
47
+ * @note 平台 op:仅 occt 引擎(原生 alignX/alignY/alignZ,L1 契约无对应成员)。
48
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
49
+ * 输入的原形状**不会被改动**——原生返回新句柄。
50
+ * @returns Shape 对齐后的形状。
51
+ * @param shape - 被对齐的形状。type:Shape required:true
52
+ * @param axis - 对齐的目标轴(x/y/z)。type:string required:true
53
+ * @param options.target - 目标坐标(缺省交由原生默认)。type:number required:false
54
+ * @param options.anchor - 包围盒锚点 min|center|max(缺省交由原生默认)。type:string required:false
55
+ * @example
56
+ * // 把零件放到 XY 平面上(最低点抬到 z=0)
57
+ * const flat = cad.alignTo(part0, 'z')
58
+ * // 居中:把 x 方向的包围盒中点移到 0
59
+ * const centered = cad.alignTo(part0, 'x', { target: 0, anchor: 'center' })
60
+ */
61
+ export declare const alignTo: ((shape: Shape, axis: AlignAxis, options?: AlignOptions | undefined) => Promise<Shape>) & {
62
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
63
+ };
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/align/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAS7C,cAAc;AACd,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAEvC,uDAAuD;AACvD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAA;AAElD,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AA6CD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,OAAO;;CAQlB,CAAA"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * api align — 包围盒锚点对齐族(S4 剩余,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 三个原生方法 `alignX` / `alignY` / `alignZ`(occt-wasm 5.6.0 有)
5
+ * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 `translate` 这类按向量平移,
6
+ * 没有「把包围盒某个锚点挪到目标坐标」的成员)⇒ 平台 op。
7
+ *
8
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.9。落地为一个
9
+ * **脚本符号** `alignTo(shape, axis, options?)`:三轴的动作是同一能力的三参数形态,
10
+ * 分成三个符号会平白制造三个名字(同一治理理由见 `liftCurve2d` 与 `view-export`)。
11
+ *
12
+ * 语义:按 `anchor`(min / center / max)取形状包围盒在该轴的极值,平移使该值落到
13
+ * `target`。**输入形状不动**(原生返回新句柄)。
14
+ *
15
+ * GOTCHA(实测钉住,test/api/occt-s4-boolean-align.test.ts A4b):`target` 与 `anchor`
16
+ * 在 d.ts 里都写作可选,但原生的**默认值**是 `target = 0` 且 **`anchor = 'center'`**
17
+ * (dist/index.js:549-553 的默认参数)——不是直觉上的 min。缺省调用
18
+ * `alignTo(shape, 'z')` 会把包围盒的 **中点** 挪到 z=0,而不是把最低点抬到 z=0。
19
+ * 本 op 不替上游编默认值(缺省一律透传 undefined 让原生默认生效),因此这条语义
20
+ * 变化会直接透到脚本面。
21
+ *
22
+ * naming:本族是刚体平移 ⇒ `kernel` + `newFaces: { via: 'byAdjacency' }`,与
23
+ * api/transform.ts 的 `translate` 同口径(刚体变换不改面集,演化由邻接关系推导)。
24
+ *
25
+ * §9.5 降级路径:一旦 L1 契约补上进 bezeichnet 的对齐成员且两侧适配器同时落地,删掉
26
+ * `engines` 声明改走 getBrepApi(),三个原生方法即从 C2 转入 C1。
27
+ */
28
+ import { solidToShape } from '../../brep/brep-ops.js';
29
+ import { getBrepApi } from '../../brep/handle-bridge.js';
30
+ import { brepOf, fromBrep } from '../../shape.js';
31
+ import { defineOp } from '../../sdk.js';
32
+ import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
33
+ const AXES = ['x', 'y', 'z'];
34
+ const ANCHORS = ['min', 'center', 'max'];
35
+ /** 输入 Shape → 内核句柄(无 BREP 槽报错)。 */
36
+ function handleOf(shape) {
37
+ const h = brepOf(shape);
38
+ if (!h) {
39
+ throw new Error('E_ALIGNTO_NO_BREP: alignTo requires a BREP handle (mesh-only shape has none)');
40
+ }
41
+ return h;
42
+ }
43
+ /** BREP 路径:按轴分派到 occt 原生 alignX / alignY / alignZ。 */
44
+ function alignToBrep(shape, axis, options) {
45
+ if (!shape) {
46
+ throw new Error('E_ALIGNTO_NO_INPUT: alignTo requires an input shape');
47
+ }
48
+ if (!AXES.includes(axis)) {
49
+ throw new Error(`E_ALIGNTO_BAD_AXIS: axis must be one of x/y/z (got ${String(axis)})`);
50
+ }
51
+ const opts = options ?? {};
52
+ if (opts.target !== undefined && (typeof opts.target !== 'number' || !Number.isFinite(opts.target))) {
53
+ throw new Error('E_ALIGNTO_BAD_TARGET: target must be a finite number');
54
+ }
55
+ if (opts.anchor !== undefined && !ANCHORS.includes(opts.anchor)) {
56
+ throw new Error(`E_ALIGNTO_BAD_ANCHOR: anchor must be one of min/center/max (got ${String(opts.anchor)})`);
57
+ }
58
+ const h = handleOf(shape);
59
+ const k = getOcctKernel();
60
+ const { target, anchor } = opts;
61
+ // 三分支**显式直调**(不用 `const native = axis === 'x' ? k.alignX : …` 再
62
+ // `.call()`):动态取属性会让覆盖率扫描器(scan-occt-op-coverage.ts)看不见
63
+ // alignX/alignY/alignZ,它们会掉回 C4 而被误判成「未接入」。
64
+ const handle = (axis === 'x'
65
+ ? k.alignX(h, target, anchor)
66
+ : axis === 'y'
67
+ ? k.alignY(h, target, anchor)
68
+ : k.alignZ(h, target, anchor));
69
+ return fromBrep(solidToShape(getBrepApi(), handle), { solid: handle });
70
+ }
71
+ /**
72
+ * 把形状沿某一轴平移,使其包围盒的指定锚点落到目标坐标。
73
+ * @group 变换
74
+ * @inputs 1
75
+ * @async false
76
+ * @qual ok
77
+ * @name alignTo
78
+ * @note 平台 op:仅 occt 引擎(原生 alignX/alignY/alignZ,L1 契约无对应成员)。
79
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
80
+ * 输入的原形状**不会被改动**——原生返回新句柄。
81
+ * @returns Shape 对齐后的形状。
82
+ * @param shape - 被对齐的形状。type:Shape required:true
83
+ * @param axis - 对齐的目标轴(x/y/z)。type:string required:true
84
+ * @param options.target - 目标坐标(缺省交由原生默认)。type:number required:false
85
+ * @param options.anchor - 包围盒锚点 min|center|max(缺省交由原生默认)。type:string required:false
86
+ * @example
87
+ * // 把零件放到 XY 平面上(最低点抬到 z=0)
88
+ * const flat = cad.alignTo(part0, 'z')
89
+ * // 居中:把 x 方向的包围盒中点移到 0
90
+ * const centered = cad.alignTo(part0, 'x', { target: 0, anchor: 'center' })
91
+ */
92
+ export const alignTo = defineOp({
93
+ name: 'alignTo',
94
+ paramDims: { options: 'length' },
95
+ brep(shape, axis, options) {
96
+ return alignToBrep(shape, axis, options);
97
+ },
98
+ engines: ['occt'],
99
+ naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
100
+ });
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/align/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api align — 包围盒锚点对齐族(S4 剩余,平台 op engines:['occt'])\n *\n * @platform occt — 三个原生方法 `alignX` / `alignY` / `alignZ`(occt-wasm 5.6.0 有)\n * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 `translate` 这类按向量平移,\n * 没有「把包围盒某个锚点挪到目标坐标」的成员)⇒ 平台 op。\n *\n * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.9。落地为一个\n * **脚本符号** `alignTo(shape, axis, options?)`:三轴的动作是同一能力的三参数形态,\n * 分成三个符号会平白制造三个名字(同一治理理由见 `liftCurve2d` 与 `view-export`)。\n *\n * 语义:按 `anchor`(min / center / max)取形状包围盒在该轴的极值,平移使该值落到\n * `target`。**输入形状不动**(原生返回新句柄)。\n *\n * GOTCHA(实测钉住,test/api/occt-s4-boolean-align.test.ts A4b):`target` 与 `anchor`\n * 在 d.ts 里都写作可选,但原生的**默认值**是 `target = 0` 且 **`anchor = 'center'`**\n * (dist/index.js:549-553 的默认参数)——不是直觉上的 min。缺省调用\n * `alignTo(shape, 'z')` 会把包围盒的 **中点** 挪到 z=0,而不是把最低点抬到 z=0。\n * 本 op 不替上游编默认值(缺省一律透传 undefined 让原生默认生效),因此这条语义\n * 变化会直接透到脚本面。\n *\n * naming:本族是刚体平移 ⇒ `kernel` + `newFaces: { via: 'byAdjacency' }`,与\n * api/transform.ts 的 `translate` 同口径(刚体变换不改面集,演化由邻接关系推导)。\n *\n * §9.5 降级路径:一旦 L1 契约补上进 bezeichnet 的对齐成员且两侧适配器同时落地,删掉\n * `engines` 声明改走 getBrepApi(),三个原生方法即从 C2 转入 C1。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { solidToShape } from '../../brep/brep-ops'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../../shape'\nimport { defineOp } from '../../sdk'\nimport type { Provenance } from '../../topology/naming/lineage'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\n\n/** 对齐的目标轴。 */\nexport type AlignAxis = 'x' | 'y' | 'z'\n\n/** 包围盒上被对齐的那个锚点(与 occt-wasm 的 `AlignAnchor` 字面量一致)。 */\nexport type AlignAnchor = 'min' | 'center' | 'max'\n\n/** `alignTo` 的选项(两个字段都缺省时取原生默认:target 0 / anchor 'min')。 */\nexport interface AlignOptions {\n /** 目标坐标;缺省交由原生默认(0)。type:number required:false */\n target?: number\n /** 包围盒锚点;缺省交由原生默认(min)。type:string required:false */\n anchor?: AlignAnchor\n}\n\nconst AXES: readonly AlignAxis[] = ['x', 'y', 'z']\nconst ANCHORS: readonly AlignAnchor[] = ['min', 'center', 'max']\n\n/** 输入 Shape → 内核句柄(无 BREP 槽报错)。 */\nfunction handleOf(shape: Shape): BrepHandle {\n const h = brepOf(shape) as BrepHandle | undefined\n if (!h) {\n throw new Error('E_ALIGNTO_NO_BREP: alignTo requires a BREP handle (mesh-only shape has none)')\n }\n return h\n}\n\n/** BREP 路径:按轴分派到 occt 原生 alignX / alignY / alignZ。 */\nfunction alignToBrep(shape: Shape, axis: AlignAxis, options?: AlignOptions): Shape {\n if (!shape) {\n throw new Error('E_ALIGNTO_NO_INPUT: alignTo requires an input shape')\n }\n if (!AXES.includes(axis)) {\n throw new Error(`E_ALIGNTO_BAD_AXIS: axis must be one of x/y/z (got ${String(axis)})`)\n }\n const opts = options ?? {}\n if (opts.target !== undefined && (typeof opts.target !== 'number' || !Number.isFinite(opts.target))) {\n throw new Error('E_ALIGNTO_BAD_TARGET: target must be a finite number')\n }\n if (opts.anchor !== undefined && !ANCHORS.includes(opts.anchor)) {\n throw new Error(`E_ALIGNTO_BAD_ANCHOR: anchor must be one of min/center/max (got ${String(opts.anchor)})`)\n }\n const h = handleOf(shape)\n const k = getOcctKernel()\n const { target, anchor } = opts\n // 三分支**显式直调**(不用 `const native = axis === 'x' ? k.alignX : …` 再\n // `.call()`):动态取属性会让覆盖率扫描器(scan-occt-op-coverage.ts)看不见\n // alignX/alignY/alignZ,它们会掉回 C4 而被误判成「未接入」。\n const handle = (\n axis === 'x'\n ? k.alignX(h as never, target, anchor as never)\n : axis === 'y'\n ? k.alignY(h as never, target, anchor as never)\n : k.alignZ(h as never, target, anchor as never)\n ) as unknown as BrepHandle\n return fromBrep(solidToShape(getBrepApi(), handle), { solid: handle })\n}\n\n/**\n * 把形状沿某一轴平移,使其包围盒的指定锚点落到目标坐标。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name alignTo\n * @note 平台 op:仅 occt 引擎(原生 alignX/alignY/alignZ,L1 契约无对应成员)。\n * 非 occt 引擎执行前报错;brep_mock 不拦截。\n * 输入的原形状**不会被改动**——原生返回新句柄。\n * @returns Shape 对齐后的形状。\n * @param shape - 被对齐的形状。type:Shape required:true\n * @param axis - 对齐的目标轴(x/y/z)。type:string required:true\n * @param options.target - 目标坐标(缺省交由原生默认)。type:number required:false\n * @param options.anchor - 包围盒锚点 min|center|max(缺省交由原生默认)。type:string required:false\n * @example\n * // 把零件放到 XY 平面上(最低点抬到 z=0)\n * const flat = cad.alignTo(part0, 'z')\n * // 居中:把 x 方向的包围盒中点移到 0\n * const centered = cad.alignTo(part0, 'x', { target: 0, anchor: 'center' })\n */\nexport const alignTo = defineOp({\n name: 'alignTo',\n paramDims: { options: 'length' },\n brep(shape: Shape, axis: AlignAxis, options?: AlignOptions) {\n return alignToBrep(shape, axis, options)\n },\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -9,7 +9,7 @@
9
9
  * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)
10
10
  * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,
11
11
  * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中
12
- * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。
12
+ * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。
13
13
  *
14
14
  * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op
15
15
  * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op
@@ -22,11 +22,12 @@ import type { LibNamespace } from '../runtime-state.js';
22
22
  /**
23
23
  * Assemble api functions into the cad namespace.
24
24
  *
25
- * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+
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(…))` 包装的
28
- * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与
29
- * `api/index.ts` 导出面同源于同一份清单。
27
+ * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的
28
+ * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。
29
+ * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`
30
+ * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。
30
31
  *
31
32
  * @returns the assembled LibNamespace ready for runtime injection.
32
33
  */
@@ -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;AAqGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAwFjD"}
@@ -9,7 +9,7 @@
9
9
  * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)
10
10
  * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,
11
11
  * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中
12
- * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。
12
+ * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。
13
13
  *
14
14
  * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op
15
15
  * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op
@@ -32,6 +32,52 @@ 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
+ // 2026-10-08(方案 §2.6 / DEC-3):脚本面 step / 3mf 出口。两者都是薄壳:宿主门
42
+ // (+ exportStep 的 occt 引擎门)之后把入参转成 ExportEntry[],序列化一律交库面
43
+ // exportModelSync(单一真源),故与库面逐字节同源。只进脚本面(本字面量 + check()
44
+ // 符号表),**不平铺 api/index.ts**(§2.7 / DEC-6)。
45
+ import { exportStep } from './export-step.js';
46
+ import { export3mf } from './export-3mf.js';
47
+ // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。
48
+ // 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual
49
+ // (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。
50
+ import { isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual, } from './shape-type/index.js';
51
+ // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。
52
+ // 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);
53
+ // 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。
54
+ import { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export/index.js';
55
+ // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。
56
+ // 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/
57
+ // approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/
58
+ // curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。
59
+ import { edge, circleArc, ellipseEdge, ellipseArc, tangentArc, approximatePoints, interpolateWithTangents, curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic, } from './curve-sketch/index.js';
60
+ // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。
61
+ // 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire
62
+ // (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。
63
+ import { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face/index.js';
64
+ // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。
65
+ // 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/
66
+ // halfSpace 已由 S3 落地)。
67
+ import { draftPrism, pipe } from './solid-offset/index.js';
68
+ // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。
69
+ // 13 个原生方法不在 L1 契约:containsPoint/distanceBetween/getInertia/
70
+ // getLinearCenterOfMass/projectPointOnEdge/projectPointOnFace/classifyPointOnFace/
71
+ // uvFromPoint/vertexPosition/subShapeCount/iterShapes 返回非 Shape,
72
+ // 走 export-brep / shape-type 同口径的普通函数;liftCurve2d / commonCells
73
+ // 返回 Shape,走 defineOp。
74
+ import { containsPoint, distanceBetween, inertia, linearCenterOfMass, projectPointOnEdge, projectPointOnFace, classifyPointOnFace, uvFromPoint, vertexPosition, subShapeCount, iterShapes, liftCurve2d, commonCells, } from './measure-query/index.js';
75
+ // S4(occt-wasm op 接入):通用布尔族(平台 op engines:['occt'],方案 §3.4.5)——
76
+ // 原生 booleanOp:带 glue/fuzzy/simplify 选项的通用形态,不在 L1 契约。
77
+ import { boolean as booleanWithOptions } from './boolean-op/index.js';
78
+ // S4(occt-wasm op 接入):包围盒对齐族(平台 op engines:['occt'],方案 §3.4.9)——
79
+ // 原生 alignX/alignY/alignZ 三轴并为一个脚本符号 alignTo。
80
+ import { alignTo } from './align/index.js';
35
81
  import { union, subtract, intersect, cut } from './boolean.js';
36
82
  import { split } from './split.js';
37
83
  import { sweep } from './sweep.js';
@@ -63,11 +109,12 @@ import { CONTRACT_VERSION } from '../runtime-state.js';
63
109
  /**
64
110
  * Assemble api functions into the cad namespace.
65
111
  *
66
- * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+
112
+ * P23(§4.2 ②,B1):cad 面 = faijs 特有 dual op(下方字面量)+
67
113
  * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec
68
- * 的 `scriptFace: true` 条目生成,经 `compatOp(projectBrepOp(…))` 包装的
69
- * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与
70
- * `api/index.ts` 导出面同源于同一份清单。
114
+ * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的
115
+ * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。
116
+ * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`
117
+ * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。
71
118
  *
72
119
  * @returns the assembled LibNamespace ready for runtime injection.
73
120
  */
@@ -91,6 +138,43 @@ export function createApiNamespace() {
91
138
  // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,
92
139
  // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。
93
140
  sweep, loft,
141
+ // S3(occt-wasm op 接入):控制点阵 → B 样条面(平台 op engines:['occt'])。
142
+ surface,
143
+ // S3(occt-wasm op 接入):2D 轮廓偏置(平台 op engines:['occt'],原生 offsetWire2D)。
144
+ offset2d,
145
+ // S3(occt-wasm op 接入):面集一次成型为实体(平台 op engines:['occt'],原生 buildSolidFromFaces)。
146
+ solidFromFaces,
147
+ // S3(occt-wasm op 接入):无限半空间实体(平台 op engines:['occt'],原生 halfSpace;
148
+ // 无界布尔工具的来源,产物 mesh 为空——单独渲染无意义,只作 cut/common/split 的工具位)。
149
+ halfSpace,
150
+ // S3(occt-wasm op 接入):导出族。exportStl 中立(只序列化 Shape 自带三角载荷,
151
+ // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。
152
+ exportStl,
153
+ exportBrep,
154
+ // 方案 §2.6:step(occt 必需——装配层级走 XCAF)/ 3mf(引擎中立,纯 XML + ZIP)。
155
+ exportStep,
156
+ export3mf,
157
+ // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。
158
+ isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,
159
+ // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。
160
+ toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,
161
+ // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。
162
+ edge, circleArc, ellipseEdge, ellipseArc, tangentArc,
163
+ approximatePoints, interpolateWithTangents,
164
+ curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,
165
+ // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。
166
+ faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,
167
+ // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。
168
+ draftPrism, pipe,
169
+ // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。
170
+ containsPoint, distanceBetween, inertia, linearCenterOfMass,
171
+ projectPointOnEdge, projectPointOnFace, classifyPointOnFace,
172
+ uvFromPoint, vertexPosition, subShapeCount, iterShapes,
173
+ liftCurve2d, commonCells,
174
+ // S4(occt-wasm op 接入):通用布尔族 booleanOp(方案 §3.4.5)+ 包围盒对齐族
175
+ // alignX/Y/Z → alignTo(方案 §3.4.9),平台 op engines:['occt']。
176
+ boolean: booleanWithOptions,
177
+ alignTo,
94
178
  faceNormal, bboxCenter, bboxMin, bboxMax,
95
179
  edgeRef,
96
180
  faceRef,
@@ -1 +1 @@
1
- {"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrE,iEAAiE;AACjE,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACrH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGnD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB;IAChC,6EAA6E;IAC7E,0EAA0E;IAC1E,0DAA0D;IAC1D,OAAO;QACL,eAAe,EAAE,gBAAgB;QACjC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;QAClC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG;QACxE,wDAAwD;QACxD,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO;QACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;QAC/B,6DAA6D;QAC7D,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc;QACnE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,mBAAmB;QAClF,KAAK,EAAE,QAAQ,EAAE,SAAS;QAC1B,OAAO,EAAE,OAAO;QAChB,6DAA6D;QAC7D,2DAA2D;QAC3D,kDAAkD;QAClD,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;QACxC,OAAO;QACP,OAAO;QACP,eAAe,EAAE,iBAAiB,EAAE,YAAY;QAChD,KAAK;QACL,0CAA0C;QAC1C,wDAAwD;QACxD,WAAW;QACX,WAAW;QACX,QAAQ,EAAE,iBAAiB;QAC3B,KAAK;QACL,GAAG,aAAa;QAChB,4EAA4E;QAC5E,gFAAgF;QAChF,GAAG;QACH,4EAA4E;QAC5E,8EAA8E;QAC9E,uEAAuE;QACvE,KAAK;QACL,aAAa;QACb,oDAAoD;QACpD,6DAA6D;QAC7D,iEAAiE;QACjE,0CAA0C;QAC1C,eAAe;QACf,WAAW;QACX,kBAAkB;QAClB,UAAU;QACV,MAAM;QACN,KAAK;KACqB,CAAA;AAC9B,CAAC","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/runtime.ts 的 createRuntime)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { surface } from './surface'\nimport { offset2d } from './offset2d'\nimport { solidFromFaces } from './solid-from-faces'\nimport { halfSpace } from './half-space'\nimport { exportStl } from './export-stl'\nimport { exportBrep } from './export-brep'\n// 2026-10-08(方案 §2.6 / DEC-3):脚本面 step / 3mf 出口。两者都是薄壳:宿主门\n// (+ exportStep 的 occt 引擎门)之后把入参转成 ExportEntry[],序列化一律交库面\n// exportModelSync(单一真源),故与库面逐字节同源。只进脚本面(本字面量 + check()\n// 符号表),**不平铺 api/index.ts**(§2.7 / DEC-6)。\nimport { exportStep } from './export-step'\nimport { export3mf } from './export-3mf'\n// S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual\n// (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。\nimport {\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n} from './shape-type'\n// S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);\n// 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。\nimport { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export'\n// S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n// 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/\n// approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/\n// curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。\nimport {\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n} from './curve-sketch'\n// S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n// 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire\n// (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。\nimport { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face'\n// S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n// 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/\n// halfSpace 已由 S3 落地)。\nimport { draftPrism, pipe } from './solid-offset'\n// S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n// 13 个原生方法不在 L1 契约:containsPoint/distanceBetween/getInertia/\n// getLinearCenterOfMass/projectPointOnEdge/projectPointOnFace/classifyPointOnFace/\n// uvFromPoint/vertexPosition/subShapeCount/iterShapes 返回非 Shape,\n// 走 export-brep / shape-type 同口径的普通函数;liftCurve2d / commonCells\n// 返回 Shape,走 defineOp。\nimport {\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n} from './measure-query'\n// S4(occt-wasm op 接入):通用布尔族(平台 op engines:['occt'],方案 §3.4.5)——\n// 原生 booleanOp:带 glue/fuzzy/simplify 选项的通用形态,不在 L1 契约。\nimport { boolean as booleanWithOptions } from './boolean-op'\n// S4(occt-wasm op 接入):包围盒对齐族(平台 op engines:['occt'],方案 §3.4.9)——\n// 原生 alignX/alignY/alignZ 三轴并为一个脚本符号 alignTo。\nimport { alignTo } from './align'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { 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 * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`\n * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。\n *\n * @returns the assembled LibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): LibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because LibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, profile, sketchOnPlane, sketchOnFace, 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 // 方案 §2.6:step(occt 必需——装配层级走 XCAF)/ 3mf(引擎中立,纯 XML + ZIP)。\n exportStep,\n export3mf,\n // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。\n toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,\n // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,\n // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n draftPrism, pipe,\n // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n // S4(occt-wasm op 接入):通用布尔族 booleanOp(方案 §3.4.5)+ 包围盒对齐族\n // alignX/Y/Z → alignTo(方案 §3.4.9),平台 op engines:['occt']。\n boolean: booleanWithOptions,\n alignTo,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as LibNamespace\n}\n"]}
@@ -1,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
  *